| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 3578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3589 // Constant properties. | 3589 // Constant properties. |
| 3590 frame_->EmitPush(Operand(node->constant_properties())); | 3590 frame_->EmitPush(Operand(node->constant_properties())); |
| 3591 // Should the object literal have fast elements? | 3591 // Should the object literal have fast elements? |
| 3592 frame_->EmitPush(Operand(Smi::FromInt(node->fast_elements() ? 1 : 0))); | 3592 frame_->EmitPush(Operand(Smi::FromInt(node->fast_elements() ? 1 : 0))); |
| 3593 if (node->depth() > 1) { | 3593 if (node->depth() > 1) { |
| 3594 frame_->CallRuntime(Runtime::kCreateObjectLiteral, 4); | 3594 frame_->CallRuntime(Runtime::kCreateObjectLiteral, 4); |
| 3595 } else { | 3595 } else { |
| 3596 frame_->CallRuntime(Runtime::kCreateObjectLiteralShallow, 4); | 3596 frame_->CallRuntime(Runtime::kCreateObjectLiteralShallow, 4); |
| 3597 } | 3597 } |
| 3598 frame_->EmitPush(r0); // save the result | 3598 frame_->EmitPush(r0); // save the result |
| 3599 |
| 3600 // Mark all computed expressions that are bound to a key that |
| 3601 // is shadowed by a later occurrence of the same key. For the |
| 3602 // marked expressions, no store code is emitted. |
| 3603 node->CalculateEmitStore(); |
| 3604 |
| 3599 for (int i = 0; i < node->properties()->length(); i++) { | 3605 for (int i = 0; i < node->properties()->length(); i++) { |
| 3600 // At the start of each iteration, the top of stack contains | 3606 // At the start of each iteration, the top of stack contains |
| 3601 // the newly created object literal. | 3607 // the newly created object literal. |
| 3602 ObjectLiteral::Property* property = node->properties()->at(i); | 3608 ObjectLiteral::Property* property = node->properties()->at(i); |
| 3603 Literal* key = property->key(); | 3609 Literal* key = property->key(); |
| 3604 Expression* value = property->value(); | 3610 Expression* value = property->value(); |
| 3605 switch (property->kind()) { | 3611 switch (property->kind()) { |
| 3606 case ObjectLiteral::Property::CONSTANT: | 3612 case ObjectLiteral::Property::CONSTANT: |
| 3607 break; | 3613 break; |
| 3608 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 3614 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 3609 if (CompileTimeValue::IsCompileTimeValue(property->value())) break; | 3615 if (CompileTimeValue::IsCompileTimeValue(property->value())) break; |
| 3610 // else fall through | 3616 // else fall through |
| 3611 case ObjectLiteral::Property::COMPUTED: | 3617 case ObjectLiteral::Property::COMPUTED: |
| 3612 if (key->handle()->IsSymbol()) { | 3618 if (key->handle()->IsSymbol()) { |
| 3613 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); | 3619 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
| 3614 Load(value); | 3620 Load(value); |
| 3615 frame_->PopToR0(); | 3621 if (property->emit_store()) { |
| 3616 // Fetch the object literal. | 3622 frame_->PopToR0(); |
| 3617 frame_->SpillAllButCopyTOSToR1(); | 3623 // Fetch the object literal. |
| 3618 __ mov(r2, Operand(key->handle())); | 3624 frame_->SpillAllButCopyTOSToR1(); |
| 3619 frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); | 3625 __ mov(r2, Operand(key->handle())); |
| 3626 frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); |
| 3627 } else { |
| 3628 frame_->Drop(); |
| 3629 } |
| 3620 break; | 3630 break; |
| 3621 } | 3631 } |
| 3622 // else fall through | 3632 // else fall through |
| 3623 case ObjectLiteral::Property::PROTOTYPE: { | 3633 case ObjectLiteral::Property::PROTOTYPE: { |
| 3624 frame_->Dup(); | 3634 frame_->Dup(); |
| 3625 Load(key); | 3635 Load(key); |
| 3626 Load(value); | 3636 Load(value); |
| 3627 frame_->CallRuntime(Runtime::kSetProperty, 3); | 3637 if (property->emit_store()) { |
| 3638 frame_->CallRuntime(Runtime::kSetProperty, 3); |
| 3639 } else { |
| 3640 frame_->Drop(3); |
| 3641 } |
| 3628 break; | 3642 break; |
| 3629 } | 3643 } |
| 3630 case ObjectLiteral::Property::SETTER: { | 3644 case ObjectLiteral::Property::SETTER: { |
| 3631 frame_->Dup(); | 3645 frame_->Dup(); |
| 3632 Load(key); | 3646 Load(key); |
| 3633 frame_->EmitPush(Operand(Smi::FromInt(1))); | 3647 frame_->EmitPush(Operand(Smi::FromInt(1))); |
| 3634 Load(value); | 3648 Load(value); |
| 3635 frame_->CallRuntime(Runtime::kDefineAccessor, 4); | 3649 frame_->CallRuntime(Runtime::kDefineAccessor, 4); |
| 3636 break; | 3650 break; |
| 3637 } | 3651 } |
| (...skipping 3671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7309 BinaryOpIC::GetName(runtime_operands_type_)); | 7323 BinaryOpIC::GetName(runtime_operands_type_)); |
| 7310 return name_; | 7324 return name_; |
| 7311 } | 7325 } |
| 7312 | 7326 |
| 7313 | 7327 |
| 7314 #undef __ | 7328 #undef __ |
| 7315 | 7329 |
| 7316 } } // namespace v8::internal | 7330 } } // namespace v8::internal |
| 7317 | 7331 |
| 7318 #endif // V8_TARGET_ARCH_ARM | 7332 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |