Index: src/arm/codegen-arm.cc |
diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc |
index 3e125a33fcbb9d3ba306307ac03ee03de77516c1..f03504eedc07d62e74353f676ffb7b819ec560b6 100644 |
--- a/src/arm/codegen-arm.cc |
+++ b/src/arm/codegen-arm.cc |
@@ -1938,8 +1938,9 @@ void CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) { |
frame_->EmitPush(cp); |
frame_->EmitPush(Operand(pairs)); |
frame_->EmitPush(Operand(Smi::FromInt(is_eval() ? 1 : 0))); |
+ frame_->EmitPush(Operand(Smi::FromInt(strict_mode_flag()))); |
- frame_->CallRuntime(Runtime::kDeclareGlobals, 3); |
+ frame_->CallRuntime(Runtime::kDeclareGlobals, 4); |
// The result is discarded. |
} |
@@ -3287,7 +3288,8 @@ void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { |
// context slot followed by initialization. |
frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); |
} else { |
- frame_->CallRuntime(Runtime::kStoreContextSlot, 3); |
+ frame_->EmitPush(Operand(Smi::FromInt(strict_mode_flag()))); |
+ frame_->CallRuntime(Runtime::kStoreContextSlot, 4); |
} |
// Storing a variable must keep the (new) value on the expression |
// stack. This is necessary for compiling assignment expressions. |
@@ -3637,7 +3639,8 @@ void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { |
Load(key); |
Load(value); |
if (property->emit_store()) { |
- frame_->CallRuntime(Runtime::kSetProperty, 3); |
+ frame_->EmitPush(Operand(Smi::FromInt(NONE))); // PropertyAttributes |
+ frame_->CallRuntime(Runtime::kSetProperty, 4); |
} else { |
frame_->Drop(3); |
} |
@@ -6674,8 +6677,12 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { |
public: |
DeferredReferenceSetKeyedValue(Register value, |
Register key, |
- Register receiver) |
- : value_(value), key_(key), receiver_(receiver) { |
+ Register receiver, |
+ StrictModeFlag strict_mode) |
+ : value_(value), |
+ key_(key), |
+ receiver_(receiver), |
+ strict_mode_(strict_mode) { |
set_comment("[ DeferredReferenceSetKeyedValue"); |
} |
@@ -6685,6 +6692,7 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { |
Register value_; |
Register key_; |
Register receiver_; |
+ StrictModeFlag strict_mode_; |
}; |
@@ -6706,7 +6714,9 @@ void DeferredReferenceSetKeyedValue::Generate() { |
{ Assembler::BlockConstPoolScope block_const_pool(masm_); |
// Call keyed store IC. It has the arguments value, key and receiver in r0, |
// r1 and r2. |
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ (strict_mode_ == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict |
+ : Builtins::KeyedStoreIC_Initialize)); |
__ Call(ic, RelocInfo::CODE_TARGET); |
// The call must be followed by a nop instruction to indicate that the |
// keyed store has been inlined. |
@@ -6724,8 +6734,12 @@ class DeferredReferenceSetNamedValue: public DeferredCode { |
public: |
DeferredReferenceSetNamedValue(Register value, |
Register receiver, |
- Handle<String> name) |
- : value_(value), receiver_(receiver), name_(name) { |
+ Handle<String> name, |
+ StrictModeFlag strict_mode) |
+ : value_(value), |
+ receiver_(receiver), |
+ name_(name), |
+ strict_mode_(strict_mode) { |
set_comment("[ DeferredReferenceSetNamedValue"); |
} |
@@ -6735,6 +6749,7 @@ class DeferredReferenceSetNamedValue: public DeferredCode { |
Register value_; |
Register receiver_; |
Handle<String> name_; |
+ StrictModeFlag strict_mode_; |
}; |
@@ -6754,7 +6769,9 @@ void DeferredReferenceSetNamedValue::Generate() { |
{ Assembler::BlockConstPoolScope block_const_pool(masm_); |
// Call keyed store IC. It has the arguments value, key and receiver in r0, |
// r1 and r2. |
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ (strict_mode_ == kStrictMode) ? Builtins::StoreIC_Initialize_Strict |
+ : Builtins::StoreIC_Initialize)); |
__ Call(ic, RelocInfo::CODE_TARGET); |
// The call must be followed by a nop instruction to indicate that the |
// named store has been inlined. |
@@ -6943,7 +6960,8 @@ void CodeGenerator::EmitNamedStore(Handle<String> name, bool is_contextual) { |
Register receiver = r1; |
DeferredReferenceSetNamedValue* deferred = |
- new DeferredReferenceSetNamedValue(value, receiver, name); |
+ new DeferredReferenceSetNamedValue( |
+ value, receiver, name, strict_mode_flag()); |
// Check that the receiver is a heap object. |
__ tst(receiver, Operand(kSmiTagMask)); |
@@ -7129,7 +7147,8 @@ void CodeGenerator::EmitKeyedStore(StaticType* key_type, |
// The deferred code expects value, key and receiver in registers. |
DeferredReferenceSetKeyedValue* deferred = |
- new DeferredReferenceSetKeyedValue(value, key, receiver); |
+ new DeferredReferenceSetKeyedValue( |
+ value, key, receiver, strict_mode_flag()); |
// Check that the value is a smi. As this inlined code does not set the |
// write barrier it is only possible to store smi values. |
@@ -7214,7 +7233,7 @@ void CodeGenerator::EmitKeyedStore(StaticType* key_type, |
deferred->BindExit(); |
} else { |
- frame()->CallKeyedStoreIC(); |
+ frame()->CallKeyedStoreIC(strict_mode_flag()); |
} |
} |