| Index: src/x64/full-codegen-x64.cc
|
| diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc
|
| index 556ec85249bb9437a3fc244a2f617baeaa88dc15..deb87da5ea273bc7543f9de3d6a5b0d78371dd51 100644
|
| --- a/src/x64/full-codegen-x64.cc
|
| +++ b/src/x64/full-codegen-x64.cc
|
| @@ -3050,19 +3050,8 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
|
| Comment cmnt(masm_, "[ UnaryOperation (DELETE)");
|
| Property* prop = expr->expression()->AsProperty();
|
| Variable* var = expr->expression()->AsVariableProxy()->AsVariable();
|
| - if (prop == NULL && var == NULL) {
|
| - // Result of deleting non-property, non-variable reference is true.
|
| - // The subexpression may have side effects.
|
| - VisitForEffect(expr->expression());
|
| - context()->Plug(true);
|
| - } else if (var != NULL &&
|
| - !var->is_global() &&
|
| - var->AsSlot() != NULL &&
|
| - var->AsSlot()->type() != Slot::LOOKUP) {
|
| - // Result of deleting non-global, non-dynamic variables is false.
|
| - // The subexpression does not have side effects.
|
| - context()->Plug(false);
|
| - } else if (prop != NULL) {
|
| +
|
| + if (prop != NULL) {
|
| if (prop->is_synthetic()) {
|
| // Result of deleting parameters is false, even when they rewrite
|
| // to accesses on the arguments object.
|
| @@ -3073,18 +3062,30 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
|
| __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
|
| context()->Plug(rax);
|
| }
|
| - } else if (var->is_global()) {
|
| - __ push(GlobalObjectOperand());
|
| - __ Push(var->name());
|
| - __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
|
| - context()->Plug(rax);
|
| + } else if (var != NULL) {
|
| + if (var->is_global()) {
|
| + __ push(GlobalObjectOperand());
|
| + __ Push(var->name());
|
| + __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
|
| + context()->Plug(rax);
|
| + } else if (var->AsSlot() != NULL &&
|
| + var->AsSlot()->type() != Slot::LOOKUP) {
|
| + // Result of deleting non-global, non-dynamic variables is false.
|
| + // The subexpression does not have side effects.
|
| + context()->Plug(false);
|
| + } else {
|
| + // Non-global variable. Call the runtime to try to delete from the
|
| + // context where the variable was introduced.
|
| + __ push(context_register());
|
| + __ Push(var->name());
|
| + __ CallRuntime(Runtime::kDeleteContextSlot, 2);
|
| + context()->Plug(rax);
|
| + }
|
| } else {
|
| - // Non-global variable. Call the runtime to try to delete from the
|
| - // context where the variable was introduced.
|
| - __ push(context_register());
|
| - __ Push(var->name());
|
| - __ CallRuntime(Runtime::kDeleteContextSlot, 2);
|
| - context()->Plug(rax);
|
| + // Result of deleting non-property, non-variable reference is true.
|
| + // The subexpression may have side effects.
|
| + VisitForEffect(expr->expression());
|
| + context()->Plug(true);
|
| }
|
| break;
|
| }
|
|
|