| Index: src/x64/codegen-x64.cc
|
| diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
|
| index d713b75336f69da7c3354d3dc738d44d16ae2594..ad114c243108bbf89e2e336f873398a8ddfcfea5 100644
|
| --- a/src/x64/codegen-x64.cc
|
| +++ b/src/x64/codegen-x64.cc
|
| @@ -2747,7 +2747,8 @@ void CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
|
| frame_->EmitPush(rsi); // The context is the first argument.
|
| frame_->EmitPush(kScratchRegister);
|
| frame_->EmitPush(Smi::FromInt(is_eval() ? 1 : 0));
|
| - Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 3);
|
| + frame_->EmitPush(Smi::FromInt(strict_mode_flag()));
|
| + Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 4);
|
| // Return value is ignored.
|
| }
|
|
|
| @@ -4605,7 +4606,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
|
| @@ -4914,8 +4916,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);
|
| }
|
| @@ -8075,8 +8078,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");
|
| }
|
|
|
| @@ -8089,6 +8096,7 @@ class DeferredReferenceSetKeyedValue: public DeferredCode {
|
| Register key_;
|
| Register receiver_;
|
| Label patch_site_;
|
| + StrictModeFlag strict_mode_;
|
| };
|
|
|
|
|
| @@ -8140,7 +8148,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 instructions (initial movq)
|
| // to the test instruction. We use masm_-> directly here instead of the
|
| @@ -8481,7 +8491,8 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) {
|
| DeferredReferenceSetKeyedValue* deferred =
|
| new DeferredReferenceSetKeyedValue(result.reg(),
|
| key.reg(),
|
| - receiver.reg());
|
| + receiver.reg(),
|
| + strict_mode_flag());
|
|
|
| // Check that the receiver is not a smi.
|
| __ JumpIfSmi(receiver.reg(), deferred->entry_label());
|
| @@ -8543,7 +8554,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
|
|
|