Revert "Implement ::class"
Reviewed By: ptarjan This reverts commit 73975187358058e071bbfca5094bb0fc6e23ef86.
Esse commit está contido em:
@@ -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;
|
||||
|
||||
+2872
-2863
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário