| Index: src/arm/codegen-arm.cc
|
| diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc
|
| index 3e125a33fcbb9d3ba306307ac03ee03de77516c1..e4309ba6835f0fb0e3a837b11b350c32cbfb4f77 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,9 @@ class DeferredReferenceSetKeyedValue: public DeferredCode {
|
| public:
|
| DeferredReferenceSetKeyedValue(Register value,
|
| Register key,
|
| - Register receiver)
|
| - : value_(value), key_(key), receiver_(receiver) {
|
| + Register receiver,
|
| + StrictModeFlag strict)
|
| + : value_(value), key_(key), receiver_(receiver), strict_(strict) {
|
| set_comment("[ DeferredReferenceSetKeyedValue");
|
| }
|
|
|
| @@ -6685,6 +6689,7 @@ class DeferredReferenceSetKeyedValue: public DeferredCode {
|
| Register value_;
|
| Register key_;
|
| Register receiver_;
|
| + StrictModeFlag strict_;
|
| };
|
|
|
|
|
| @@ -6706,7 +6711,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_ == 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 +6731,9 @@ class DeferredReferenceSetNamedValue: public DeferredCode {
|
| public:
|
| DeferredReferenceSetNamedValue(Register value,
|
| Register receiver,
|
| - Handle<String> name)
|
| - : value_(value), receiver_(receiver), name_(name) {
|
| + Handle<String> name,
|
| + StrictModeFlag strict)
|
| + : value_(value), receiver_(receiver), name_(name), strict_(strict) {
|
| set_comment("[ DeferredReferenceSetNamedValue");
|
| }
|
|
|
| @@ -6735,6 +6743,7 @@ class DeferredReferenceSetNamedValue: public DeferredCode {
|
| Register value_;
|
| Register receiver_;
|
| Handle<String> name_;
|
| + StrictModeFlag strict_;
|
| };
|
|
|
|
|
| @@ -6754,7 +6763,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_ == 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 +6954,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 +7141,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 +7227,7 @@ void CodeGenerator::EmitKeyedStore(StaticType* key_type,
|
|
|
| deferred->BindExit();
|
| } else {
|
| - frame()->CallKeyedStoreIC();
|
| + frame()->CallKeyedStoreIC(strict_mode_flag());
|
| }
|
| }
|
|
|
|
|