Revert "Implement ::class"

Reviewed By: ptarjan

This reverts commit 73975187358058e071bbfca5094bb0fc6e23ef86.
Esse commit está contido em:
Sean Cannella
2014-01-23 07:55:54 -08:00
commit de Sara Golemon
commit 621b302b23
13 arquivos alterados com 2880 adições e 2970 exclusões
+5 -12
Ver Arquivo
@@ -3934,10 +3934,6 @@ bool EmitterVisitor::visitImpl(ConstructPtr node) {
ClassConstantExpressionPtr cc(
static_pointer_cast<ClassConstantExpression>(node));
StringData* nName = makeStaticString(cc->getConName());
auto const getOriginalClassName = [&] {
const std::string& clsName = cc->getOriginalClassName();
return makeStaticString(clsName);
};
if (cc->isStatic()) {
// static::Constant
e.LateBoundCls();
@@ -3951,12 +3947,9 @@ bool EmitterVisitor::visitImpl(ConstructPtr node) {
} else if (cc->getOriginalClass() &&
!cc->getOriginalClass()->isTrait()) {
// C::Constant inside a class
auto nCls = getOriginalClassName();
if (cc->isColonColonClass()) {
e.String(nCls);
} else {
e.ClsCnsD(nName, nCls);
}
const std::string& clsName = cc->getOriginalClassName();
StringData* nCls = makeStaticString(clsName);
e.ClsCnsD(nName, nCls);
} else if (cc->isSelf()) {
// self::Constant inside trait or pseudomain
e.Self();
@@ -3972,8 +3965,8 @@ bool EmitterVisitor::visitImpl(ConstructPtr node) {
// will set cc->originalClassName to the trait's name for
// the isSelf and isParent cases, but self and parent must
// be resolved dynamically when used inside of traits.
assert(!cc->isColonColonClass());
auto nCls = getOriginalClassName();
const std::string& clsName = cc->getOriginalClassName();
StringData* nCls = makeStaticString(clsName);
e.ClsCnsD(nName, nCls);
}
return true;
@@ -46,7 +46,6 @@ public:
bool isValid() const { return m_valid; }
bool isDynamic() const;
bool hasClass() const { return m_defScope != 0; }
bool isColonColonClass() const { return m_varName == "class"; }
private:
std::string m_varName;
BlockScope *m_defScope;
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
-24
Ver Arquivo
@@ -797,30 +797,6 @@ void Parser::onClassConst(Token &out, Token &cls, Token &name, bool text) {
out->exp = con;
}
void Parser::onClassClass(Token &out, Token &cls, Token &name,
bool inStaticContext) {
if (inStaticContext) {
if (cls->same("parent") || cls->same("static")) {
PARSE_ERROR(
"%s::class cannot be used for compile-time class name resolution",
cls->text().c_str()
);
return;
}
}
if (cls->same("self") || cls->same("parent") || cls->same("static")) {
if (cls->same("self") && m_inTrait) {
// Sooo... self:: works dynamically for everything in a trait except
// for self::CLASS where it returns the trait name. Great...
onScalar(out, T_TRAIT_C, cls);
} else {
onClassConst(out, cls, name, inStaticContext);
}
} else {
onScalar(out, T_STRING, cls);
}
}
///////////////////////////////////////////////////////////////////////////////
// function/method declaration
-1
Ver Arquivo
@@ -190,7 +190,6 @@ public:
void onCollectionPair(Token &out, Token *pairs, Token *name, Token &value);
void onUserAttribute(Token &out, Token *attrList, Token &name, Token &value);
void onClassConst(Token &out, Token &cls, Token &name, bool text);
void onClassClass(Token &out, Token &cls, Token &name, bool text);
void fixStaticVars();
void onFunctionStart(Token &name, bool doPushComment = true);
void onFunction(Token &out, Token *modifier, Token &ret, Token &ref,
Arquivo normal → Arquivo executável
+2 -7
Ver Arquivo
@@ -2179,9 +2179,6 @@ static_class_constant:
| T_XHP_LABEL T_DOUBLE_COLON
ident { $1.xhpLabel();
_p->onClassConst($$, $1, $3, 1);}
| class_namespace_string_typeargs
T_DOUBLE_COLON
T_CLASS { _p->onClassClass($$, $1, $3, 1);}
;
scalar:
@@ -2574,10 +2571,8 @@ variable_list:
;
class_constant:
static_class_name
T_DOUBLE_COLON ident { _p->onClassConst($$, $1, $3, 0);}
| static_class_name
T_DOUBLE_COLON T_CLASS { _p->onClassClass($$, $1, $3, 0);}
static_class_name
T_DOUBLE_COLON ident { _p->onClassConst($$, $1, $3, 0);}
;
/* hack productions -- these allow some extra stuff in hack
-4
Ver Arquivo
@@ -639,10 +639,6 @@ struct Parser : ParserBase {
.setExtra(new OnClassConstEI(text));
}
void onClassClass(Token &out, Token &cls, Token &name, bool text) {
onClassConst(out, cls, name, text);
}
void fixStaticVars() { /* TODO */}
void onFunctionStart(Token& name, bool doPushComment = true) {
-8
Ver Arquivo
@@ -3724,14 +3724,6 @@ OPTBLD_INLINE void VMExecutionContext::iopClsCns(IOP_ARGS) {
assert(tv->m_type == KindOfClass);
Class* class_ = tv->m_data.pcls;
assert(class_ != nullptr);
if (clsCnsName->isame(s_class.get())) {
// Doesn't decref tv since Classes aren't refcounted
auto name = const_cast<StringData*>(class_->name());
assert(name->isStatic());
tv->m_type = KindOfStaticString;
tv->m_data.pstr = name;
return;
}
auto const clsCns = class_->clsCnsGet(clsCnsName);
if (clsCns.m_type == KindOfUninit) {
raise_error("Couldn't find constant %s::%s",
-38
Ver Arquivo
@@ -1,38 +0,0 @@
<?php
namespace NS;
function main() {
class B {}
class A extends B {
public function b() {
var_dump(self::class);
var_dump(static::class);
var_dump(parent::class);
}
}
var_dump(A::class);
A::b();
function c($c = A::class) {
var_dump($c);
}
c();
var_dump(Vector::class);
trait C {
public function c() {
var_dump(self::class);
var_dump(static::class);
var_dump(parent::class);
}
}
class D extends B {
use C;
}
D::c();
var_dump(C::class);
interface E {}
var_dump(E::class);
}
main();
@@ -1,11 +0,0 @@
string(4) "NS\A"
string(4) "NS\A"
string(4) "NS\A"
string(4) "NS\B"
string(4) "NS\A"
string(9) "NS\Vector"
string(4) "NS\C"
string(4) "NS\D"
string(4) "NS\B"
string(4) "NS\C"
string(4) "NS\E"
+1 -1
Ver Arquivo
@@ -19,7 +19,7 @@
namespace HPHP { namespace Util { namespace TextArt {
///////////////////////////////////////////////////////////////////////////////
// comment only change
#define BOX_H get_box_drawing_char(LightHorizontal)
#define BOX_V get_box_drawing_char(LightVertical)
#define BOX_UL get_box_drawing_char(LightDownAndRight)