Chromium Code Reviews| 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); |