Index: src/x64/full-codegen-x64.cc |
=================================================================== |
--- src/x64/full-codegen-x64.cc (revision 6193) |
+++ src/x64/full-codegen-x64.cc (working copy) |
@@ -459,7 +459,10 @@ |
void FullCodeGenerator::TestContext::Plug(bool flag) const { |
- codegen()->PrepareForBailoutBeforeSplit(TOS_REG, true, NULL, NULL); |
+ codegen()->PrepareForBailoutBeforeSplit(TOS_REG, |
+ true, |
+ true_label_, |
+ false_label_); |
if (flag) { |
if (true_label_ != fall_through_) __ jmp(true_label_); |
} else { |
@@ -1380,17 +1383,30 @@ |
VisitForStackValue(property->obj()); |
} |
break; |
- case KEYED_PROPERTY: |
+ case KEYED_PROPERTY: { |
if (expr->is_compound()) { |
- VisitForStackValue(property->obj()); |
- VisitForAccumulatorValue(property->key()); |
+ if (property->is_arguments_access()) { |
+ VariableProxy* obj_proxy = property->obj()->AsVariableProxy(); |
+ __ push(EmitSlotSearch(obj_proxy->var()->AsSlot(), rcx)); |
Kevin Millikin (Chromium)
2011/01/06 13:12:22
I know this is a duplication of the code on ia32,
William Hesse
2011/01/06 13:26:02
Fixed all places here and on ia32.
|
+ __ Move(rax, property->key()->AsLiteral()->handle()); |
+ } else { |
+ VisitForStackValue(property->obj()); |
+ VisitForAccumulatorValue(property->key()); |
+ } |
__ movq(rdx, Operand(rsp, 0)); |
__ push(rax); |
} else { |
- VisitForStackValue(property->obj()); |
- VisitForStackValue(property->key()); |
+ if (property->is_arguments_access()) { |
+ VariableProxy* obj_proxy = property->obj()->AsVariableProxy(); |
+ __ push(EmitSlotSearch(obj_proxy->var()->AsSlot(), rcx)); |
+ __ Push(property->key()->AsLiteral()->handle()); |
+ } else { |
+ VisitForStackValue(property->obj()); |
+ VisitForStackValue(property->key()); |
+ } |
} |
break; |
+ } |
} |
if (expr->is_compound()) { |
@@ -3119,8 +3135,14 @@ |
__ push(rax); // Copy of receiver, needed for later store. |
EmitNamedPropertyLoad(prop); |
} else { |
- VisitForStackValue(prop->obj()); |
- VisitForAccumulatorValue(prop->key()); |
+ if (prop->is_arguments_access()) { |
+ VariableProxy* obj_proxy = prop->obj()->AsVariableProxy(); |
+ __ push(EmitSlotSearch(obj_proxy->var()->AsSlot(), rcx)); |
+ __ Move(rax, prop->key()->AsLiteral()->handle()); |
+ } else { |
+ VisitForStackValue(prop->obj()); |
+ VisitForAccumulatorValue(prop->key()); |
+ } |
__ movq(rdx, Operand(rsp, 0)); // Leave receiver on stack |
__ push(rax); // Copy of key, needed for later store. |
EmitKeyedPropertyLoad(prop); |