Index: src/x64/full-codegen-x64.cc |
diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc |
index 8711f42384558595a5b487651be8267bedb5fc85..9f931be5bc37e523dd05eb14db1dec3038531d6a 100644 |
--- a/src/x64/full-codegen-x64.cc |
+++ b/src/x64/full-codegen-x64.cc |
@@ -733,7 +733,9 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, |
prop->key()->AsLiteral()->handle()->IsSmi()); |
__ Move(rcx, prop->key()->AsLiteral()->handle()); |
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin(is_strict() |
+ ? Builtins::KeyedStoreIC_Initialize_Strict |
+ : Builtins::KeyedStoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
} |
} |
@@ -1333,7 +1335,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
VisitForStackValue(key); |
VisitForStackValue(value); |
if (property->emit_store()) { |
- __ CallRuntime(Runtime::kSetProperty, 3); |
+ __ Push(Smi::FromInt(NONE)); // PropertyAttributes |
+ __ CallRuntime(Runtime::kSetProperty, 4); |
} else { |
__ Drop(3); |
} |
@@ -1680,7 +1683,9 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { |
__ movq(rdx, rax); |
__ pop(rax); // Restore value. |
__ Move(rcx, prop->key()->AsLiteral()->handle()); |
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ is_strict() ? Builtins::StoreIC_Initialize_Strict |
+ : Builtins::StoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
break; |
} |
@@ -1701,7 +1706,9 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { |
__ pop(rdx); |
} |
__ pop(rax); // Restore value. |
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict |
+ : Builtins::KeyedStoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
break; |
} |
@@ -1776,7 +1783,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, |
// The runtime will ignore const redeclaration. |
__ CallRuntime(Runtime::kInitializeConstContextSlot, 3); |
} else { |
- __ CallRuntime(Runtime::kStoreContextSlot, 3); |
+ __ Push(Smi::FromInt(strict_mode_flag())); |
+ __ CallRuntime(Runtime::kStoreContextSlot, 4); |
} |
break; |
} |
@@ -1809,7 +1817,9 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
} else { |
__ pop(rdx); |
} |
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ is_strict() ? Builtins::StoreIC_Initialize_Strict |
+ : Builtins::StoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
// If the assignment ends an initialization block, revert to fast case. |
@@ -1847,7 +1857,9 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
} |
// Record source code position before IC call. |
SetSourcePosition(expr->position()); |
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict |
+ : Builtins::KeyedStoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
// If the assignment ends an initialization block, revert to fast case. |
@@ -3355,7 +3367,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
case NAMED_PROPERTY: { |
__ Move(rcx, prop->key()->AsLiteral()->handle()); |
__ pop(rdx); |
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ is_strict() ? Builtins::StoreIC_Initialize_Strict |
+ : Builtins::StoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
if (expr->is_postfix()) { |
@@ -3370,7 +3384,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
case KEYED_PROPERTY: { |
__ pop(rcx); |
__ pop(rdx); |
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict |
+ : Builtins::KeyedStoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET); |
PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
if (expr->is_postfix()) { |