diff --git a/hphp/compiler/analysis/emitter.cpp b/hphp/compiler/analysis/emitter.cpp index 40db0c551..fe5e9b977 100644 --- a/hphp/compiler/analysis/emitter.cpp +++ b/hphp/compiler/analysis/emitter.cpp @@ -2491,8 +2491,7 @@ bool EmitterVisitor::visitImpl(ConstructPtr node) { ExpressionListPtr exps( static_pointer_cast(node)->getExps()); for (int i = 0, n = exps->getCount(); i < n; i++) { - visit((*exps)[i]); - emitUnset(e); + emitVisitAndUnset(e, (*exps)[i]); } return false; } @@ -2598,15 +2597,13 @@ bool EmitterVisitor::visitImpl(ConstructPtr node) { static_pointer_cast(exp)); if (exps->getListKind() == ExpressionList::ListKindParam) { for (int i = 0, n = exps->getCount(); i < n; i++) { - visit((*exps)[i]); - emitUnset(e); + emitVisitAndUnset(e, (*exps)[i]); } e.Null(); return true; } } - visit(exp); - emitUnset(e); + emitVisitAndUnset(e, exp); e.Null(); return true; } @@ -4509,7 +4506,8 @@ void EmitterVisitor::emitEmpty(Emitter& e) { } } -void EmitterVisitor::emitUnset(Emitter& e) { +void EmitterVisitor::emitUnset(Emitter& e, + ExpressionPtr exp /* = ExpressionPtr() */) { if (checkIfStackEmpty("Unset*")) return; emitClsIfSPropBase(e); @@ -4527,8 +4525,10 @@ void EmitterVisitor::emitUnset(Emitter& e) { case StackSym::CG: e.UnsetG(); break; case StackSym::LS: // fall through case StackSym::CS: + assert(exp); e.String( - StringData::GetStaticString("Attempt to unset static property") + StringData::GetStaticString("Attempt to unset static property " + + exp->getText()) ); e.Fatal(0); break; @@ -4545,6 +4545,11 @@ void EmitterVisitor::emitUnset(Emitter& e) { } } +void EmitterVisitor::emitVisitAndUnset(Emitter& e, ExpressionPtr exp) { + visit(exp); + emitUnset(e, exp); +} + void EmitterVisitor::emitSet(Emitter& e) { if (checkIfStackEmpty("Set*")) return; diff --git a/hphp/compiler/analysis/emitter.h b/hphp/compiler/analysis/emitter.h index d7745e78f..742a052de 100644 --- a/hphp/compiler/analysis/emitter.h +++ b/hphp/compiler/analysis/emitter.h @@ -564,7 +564,8 @@ public: void emitIsDouble(Emitter& e); void emitIsBool(Emitter& e); void emitEmpty(Emitter& e); - void emitUnset(Emitter& e); + void emitUnset(Emitter& e, ExpressionPtr exp = ExpressionPtr()); + void emitVisitAndUnset(Emitter& e, ExpressionPtr exp); void emitSet(Emitter& e); void emitSetOp(Emitter& e, int op); void emitBind(Emitter& e); diff --git a/hphp/test/quick/unset_static.php b/hphp/test/quick/unset_static.php new file mode 100644 index 000000000..afa809aa0 --- /dev/null +++ b/hphp/test/quick/unset_static.php @@ -0,0 +1,5 @@ +