Index: src/ia32/codegen-ia32.cc |
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc |
index ae544dc63b211ac43ea618e7d1ecde9178e2daaa..795567bc1ce8f75d51ac0f609f45e5d82b3314ce 100644 |
--- a/src/ia32/codegen-ia32.cc |
+++ b/src/ia32/codegen-ia32.cc |
@@ -3526,7 +3526,8 @@ void CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) { |
frame_->EmitPush(esi); // The context is the first argument. |
frame_->EmitPush(Immediate(pairs)); |
frame_->EmitPush(Immediate(Smi::FromInt(is_eval() ? 1 : 0))); |
- Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 3); |
+ frame_->EmitPush(Immediate(Smi::FromInt(strict_mode_flag()))); |
+ Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 4); |
// Return value is ignored. |
} |
@@ -5259,7 +5260,8 @@ void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { |
// by initialization. |
value = frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); |
} else { |
- value = frame_->CallRuntime(Runtime::kStoreContextSlot, 3); |
+ frame_->Push(Smi::FromInt(strict_mode_flag())); |
+ value = frame_->CallRuntime(Runtime::kStoreContextSlot, 4); |
} |
// Storing a variable must keep the (new) value on the expression |
// stack. This is necessary for compiling chained assignment |
@@ -5608,8 +5610,9 @@ void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { |
Load(property->key()); |
Load(property->value()); |
if (property->emit_store()) { |
+ frame_->Push(Smi::FromInt(NONE)); // PropertyAttributes |
// Ignore the result. |
- Result ignored = frame_->CallRuntime(Runtime::kSetProperty, 3); |
+ Result ignored = frame_->CallRuntime(Runtime::kSetProperty, 4); |
} else { |
frame_->Drop(3); |
} |
@@ -9458,11 +9461,13 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { |
DeferredReferenceSetKeyedValue(Register value, |
Register key, |
Register receiver, |
- Register scratch) |
+ Register scratch, |
+ StrictModeFlag strict_mode) |
: value_(value), |
key_(key), |
receiver_(receiver), |
- scratch_(scratch) { |
+ scratch_(scratch), |
+ strict_mode_(strict_mode) { |
set_comment("[ DeferredReferenceSetKeyedValue"); |
} |
@@ -9476,6 +9481,7 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { |
Register receiver_; |
Register scratch_; |
Label patch_site_; |
+ StrictModeFlag strict_mode_; |
}; |
@@ -9534,7 +9540,9 @@ void DeferredReferenceSetKeyedValue::Generate() { |
} |
// Call the IC stub. |
- 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 delta from the start of the map-compare instruction to the |
// test instruction. We use masm_-> directly here instead of the |
@@ -9896,7 +9904,8 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) { |
new DeferredReferenceSetKeyedValue(result.reg(), |
key.reg(), |
receiver.reg(), |
- tmp.reg()); |
+ tmp.reg(), |
+ strict_mode_flag()); |
// Check that the receiver is not a smi. |
__ test(receiver.reg(), Immediate(kSmiTagMask)); |
@@ -9951,7 +9960,7 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) { |
deferred->BindExit(); |
} else { |
- result = frame()->CallKeyedStoreIC(); |
+ result = frame()->CallKeyedStoreIC(strict_mode_flag()); |
// Make sure that we do not have a test instruction after the |
// call. A test instruction after the call is used to |
// indicate that we have generated an inline version of the |