Index: src/arm/full-codegen-arm.cc |
diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc |
index 254fd180f865f8b1ab06a04755ef4a89d4079e0d..2cba609aa3298f886cdd51d23d4aae6f45120e01 100644 |
--- a/src/arm/full-codegen-arm.cc |
+++ b/src/arm/full-codegen-arm.cc |
@@ -783,7 +783,9 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, |
prop->key()->AsLiteral()->handle()->IsSmi()); |
__ mov(r1, Operand(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); |
// Value in r0 is ignored (declarations are statements). |
} |
@@ -799,10 +801,11 @@ void FullCodeGenerator::VisitDeclaration(Declaration* decl) { |
void FullCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) { |
// Call the runtime to declare the globals. |
// The context is the first argument. |
- __ mov(r1, Operand(pairs)); |
- __ mov(r0, Operand(Smi::FromInt(is_eval() ? 1 : 0))); |
- __ Push(cp, r1, r0); |
- __ CallRuntime(Runtime::kDeclareGlobals, 3); |
+ __ mov(r2, Operand(pairs)); |
+ __ mov(r1, Operand(Smi::FromInt(is_eval() ? 1 : 0))); |
+ __ mov(r0, Operand(Smi::FromInt(strict_mode_flag()))); |
+ __ Push(cp, r2, r1, r0); |
+ __ CallRuntime(Runtime::kDeclareGlobals, 4); |
// Return value is ignored. |
} |
@@ -1446,7 +1449,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { |
VisitForStackValue(key); |
VisitForStackValue(value); |
if (property->emit_store()) { |
- __ CallRuntime(Runtime::kSetProperty, 3); |
+ __ mov(r0, Operand(Smi::FromInt(NONE))); // PropertyAttributes |
+ __ push(r0); |
+ __ CallRuntime(Runtime::kSetProperty, 4); |
} else { |
__ Drop(3); |
} |
@@ -2040,7 +2045,9 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { |
__ mov(r1, r0); |
__ pop(r0); // Restore value. |
__ mov(r2, Operand(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; |
} |
@@ -2061,7 +2068,9 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { |
__ pop(r2); |
} |
__ pop(r0); // 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; |
} |
@@ -2085,9 +2094,9 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, |
// r2, and the global object in r1. |
__ mov(r2, Operand(var->name())); |
__ ldr(r1, GlobalObjectOperand()); |
- Handle<Code> ic(Builtins::builtin(is_strict() |
- ? Builtins::StoreIC_Initialize_Strict |
- : Builtins::StoreIC_Initialize)); |
+ Handle<Code> ic(Builtins::builtin( |
+ is_strict() ? Builtins::StoreIC_Initialize_Strict |
+ : Builtins::StoreIC_Initialize)); |
EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); |
} else if (op == Token::INIT_CONST) { |
@@ -2156,9 +2165,10 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, |
case Slot::LOOKUP: |
// Call the runtime for the assignment. |
__ push(r0); // Value. |
- __ mov(r0, Operand(slot->var()->name())); |
- __ Push(cp, r0); // Context and name. |
- __ CallRuntime(Runtime::kStoreContextSlot, 3); |
+ __ mov(r1, Operand(slot->var()->name())); |
+ __ mov(r0, Operand(Smi::FromInt(strict_mode_flag()))); |
+ __ Push(cp, r1, r0); // Context, name, strict mode. |
+ __ CallRuntime(Runtime::kStoreContextSlot, 4); |
break; |
} |
} |
@@ -2193,7 +2203,9 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
__ pop(r1); |
} |
- 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. |
@@ -2237,7 +2249,9 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
__ pop(r2); |
} |
- 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. |
@@ -3757,7 +3771,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
case NAMED_PROPERTY: { |
__ mov(r2, Operand(prop->key()->AsLiteral()->handle())); |
__ pop(r1); |
- 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()) { |
@@ -3772,7 +3788,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { |
case KEYED_PROPERTY: { |
__ pop(r1); // Key. |
__ pop(r2); // Receiver. |
- 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()) { |