Remove code handling parameters rewritten to properties (aka synthetic properties).

After merging the new arguments branch, there is no need for this code anymore.

TEST=all tests pass
Review URL: http://codereview.chromium.org/7753030

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9031 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent cd3588d5
...@@ -47,7 +47,6 @@ namespace internal { ...@@ -47,7 +47,6 @@ namespace internal {
static unsigned GetPropertyId(Property* property) { static unsigned GetPropertyId(Property* property) {
if (property->is_synthetic()) return AstNode::kNoNumber;
return property->id(); return property->id();
} }
...@@ -694,9 +693,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -694,9 +693,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
Comment cmnt(masm_, "[ Declaration"); Comment cmnt(masm_, "[ Declaration");
ASSERT(variable != NULL); // Must have been resolved. ASSERT(variable != NULL); // Must have been resolved.
Slot* slot = variable->AsSlot(); Slot* slot = variable->AsSlot();
Property* prop = variable->AsProperty(); ASSERT(slot != NULL);
if (slot != NULL) {
switch (slot->type()) { switch (slot->type()) {
case Slot::PARAMETER: case Slot::PARAMETER:
case Slot::LOCAL: case Slot::LOCAL:
...@@ -765,35 +762,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -765,35 +762,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
break; break;
} }
} }
} else if (prop != NULL) {
// A const declaration aliasing a parameter is an illegal redeclaration.
ASSERT(mode != Variable::CONST);
if (function != NULL) {
// We are declaring a function that rewrites to a property.
// Use (keyed) IC to set the initial value. We cannot visit the
// rewrite because it's shared and we risk recording duplicate AST
// IDs for bailouts from optimized code.
ASSERT(prop->obj()->AsVariableProxy() != NULL);
{ AccumulatorValueContext for_object(this);
EmitVariableLoad(prop->obj()->AsVariableProxy());
}
__ push(r0);
VisitForAccumulatorValue(function);
__ pop(r2);
ASSERT(prop->key()->AsLiteral() != NULL &&
prop->key()->AsLiteral()->handle()->IsSmi());
__ mov(r1, Operand(prop->key()->AsLiteral()->handle()));
Handle<Code> ic = is_strict_mode()
? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
: isolate()->builtins()->KeyedStoreIC_Initialize();
__ Call(ic);
// Value in r0 is ignored (declarations are statements).
}
}
} }
...@@ -2272,37 +2240,11 @@ void FullCodeGenerator::VisitCall(Call* expr) { ...@@ -2272,37 +2240,11 @@ void FullCodeGenerator::VisitCall(Call* expr) {
EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET);
} else { } else {
// Call to a keyed property. // Call to a keyed property.
// For a synthetic property use keyed load IC followed by function call,
// for a regular property use EmitKeyedCallWithIC.
if (prop->is_synthetic()) {
// Do not visit the object and key subexpressions (they are shared
// by all occurrences of the same rewritten parameter).
ASSERT(prop->obj()->AsVariableProxy() != NULL);
ASSERT(prop->obj()->AsVariableProxy()->var()->AsSlot() != NULL);
Slot* slot = prop->obj()->AsVariableProxy()->var()->AsSlot();
MemOperand operand = EmitSlotSearch(slot, r1);
__ ldr(r1, operand);
ASSERT(prop->key()->AsLiteral() != NULL);
ASSERT(prop->key()->AsLiteral()->handle()->IsSmi());
__ mov(r0, Operand(prop->key()->AsLiteral()->handle()));
// Record source code position for IC call.
SetSourcePosition(prop->position());
Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
__ Call(ic, RelocInfo::CODE_TARGET, GetPropertyId(prop));
__ ldr(r1, GlobalObjectOperand());
__ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset));
__ Push(r0, r1); // Function, receiver.
EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS);
} else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
} }
EmitKeyedCallWithIC(expr, prop->key()); EmitKeyedCallWithIC(expr, prop->key());
} }
}
} else { } else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(fun); VisitForStackValue(fun);
...@@ -3631,18 +3573,12 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { ...@@ -3631,18 +3573,12 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
Variable* var = expr->expression()->AsVariableProxy()->AsVariable(); Variable* var = expr->expression()->AsVariableProxy()->AsVariable();
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.
context()->Plug(false);
} else {
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
VisitForStackValue(prop->key()); VisitForStackValue(prop->key());
__ mov(r1, Operand(Smi::FromInt(strict_mode_flag()))); __ mov(r1, Operand(Smi::FromInt(strict_mode_flag())));
__ push(r1); __ push(r1);
__ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
context()->Plug(r0); context()->Plug(r0);
}
} else if (var != NULL) { } else if (var != NULL) {
// Delete of an unqualified identifier is disallowed in strict mode // Delete of an unqualified identifier is disallowed in strict mode
// but "delete this" is. // but "delete this" is.
......
...@@ -1231,21 +1231,14 @@ class Slot: public Expression { ...@@ -1231,21 +1231,14 @@ class Slot: public Expression {
class Property: public Expression { class Property: public Expression {
public: public:
// Synthetic properties are property lookups introduced by the system,
// to objects that aren't visible to the user. Function calls to synthetic
// properties should use the global object as receiver, not the base object
// of the resolved Reference.
enum Type { NORMAL, SYNTHETIC };
Property(Isolate* isolate, Property(Isolate* isolate,
Expression* obj, Expression* obj,
Expression* key, Expression* key,
int pos, int pos)
Type type = NORMAL)
: Expression(isolate), : Expression(isolate),
obj_(obj), obj_(obj),
key_(key), key_(key),
pos_(pos), pos_(pos),
type_(type),
is_monomorphic_(false), is_monomorphic_(false),
is_array_length_(false), is_array_length_(false),
is_string_length_(false), is_string_length_(false),
...@@ -1260,7 +1253,6 @@ class Property: public Expression { ...@@ -1260,7 +1253,6 @@ class Property: public Expression {
Expression* obj() const { return obj_; } Expression* obj() const { return obj_; }
Expression* key() const { return key_; } Expression* key() const { return key_; }
virtual int position() const { return pos_; } virtual int position() const { return pos_; }
bool is_synthetic() const { return type_ == SYNTHETIC; }
bool IsStringLength() const { return is_string_length_; } bool IsStringLength() const { return is_string_length_; }
bool IsStringAccess() const { return is_string_access_; } bool IsStringAccess() const { return is_string_access_; }
...@@ -1276,7 +1268,6 @@ class Property: public Expression { ...@@ -1276,7 +1268,6 @@ class Property: public Expression {
Expression* obj_; Expression* obj_;
Expression* key_; Expression* key_;
int pos_; int pos_;
Type type_;
SmallMapList receiver_types_; SmallMapList receiver_types_;
bool is_monomorphic_ : 1; bool is_monomorphic_ : 1;
......
...@@ -5074,11 +5074,6 @@ void HGraphBuilder::VisitDelete(UnaryOperation* expr) { ...@@ -5074,11 +5074,6 @@ void HGraphBuilder::VisitDelete(UnaryOperation* expr) {
// The subexpression does not have side effects. // The subexpression does not have side effects.
return ast_context()->ReturnValue(graph()->GetConstantFalse()); return ast_context()->ReturnValue(graph()->GetConstantFalse());
} else if (prop != NULL) { } else if (prop != NULL) {
if (prop->is_synthetic()) {
// Result of deleting parameters is false, even when they rewrite
// to accesses on the arguments object.
return ast_context()->ReturnValue(graph()->GetConstantFalse());
} else {
CHECK_ALIVE(VisitForValue(prop->obj())); CHECK_ALIVE(VisitForValue(prop->obj()));
CHECK_ALIVE(VisitForValue(prop->key())); CHECK_ALIVE(VisitForValue(prop->key()));
HValue* key = Pop(); HValue* key = Pop();
...@@ -5086,7 +5081,6 @@ void HGraphBuilder::VisitDelete(UnaryOperation* expr) { ...@@ -5086,7 +5081,6 @@ void HGraphBuilder::VisitDelete(UnaryOperation* expr) {
HValue* context = environment()->LookupContext(); HValue* context = environment()->LookupContext();
HDeleteProperty* instr = new(zone()) HDeleteProperty(context, obj, key); HDeleteProperty* instr = new(zone()) HDeleteProperty(context, obj, key);
return ast_context()->ReturnInstruction(instr, expr->id()); return ast_context()->ReturnInstruction(instr, expr->id());
}
} else if (var->is_global()) { } else if (var->is_global()) {
Bailout("delete with global variable"); Bailout("delete with global variable");
} else { } else {
......
...@@ -46,7 +46,6 @@ namespace internal { ...@@ -46,7 +46,6 @@ namespace internal {
static unsigned GetPropertyId(Property* property) { static unsigned GetPropertyId(Property* property) {
if (property->is_synthetic()) return AstNode::kNoNumber;
return property->id(); return property->id();
} }
...@@ -690,9 +689,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -690,9 +689,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
Comment cmnt(masm_, "[ Declaration"); Comment cmnt(masm_, "[ Declaration");
ASSERT(variable != NULL); // Must have been resolved. ASSERT(variable != NULL); // Must have been resolved.
Slot* slot = variable->AsSlot(); Slot* slot = variable->AsSlot();
Property* prop = variable->AsProperty(); ASSERT(slot != NULL);
if (slot != NULL) {
switch (slot->type()) { switch (slot->type()) {
case Slot::PARAMETER: case Slot::PARAMETER:
case Slot::LOCAL: case Slot::LOCAL:
...@@ -761,36 +758,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -761,36 +758,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
break; break;
} }
} }
} else if (prop != NULL) {
// A const declaration aliasing a parameter is an illegal redeclaration.
ASSERT(mode != Variable::CONST);
if (function != NULL) {
// We are declaring a function that rewrites to a property.
// Use (keyed) IC to set the initial value. We cannot visit the
// rewrite because it's shared and we risk recording duplicate AST
// IDs for bailouts from optimized code.
ASSERT(prop->obj()->AsVariableProxy() != NULL);
{ AccumulatorValueContext for_object(this);
EmitVariableLoad(prop->obj()->AsVariableProxy());
}
__ push(eax);
increment_stack_height();
VisitForAccumulatorValue(function);
__ pop(edx);
decrement_stack_height();
ASSERT(prop->key()->AsLiteral() != NULL &&
prop->key()->AsLiteral()->handle()->IsSmi());
__ SafeSet(ecx, Immediate(prop->key()->AsLiteral()->handle()));
Handle<Code> ic = is_strict_mode()
? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
: isolate()->builtins()->KeyedStoreIC_Initialize();
__ call(ic);
}
}
} }
...@@ -1824,21 +1791,11 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { ...@@ -1824,21 +1791,11 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) {
case KEYED_PROPERTY: { case KEYED_PROPERTY: {
__ push(eax); // Preserve value. __ push(eax); // Preserve value.
increment_stack_height(); increment_stack_height();
if (prop->is_synthetic()) {
ASSERT(prop->obj()->AsVariableProxy() != NULL);
ASSERT(prop->key()->AsLiteral() != NULL);
{ AccumulatorValueContext for_object(this);
EmitVariableLoad(prop->obj()->AsVariableProxy());
}
__ mov(edx, eax);
__ SafeSet(ecx, Immediate(prop->key()->AsLiteral()->handle()));
} else {
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
VisitForAccumulatorValue(prop->key()); VisitForAccumulatorValue(prop->key());
__ mov(ecx, eax); __ mov(ecx, eax);
__ pop(edx); __ pop(edx);
decrement_stack_height(); decrement_stack_height();
}
__ pop(eax); // Restore value. __ pop(eax); // Restore value.
decrement_stack_height(); decrement_stack_height();
Handle<Code> ic = is_strict_mode() Handle<Code> ic = is_strict_mode()
...@@ -2275,41 +2232,11 @@ void FullCodeGenerator::VisitCall(Call* expr) { ...@@ -2275,41 +2232,11 @@ void FullCodeGenerator::VisitCall(Call* expr) {
EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET);
} else { } else {
// Call to a keyed property. // Call to a keyed property.
// For a synthetic property use keyed load IC followed by function call,
// for a regular property use EmitKeyedCallWithIC.
if (prop->is_synthetic()) {
// Do not visit the object and key subexpressions (they are shared
// by all occurrences of the same rewritten parameter).
ASSERT(prop->obj()->AsVariableProxy() != NULL);
ASSERT(prop->obj()->AsVariableProxy()->var()->AsSlot() != NULL);
Slot* slot = prop->obj()->AsVariableProxy()->var()->AsSlot();
MemOperand operand = EmitSlotSearch(slot, edx);
__ mov(edx, operand);
ASSERT(prop->key()->AsLiteral() != NULL);
ASSERT(prop->key()->AsLiteral()->handle()->IsSmi());
__ mov(eax, prop->key()->AsLiteral()->handle());
// Record source code position for IC call.
SetSourcePosition(prop->position());
Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
__ call(ic, RelocInfo::CODE_TARGET, GetPropertyId(prop));
// Push result (function).
__ push(eax);
increment_stack_height();
// Push Global receiver.
__ mov(ecx, GlobalObjectOperand());
__ push(FieldOperand(ecx, GlobalObject::kGlobalReceiverOffset));
increment_stack_height();
EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS);
} else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
} }
EmitKeyedCallWithIC(expr, prop->key()); EmitKeyedCallWithIC(expr, prop->key());
} }
}
} else { } else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(fun); VisitForStackValue(fun);
...@@ -3688,18 +3615,12 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { ...@@ -3688,18 +3615,12 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
Variable* var = expr->expression()->AsVariableProxy()->AsVariable(); Variable* var = expr->expression()->AsVariableProxy()->AsVariable();
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.
context()->Plug(false);
} else {
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
VisitForStackValue(prop->key()); VisitForStackValue(prop->key());
__ push(Immediate(Smi::FromInt(strict_mode_flag()))); __ push(Immediate(Smi::FromInt(strict_mode_flag())));
__ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
decrement_stack_height(2); decrement_stack_height(2);
context()->Plug(eax); context()->Plug(eax);
}
} else if (var != NULL) { } else if (var != NULL) {
// Delete of an unqualified identifier is disallowed in strict mode // Delete of an unqualified identifier is disallowed in strict mode
// but "delete this" is. // but "delete this" is.
......
...@@ -55,7 +55,6 @@ namespace internal { ...@@ -55,7 +55,6 @@ namespace internal {
static unsigned GetPropertyId(Property* property) { static unsigned GetPropertyId(Property* property) {
if (property->is_synthetic()) return AstNode::kNoNumber;
return property->id(); return property->id();
} }
...@@ -697,9 +696,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -697,9 +696,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
Comment cmnt(masm_, "[ Declaration"); Comment cmnt(masm_, "[ Declaration");
ASSERT(variable != NULL); // Must have been resolved. ASSERT(variable != NULL); // Must have been resolved.
Slot* slot = variable->AsSlot(); Slot* slot = variable->AsSlot();
Property* prop = variable->AsProperty(); ASSERT(slot != NULL);
if (slot != NULL) {
switch (slot->type()) { switch (slot->type()) {
case Slot::PARAMETER: case Slot::PARAMETER:
case Slot::LOCAL: case Slot::LOCAL:
...@@ -772,36 +769,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -772,36 +769,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
break; break;
} }
} }
} else if (prop != NULL) {
// A const declaration aliasing a parameter is an illegal redeclaration.
ASSERT(mode != Variable::CONST);
if (function != NULL) {
// We are declaring a function that rewrites to a property.
// Use (keyed) IC to set the initial value. We cannot visit the
// rewrite because it's shared and we risk recording duplicate AST
// IDs for bailouts from optimized code.
ASSERT(prop->obj()->AsVariableProxy() != NULL);
{ AccumulatorValueContext for_object(this);
EmitVariableLoad(prop->obj()->AsVariableProxy());
}
__ push(result_register());
VisitForAccumulatorValue(function);
__ mov(a0, result_register());
__ pop(a2);
ASSERT(prop->key()->AsLiteral() != NULL &&
prop->key()->AsLiteral()->handle()->IsSmi());
__ li(a1, Operand(prop->key()->AsLiteral()->handle()));
Handle<Code> ic = is_strict_mode()
? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
: isolate()->builtins()->KeyedStoreIC_Initialize();
__ Call(ic);
// Value in v0 is ignored (declarations are statements).
}
}
} }
...@@ -2286,37 +2253,11 @@ void FullCodeGenerator::VisitCall(Call* expr) { ...@@ -2286,37 +2253,11 @@ void FullCodeGenerator::VisitCall(Call* expr) {
EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET);
} else { } else {
// Call to a keyed property. // Call to a keyed property.
// For a synthetic property use keyed load IC followed by function call,
// for a regular property use EmitKeyedCallWithIC.
if (prop->is_synthetic()) {
// Do not visit the object and key subexpressions (they are shared
// by all occurrences of the same rewritten parameter).
ASSERT(prop->obj()->AsVariableProxy() != NULL);
ASSERT(prop->obj()->AsVariableProxy()->var()->AsSlot() != NULL);
Slot* slot = prop->obj()->AsVariableProxy()->var()->AsSlot();
MemOperand operand = EmitSlotSearch(slot, a1);
__ lw(a1, operand);
ASSERT(prop->key()->AsLiteral() != NULL);
ASSERT(prop->key()->AsLiteral()->handle()->IsSmi());
__ li(a0, Operand(prop->key()->AsLiteral()->handle()));
// Record source code position for IC call.
SetSourcePosition(prop->position());
Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
__ Call(ic, RelocInfo::CODE_TARGET, GetPropertyId(prop));
__ lw(a1, GlobalObjectOperand());
__ lw(a1, FieldMemOperand(a1, GlobalObject::kGlobalReceiverOffset));
__ Push(v0, a1); // Function, receiver.
EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS);
} else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
} }
EmitKeyedCallWithIC(expr, prop->key()); EmitKeyedCallWithIC(expr, prop->key());
} }
}
} else { } else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(fun); VisitForStackValue(fun);
...@@ -3653,18 +3594,12 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { ...@@ -3653,18 +3594,12 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
Variable* var = expr->expression()->AsVariableProxy()->AsVariable(); Variable* var = expr->expression()->AsVariableProxy()->AsVariable();
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.
context()->Plug(false);
} else {
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
VisitForStackValue(prop->key()); VisitForStackValue(prop->key());
__ li(a1, Operand(Smi::FromInt(strict_mode_flag()))); __ li(a1, Operand(Smi::FromInt(strict_mode_flag())));
__ push(a1); __ push(a1);
__ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
context()->Plug(v0); context()->Plug(v0);
}
} else if (var != NULL) { } else if (var != NULL) {
// Delete of an unqualified identifier is disallowed in strict mode // Delete of an unqualified identifier is disallowed in strict mode
// but "delete this" is. // but "delete this" is.
......
...@@ -45,7 +45,6 @@ namespace internal { ...@@ -45,7 +45,6 @@ namespace internal {
static unsigned GetPropertyId(Property* property) { static unsigned GetPropertyId(Property* property) {
if (property->is_synthetic()) return AstNode::kNoNumber;
return property->id(); return property->id();
} }
...@@ -665,9 +664,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -665,9 +664,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
Comment cmnt(masm_, "[ Declaration"); Comment cmnt(masm_, "[ Declaration");
ASSERT(variable != NULL); // Must have been resolved. ASSERT(variable != NULL); // Must have been resolved.
Slot* slot = variable->AsSlot(); Slot* slot = variable->AsSlot();
Property* prop = variable->AsProperty(); ASSERT(slot != NULL);
if (slot != NULL) {
switch (slot->type()) { switch (slot->type()) {
case Slot::PARAMETER: case Slot::PARAMETER:
case Slot::LOCAL: case Slot::LOCAL:
...@@ -732,32 +729,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, ...@@ -732,32 +729,6 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
break; break;
} }
} }
} else if (prop != NULL) {
// A const declaration aliasing a parameter is an illegal redeclaration.
ASSERT(mode != Variable::CONST);
if (function != NULL) {
// We are declaring a function that rewrites to a property.
// Use (keyed) IC to set the initial value. We cannot visit the
// rewrite because it's shared and we risk recording duplicate AST
// IDs for bailouts from optimized code.
ASSERT(prop->obj()->AsVariableProxy() != NULL);
{ AccumulatorValueContext for_object(this);
EmitVariableLoad(prop->obj()->AsVariableProxy());
}
__ push(rax);
VisitForAccumulatorValue(function);
__ pop(rdx);
ASSERT(prop->key()->AsLiteral() != NULL &&
prop->key()->AsLiteral()->handle()->IsSmi());
__ Move(rcx, prop->key()->AsLiteral()->handle());
Handle<Code> ic = is_strict_mode()
? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
: isolate()->builtins()->KeyedStoreIC_Initialize();
__ call(ic);
}
}
} }
...@@ -2169,39 +2140,11 @@ void FullCodeGenerator::VisitCall(Call* expr) { ...@@ -2169,39 +2140,11 @@ void FullCodeGenerator::VisitCall(Call* expr) {
EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET); EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET);
} else { } else {
// Call to a keyed property. // Call to a keyed property.
// For a synthetic property use keyed load IC followed by function call,
// for a regular property use EmitKeyedCallWithIC.
if (prop->is_synthetic()) {
// Do not visit the object and key subexpressions (they are shared
// by all occurrences of the same rewritten parameter).
ASSERT(prop->obj()->AsVariableProxy() != NULL);
ASSERT(prop->obj()->AsVariableProxy()->var()->AsSlot() != NULL);
Slot* slot = prop->obj()->AsVariableProxy()->var()->AsSlot();
MemOperand operand = EmitSlotSearch(slot, rdx);
__ movq(rdx, operand);
ASSERT(prop->key()->AsLiteral() != NULL);
ASSERT(prop->key()->AsLiteral()->handle()->IsSmi());
__ Move(rax, prop->key()->AsLiteral()->handle());
// Record source code position for IC call.
SetSourcePosition(prop->position());
Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
__ call(ic, RelocInfo::CODE_TARGET, GetPropertyId(prop));
// Push result (function).
__ push(rax);
// Push Global receiver.
__ movq(rcx, GlobalObjectOperand());
__ push(FieldOperand(rcx, GlobalObject::kGlobalReceiverOffset));
EmitCallWithStub(expr, NO_CALL_FUNCTION_FLAGS);
} else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
} }
EmitKeyedCallWithIC(expr, prop->key()); EmitKeyedCallWithIC(expr, prop->key());
} }
}
} else { } else {
{ PreservePositionScope scope(masm()->positions_recorder()); { PreservePositionScope scope(masm()->positions_recorder());
VisitForStackValue(fun); VisitForStackValue(fun);
...@@ -3566,17 +3509,11 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { ...@@ -3566,17 +3509,11 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
Variable* var = expr->expression()->AsVariableProxy()->AsVariable(); Variable* var = expr->expression()->AsVariableProxy()->AsVariable();
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.
context()->Plug(false);
} else {
VisitForStackValue(prop->obj()); VisitForStackValue(prop->obj());
VisitForStackValue(prop->key()); VisitForStackValue(prop->key());
__ Push(Smi::FromInt(strict_mode_flag())); __ Push(Smi::FromInt(strict_mode_flag()));
__ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
context()->Plug(rax); context()->Plug(rax);
}
} else if (var != NULL) { } else if (var != NULL) {
// Delete of an unqualified identifier is disallowed in strict mode // Delete of an unqualified identifier is disallowed in strict mode
// but "delete this" is. // but "delete this" is.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment