From: mmaly@chromium.org Date: Mon, 14 Feb 2011 17:33:06 +0000 (+0000) Subject: Refactoring codegen for delete. X-Git-Tag: upstream/4.7.83~20219 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3711b87e8c3db6b2d12c97bab4843bb59addf41c;p=platform%2Fupstream%2Fv8.git Refactoring codegen for delete. * keep handling of VariableProxy and Property together * place clauses in the order of discovery git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6778 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc index 3649941..801296b 100644 --- a/src/arm/full-codegen-arm.cc +++ b/src/arm/full-codegen-arm.cc @@ -3053,19 +3053,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. @@ -3076,20 +3065,32 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { __ InvokeBuiltin(Builtins::DELETE, CALL_JS); context()->Plug(r0); } - } else if (var->is_global()) { - __ ldr(r1, GlobalObjectOperand()); - __ mov(r0, Operand(var->name())); - __ Push(r1, r0); - __ InvokeBuiltin(Builtins::DELETE, CALL_JS); - context()->Plug(r0); + } else if (var != NULL) { + if (var->is_global()) { + __ ldr(r1, GlobalObjectOperand()); + __ mov(r0, Operand(var->name())); + __ Push(r1, r0); + __ InvokeBuiltin(Builtins::DELETE, CALL_JS); + context()->Plug(r0); + } 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()); + __ mov(r2, Operand(var->name())); + __ push(r2); + __ CallRuntime(Runtime::kDeleteContextSlot, 2); + context()->Plug(r0); + } } else { - // Non-global variable. Call the runtime to try to delete from the - // context where the variable was introduced. - __ push(context_register()); - __ mov(r2, Operand(var->name())); - __ push(r2); - __ CallRuntime(Runtime::kDeleteContextSlot, 2); - context()->Plug(r0); + // Result of deleting non-property, non-variable reference is true. + // The subexpression may have side effects. + VisitForEffect(expr->expression()); + context()->Plug(true); } break; } diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc index e807d65..ada7b3d 100644 --- a/src/ia32/full-codegen-ia32.cc +++ b/src/ia32/full-codegen-ia32.cc @@ -3721,19 +3721,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. @@ -3744,18 +3733,30 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); context()->Plug(eax); } - } else if (var->is_global()) { - __ push(GlobalObjectOperand()); - __ push(Immediate(var->name())); - __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); - context()->Plug(eax); + } else if (var != NULL) { + if (var->is_global()) { + __ push(GlobalObjectOperand()); + __ push(Immediate(var->name())); + __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); + context()->Plug(eax); + } 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(Immediate(var->name())); + __ CallRuntime(Runtime::kDeleteContextSlot, 2); + context()->Plug(eax); + } } else { - // Non-global variable. Call the runtime to try to delete from the - // context where the variable was introduced. - __ push(context_register()); - __ push(Immediate(var->name())); - __ CallRuntime(Runtime::kDeleteContextSlot, 2); - context()->Plug(eax); + // Result of deleting non-property, non-variable reference is true. + // The subexpression may have side effects. + VisitForEffect(expr->expression()); + context()->Plug(true); } break; } diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc index 4df0d5f..24a8524 100644 --- a/src/x64/full-codegen-x64.cc +++ b/src/x64/full-codegen-x64.cc @@ -3060,19 +3060,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. @@ -3083,18 +3072,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; }