From 749b69853a7efbf9975fdacc86e2aab07d17a1f5 Mon Sep 17 00:00:00 2001 From: "mmaly@chromium.org" Date: Tue, 1 Mar 2011 06:10:41 +0000 Subject: [PATCH] Revert "Assignment to read only properties throws in strict mode." This reverts commit 503f2a501e504f330821f247074e731aa649b1f0. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6977 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/api.cc | 6 +- src/arm/codegen-arm.cc | 43 +++----- src/arm/full-codegen-arm.cc | 54 ++++------ src/arm/ic-arm.cc | 27 ++--- src/arm/lithium-codegen-arm.cc | 10 +- src/arm/stub-cache-arm.cc | 12 +-- src/arm/virtual-frame-arm.cc | 12 +-- src/arm/virtual-frame-arm.h | 2 +- src/builtins.cc | 20 +--- src/builtins.h | 215 +++++++++++++++++++------------------- src/debug.cc | 3 +- src/handles.cc | 18 ++-- src/handles.h | 9 +- src/ia32/codegen-ia32.cc | 25 ++--- src/ia32/full-codegen-ia32.cc | 41 ++------ src/ia32/ic-ia32.cc | 27 ++--- src/ia32/lithium-codegen-ia32.cc | 8 +- src/ia32/stub-cache-ia32.cc | 10 +- src/ia32/virtual-frame-ia32.cc | 12 +-- src/ia32/virtual-frame-ia32.h | 2 +- src/ic-inl.h | 9 -- src/ic.cc | 102 +++++++----------- src/ic.h | 45 +++----- src/messages.js | 2 - src/objects-inl.h | 6 +- src/objects.cc | 41 ++------ src/objects.h | 12 +-- src/parser.cc | 57 ++++------ src/runtime.cc | 138 +++++++----------------- src/runtime.h | 11 +- src/stub-cache.cc | 78 ++++++-------- src/stub-cache.h | 33 +++--- src/x64/codegen-x64.cc | 27 ++--- src/x64/full-codegen-x64.cc | 37 ++----- src/x64/ic-x64.cc | 25 ++--- src/x64/lithium-codegen-x64.cc | 8 +- src/x64/stub-cache-x64.cc | 8 +- src/x64/virtual-frame-x64.cc | 12 +-- src/x64/virtual-frame-x64.h | 2 +- test/cctest/test-api.cc | 9 +- test/cctest/test-compiler.cc | 2 +- test/cctest/test-debug.cc | 3 +- test/cctest/test-heap.cc | 63 +++++------ test/cctest/test-mark-compact.cc | 11 +- test/es5conform/es5conform.status | 66 ++++++++++++ test/mjsunit/strict-mode.js | 115 -------------------- 46 files changed, 523 insertions(+), 955 deletions(-) diff --git a/src/api.cc b/src/api.cc index b77e450..d718c88 100644 --- a/src/api.cc +++ b/src/api.cc @@ -2286,8 +2286,7 @@ bool v8::Object::Set(v8::Handle key, v8::Handle value, self, key_obj, value_obj, - static_cast(attribs), - i::kNonStrictMode); + static_cast(attribs)); has_pending_exception = obj.is_null(); EXCEPTION_BAILOUT_CHECK(false); return true; @@ -2712,8 +2711,7 @@ bool v8::Object::SetHiddenValue(v8::Handle key, hidden_props, key_obj, value_obj, - static_cast(None), - i::kNonStrictMode); + static_cast(None)); has_pending_exception = obj.is_null(); EXCEPTION_BAILOUT_CHECK(false); return true; diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index f03504e..3e125a3 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -1938,9 +1938,8 @@ void CodeGenerator::DeclareGlobals(Handle 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, 4); + frame_->CallRuntime(Runtime::kDeclareGlobals, 3); // The result is discarded. } @@ -3288,8 +3287,7 @@ void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { // context slot followed by initialization. frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); } else { - frame_->EmitPush(Operand(Smi::FromInt(strict_mode_flag()))); - frame_->CallRuntime(Runtime::kStoreContextSlot, 4); + frame_->CallRuntime(Runtime::kStoreContextSlot, 3); } // Storing a variable must keep the (new) value on the expression // stack. This is necessary for compiling assignment expressions. @@ -3639,8 +3637,7 @@ void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { Load(key); Load(value); if (property->emit_store()) { - frame_->EmitPush(Operand(Smi::FromInt(NONE))); // PropertyAttributes - frame_->CallRuntime(Runtime::kSetProperty, 4); + frame_->CallRuntime(Runtime::kSetProperty, 3); } else { frame_->Drop(3); } @@ -6677,12 +6674,8 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { public: DeferredReferenceSetKeyedValue(Register value, Register key, - Register receiver, - StrictModeFlag strict_mode) - : value_(value), - key_(key), - receiver_(receiver), - strict_mode_(strict_mode) { + Register receiver) + : value_(value), key_(key), receiver_(receiver) { set_comment("[ DeferredReferenceSetKeyedValue"); } @@ -6692,7 +6685,6 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { Register value_; Register key_; Register receiver_; - StrictModeFlag strict_mode_; }; @@ -6714,9 +6706,7 @@ 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 ic(Builtins::builtin( - (strict_mode_ == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(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. @@ -6734,12 +6724,8 @@ class DeferredReferenceSetNamedValue: public DeferredCode { public: DeferredReferenceSetNamedValue(Register value, Register receiver, - Handle name, - StrictModeFlag strict_mode) - : value_(value), - receiver_(receiver), - name_(name), - strict_mode_(strict_mode) { + Handle name) + : value_(value), receiver_(receiver), name_(name) { set_comment("[ DeferredReferenceSetNamedValue"); } @@ -6749,7 +6735,6 @@ class DeferredReferenceSetNamedValue: public DeferredCode { Register value_; Register receiver_; Handle name_; - StrictModeFlag strict_mode_; }; @@ -6769,9 +6754,7 @@ 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 ic(Builtins::builtin( - (strict_mode_ == kStrictMode) ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(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. @@ -6960,8 +6943,7 @@ void CodeGenerator::EmitNamedStore(Handle name, bool is_contextual) { Register receiver = r1; DeferredReferenceSetNamedValue* deferred = - new DeferredReferenceSetNamedValue( - value, receiver, name, strict_mode_flag()); + new DeferredReferenceSetNamedValue(value, receiver, name); // Check that the receiver is a heap object. __ tst(receiver, Operand(kSmiTagMask)); @@ -7147,8 +7129,7 @@ void CodeGenerator::EmitKeyedStore(StaticType* key_type, // The deferred code expects value, key and receiver in registers. DeferredReferenceSetKeyedValue* deferred = - new DeferredReferenceSetKeyedValue( - value, key, receiver, strict_mode_flag()); + new DeferredReferenceSetKeyedValue(value, key, receiver); // 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. @@ -7233,7 +7214,7 @@ void CodeGenerator::EmitKeyedStore(StaticType* key_type, deferred->BindExit(); } else { - frame()->CallKeyedStoreIC(strict_mode_flag()); + frame()->CallKeyedStoreIC(); } } diff --git a/src/arm/full-codegen-arm.cc b/src/arm/full-codegen-arm.cc index a242870..9f521fb 100644 --- a/src/arm/full-codegen-arm.cc +++ b/src/arm/full-codegen-arm.cc @@ -793,9 +793,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, prop->key()->AsLiteral()->handle()->IsSmi()); __ mov(r1, Operand(prop->key()->AsLiteral()->handle())); - Handle ic(Builtins::builtin(is_strict() - ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); // Value in r0 is ignored (declarations are statements). } @@ -811,11 +809,10 @@ void FullCodeGenerator::VisitDeclaration(Declaration* decl) { void FullCodeGenerator::DeclareGlobals(Handle pairs) { // Call the runtime to declare the globals. // The context is the first argument. - __ 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); + __ mov(r1, Operand(pairs)); + __ mov(r0, Operand(Smi::FromInt(is_eval() ? 1 : 0))); + __ Push(cp, r1, r0); + __ CallRuntime(Runtime::kDeclareGlobals, 3); // Return value is ignored. } @@ -1459,9 +1456,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForStackValue(key); VisitForStackValue(value); if (property->emit_store()) { - __ mov(r0, Operand(Smi::FromInt(NONE))); // PropertyAttributes - __ push(r0); - __ CallRuntime(Runtime::kSetProperty, 4); + __ CallRuntime(Runtime::kSetProperty, 3); } else { __ Drop(3); } @@ -2055,9 +2050,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { __ mov(r1, r0); __ pop(r0); // Restore value. __ mov(r2, Operand(prop->key()->AsLiteral()->handle())); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); break; } @@ -2078,9 +2071,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { __ pop(r2); } __ pop(r0); // Restore value. - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); break; } @@ -2104,9 +2095,9 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, // r2, and the global object in r1. __ mov(r2, Operand(var->name())); __ ldr(r1, GlobalObjectOperand()); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(is_strict() + ? Builtins::StoreIC_Initialize_Strict + : Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT); } else if (op == Token::INIT_CONST) { @@ -2175,10 +2166,9 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, case Slot::LOOKUP: // Call the runtime for the assignment. __ push(r0); // Value. - __ 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); + __ mov(r0, Operand(slot->var()->name())); + __ Push(cp, r0); // Context and name. + __ CallRuntime(Runtime::kStoreContextSlot, 3); break; } } @@ -2213,9 +2203,7 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { __ pop(r1); } - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); // If the assignment ends an initialization block, revert to fast case. @@ -2259,9 +2247,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { __ pop(r2); } - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); // If the assignment ends an initialization block, revert to fast case. @@ -3781,9 +3767,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { case NAMED_PROPERTY: { __ mov(r2, Operand(prop->key()->AsLiteral()->handle())); __ pop(r1); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); if (expr->is_postfix()) { @@ -3798,9 +3782,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { case KEYED_PROPERTY: { __ pop(r1); // Key. __ pop(r2); // Receiver. - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); if (expr->is_postfix()) { diff --git a/src/arm/ic-arm.cc b/src/arm/ic-arm.cc index 0fc6818..6c7aa06 100644 --- a/src/arm/ic-arm.cc +++ b/src/arm/ic-arm.cc @@ -1400,8 +1400,7 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { } -void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) { // ---------- S t a t e -------------- // -- r0 : value // -- r1 : key @@ -1412,16 +1411,11 @@ void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, // Push receiver, key and value for runtime call. __ Push(r2, r1, r0); - __ mov(r1, Operand(Smi::FromInt(NONE))); // PropertyAttributes - __ mov(r0, Operand(Smi::FromInt(strict_mode))); // Strict mode. - __ Push(r1, r0); - - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); } -void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { // ---------- S t a t e -------------- // -- r0 : value // -- r1 : key @@ -1476,7 +1470,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, // r0: value. // r1: key. // r2: receiver. - GenerateRuntimeSetProperty(masm, strict_mode); + GenerateRuntimeSetProperty(masm); // Check whether the elements is a pixel array. // r4: elements map. @@ -1546,7 +1540,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, void StoreIC::GenerateMegamorphic(MacroAssembler* masm, - StrictModeFlag strict_mode) { + Code::ExtraICState extra_ic_state) { // ----------- S t a t e ------------- // -- r0 : value // -- r1 : receiver @@ -1558,7 +1552,7 @@ void StoreIC::GenerateMegamorphic(MacroAssembler* masm, Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, NOT_IN_LOOP, MONOMORPHIC, - strict_mode); + extra_ic_state); StubCache::GenerateProbe(masm, flags, r1, r2, r3, r4, r5); // Cache miss: Jump to runtime. @@ -1652,8 +1646,7 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { } -void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void StoreIC::GenerateGlobalProxy(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- r0 : value // -- r1 : receiver @@ -1663,12 +1656,8 @@ void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, __ Push(r1, r2, r0); - __ mov(r1, Operand(Smi::FromInt(NONE))); // PropertyAttributes - __ mov(r0, Operand(Smi::FromInt(strict_mode))); - __ Push(r1, r0); - // Do tail-call to runtime routine. - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); } diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 56debac..d375617 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -2863,9 +2863,9 @@ void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { // Name is always in r2. __ mov(r2, Operand(instr->name())); - Handle ic(Builtins::builtin( - info_->is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(info_->is_strict() + ? Builtins::StoreIC_Initialize_Strict + : Builtins::StoreIC_Initialize)); CallCode(ic, RelocInfo::CODE_TARGET, instr); } @@ -2907,9 +2907,7 @@ void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { ASSERT(ToRegister(instr->key()).is(r1)); ASSERT(ToRegister(instr->value()).is(r0)); - Handle ic(Builtins::builtin( - info_->is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); CallCode(ic, RelocInfo::CODE_TARGET, instr); } diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc index 60a11f3..e250112 100644 --- a/src/arm/stub-cache-arm.cc +++ b/src/arm/stub-cache-arm.cc @@ -2671,13 +2671,10 @@ MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, __ Push(r1, r2, r0); // Receiver, name, value. - __ mov(r0, Operand(Smi::FromInt(strict_mode_))); - __ push(r0); // strict mode - // Do tail-call to the runtime system. ExternalReference store_ic_property = ExternalReference(IC_Utility(IC::kStoreInterceptorProperty)); - __ TailCallExternalReference(store_ic_property, 4, 1); + __ TailCallExternalReference(store_ic_property, 3, 1); // Handle store cache miss. __ bind(&miss); @@ -4059,12 +4056,7 @@ MaybeObject* ExternalArrayStubCompiler::CompileKeyedStoreStub( // Push receiver, key and value for runtime call. __ Push(r2, r1, r0); - __ mov(r1, Operand(Smi::FromInt(NONE))); // PropertyAttributes - __ mov(r0, Operand(Smi::FromInt( - Code::ExtractExtraICStateFromFlags(flags) & kStrictMode))); - __ Push(r1, r0); - - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); return GetCode(flags); } diff --git a/src/arm/virtual-frame-arm.cc b/src/arm/virtual-frame-arm.cc index 544e405..b4b518c 100644 --- a/src/arm/virtual-frame-arm.cc +++ b/src/arm/virtual-frame-arm.cc @@ -332,9 +332,9 @@ void VirtualFrame::CallLoadIC(Handle name, RelocInfo::Mode mode) { void VirtualFrame::CallStoreIC(Handle name, bool is_contextual, StrictModeFlag strict_mode) { - Handle ic(Builtins::builtin( - (strict_mode == kStrictMode) ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(strict_mode == kStrictMode + ? Builtins::StoreIC_Initialize_Strict + : Builtins::StoreIC_Initialize)); PopToR0(); RelocInfo::Mode mode; if (is_contextual) { @@ -359,10 +359,8 @@ void VirtualFrame::CallKeyedLoadIC() { } -void VirtualFrame::CallKeyedStoreIC(StrictModeFlag strict_mode) { - Handle ic(Builtins::builtin( - (strict_mode == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); +void VirtualFrame::CallKeyedStoreIC() { + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); PopToR1R0(); SpillAll(); EmitPop(r2); diff --git a/src/arm/virtual-frame-arm.h b/src/arm/virtual-frame-arm.h index 76470bd..b6e794a 100644 --- a/src/arm/virtual-frame-arm.h +++ b/src/arm/virtual-frame-arm.h @@ -303,7 +303,7 @@ class VirtualFrame : public ZoneObject { // Call keyed store IC. Value, key and receiver are on the stack. All three // are consumed. Result is returned in r0. - void CallKeyedStoreIC(StrictModeFlag strict_mode); + void CallKeyedStoreIC(); // Call into an IC stub given the number of arguments it removes // from the stack. Register arguments to the IC stub are implicit, diff --git a/src/builtins.cc b/src/builtins.cc index 01e8deb..8fdc1b1 100644 --- a/src/builtins.cc +++ b/src/builtins.cc @@ -1328,12 +1328,12 @@ static void Generate_StoreIC_Normal_Strict(MacroAssembler* masm) { static void Generate_StoreIC_Megamorphic(MacroAssembler* masm) { - StoreIC::GenerateMegamorphic(masm, kNonStrictMode); + StoreIC::GenerateMegamorphic(masm, StoreIC::kStoreICNonStrict); } static void Generate_StoreIC_Megamorphic_Strict(MacroAssembler* masm) { - StoreIC::GenerateMegamorphic(masm, kStrictMode); + StoreIC::GenerateMegamorphic(masm, StoreIC::kStoreICStrict); } @@ -1348,22 +1348,17 @@ static void Generate_StoreIC_ArrayLength_Strict(MacroAssembler* masm) { static void Generate_StoreIC_GlobalProxy(MacroAssembler* masm) { - StoreIC::GenerateGlobalProxy(masm, kNonStrictMode); + StoreIC::GenerateGlobalProxy(masm); } static void Generate_StoreIC_GlobalProxy_Strict(MacroAssembler* masm) { - StoreIC::GenerateGlobalProxy(masm, kStrictMode); + StoreIC::GenerateGlobalProxy(masm); } static void Generate_KeyedStoreIC_Generic(MacroAssembler* masm) { - KeyedStoreIC::GenerateGeneric(masm, kNonStrictMode); -} - - -static void Generate_KeyedStoreIC_Generic_Strict(MacroAssembler* masm) { - KeyedStoreIC::GenerateGeneric(masm, kStrictMode); + KeyedStoreIC::GenerateGeneric(masm); } @@ -1377,11 +1372,6 @@ static void Generate_KeyedStoreIC_Initialize(MacroAssembler* masm) { } -static void Generate_KeyedStoreIC_Initialize_Strict(MacroAssembler* masm) { - KeyedStoreIC::GenerateInitialize(masm); -} - - #ifdef ENABLE_DEBUGGER_SUPPORT static void Generate_LoadIC_DebugBreak(MacroAssembler* masm) { Debug::GenerateLoadICDebugBreak(masm); diff --git a/src/builtins.h b/src/builtins.h index 5ea4665..2733410 100644 --- a/src/builtins.h +++ b/src/builtins.h @@ -62,116 +62,111 @@ enum BuiltinExtraArguments { // Define list of builtins implemented in assembly. -#define BUILTIN_LIST_A(V) \ - V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(JSConstructCall, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(JSConstructStubCountdown, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(JSConstructStubGeneric, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(JSConstructStubApi, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(JSEntryTrampoline, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(JSConstructEntryTrampoline, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(LazyCompile, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(LazyRecompile, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(NotifyDeoptimized, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(NotifyLazyDeoptimized, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(NotifyOSR, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - \ - V(LoadIC_Miss, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(KeyedLoadIC_Miss, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(StoreIC_Miss, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(KeyedStoreIC_Miss, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - \ - V(LoadIC_Initialize, LOAD_IC, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(LoadIC_PreMonomorphic, LOAD_IC, PREMONOMORPHIC, \ - Code::kNoExtraICState) \ - V(LoadIC_Normal, LOAD_IC, MONOMORPHIC, \ - Code::kNoExtraICState) \ - V(LoadIC_ArrayLength, LOAD_IC, MONOMORPHIC, \ - Code::kNoExtraICState) \ - V(LoadIC_StringLength, LOAD_IC, MONOMORPHIC, \ - Code::kNoExtraICState) \ - V(LoadIC_StringWrapperLength, LOAD_IC, MONOMORPHIC, \ - Code::kNoExtraICState) \ - V(LoadIC_FunctionPrototype, LOAD_IC, MONOMORPHIC, \ - Code::kNoExtraICState) \ - V(LoadIC_Megamorphic, LOAD_IC, MEGAMORPHIC, \ - Code::kNoExtraICState) \ - \ - V(KeyedLoadIC_Initialize, KEYED_LOAD_IC, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(KeyedLoadIC_PreMonomorphic, KEYED_LOAD_IC, PREMONOMORPHIC, \ - Code::kNoExtraICState) \ - V(KeyedLoadIC_Generic, KEYED_LOAD_IC, MEGAMORPHIC, \ - Code::kNoExtraICState) \ - V(KeyedLoadIC_String, KEYED_LOAD_IC, MEGAMORPHIC, \ - Code::kNoExtraICState) \ - V(KeyedLoadIC_IndexedInterceptor, KEYED_LOAD_IC, MEGAMORPHIC, \ - Code::kNoExtraICState) \ - \ - V(StoreIC_Initialize, STORE_IC, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(StoreIC_ArrayLength, STORE_IC, MONOMORPHIC, \ - Code::kNoExtraICState) \ - V(StoreIC_Normal, STORE_IC, MONOMORPHIC, \ - Code::kNoExtraICState) \ - V(StoreIC_Megamorphic, STORE_IC, MEGAMORPHIC, \ - Code::kNoExtraICState) \ - V(StoreIC_GlobalProxy, STORE_IC, MEGAMORPHIC, \ - Code::kNoExtraICState) \ - V(StoreIC_Initialize_Strict, STORE_IC, UNINITIALIZED, \ - kStrictMode) \ - V(StoreIC_ArrayLength_Strict, STORE_IC, MONOMORPHIC, \ - kStrictMode) \ - V(StoreIC_Normal_Strict, STORE_IC, MONOMORPHIC, \ - kStrictMode) \ - V(StoreIC_Megamorphic_Strict, STORE_IC, MEGAMORPHIC, \ - kStrictMode) \ - V(StoreIC_GlobalProxy_Strict, STORE_IC, MEGAMORPHIC, \ - kStrictMode) \ - \ - V(KeyedStoreIC_Initialize, KEYED_STORE_IC, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(KeyedStoreIC_Generic, KEYED_STORE_IC, MEGAMORPHIC, \ - Code::kNoExtraICState) \ - \ - V(KeyedStoreIC_Initialize_Strict, KEYED_STORE_IC, UNINITIALIZED, \ - kStrictMode) \ - V(KeyedStoreIC_Generic_Strict, KEYED_STORE_IC, MEGAMORPHIC, \ - kStrictMode) \ - \ - /* Uses KeyedLoadIC_Initialize; must be after in list. */ \ - V(FunctionCall, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(FunctionApply, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - \ - V(ArrayCode, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - V(ArrayConstructCode, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - \ - V(StringConstructCode, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) \ - \ - V(OnStackReplacement, BUILTIN, UNINITIALIZED, \ - Code::kNoExtraICState) +#define BUILTIN_LIST_A(V) \ + V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(JSConstructCall, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(JSConstructStubCountdown, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(JSConstructStubGeneric, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(JSConstructStubApi, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(JSEntryTrampoline, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(JSConstructEntryTrampoline, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(LazyCompile, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(LazyRecompile, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(NotifyDeoptimized, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(NotifyLazyDeoptimized, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(NotifyOSR, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + \ + V(LoadIC_Miss, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(KeyedLoadIC_Miss, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(StoreIC_Miss, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(KeyedStoreIC_Miss, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + \ + V(LoadIC_Initialize, LOAD_IC, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(LoadIC_PreMonomorphic, LOAD_IC, PREMONOMORPHIC, \ + Code::kNoExtraICState) \ + V(LoadIC_Normal, LOAD_IC, MONOMORPHIC, \ + Code::kNoExtraICState) \ + V(LoadIC_ArrayLength, LOAD_IC, MONOMORPHIC, \ + Code::kNoExtraICState) \ + V(LoadIC_StringLength, LOAD_IC, MONOMORPHIC, \ + Code::kNoExtraICState) \ + V(LoadIC_StringWrapperLength, LOAD_IC, MONOMORPHIC, \ + Code::kNoExtraICState) \ + V(LoadIC_FunctionPrototype, LOAD_IC, MONOMORPHIC, \ + Code::kNoExtraICState) \ + V(LoadIC_Megamorphic, LOAD_IC, MEGAMORPHIC, \ + Code::kNoExtraICState) \ + \ + V(KeyedLoadIC_Initialize, KEYED_LOAD_IC, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(KeyedLoadIC_PreMonomorphic, KEYED_LOAD_IC, PREMONOMORPHIC, \ + Code::kNoExtraICState) \ + V(KeyedLoadIC_Generic, KEYED_LOAD_IC, MEGAMORPHIC, \ + Code::kNoExtraICState) \ + V(KeyedLoadIC_String, KEYED_LOAD_IC, MEGAMORPHIC, \ + Code::kNoExtraICState) \ + V(KeyedLoadIC_IndexedInterceptor, KEYED_LOAD_IC, MEGAMORPHIC, \ + Code::kNoExtraICState) \ + \ + V(StoreIC_Initialize, STORE_IC, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(StoreIC_ArrayLength, STORE_IC, MONOMORPHIC, \ + Code::kNoExtraICState) \ + V(StoreIC_Normal, STORE_IC, MONOMORPHIC, \ + Code::kNoExtraICState) \ + V(StoreIC_Megamorphic, STORE_IC, MEGAMORPHIC, \ + Code::kNoExtraICState) \ + V(StoreIC_GlobalProxy, STORE_IC, MEGAMORPHIC, \ + Code::kNoExtraICState) \ + V(StoreIC_Initialize_Strict, STORE_IC, UNINITIALIZED, \ + StoreIC::kStoreICStrict) \ + V(StoreIC_ArrayLength_Strict, STORE_IC, MONOMORPHIC, \ + StoreIC::kStoreICStrict) \ + V(StoreIC_Normal_Strict, STORE_IC, MONOMORPHIC, \ + StoreIC::kStoreICStrict) \ + V(StoreIC_Megamorphic_Strict, STORE_IC, MEGAMORPHIC, \ + StoreIC::kStoreICStrict) \ + V(StoreIC_GlobalProxy_Strict, STORE_IC, MEGAMORPHIC, \ + StoreIC::kStoreICStrict) \ + \ + V(KeyedStoreIC_Initialize, KEYED_STORE_IC, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(KeyedStoreIC_Generic, KEYED_STORE_IC, MEGAMORPHIC, \ + Code::kNoExtraICState) \ + \ + /* Uses KeyedLoadIC_Initialize; must be after in list. */ \ + V(FunctionCall, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(FunctionApply, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + \ + V(ArrayCode, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + V(ArrayConstructCode, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + \ + V(StringConstructCode, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) \ + \ + V(OnStackReplacement, BUILTIN, UNINITIALIZED, \ + Code::kNoExtraICState) #ifdef ENABLE_DEBUGGER_SUPPORT diff --git a/src/debug.cc b/src/debug.cc index c473941..d8201a1 100644 --- a/src/debug.cc +++ b/src/debug.cc @@ -836,8 +836,7 @@ bool Debug::Load() { Handle key = Factory::LookupAsciiSymbol("builtins"); Handle global = Handle(context->global()); RETURN_IF_EMPTY_HANDLE_VALUE( - SetProperty(global, key, Handle(global->builtins()), - NONE, kNonStrictMode), + SetProperty(global, key, Handle(global->builtins()), NONE), false); // Compile the JavaScript for the debugger in the debugger context. diff --git a/src/handles.cc b/src/handles.cc index 05c81bb..8b2f95b 100644 --- a/src/handles.cc +++ b/src/handles.cc @@ -242,21 +242,17 @@ Handle SetPrototype(Handle function, Handle SetProperty(Handle object, Handle key, Handle value, - PropertyAttributes attributes, - StrictModeFlag strict) { - CALL_HEAP_FUNCTION(object->SetProperty(*key, *value, attributes, strict), - Object); + PropertyAttributes attributes) { + CALL_HEAP_FUNCTION(object->SetProperty(*key, *value, attributes), Object); } Handle SetProperty(Handle object, Handle key, Handle value, - PropertyAttributes attributes, - StrictModeFlag strict) { + PropertyAttributes attributes) { CALL_HEAP_FUNCTION( - Runtime::SetObjectProperty(object, key, value, attributes, strict), - Object); + Runtime::SetObjectProperty(object, key, value, attributes), Object); } @@ -308,12 +304,10 @@ void SetLocalPropertyNoThrow(Handle object, Handle SetPropertyWithInterceptor(Handle object, Handle key, Handle value, - PropertyAttributes attributes, - StrictModeFlag strict) { + PropertyAttributes attributes) { CALL_HEAP_FUNCTION(object->SetPropertyWithInterceptor(*key, *value, - attributes, - strict), + attributes), Object); } diff --git a/src/handles.h b/src/handles.h index c4e9925..8f1664b 100644 --- a/src/handles.h +++ b/src/handles.h @@ -246,14 +246,12 @@ Handle FlattenGetString(Handle str); Handle SetProperty(Handle object, Handle key, Handle value, - PropertyAttributes attributes, - StrictModeFlag strict); + PropertyAttributes attributes); Handle SetProperty(Handle object, Handle key, Handle value, - PropertyAttributes attributes, - StrictModeFlag strict); + PropertyAttributes attributes); Handle ForceSetProperty(Handle object, Handle key, @@ -284,8 +282,7 @@ void SetLocalPropertyNoThrow(Handle object, Handle SetPropertyWithInterceptor(Handle object, Handle key, Handle value, - PropertyAttributes attributes, - StrictModeFlag strict); + PropertyAttributes attributes); Handle SetElement(Handle object, uint32_t index, diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc index 1318622..770ec0b 100644 --- a/src/ia32/codegen-ia32.cc +++ b/src/ia32/codegen-ia32.cc @@ -3526,8 +3526,7 @@ void CodeGenerator::DeclareGlobals(Handle pairs) { frame_->EmitPush(esi); // The context is the first argument. frame_->EmitPush(Immediate(pairs)); frame_->EmitPush(Immediate(Smi::FromInt(is_eval() ? 1 : 0))); - frame_->EmitPush(Immediate(Smi::FromInt(strict_mode_flag()))); - Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 4); + Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 3); // Return value is ignored. } @@ -5260,8 +5259,7 @@ void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { // by initialization. value = frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); } else { - frame_->Push(Smi::FromInt(strict_mode_flag())); - value = frame_->CallRuntime(Runtime::kStoreContextSlot, 4); + value = frame_->CallRuntime(Runtime::kStoreContextSlot, 3); } // Storing a variable must keep the (new) value on the expression // stack. This is necessary for compiling chained assignment @@ -5620,9 +5618,8 @@ 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, 4); + Result ignored = frame_->CallRuntime(Runtime::kSetProperty, 3); } else { frame_->Drop(3); } @@ -9471,13 +9468,11 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { DeferredReferenceSetKeyedValue(Register value, Register key, Register receiver, - Register scratch, - StrictModeFlag strict_mode) + Register scratch) : value_(value), key_(key), receiver_(receiver), - scratch_(scratch), - strict_mode_(strict_mode) { + scratch_(scratch) { set_comment("[ DeferredReferenceSetKeyedValue"); } @@ -9491,7 +9486,6 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { Register receiver_; Register scratch_; Label patch_site_; - StrictModeFlag strict_mode_; }; @@ -9550,9 +9544,7 @@ void DeferredReferenceSetKeyedValue::Generate() { } // Call the IC stub. - Handle ic(Builtins::builtin( - (strict_mode_ == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(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 @@ -9914,8 +9906,7 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) { new DeferredReferenceSetKeyedValue(result.reg(), key.reg(), receiver.reg(), - tmp.reg(), - strict_mode_flag()); + tmp.reg()); // Check that the receiver is not a smi. __ test(receiver.reg(), Immediate(kSmiTagMask)); @@ -9970,7 +9961,7 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) { deferred->BindExit(); } else { - result = frame()->CallKeyedStoreIC(strict_mode_flag()); + result = frame()->CallKeyedStoreIC(); // 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 diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc index 566b9a7..4255347 100644 --- a/src/ia32/full-codegen-ia32.cc +++ b/src/ia32/full-codegen-ia32.cc @@ -741,9 +741,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, prop->key()->AsLiteral()->handle()->IsSmi()); __ Set(ecx, Immediate(prop->key()->AsLiteral()->handle())); - Handle ic(Builtins::builtin(is_strict() - ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); } } @@ -760,8 +758,7 @@ void FullCodeGenerator::DeclareGlobals(Handle pairs) { __ push(esi); // The context is the first argument. __ push(Immediate(pairs)); __ push(Immediate(Smi::FromInt(is_eval() ? 1 : 0))); - __ push(Immediate(Smi::FromInt(strict_mode_flag()))); - __ CallRuntime(Runtime::kDeclareGlobals, 4); + __ CallRuntime(Runtime::kDeclareGlobals, 3); // Return value is ignored. } @@ -1383,9 +1380,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForAccumulatorValue(value); __ mov(ecx, Immediate(key->handle())); __ mov(edx, Operand(esp, 0)); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); PrepareForBailoutForId(key->id(), NO_REGISTERS); } else { @@ -1399,8 +1394,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForStackValue(key); VisitForStackValue(value); if (property->emit_store()) { - __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes - __ CallRuntime(Runtime::kSetProperty, 4); + __ CallRuntime(Runtime::kSetProperty, 3); } else { __ Drop(3); } @@ -1991,9 +1985,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { __ mov(edx, eax); __ pop(eax); // Restore value. __ mov(ecx, prop->key()->AsLiteral()->handle()); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); break; } @@ -2014,9 +2006,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { __ pop(edx); } __ pop(eax); // Restore value. - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); break; } @@ -2111,8 +2101,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, __ push(eax); // Value. __ push(esi); // Context. __ push(Immediate(var->name())); - __ push(Immediate(Smi::FromInt(strict_mode_flag()))); - __ CallRuntime(Runtime::kStoreContextSlot, 4); + __ CallRuntime(Runtime::kStoreContextSlot, 3); break; } } @@ -2143,9 +2132,7 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { } else { __ pop(edx); } - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); // If the assignment ends an initialization block, revert to fast case. @@ -2183,9 +2170,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { } // Record source code position before IC call. SetSourcePosition(expr->position()); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); // If the assignment ends an initialization block, revert to fast case. @@ -4040,9 +4025,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { case NAMED_PROPERTY: { __ mov(ecx, prop->key()->AsLiteral()->handle()); __ pop(edx); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); if (expr->is_postfix()) { @@ -4057,9 +4040,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { case KEYED_PROPERTY: { __ pop(ecx); __ pop(edx); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); if (expr->is_postfix()) { diff --git a/src/ia32/ic-ia32.cc b/src/ia32/ic-ia32.cc index 6b9e749..73cd60d 100644 --- a/src/ia32/ic-ia32.cc +++ b/src/ia32/ic-ia32.cc @@ -761,8 +761,7 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { } -void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- eax : value // -- ecx : key @@ -802,7 +801,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, // Slow case: call runtime. __ bind(&slow); - GenerateRuntimeSetProperty(masm, strict_mode); + GenerateRuntimeSetProperty(masm); // Check whether the elements is a pixel array. __ bind(&check_pixel_array); @@ -1489,7 +1488,7 @@ void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { void StoreIC::GenerateMegamorphic(MacroAssembler* masm, - StrictModeFlag strict_mode) { + Code::ExtraICState extra_ic_state) { // ----------- S t a t e ------------- // -- eax : value // -- ecx : name @@ -1500,7 +1499,7 @@ void StoreIC::GenerateMegamorphic(MacroAssembler* masm, Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, NOT_IN_LOOP, MONOMORPHIC, - strict_mode); + extra_ic_state); StubCache::GenerateProbe(masm, flags, edx, ecx, ebx, no_reg); // Cache miss: Jump to runtime. @@ -1618,8 +1617,7 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { } -void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void StoreIC::GenerateGlobalProxy(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- eax : value // -- ecx : name @@ -1630,17 +1628,14 @@ void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, __ push(edx); __ push(ecx); __ push(eax); - __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes - __ push(Immediate(Smi::FromInt(strict_mode))); - __ push(ebx); // return address + __ push(ebx); // Do tail-call to runtime routine. - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); } -void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- eax : value // -- ecx : key @@ -1652,12 +1647,10 @@ void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, __ push(edx); __ push(ecx); __ push(eax); - __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes - __ push(Immediate(Smi::FromInt(strict_mode))); // Strict mode. - __ push(ebx); // return address + __ push(ebx); // Do tail-call to runtime routine. - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); } diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 8fab7ce..c7424a5 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -2786,9 +2786,7 @@ void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { ASSERT(ToRegister(instr->value()).is(eax)); __ mov(ecx, instr->name()); - Handle ic(Builtins::builtin( - info_->is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); CallCode(ic, RelocInfo::CODE_TARGET, instr); } @@ -2856,9 +2854,7 @@ void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { ASSERT(ToRegister(instr->key()).is(ecx)); ASSERT(ToRegister(instr->value()).is(eax)); - Handle ic(Builtins::builtin( - info_->is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); CallCode(ic, RelocInfo::CODE_TARGET, instr); } diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc index 633097a..51cc46a 100644 --- a/src/ia32/stub-cache-ia32.cc +++ b/src/ia32/stub-cache-ia32.cc @@ -2552,13 +2552,12 @@ MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, __ push(edx); // receiver __ push(ecx); // name __ push(eax); // value - __ push(Immediate(Smi::FromInt(strict_mode_))); __ push(ebx); // restore return address // Do tail-call to the runtime system. ExternalReference store_ic_property = ExternalReference(IC_Utility(IC::kStoreInterceptorProperty)); - __ TailCallExternalReference(store_ic_property, 4, 1); + __ TailCallExternalReference(store_ic_property, 3, 1); // Handle store cache miss. __ bind(&miss); @@ -3713,13 +3712,10 @@ MaybeObject* ExternalArrayStubCompiler::CompileKeyedStoreStub( __ push(edx); __ push(ecx); __ push(eax); - __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes - __ push(Immediate(Smi::FromInt( - Code::ExtractExtraICStateFromFlags(flags) & kStrictMode))); - __ push(ebx); // return address + __ push(ebx); // Do tail-call to runtime routine. - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); return GetCode(flags); } diff --git a/src/ia32/virtual-frame-ia32.cc b/src/ia32/virtual-frame-ia32.cc index 5e2cbee..515a9fe 100644 --- a/src/ia32/virtual-frame-ia32.cc +++ b/src/ia32/virtual-frame-ia32.cc @@ -1038,9 +1038,9 @@ Result VirtualFrame::CallStoreIC(Handle name, StrictModeFlag strict_mode) { // Value and (if not contextual) receiver are on top of the frame. // The IC expects name in ecx, value in eax, and receiver in edx. - Handle ic(Builtins::builtin( - (strict_mode == kStrictMode) ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(strict_mode == kStrictMode + ? Builtins::StoreIC_Initialize_Strict + : Builtins::StoreIC_Initialize)); Result value = Pop(); RelocInfo::Mode mode; @@ -1061,7 +1061,7 @@ Result VirtualFrame::CallStoreIC(Handle name, } -Result VirtualFrame::CallKeyedStoreIC(StrictModeFlag strict_mode) { +Result VirtualFrame::CallKeyedStoreIC() { // Value, key, and receiver are on the top of the frame. The IC // expects value in eax, key in ecx, and receiver in edx. Result value = Pop(); @@ -1105,9 +1105,7 @@ Result VirtualFrame::CallKeyedStoreIC(StrictModeFlag strict_mode) { receiver.Unuse(); } - Handle ic(Builtins::builtin( - (strict_mode == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); return RawCallCodeObject(ic, RelocInfo::CODE_TARGET); } diff --git a/src/ia32/virtual-frame-ia32.h b/src/ia32/virtual-frame-ia32.h index f5d0e8d..93362b4 100644 --- a/src/ia32/virtual-frame-ia32.h +++ b/src/ia32/virtual-frame-ia32.h @@ -370,7 +370,7 @@ class VirtualFrame: public ZoneObject { // Call keyed store IC. Value, key, and receiver are found on top // of the frame. All three are dropped. - Result CallKeyedStoreIC(StrictModeFlag strict_mode); + Result CallKeyedStoreIC(); // Call call IC. Function name, arguments, and receiver are found on top // of the frame and dropped by the call. The argument count does not diff --git a/src/ic-inl.h b/src/ic-inl.h index 9d358ed..8fbc184 100644 --- a/src/ic-inl.h +++ b/src/ic-inl.h @@ -76,15 +76,6 @@ Code* IC::GetTargetAtAddress(Address address) { void IC::SetTargetAtAddress(Address address, Code* target) { ASSERT(target->is_inline_cache_stub() || target->is_compare_ic_stub()); -#ifdef DEBUG - // STORE_IC and KEYED_STORE_IC use Code::extra_ic_state() to mark - // ICs as strict mode. The strict-ness of the IC must be preserved. - Code* old_target = GetTargetAtAddress(address); - if (old_target->kind() == Code::STORE_IC || - old_target->kind() == Code::KEYED_STORE_IC) { - ASSERT(old_target->extra_ic_state() == target->extra_ic_state()); - } -#endif Assembler::set_target_address_at(address, target->instruction_start()); } diff --git a/src/ic.cc b/src/ic.cc index 2d666d6..4f75ade 100644 --- a/src/ic.cc +++ b/src/ic.cc @@ -343,7 +343,7 @@ void StoreIC::Clear(Address address, Code* target) { if (target->ic_state() == UNINITIALIZED) return; ClearInlinedVersion(address); SetTargetAtAddress(address, - (target->extra_ic_state() == kStrictMode) + target->extra_ic_state() == kStoreICStrict ? initialize_stub_strict() : initialize_stub()); } @@ -366,10 +366,7 @@ void KeyedStoreIC::RestoreInlinedVersion(Address address) { void KeyedStoreIC::Clear(Address address, Code* target) { if (target->ic_state() == UNINITIALIZED) return; - SetTargetAtAddress(address, - (target->extra_ic_state() == kStrictMode) - ? initialize_stub_strict() - : initialize_stub()); + SetTargetAtAddress(address, initialize_stub()); } @@ -1230,8 +1227,7 @@ MaybeObject* KeyedLoadIC::Load(State state, if (receiver->HasExternalArrayElements()) { MaybeObject* probe = StubCache::ComputeKeyedLoadOrStoreExternalArray(*receiver, - false, - kNonStrictMode); + false); stub = probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); } else if (receiver->HasIndexedInterceptor()) { @@ -1387,7 +1383,7 @@ static bool LookupForWrite(JSObject* object, MaybeObject* StoreIC::Store(State state, - StrictModeFlag strict_mode, + Code::ExtraICState extra_ic_state, Handle object, Handle name, Handle value) { @@ -1417,11 +1413,11 @@ MaybeObject* StoreIC::Store(State state, #ifdef DEBUG if (FLAG_trace_ic) PrintF("[StoreIC : +#length /array]\n"); #endif - Builtins::Name target = (strict_mode == kStrictMode) + Builtins::Name target = (extra_ic_state == kStoreICStrict) ? Builtins::StoreIC_ArrayLength_Strict : Builtins::StoreIC_ArrayLength; set_target(Builtins::builtin(target)); - return receiver->SetProperty(*name, *value, NONE, strict_mode); + return receiver->SetProperty(*name, *value, NONE); } // Lookup the property locally in the receiver. @@ -1445,15 +1441,13 @@ MaybeObject* StoreIC::Store(State state, // Index is an offset from the end of the object. int offset = map->instance_size() + (index * kPointerSize); if (PatchInlinedStore(address(), map, offset)) { - set_target((strict_mode == kStrictMode) - ? megamorphic_stub_strict() - : megamorphic_stub()); + set_target(megamorphic_stub()); #ifdef DEBUG if (FLAG_trace_ic) { PrintF("[StoreIC : inline patch %s]\n", *name->ToCString()); } #endif - return receiver->SetProperty(*name, *value, NONE, strict_mode); + return receiver->SetProperty(*name, *value, NONE); #ifdef DEBUG } else { @@ -1480,16 +1474,11 @@ MaybeObject* StoreIC::Store(State state, // If no inlined store ic was patched, generate a stub for this // store. - UpdateCaches(&lookup, state, strict_mode, receiver, name, value); + UpdateCaches(&lookup, state, extra_ic_state, receiver, name, value); } else { - // Strict mode doesn't allow setting non-existent global property - // or an assignment to a read only property. - if (strict_mode == kStrictMode) { - if (lookup.IsFound() && lookup.IsReadOnly()) { - return TypeError("strict_read_only_property", object, name); - } else if (IsContextual(object)) { - return ReferenceError("not_defined", name); - } + // Strict mode doesn't allow setting non-existent global property. + if (extra_ic_state == kStoreICStrict && IsContextual(object)) { + return ReferenceError("not_defined", name); } } } @@ -1497,7 +1486,7 @@ MaybeObject* StoreIC::Store(State state, if (receiver->IsJSGlobalProxy()) { // Generate a generic stub that goes to the runtime when we see a global // proxy as receiver. - Code* stub = (strict_mode == kStrictMode) + Code* stub = (extra_ic_state == kStoreICStrict) ? global_proxy_stub_strict() : global_proxy_stub(); if (target() != stub) { @@ -1509,13 +1498,13 @@ MaybeObject* StoreIC::Store(State state, } // Set the property. - return receiver->SetProperty(*name, *value, NONE, strict_mode); + return receiver->SetProperty(*name, *value, NONE); } void StoreIC::UpdateCaches(LookupResult* lookup, State state, - StrictModeFlag strict_mode, + Code::ExtraICState extra_ic_state, Handle receiver, Handle name, Handle value) { @@ -1537,7 +1526,7 @@ void StoreIC::UpdateCaches(LookupResult* lookup, switch (type) { case FIELD: { maybe_code = StubCache::ComputeStoreField( - *name, *receiver, lookup->GetFieldIndex(), NULL, strict_mode); + *name, *receiver, lookup->GetFieldIndex(), NULL, extra_ic_state); break; } case MAP_TRANSITION: { @@ -1547,7 +1536,7 @@ void StoreIC::UpdateCaches(LookupResult* lookup, Handle transition(lookup->GetTransitionMap()); int index = transition->PropertyIndexFor(*name); maybe_code = StubCache::ComputeStoreField( - *name, *receiver, index, *transition, strict_mode); + *name, *receiver, index, *transition, extra_ic_state); break; } case NORMAL: { @@ -1559,10 +1548,10 @@ void StoreIC::UpdateCaches(LookupResult* lookup, JSGlobalPropertyCell* cell = JSGlobalPropertyCell::cast(global->GetPropertyCell(lookup)); maybe_code = StubCache::ComputeStoreGlobal( - *name, *global, cell, strict_mode); + *name, *global, cell, extra_ic_state); } else { if (lookup->holder() != *receiver) return; - maybe_code = StubCache::ComputeStoreNormal(strict_mode); + maybe_code = StubCache::ComputeStoreNormal(extra_ic_state); } break; } @@ -1571,13 +1560,13 @@ void StoreIC::UpdateCaches(LookupResult* lookup, AccessorInfo* callback = AccessorInfo::cast(lookup->GetCallbackObject()); if (v8::ToCData
(callback->setter()) == 0) return; maybe_code = StubCache::ComputeStoreCallback( - *name, *receiver, callback, strict_mode); + *name, *receiver, callback, extra_ic_state); break; } case INTERCEPTOR: { ASSERT(!receiver->GetNamedInterceptor()->setter()->IsUndefined()); maybe_code = StubCache::ComputeStoreInterceptor( - *name, *receiver, strict_mode); + *name, *receiver, extra_ic_state); break; } default: @@ -1594,7 +1583,7 @@ void StoreIC::UpdateCaches(LookupResult* lookup, } else if (state == MONOMORPHIC) { // Only move to megamorphic if the target changes. if (target() != Code::cast(code)) { - set_target((strict_mode == kStrictMode) + set_target(extra_ic_state == kStoreICStrict ? megamorphic_stub_strict() : megamorphic_stub()); } @@ -1610,7 +1599,6 @@ void StoreIC::UpdateCaches(LookupResult* lookup, MaybeObject* KeyedStoreIC::Store(State state, - StrictModeFlag strict_mode, Handle object, Handle key, Handle value) { @@ -1642,11 +1630,11 @@ MaybeObject* KeyedStoreIC::Store(State state, // Update inline cache and stub cache. if (FLAG_use_ic) { - UpdateCaches(&lookup, state, strict_mode, receiver, name, value); + UpdateCaches(&lookup, state, receiver, name, value); } // Set the property. - return receiver->SetProperty(*name, *value, NONE, strict_mode); + return receiver->SetProperty(*name, *value, NONE); } // Do not use ICs for objects that require access checks (including @@ -1655,25 +1643,23 @@ MaybeObject* KeyedStoreIC::Store(State state, ASSERT(!(use_ic && object->IsJSGlobalProxy())); if (use_ic) { - Code* stub = - (strict_mode == kStrictMode) ? generic_stub_strict() : generic_stub(); + Code* stub = generic_stub(); if (state == UNINITIALIZED) { if (object->IsJSObject()) { Handle receiver = Handle::cast(object); if (receiver->HasExternalArrayElements()) { MaybeObject* probe = - StubCache::ComputeKeyedLoadOrStoreExternalArray( - *receiver, true, strict_mode); + StubCache::ComputeKeyedLoadOrStoreExternalArray(*receiver, true); stub = probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); } else if (receiver->HasPixelElements()) { MaybeObject* probe = - StubCache::ComputeKeyedStorePixelArray(*receiver, strict_mode); + StubCache::ComputeKeyedStorePixelArray(*receiver); stub = probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); } else if (key->IsSmi() && receiver->map()->has_fast_elements()) { MaybeObject* probe = - StubCache::ComputeKeyedStoreSpecialized(*receiver, strict_mode); + StubCache::ComputeKeyedStoreSpecialized(*receiver); stub = probe->IsFailure() ? NULL : Code::cast(probe->ToObjectUnchecked()); } @@ -1683,13 +1669,12 @@ MaybeObject* KeyedStoreIC::Store(State state, } // Set the property. - return Runtime::SetObjectProperty(object, key, value, NONE, strict_mode); + return Runtime::SetObjectProperty(object, key, value, NONE); } void KeyedStoreIC::UpdateCaches(LookupResult* lookup, State state, - StrictModeFlag strict_mode, Handle receiver, Handle name, Handle value) { @@ -1716,8 +1701,8 @@ void KeyedStoreIC::UpdateCaches(LookupResult* lookup, switch (type) { case FIELD: { - maybe_code = StubCache::ComputeKeyedStoreField( - *name, *receiver, lookup->GetFieldIndex(), NULL, strict_mode); + maybe_code = StubCache::ComputeKeyedStoreField(*name, *receiver, + lookup->GetFieldIndex()); break; } case MAP_TRANSITION: { @@ -1726,8 +1711,8 @@ void KeyedStoreIC::UpdateCaches(LookupResult* lookup, ASSERT(type == MAP_TRANSITION); Handle transition(lookup->GetTransitionMap()); int index = transition->PropertyIndexFor(*name); - maybe_code = StubCache::ComputeKeyedStoreField( - *name, *receiver, index, *transition, strict_mode); + maybe_code = StubCache::ComputeKeyedStoreField(*name, *receiver, + index, *transition); break; } // fall through. @@ -1735,9 +1720,7 @@ void KeyedStoreIC::UpdateCaches(LookupResult* lookup, default: { // Always rewrite to the generic case so that we do not // repeatedly try to rewrite. - maybe_code = (strict_mode == kStrictMode) - ? generic_stub_strict() - : generic_stub(); + maybe_code = generic_stub(); break; } } @@ -1752,9 +1735,7 @@ void KeyedStoreIC::UpdateCaches(LookupResult* lookup, if (state == UNINITIALIZED || state == PREMONOMORPHIC) { set_target(Code::cast(code)); } else if (state == MONOMORPHIC) { - set_target((strict_mode == kStrictMode) - ? megamorphic_stub_strict() - : megamorphic_stub()); + set_target(megamorphic_stub()); } #ifdef DEBUG @@ -1855,11 +1836,8 @@ MUST_USE_RESULT MaybeObject* StoreIC_Miss(Arguments args) { StoreIC ic; IC::State state = IC::StateFrom(ic.target(), args[0], args[1]); Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state(); - return ic.Store(state, - static_cast(extra_ic_state & kStrictMode), - args.at(0), - args.at(1), - args.at(2)); + return ic.Store(state, extra_ic_state, args.at(0), + args.at(1), args.at(2)); } @@ -1923,11 +1901,7 @@ MUST_USE_RESULT MaybeObject* KeyedStoreIC_Miss(Arguments args) { ASSERT(args.length() == 3); KeyedStoreIC ic; IC::State state = IC::StateFrom(ic.target(), args[0], args[1]); - Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state(); - return ic.Store(state, - static_cast(extra_ic_state & kStrictMode), - args.at(0), - args.at(1), + return ic.Store(state, args.at(0), args.at(1), args.at(2)); } diff --git a/src/ic.h b/src/ic.h index e12cbaf..96838c7 100644 --- a/src/ic.h +++ b/src/ic.h @@ -398,10 +398,16 @@ class KeyedLoadIC: public IC { class StoreIC: public IC { public: + + enum StoreICStrictMode { + kStoreICNonStrict = kNonStrictMode, + kStoreICStrict = kStrictMode + }; + StoreIC() : IC(NO_EXTRA_FRAME) { ASSERT(target()->is_store_stub()); } MUST_USE_RESULT MaybeObject* Store(State state, - StrictModeFlag strict_mode, + Code::ExtraICState extra_ic_state, Handle object, Handle name, Handle value); @@ -410,11 +416,10 @@ class StoreIC: public IC { static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } static void GenerateMiss(MacroAssembler* masm); static void GenerateMegamorphic(MacroAssembler* masm, - StrictModeFlag strict_mode); + Code::ExtraICState extra_ic_state); static void GenerateArrayLength(MacroAssembler* masm); static void GenerateNormal(MacroAssembler* masm); - static void GenerateGlobalProxy(MacroAssembler* masm, - StrictModeFlag strict_mode); + static void GenerateGlobalProxy(MacroAssembler* masm); // Clear the use of an inlined version. static void ClearInlinedVersion(Address address); @@ -428,18 +433,11 @@ class StoreIC: public IC { // lookup result. void UpdateCaches(LookupResult* lookup, State state, - StrictModeFlag strict_mode, + Code::ExtraICState extra_ic_state, Handle receiver, Handle name, Handle value); - void set_target(Code* code) { - // Strict mode must be preserved across IC patching. - ASSERT((code->extra_ic_state() & kStrictMode) == - (target()->extra_ic_state() & kStrictMode)); - IC::set_target(code); - } - // Stub accessors. static Code* megamorphic_stub() { return Builtins::builtin(Builtins::StoreIC_Megamorphic); @@ -475,7 +473,6 @@ class KeyedStoreIC: public IC { KeyedStoreIC() : IC(NO_EXTRA_FRAME) { } MUST_USE_RESULT MaybeObject* Store(State state, - StrictModeFlag strict_mode, Handle object, Handle name, Handle value); @@ -483,9 +480,8 @@ class KeyedStoreIC: public IC { // Code generators for stub routines. Only called once at startup. static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } static void GenerateMiss(MacroAssembler* masm); - static void GenerateRuntimeSetProperty(MacroAssembler* masm, - StrictModeFlag strict_mode); - static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode); + static void GenerateRuntimeSetProperty(MacroAssembler* masm); + static void GenerateGeneric(MacroAssembler* masm); // Clear the inlined version so the IC is always hit. static void ClearInlinedVersion(Address address); @@ -497,37 +493,20 @@ class KeyedStoreIC: public IC { // Update the inline cache. void UpdateCaches(LookupResult* lookup, State state, - StrictModeFlag strict_mode, Handle receiver, Handle name, Handle value); - void set_target(Code* code) { - // Strict mode must be preserved across IC patching. - ASSERT((code->extra_ic_state() & kStrictMode) == - (target()->extra_ic_state() & kStrictMode)); - IC::set_target(code); - } - // Stub accessors. static Code* initialize_stub() { return Builtins::builtin(Builtins::KeyedStoreIC_Initialize); } - static Code* initialize_stub_strict() { - return Builtins::builtin(Builtins::KeyedStoreIC_Initialize_Strict); - } static Code* megamorphic_stub() { return Builtins::builtin(Builtins::KeyedStoreIC_Generic); } - static Code* megamorphic_stub_strict() { - return Builtins::builtin(Builtins::KeyedStoreIC_Generic_Strict); - } static Code* generic_stub() { return Builtins::builtin(Builtins::KeyedStoreIC_Generic); } - static Code* generic_stub_strict() { - return Builtins::builtin(Builtins::KeyedStoreIC_Generic_Strict); - } static void Clear(Address address, Code* target); diff --git a/src/messages.js b/src/messages.js index 2c94912..db33753 100644 --- a/src/messages.js +++ b/src/messages.js @@ -228,8 +228,6 @@ function FormatMessage(message) { strict_delete_property: ["Cannot delete property '", "%0", "' of ", "%1"], strict_const: ["Use of const in strict mode."], strict_function: ["In strict mode code, functions can only be declared at top level or immediately within another function." ], - strict_read_only_property: ["Cannot assign to read only property '", "%0", "' of ", "%1"], - strict_cannot_assign: ["Cannot assign to read only '", "%0", "' in strict mode"], }; } var message_type = %MessageGetType(message); diff --git a/src/objects-inl.h b/src/objects-inl.h index dedb199..f955d33 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -2619,8 +2619,7 @@ Code::Flags Code::ComputeFlags(Kind kind, ASSERT(extra_ic_state == kNoExtraICState || (kind == CALL_IC && (ic_state == MONOMORPHIC || ic_state == MONOMORPHIC_PROTOTYPE_FAILURE)) || - (kind == STORE_IC) || - (kind == KEYED_STORE_IC)); + (kind == STORE_IC)); // Compute the bit mask. int bits = kind << kFlagsKindShift; if (in_loop) bits |= kFlagsICInLoopMask; @@ -3742,8 +3741,7 @@ MaybeObject* JSObject::SetHiddenPropertiesObject(Object* hidden_obj) { ASSERT(!IsJSGlobalProxy()); return SetPropertyPostInterceptor(Heap::hidden_symbol(), hidden_obj, - DONT_ENUM, - kNonStrictMode); + DONT_ENUM); } diff --git a/src/objects.cc b/src/objects.cc index 0b7f60a..0b1d72a 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -1444,15 +1444,14 @@ MaybeObject* JSObject::AddProperty(String* name, MaybeObject* JSObject::SetPropertyPostInterceptor( String* name, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict) { + PropertyAttributes attributes) { // Check local property, ignore interceptor. LookupResult result; LocalLookupRealNamedProperty(name, &result); if (result.IsFound()) { // An existing property, a map transition or a null descriptor was // found. Use set property to handle all these cases. - return SetProperty(&result, name, value, attributes, strict); + return SetProperty(&result, name, value, attributes); } // Add a new real property. return AddProperty(name, value, attributes); @@ -1577,8 +1576,7 @@ MaybeObject* JSObject::ConvertDescriptorToField(String* name, MaybeObject* JSObject::SetPropertyWithInterceptor( String* name, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict) { + PropertyAttributes attributes) { HandleScope scope; Handle this_handle(this); Handle name_handle(name); @@ -1607,8 +1605,7 @@ MaybeObject* JSObject::SetPropertyWithInterceptor( MaybeObject* raw_result = this_handle->SetPropertyPostInterceptor(*name_handle, *value_handle, - attributes, - strict); + attributes); RETURN_IF_SCHEDULED_EXCEPTION(); return raw_result; } @@ -1616,11 +1613,10 @@ MaybeObject* JSObject::SetPropertyWithInterceptor( MaybeObject* JSObject::SetProperty(String* name, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict) { + PropertyAttributes attributes) { LookupResult result; LocalLookup(name, &result); - return SetProperty(&result, name, value, attributes, strict); + return SetProperty(&result, name, value, attributes); } @@ -1900,8 +1896,7 @@ MaybeObject* JSObject::SetPropertyWithFailedAccessCheck(LookupResult* result, MaybeObject* JSObject::SetProperty(LookupResult* result, String* name, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict) { + PropertyAttributes attributes) { // Make sure that the top context does not change when doing callbacks or // interceptor calls. AssertNoContextChange ncc; @@ -1928,8 +1923,7 @@ MaybeObject* JSObject::SetProperty(LookupResult* result, Object* proto = GetPrototype(); if (proto->IsNull()) return value; ASSERT(proto->IsJSGlobalObject()); - return JSObject::cast(proto)->SetProperty( - result, name, value, attributes, strict); + return JSObject::cast(proto)->SetProperty(result, name, value, attributes); } if (!result->IsProperty() && !IsJSContextExtensionObject()) { @@ -1948,19 +1942,7 @@ MaybeObject* JSObject::SetProperty(LookupResult* result, // Neither properties nor transitions found. return AddProperty(name, value, attributes); } - if (result->IsReadOnly() && result->IsProperty()) { - if (strict == kStrictMode) { - HandleScope scope; - Handle key(name); - Handle holder(this); - Handle args[2] = { key, holder }; - return Top::Throw(*Factory::NewTypeError("strict_read_only_property", - HandleVector(args, 2))); - - } else { - return value; - } - } + if (result->IsReadOnly() && result->IsProperty()) return value; // This is a real property that is not read-only, or it is a // transition or null descriptor and there are no setters in the prototypes. switch (result->type()) { @@ -1988,7 +1970,7 @@ MaybeObject* JSObject::SetProperty(LookupResult* result, value, result->holder()); case INTERCEPTOR: - return SetPropertyWithInterceptor(name, value, attributes, strict); + return SetPropertyWithInterceptor(name, value, attributes); case CONSTANT_TRANSITION: { // If the same constant function is being added we can simply // transition to the target map. @@ -6305,8 +6287,7 @@ void Code::PrintExtraICState(FILE* out, Kind kind, ExtraICState extra) { } break; case STORE_IC: - case KEYED_STORE_IC: - if (extra == kStrictMode) { + if (extra == StoreIC::kStoreICStrict) { name = "STRICT"; } break; diff --git a/src/objects.h b/src/objects.h index de15a73..fbfc5fd 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1361,13 +1361,11 @@ class JSObject: public HeapObject { MUST_USE_RESULT MaybeObject* SetProperty(String* key, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict); + PropertyAttributes attributes); MUST_USE_RESULT MaybeObject* SetProperty(LookupResult* result, String* key, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict); + PropertyAttributes attributes); MUST_USE_RESULT MaybeObject* SetPropertyWithFailedAccessCheck( LookupResult* result, String* name, @@ -1382,13 +1380,11 @@ class JSObject: public HeapObject { MUST_USE_RESULT MaybeObject* SetPropertyWithInterceptor( String* name, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict); + PropertyAttributes attributes); MUST_USE_RESULT MaybeObject* SetPropertyPostInterceptor( String* name, Object* value, - PropertyAttributes attributes, - StrictModeFlag strict); + PropertyAttributes attributes); MUST_USE_RESULT MaybeObject* SetLocalPropertyIgnoreAttributes( String* key, Object* value, diff --git a/src/parser.cc b/src/parser.cc index 8560310..9fedfc9 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -1661,49 +1661,34 @@ Block* Parser::ParseVariableDeclarations(bool accept_IN, if (top_scope_->is_global_scope()) { // Compute the arguments for the runtime call. - ZoneList* arguments = new ZoneList(3); + ZoneList* arguments = new ZoneList(2); + // Be careful not to assign a value to the global variable if + // we're in a with. The initialization value should not + // necessarily be stored in the global object in that case, + // which is why we need to generate a separate assignment node. arguments->Add(new Literal(name)); // we have at least 1 parameter - CallRuntime* initialize; - - if (is_const) { + if (is_const || (value != NULL && !inside_with())) { arguments->Add(value); value = NULL; // zap the value to avoid the unnecessary assignment - - // Construct the call to Runtime_InitializeConstGlobal - // and add it to the initialization statement block. - // Note that the function does different things depending on - // the number of arguments (1 or 2). + } + // Construct the call to Runtime::DeclareGlobal{Variable,Const}Locally + // and add it to the initialization statement block. Note that + // this function does different things depending on if we have + // 1 or 2 parameters. + CallRuntime* initialize; + if (is_const) { initialize = - new CallRuntime( - Factory::InitializeConstGlobal_symbol(), - Runtime::FunctionForId(Runtime::kInitializeConstGlobal), - arguments); + new CallRuntime( + Factory::InitializeConstGlobal_symbol(), + Runtime::FunctionForId(Runtime::kInitializeConstGlobal), + arguments); } else { - // Add strict mode. - // We may want to pass singleton to avoid Literal allocations. - arguments->Add(NewNumberLiteral( - temp_scope_->StrictMode() ? kStrictMode : kNonStrictMode)); - - // Be careful not to assign a value to the global variable if - // we're in a with. The initialization value should not - // necessarily be stored in the global object in that case, - // which is why we need to generate a separate assignment node. - if (value != NULL && !inside_with()) { - arguments->Add(value); - value = NULL; // zap the value to avoid the unnecessary assignment - } - - // Construct the call to Runtime_InitializeVarGlobal - // and add it to the initialization statement block. - // Note that the function does different things depending on - // the number of arguments (2 or 3). initialize = - new CallRuntime( - Factory::InitializeVarGlobal_symbol(), - Runtime::FunctionForId(Runtime::kInitializeVarGlobal), - arguments); + new CallRuntime( + Factory::InitializeVarGlobal_symbol(), + Runtime::FunctionForId(Runtime::kInitializeVarGlobal), + arguments); } - block->AddStatement(new ExpressionStatement(initialize)); } diff --git a/src/runtime.cc b/src/runtime.cc index 6f5807d..dce2e15 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -160,8 +160,7 @@ MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(JSObject* boilerplate) { if (!maybe_result->ToObject(&result)) return maybe_result; } { MaybeObject* maybe_result = - // Creating object copy for literals. No strict mode needed. - copy->SetProperty(key_string, result, NONE, kNonStrictMode); + copy->SetProperty(key_string, result, NONE); if (!maybe_result->ToObject(&result)) return maybe_result; } } @@ -547,9 +546,7 @@ static MaybeObject* Runtime_CreateCatchExtensionObject(Arguments args) { // Assign the exception value to the catch variable and make sure // that the catch variable is DontDelete. { MaybeObject* maybe_value = - // Passing non-strict per ECMA-262 5th Ed. 12.14. Catch, bullet #4. - JSObject::cast(object)->SetProperty( - key, value, DONT_DELETE, kNonStrictMode); + JSObject::cast(object)->SetProperty(key, value, DONT_DELETE); if (!maybe_value->ToObject(&value)) return maybe_value; } return object; @@ -997,16 +994,12 @@ static Failure* ThrowRedeclarationError(const char* type, Handle name) { static MaybeObject* Runtime_DeclareGlobals(Arguments args) { - ASSERT(args.length() == 4); HandleScope scope; Handle global = Handle(Top::context()->global()); Handle context = args.at(0); CONVERT_ARG_CHECKED(FixedArray, pairs, 1); bool is_eval = Smi::cast(args[2])->value() == 1; - StrictModeFlag strict_mode = - static_cast(Smi::cast(args[3])->value()); - ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); // Compute the property attributes. According to ECMA-262, section // 13, page 71, the property must be read-only and @@ -1116,11 +1109,7 @@ static MaybeObject* Runtime_DeclareGlobals(Arguments args) { value, attributes)); } else { - RETURN_IF_EMPTY_HANDLE(SetProperty(global, - name, - value, - attributes, - strict_mode)); + RETURN_IF_EMPTY_HANDLE(SetProperty(global, name, value, attributes)); } } @@ -1181,8 +1170,7 @@ static MaybeObject* Runtime_DeclareContextSlot(Arguments args) { // Slow case: The property is not in the FixedArray part of the context. Handle context_ext = Handle::cast(holder); RETURN_IF_EMPTY_HANDLE( - SetProperty(context_ext, name, initial_value, - mode, kNonStrictMode)); + SetProperty(context_ext, name, initial_value, mode)); } } @@ -1223,8 +1211,7 @@ static MaybeObject* Runtime_DeclareContextSlot(Arguments args) { return ThrowRedeclarationError("const", name); } } - RETURN_IF_EMPTY_HANDLE(SetProperty(context_ext, name, value, mode, - kNonStrictMode)); + RETURN_IF_EMPTY_HANDLE(SetProperty(context_ext, name, value, mode)); } return Heap::undefined_value(); @@ -1233,21 +1220,14 @@ static MaybeObject* Runtime_DeclareContextSlot(Arguments args) { static MaybeObject* Runtime_InitializeVarGlobal(Arguments args) { NoHandleAllocation nha; - // args[0] == name - // args[1] == strict_mode - // args[2] == value (optional) // Determine if we need to assign to the variable if it already // exists (based on the number of arguments). - RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); - bool assign = args.length() == 3; + RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); + bool assign = args.length() == 2; CONVERT_ARG_CHECKED(String, name, 0); GlobalObject* global = Top::context()->global(); - RUNTIME_ASSERT(args[1]->IsSmi()); - StrictModeFlag strict_mode = - static_cast(Smi::cast(args[1])->value()); - ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); // According to ECMA-262, section 12.2, page 62, the property must // not be deletable. @@ -1303,9 +1283,8 @@ static MaybeObject* Runtime_InitializeVarGlobal(Arguments args) { } // Assign the value (or undefined) to the property. - Object* value = (assign) ? args[2] : Heap::undefined_value(); - return real_holder->SetProperty( - &lookup, *name, value, attributes, strict_mode); + Object* value = (assign) ? args[1] : Heap::undefined_value(); + return real_holder->SetProperty(&lookup, *name, value, attributes); } Object* proto = real_holder->GetPrototype(); @@ -1319,9 +1298,7 @@ static MaybeObject* Runtime_InitializeVarGlobal(Arguments args) { } global = Top::context()->global(); - if (assign) { - return global->SetProperty(*name, args[2], attributes, strict_mode); - } + if (assign) return global->SetProperty(*name, args[1], attributes); return Heap::undefined_value(); } @@ -1380,19 +1357,13 @@ static MaybeObject* Runtime_InitializeConstGlobal(Arguments args) { // BUG 1213575: Handle the case where we have to set a read-only // property through an interceptor and only do it if it's // uninitialized, e.g. the hole. Nirk... - // Passing non-strict mode because the property is writable. - RETURN_IF_EMPTY_HANDLE(SetProperty(global, - name, - value, - attributes, - kNonStrictMode)); + RETURN_IF_EMPTY_HANDLE(SetProperty(global, name, value, attributes)); return *value; } // Set the value, but only we're assigning the initial value to a // constant. For now, we determine this by checking if the // current value is the hole. - // Strict mode handling not needed (const disallowed in strict mode). PropertyType type = lookup.type(); if (type == FIELD) { FixedArray* properties = global->properties(); @@ -1468,9 +1439,7 @@ static MaybeObject* Runtime_InitializeConstContextSlot(Arguments args) { // context. if (attributes == ABSENT) { Handle global = Handle(Top::context()->global()); - // Strict mode not needed (const disallowed in strict mode). - RETURN_IF_EMPTY_HANDLE( - SetProperty(global, name, value, NONE, kNonStrictMode)); + RETURN_IF_EMPTY_HANDLE(SetProperty(global, name, value, NONE)); return *value; } @@ -1507,9 +1476,8 @@ static MaybeObject* Runtime_InitializeConstContextSlot(Arguments args) { // The property was found in a different context extension object. // Set it if it is not a read-only property. if ((attributes & READ_ONLY) == 0) { - // Strict mode not needed (const disallowed in strict mode). RETURN_IF_EMPTY_HANDLE( - SetProperty(context_ext, name, value, attributes, kNonStrictMode)); + SetProperty(context_ext, name, value, attributes)); } } @@ -1675,7 +1643,7 @@ static Handle InstallBuiltin(Handle holder, code, false); optimized->shared()->DontAdaptArguments(); - SetProperty(holder, key, optimized, NONE, kStrictMode); + SetProperty(holder, key, optimized, NONE); return optimized; } @@ -3771,8 +3739,7 @@ static MaybeObject* Runtime_DefineOrRedefineDataProperty(Arguments args) { MaybeObject* Runtime::SetObjectProperty(Handle object, Handle key, Handle value, - PropertyAttributes attr, - StrictModeFlag strict) { + PropertyAttributes attr) { HandleScope scope; if (object->IsUndefined() || object->IsNull()) { @@ -3802,7 +3769,6 @@ MaybeObject* Runtime::SetObjectProperty(Handle object, return *value; } - // TODO(1220): Implement SetElement strict mode. Handle result = SetElement(js_object, index, value); if (result.is_null()) return Failure::Exception(); return *value; @@ -3815,7 +3781,7 @@ MaybeObject* Runtime::SetObjectProperty(Handle object, } else { Handle key_string = Handle::cast(key); key_string->TryFlatten(); - result = SetProperty(js_object, key_string, value, attr, strict); + result = SetProperty(js_object, key_string, value, attr); } if (result.is_null()) return Failure::Exception(); return *value; @@ -3828,10 +3794,9 @@ MaybeObject* Runtime::SetObjectProperty(Handle object, Handle name = Handle::cast(converted); if (name->AsArrayIndex(&index)) { - // TODO(1220): Implement SetElement strict mode. return js_object->SetElement(index, *value); } else { - return js_object->SetProperty(*name, *value, attr, strict); + return js_object->SetProperty(*name, *value, attr); } } @@ -3923,27 +3888,23 @@ MaybeObject* Runtime::ForceDeleteObjectProperty(Handle js_object, static MaybeObject* Runtime_SetProperty(Arguments args) { NoHandleAllocation ha; - RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); + RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); Handle object = args.at(0); Handle key = args.at(1); Handle value = args.at(2); - CONVERT_SMI_CHECKED(unchecked_attributes, args[3]); - RUNTIME_ASSERT( - (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); - // Compute attributes. - PropertyAttributes attributes = - static_cast(unchecked_attributes); - StrictModeFlag strict = kNonStrictMode; - if (args.length() == 5) { - CONVERT_SMI_CHECKED(strict_unchecked, args[4]); - RUNTIME_ASSERT(strict_unchecked == kStrictMode || - strict_unchecked == kNonStrictMode); - strict = static_cast(strict_unchecked); + // Compute attributes. + PropertyAttributes attributes = NONE; + if (args.length() == 4) { + CONVERT_CHECKED(Smi, value_obj, args[3]); + int unchecked_value = value_obj->value(); + // Only attribute bits should be set. + RUNTIME_ASSERT( + (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); + attributes = static_cast(unchecked_value); } - - return Runtime::SetObjectProperty(object, key, value, attributes, strict); + return Runtime::SetObjectProperty(object, key, value, attributes); } @@ -3977,7 +3938,7 @@ static MaybeObject* Runtime_DeleteProperty(Arguments args) { CONVERT_CHECKED(JSObject, object, args[0]); CONVERT_CHECKED(String, key, args[1]); CONVERT_SMI_CHECKED(strict, args[2]); - return object->DeleteProperty(key, (strict == kStrictMode) + return object->DeleteProperty(key, strict == kStrictMode ? JSObject::STRICT_DELETION : JSObject::NORMAL_DELETION); } @@ -7525,16 +7486,11 @@ static ObjectPair Runtime_LoadContextSlotNoReferenceError(Arguments args) { static MaybeObject* Runtime_StoreContextSlot(Arguments args) { HandleScope scope; - ASSERT(args.length() == 4); + ASSERT(args.length() == 3); Handle value(args[0]); CONVERT_ARG_CHECKED(Context, context, 1); CONVERT_ARG_CHECKED(String, name, 2); - CONVERT_SMI_CHECKED(strict_unchecked, args[3]); - RUNTIME_ASSERT(strict_unchecked == kStrictMode || - strict_unchecked == kNonStrictMode); - StrictModeFlag strict = static_cast(strict_unchecked); - int index; PropertyAttributes attributes; @@ -7578,12 +7534,7 @@ static MaybeObject* Runtime_StoreContextSlot(Arguments args) { // extension object itself. if ((attributes & READ_ONLY) == 0 || (context_ext->GetLocalPropertyAttribute(*name) == ABSENT)) { - RETURN_IF_EMPTY_HANDLE(SetProperty(context_ext, name, value, NONE, strict)); - } else if (strict == kStrictMode && (attributes & READ_ONLY) != 0) { - // Setting read only property in strict mode. - Handle error = - Factory::NewTypeError("strict_cannot_assign", HandleVector(&name, 1)); - return Top::Throw(*error); + RETURN_IF_EMPTY_HANDLE(SetProperty(context_ext, name, value, NONE)); } return *value; } @@ -9316,9 +9267,7 @@ static bool CopyContextLocalsToScopeObject( RETURN_IF_EMPTY_HANDLE_VALUE( SetProperty(scope_object, scope_info.context_slot_name(i), - Handle(context->get(context_index)), - NONE, - kNonStrictMode), + Handle(context->get(context_index)), NONE), false); } } @@ -9344,9 +9293,7 @@ static Handle MaterializeLocalScope(JavaScriptFrame* frame) { RETURN_IF_EMPTY_HANDLE_VALUE( SetProperty(local_scope, scope_info.parameter_name(i), - Handle(frame->GetParameter(i)), - NONE, - kNonStrictMode), + Handle(frame->GetParameter(i)), NONE), Handle()); } @@ -9355,9 +9302,7 @@ static Handle MaterializeLocalScope(JavaScriptFrame* frame) { RETURN_IF_EMPTY_HANDLE_VALUE( SetProperty(local_scope, scope_info.stack_slot_name(i), - Handle(frame->GetExpression(i)), - NONE, - kNonStrictMode), + Handle(frame->GetExpression(i)), NONE), Handle()); } @@ -9381,11 +9326,7 @@ static Handle MaterializeLocalScope(JavaScriptFrame* frame) { ASSERT(keys->get(i)->IsString()); Handle key(String::cast(keys->get(i))); RETURN_IF_EMPTY_HANDLE_VALUE( - SetProperty(local_scope, - key, - GetProperty(ext, key), - NONE, - kNonStrictMode), + SetProperty(local_scope, key, GetProperty(ext, key), NONE), Handle()); } } @@ -9423,8 +9364,7 @@ static Handle MaterializeClosure(Handle context) { SetProperty(closure_scope, scope_info.parameter_name(i), Handle(element), - NONE, - kNonStrictMode), + NONE), Handle()); } } @@ -9445,11 +9385,7 @@ static Handle MaterializeClosure(Handle context) { ASSERT(keys->get(i)->IsString()); Handle key(String::cast(keys->get(i))); RETURN_IF_EMPTY_HANDLE_VALUE( - SetProperty(closure_scope, - key, - GetProperty(ext, key), - NONE, - kNonStrictMode), + SetProperty(closure_scope, key, GetProperty(ext, key), NONE), Handle()); } } diff --git a/src/runtime.h b/src/runtime.h index 52a6e1f..06437ef 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -241,7 +241,7 @@ namespace internal { F(ResolvePossiblyDirectEval, 4, 2) \ F(ResolvePossiblyDirectEvalNoLookup, 4, 2) \ \ - F(SetProperty, -1 /* 4 or 5 */, 1) \ + F(SetProperty, -1 /* 3 or 4 */, 1) \ F(DefineOrRedefineDataProperty, 4, 1) \ F(DefineOrRedefineAccessorProperty, 5, 1) \ F(IgnoreAttributesAndSetProperty, -1 /* 3 or 4 */, 1) \ @@ -288,12 +288,12 @@ namespace internal { F(DeleteContextSlot, 2, 1) \ F(LoadContextSlot, 2, 2) \ F(LoadContextSlotNoReferenceError, 2, 2) \ - F(StoreContextSlot, 4, 1) \ + F(StoreContextSlot, 3, 1) \ \ /* Declarations and initialization */ \ - F(DeclareGlobals, 4, 1) \ + F(DeclareGlobals, 3, 1) \ F(DeclareContextSlot, 4, 1) \ - F(InitializeVarGlobal, -1 /* 2 or 3 */, 1) \ + F(InitializeVarGlobal, -1 /* 1 or 2 */, 1) \ F(InitializeConstGlobal, 2, 1) \ F(InitializeConstContextSlot, 3, 1) \ F(OptimizeObjectForAddingMultipleProperties, 2, 1) \ @@ -538,8 +538,7 @@ class Runtime : public AllStatic { Handle object, Handle key, Handle value, - PropertyAttributes attr, - StrictModeFlag strict); + PropertyAttributes attr); MUST_USE_RESULT static MaybeObject* ForceSetObjectProperty( Handle object, diff --git a/src/stub-cache.cc b/src/stub-cache.cc index 360f0b7..abb26d6 100644 --- a/src/stub-cache.cc +++ b/src/stub-cache.cc @@ -498,13 +498,13 @@ MaybeObject* StubCache::ComputeStoreField(String* name, JSObject* receiver, int field_index, Map* transition, - StrictModeFlag strict_mode) { + Code::ExtraICState extra_ic_state) { PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::STORE_IC, type, strict_mode); + Code::STORE_IC, type, extra_ic_state); Object* code = receiver->map()->FindInCodeCache(name, flags); if (code->IsUndefined()) { - StoreStubCompiler compiler(strict_mode); + StoreStubCompiler compiler(extra_ic_state); { MaybeObject* maybe_code = compiler.CompileStoreField(receiver, field_index, transition, name); if (!maybe_code->ToObject(&code)) return maybe_code; @@ -521,15 +521,13 @@ MaybeObject* StubCache::ComputeStoreField(String* name, } -MaybeObject* StubCache::ComputeKeyedStoreSpecialized( - JSObject* receiver, - StrictModeFlag strict_mode) { +MaybeObject* StubCache::ComputeKeyedStoreSpecialized(JSObject* receiver) { Code::Flags flags = - Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); + Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL); String* name = Heap::KeyedStoreSpecialized_symbol(); Object* code = receiver->map()->FindInCodeCache(name, flags); if (code->IsUndefined()) { - KeyedStoreStubCompiler compiler(strict_mode); + KeyedStoreStubCompiler compiler; { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); if (!maybe_code->ToObject(&code)) return maybe_code; } @@ -544,9 +542,7 @@ MaybeObject* StubCache::ComputeKeyedStoreSpecialized( } -MaybeObject* StubCache::ComputeKeyedStorePixelArray( - JSObject* receiver, - StrictModeFlag strict_mode) { +MaybeObject* StubCache::ComputeKeyedStorePixelArray(JSObject* receiver) { // Using NORMAL as the PropertyType for array element stores is a misuse. The // generated stub always accesses fast elements, not slow-mode fields, but // some property type is required for the stub lookup. Note that overloading @@ -554,11 +550,11 @@ MaybeObject* StubCache::ComputeKeyedStorePixelArray( // other keyed field stores. This is guaranteed to be the case since all field // keyed stores that are not array elements go through a generic builtin stub. Code::Flags flags = - Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); + Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL); String* name = Heap::KeyedStorePixelArray_symbol(); Object* code = receiver->map()->FindInCodeCache(name, flags); if (code->IsUndefined()) { - KeyedStoreStubCompiler compiler(strict_mode); + KeyedStoreStubCompiler compiler; { MaybeObject* maybe_code = compiler.CompileStorePixelArray(receiver); if (!maybe_code->ToObject(&code)) return maybe_code; } @@ -602,13 +598,11 @@ ExternalArrayType ElementsKindToExternalArrayType(JSObject::ElementsKind kind) { MaybeObject* StubCache::ComputeKeyedLoadOrStoreExternalArray( JSObject* receiver, - bool is_store, - StrictModeFlag strict_mode) { + bool is_store) { Code::Flags flags = Code::ComputeMonomorphicFlags( is_store ? Code::KEYED_STORE_IC : Code::KEYED_LOAD_IC, - NORMAL, - strict_mode); + NORMAL); ExternalArrayType array_type = ElementsKindToExternalArrayType(receiver->GetElementsKind()); String* name = @@ -621,9 +615,9 @@ MaybeObject* StubCache::ComputeKeyedLoadOrStoreExternalArray( Object* code = map->FindInCodeCache(name, flags); if (code->IsUndefined()) { ExternalArrayStubCompiler compiler; - { MaybeObject* maybe_code = is_store - ? compiler.CompileKeyedStoreStub(array_type, flags) - : compiler.CompileKeyedLoadStub(array_type, flags); + { MaybeObject* maybe_code = + is_store ? compiler.CompileKeyedStoreStub(array_type, flags) : + compiler.CompileKeyedLoadStub(array_type, flags); if (!maybe_code->ToObject(&code)) return maybe_code; } if (is_store) { @@ -643,8 +637,8 @@ MaybeObject* StubCache::ComputeKeyedLoadOrStoreExternalArray( } -MaybeObject* StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { - return Builtins::builtin((strict_mode == kStrictMode) +MaybeObject* StubCache::ComputeStoreNormal(Code::ExtraICState extra_ic_state) { + return Builtins::builtin(extra_ic_state == StoreIC::kStoreICStrict ? Builtins::StoreIC_Normal_Strict : Builtins::StoreIC_Normal); } @@ -653,12 +647,12 @@ MaybeObject* StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { MaybeObject* StubCache::ComputeStoreGlobal(String* name, GlobalObject* receiver, JSGlobalPropertyCell* cell, - StrictModeFlag strict_mode) { + Code::ExtraICState extra_ic_state) { Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::STORE_IC, NORMAL, strict_mode); + Code::STORE_IC, NORMAL, extra_ic_state); Object* code = receiver->map()->FindInCodeCache(name, flags); if (code->IsUndefined()) { - StoreStubCompiler compiler(strict_mode); + StoreStubCompiler compiler(extra_ic_state); { MaybeObject* maybe_code = compiler.CompileStoreGlobal(receiver, cell, name); if (!maybe_code->ToObject(&code)) return maybe_code; @@ -679,13 +673,13 @@ MaybeObject* StubCache::ComputeStoreCallback( String* name, JSObject* receiver, AccessorInfo* callback, - StrictModeFlag strict_mode) { + Code::ExtraICState extra_ic_state) { ASSERT(v8::ToCData
(callback->setter()) != 0); Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::STORE_IC, CALLBACKS, strict_mode); + Code::STORE_IC, CALLBACKS, extra_ic_state); Object* code = receiver->map()->FindInCodeCache(name, flags); if (code->IsUndefined()) { - StoreStubCompiler compiler(strict_mode); + StoreStubCompiler compiler(extra_ic_state); { MaybeObject* maybe_code = compiler.CompileStoreCallback(receiver, callback, name); if (!maybe_code->ToObject(&code)) return maybe_code; @@ -705,12 +699,12 @@ MaybeObject* StubCache::ComputeStoreCallback( MaybeObject* StubCache::ComputeStoreInterceptor( String* name, JSObject* receiver, - StrictModeFlag strict_mode) { + Code::ExtraICState extra_ic_state) { Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::STORE_IC, INTERCEPTOR, strict_mode); + Code::STORE_IC, INTERCEPTOR, extra_ic_state); Object* code = receiver->map()->FindInCodeCache(name, flags); if (code->IsUndefined()) { - StoreStubCompiler compiler(strict_mode); + StoreStubCompiler compiler(extra_ic_state); { MaybeObject* maybe_code = compiler.CompileStoreInterceptor(receiver, name); if (!maybe_code->ToObject(&code)) return maybe_code; @@ -730,14 +724,12 @@ MaybeObject* StubCache::ComputeStoreInterceptor( MaybeObject* StubCache::ComputeKeyedStoreField(String* name, JSObject* receiver, int field_index, - Map* transition, - StrictModeFlag strict_mode) { + Map* transition) { PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; - Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::KEYED_STORE_IC, type, strict_mode); + Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, type); Object* code = receiver->map()->FindInCodeCache(name, flags); if (code->IsUndefined()) { - KeyedStoreStubCompiler compiler(strict_mode); + KeyedStoreStubCompiler compiler; { MaybeObject* maybe_code = compiler.CompileStoreField(receiver, field_index, transition, name); if (!maybe_code->ToObject(&code)) return maybe_code; @@ -1425,17 +1417,12 @@ MaybeObject* LoadPropertyWithInterceptorForCall(Arguments args) { MaybeObject* StoreInterceptorProperty(Arguments args) { - ASSERT(args.length() == 4); JSObject* recv = JSObject::cast(args[0]); String* name = String::cast(args[1]); Object* value = args[2]; - StrictModeFlag strict = - static_cast(Smi::cast(args[3])->value()); - ASSERT(strict == kStrictMode || strict == kNonStrictMode); ASSERT(recv->HasNamedInterceptor()); PropertyAttributes attr = NONE; - MaybeObject* result = recv->SetPropertyWithInterceptor( - name, value, attr, strict); + MaybeObject* result = recv->SetPropertyWithInterceptor(name, value, attr); return result; } @@ -1688,8 +1675,8 @@ MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) { MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { - Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::STORE_IC, type, strict_mode_); + Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, type, + extra_ic_state_); MaybeObject* result = GetCodeWithFlags(flags, name); if (!result->IsFailure()) { PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, @@ -1704,8 +1691,7 @@ MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { - Code::Flags flags = Code::ComputeMonomorphicFlags( - Code::KEYED_STORE_IC, type, strict_mode_); + Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, type); MaybeObject* result = GetCodeWithFlags(flags, name); if (!result->IsFailure()) { PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, diff --git a/src/stub-cache.h b/src/stub-cache.h index 6927076..4638da2 100644 --- a/src/stub-cache.h +++ b/src/stub-cache.h @@ -143,27 +143,27 @@ class StubCache : public AllStatic { JSObject* receiver, int field_index, Map* transition, - StrictModeFlag strict_mode); + Code::ExtraICState extra_ic_state); MUST_USE_RESULT static MaybeObject* ComputeStoreNormal( - StrictModeFlag strict_mode); + Code::ExtraICState extra_ic_state); MUST_USE_RESULT static MaybeObject* ComputeStoreGlobal( String* name, GlobalObject* receiver, JSGlobalPropertyCell* cell, - StrictModeFlag strict_mode); + Code::ExtraICState extra_ic_state); MUST_USE_RESULT static MaybeObject* ComputeStoreCallback( String* name, JSObject* receiver, AccessorInfo* callback, - StrictModeFlag strict_mode); + Code::ExtraICState extra_ic_state); MUST_USE_RESULT static MaybeObject* ComputeStoreInterceptor( String* name, JSObject* receiver, - StrictModeFlag strict_mode); + Code::ExtraICState extra_ic_state); // --- @@ -171,21 +171,17 @@ class StubCache : public AllStatic { String* name, JSObject* receiver, int field_index, - Map* transition, - StrictModeFlag strict_mode); + Map* transition = NULL); MUST_USE_RESULT static MaybeObject* ComputeKeyedStoreSpecialized( - JSObject* receiver, - StrictModeFlag strict_mode); + JSObject* receiver); MUST_USE_RESULT static MaybeObject* ComputeKeyedStorePixelArray( - JSObject* receiver, - StrictModeFlag strict_mode); + JSObject* receiver); MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadOrStoreExternalArray( JSObject* receiver, - bool is_store, - StrictModeFlag strict_mode); + bool is_store); // --- @@ -632,8 +628,8 @@ class KeyedLoadStubCompiler: public StubCompiler { class StoreStubCompiler: public StubCompiler { public: - explicit StoreStubCompiler(StrictModeFlag strict_mode) - : strict_mode_(strict_mode) { } + explicit StoreStubCompiler(Code::ExtraICState extra_ic_state) + : extra_ic_state_(extra_ic_state) { } MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, int index, @@ -653,15 +649,12 @@ class StoreStubCompiler: public StubCompiler { private: MaybeObject* GetCode(PropertyType type, String* name); - StrictModeFlag strict_mode_; + Code::ExtraICState extra_ic_state_; }; class KeyedStoreStubCompiler: public StubCompiler { public: - explicit KeyedStoreStubCompiler(StrictModeFlag strict_mode) - : strict_mode_(strict_mode) { } - MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, int index, Map* transition, @@ -673,8 +666,6 @@ class KeyedStoreStubCompiler: public StubCompiler { private: MaybeObject* GetCode(PropertyType type, String* name); - - StrictModeFlag strict_mode_; }; diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index 6a71e6f..dfee36e 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -2747,8 +2747,7 @@ void CodeGenerator::DeclareGlobals(Handle pairs) { frame_->EmitPush(rsi); // The context is the first argument. frame_->EmitPush(kScratchRegister); frame_->EmitPush(Smi::FromInt(is_eval() ? 1 : 0)); - frame_->EmitPush(Smi::FromInt(strict_mode_flag())); - Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 4); + Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 3); // Return value is ignored. } @@ -4606,8 +4605,7 @@ void CodeGenerator::StoreToSlot(Slot* slot, InitState init_state) { // by initialization. value = frame_->CallRuntime(Runtime::kInitializeConstContextSlot, 3); } else { - frame_->Push(Smi::FromInt(strict_mode_flag())); - value = frame_->CallRuntime(Runtime::kStoreContextSlot, 4); + value = frame_->CallRuntime(Runtime::kStoreContextSlot, 3); } // Storing a variable must keep the (new) value on the expression // stack. This is necessary for compiling chained assignment @@ -4927,9 +4925,8 @@ 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, 4); + Result ignored = frame_->CallRuntime(Runtime::kSetProperty, 3); } else { frame_->Drop(3); } @@ -8089,12 +8086,8 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { public: DeferredReferenceSetKeyedValue(Register value, Register key, - Register receiver, - StrictModeFlag strict_mode) - : value_(value), - key_(key), - receiver_(receiver), - strict_mode_(strict_mode) { + Register receiver) + : value_(value), key_(key), receiver_(receiver) { set_comment("[ DeferredReferenceSetKeyedValue"); } @@ -8107,7 +8100,6 @@ class DeferredReferenceSetKeyedValue: public DeferredCode { Register key_; Register receiver_; Label patch_site_; - StrictModeFlag strict_mode_; }; @@ -8159,9 +8151,7 @@ void DeferredReferenceSetKeyedValue::Generate() { } // Call the IC stub. - Handle ic(Builtins::builtin( - (strict_mode_ == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(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 @@ -8502,8 +8492,7 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) { DeferredReferenceSetKeyedValue* deferred = new DeferredReferenceSetKeyedValue(result.reg(), key.reg(), - receiver.reg(), - strict_mode_flag()); + receiver.reg()); // Check that the receiver is not a smi. __ JumpIfSmi(receiver.reg(), deferred->entry_label()); @@ -8565,7 +8554,7 @@ Result CodeGenerator::EmitKeyedStore(StaticType* key_type) { deferred->BindExit(); } else { - result = frame()->CallKeyedStoreIC(strict_mode_flag()); + result = frame()->CallKeyedStoreIC(); // 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 diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc index 472e406..1381a94 100644 --- a/src/x64/full-codegen-x64.cc +++ b/src/x64/full-codegen-x64.cc @@ -742,9 +742,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable, prop->key()->AsLiteral()->handle()->IsSmi()); __ Move(rcx, prop->key()->AsLiteral()->handle()); - Handle ic(Builtins::builtin(is_strict() - ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); } } @@ -761,8 +759,7 @@ void FullCodeGenerator::DeclareGlobals(Handle pairs) { __ push(rsi); // The context is the first argument. __ Push(pairs); __ Push(Smi::FromInt(is_eval() ? 1 : 0)); - __ Push(Smi::FromInt(strict_mode_flag())); - __ CallRuntime(Runtime::kDeclareGlobals, 4); + __ CallRuntime(Runtime::kDeclareGlobals, 3); // Return value is ignored. } @@ -1406,8 +1403,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForStackValue(key); VisitForStackValue(value); if (property->emit_store()) { - __ Push(Smi::FromInt(NONE)); // PropertyAttributes - __ CallRuntime(Runtime::kSetProperty, 4); + __ CallRuntime(Runtime::kSetProperty, 3); } else { __ Drop(3); } @@ -1754,9 +1750,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { __ movq(rdx, rax); __ pop(rax); // Restore value. __ Move(rcx, prop->key()->AsLiteral()->handle()); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); break; } @@ -1777,9 +1771,7 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) { __ pop(rdx); } __ pop(rax); // Restore value. - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); break; } @@ -1874,8 +1866,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var, __ push(rax); // Value. __ push(rsi); // Context. __ Push(var->name()); - __ Push(Smi::FromInt(strict_mode_flag())); - __ CallRuntime(Runtime::kStoreContextSlot, 4); + __ CallRuntime(Runtime::kStoreContextSlot, 3); break; } } @@ -1906,9 +1897,7 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { } else { __ pop(rdx); } - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); // If the assignment ends an initialization block, revert to fast case. @@ -1946,9 +1935,7 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { } // Record source code position before IC call. SetSourcePosition(expr->position()); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); // If the assignment ends an initialization block, revert to fast case. @@ -3463,9 +3450,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { case NAMED_PROPERTY: { __ Move(rcx, prop->key()->AsLiteral()->handle()); __ pop(rdx); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); if (expr->is_postfix()) { @@ -3480,9 +3465,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { case KEYED_PROPERTY: { __ pop(rcx); __ pop(rdx); - Handle ic(Builtins::builtin( - is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); EmitCallIC(ic, RelocInfo::CODE_TARGET); PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); if (expr->is_postfix()) { diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc index b3243cf..55d837c 100644 --- a/src/x64/ic-x64.cc +++ b/src/x64/ic-x64.cc @@ -766,8 +766,7 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { } -void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- rax : value // -- rcx : key @@ -814,7 +813,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, __ bind(&slow); __ Integer32ToSmi(rcx, rcx); __ bind(&slow_with_tagged_index); - GenerateRuntimeSetProperty(masm, strict_mode); + GenerateRuntimeSetProperty(masm); // Never returns to here. // Check whether the elements is a pixel array. @@ -1475,7 +1474,7 @@ void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { void StoreIC::GenerateMegamorphic(MacroAssembler* masm, - StrictModeFlag strict_mode) { + Code::ExtraICState extra_ic_state) { // ----------- S t a t e ------------- // -- rax : value // -- rcx : name @@ -1487,7 +1486,7 @@ void StoreIC::GenerateMegamorphic(MacroAssembler* masm, Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, NOT_IN_LOOP, MONOMORPHIC, - strict_mode); + extra_ic_state); StubCache::GenerateProbe(masm, flags, rdx, rcx, rbx, no_reg); // Cache miss: Jump to runtime. @@ -1594,8 +1593,7 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { } -void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void StoreIC::GenerateGlobalProxy(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- rax : value // -- rcx : name @@ -1606,17 +1604,14 @@ void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, __ push(rdx); __ push(rcx); __ push(rax); - __ Push(Smi::FromInt(NONE)); // PropertyAttributes - __ Push(Smi::FromInt(strict_mode)); - __ push(rbx); // return address + __ push(rbx); // Do tail-call to runtime routine. - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); } -void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, - StrictModeFlag strict_mode) { +void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) { // ----------- S t a t e ------------- // -- rax : value // -- rcx : key @@ -1628,12 +1623,10 @@ void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, __ push(rdx); // receiver __ push(rcx); // key __ push(rax); // value - __ Push(Smi::FromInt(NONE)); // PropertyAttributes - __ Push(Smi::FromInt(strict_mode)); // Strict mode. __ push(rbx); // return address // Do tail-call to runtime routine. - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); } diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 9896562..791f5e7 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -2641,9 +2641,7 @@ void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { ASSERT(ToRegister(instr->value()).is(rax)); __ Move(rcx, instr->hydrogen()->name()); - Handle ic(Builtins::builtin( - info_->is_strict() ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::StoreIC_Initialize)); CallCode(ic, RelocInfo::CODE_TARGET, instr); } @@ -2712,9 +2710,7 @@ void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { ASSERT(ToRegister(instr->key()).is(rcx)); ASSERT(ToRegister(instr->value()).is(rax)); - Handle ic(Builtins::builtin( - info_->is_strict() ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); CallCode(ic, RelocInfo::CODE_TARGET, instr); } diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc index 109985c..774de71 100644 --- a/src/x64/stub-cache-x64.cc +++ b/src/x64/stub-cache-x64.cc @@ -2408,13 +2408,12 @@ MaybeObject* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, __ push(rdx); // receiver __ push(rcx); // name __ push(rax); // value - __ Push(Smi::FromInt(strict_mode_)); __ push(rbx); // restore return address // Do tail-call to the runtime system. ExternalReference store_ic_property = ExternalReference(IC_Utility(IC::kStoreInterceptorProperty)); - __ TailCallExternalReference(store_ic_property, 4, 1); + __ TailCallExternalReference(store_ic_property, 3, 1); // Handle store cache miss. __ bind(&miss); @@ -3491,13 +3490,10 @@ MaybeObject* ExternalArrayStubCompiler::CompileKeyedStoreStub( __ push(rdx); // receiver __ push(rcx); // key __ push(rax); // value - __ Push(Smi::FromInt(NONE)); // PropertyAttributes - __ Push(Smi::FromInt( - Code::ExtractExtraICStateFromFlags(flags) & kStrictMode)); __ push(rbx); // return address // Do tail-call to runtime routine. - __ TailCallRuntime(Runtime::kSetProperty, 5, 1); + __ TailCallRuntime(Runtime::kSetProperty, 3, 1); return GetCode(flags); } diff --git a/src/x64/virtual-frame-x64.cc b/src/x64/virtual-frame-x64.cc index 1787044..ea115f2 100644 --- a/src/x64/virtual-frame-x64.cc +++ b/src/x64/virtual-frame-x64.cc @@ -1124,9 +1124,9 @@ Result VirtualFrame::CallStoreIC(Handle name, StrictModeFlag strict_mode) { // Value and (if not contextual) receiver are on top of the frame. // The IC expects name in rcx, value in rax, and receiver in rdx. - Handle ic(Builtins::builtin( - (strict_mode == kStrictMode) ? Builtins::StoreIC_Initialize_Strict - : Builtins::StoreIC_Initialize)); + Handle ic(Builtins::builtin(strict_mode == kStrictMode + ? Builtins::StoreIC_Initialize_Strict + : Builtins::StoreIC_Initialize)); Result value = Pop(); RelocInfo::Mode mode; if (is_contextual) { @@ -1146,7 +1146,7 @@ Result VirtualFrame::CallStoreIC(Handle name, } -Result VirtualFrame::CallKeyedStoreIC(StrictModeFlag strict_mode) { +Result VirtualFrame::CallKeyedStoreIC() { // Value, key, and receiver are on the top of the frame. The IC // expects value in rax, key in rcx, and receiver in rdx. Result value = Pop(); @@ -1190,9 +1190,7 @@ Result VirtualFrame::CallKeyedStoreIC(StrictModeFlag strict_mode) { receiver.Unuse(); } - Handle ic(Builtins::builtin( - (strict_mode == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict - : Builtins::KeyedStoreIC_Initialize)); + Handle ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); return RawCallCodeObject(ic, RelocInfo::CODE_TARGET); } diff --git a/src/x64/virtual-frame-x64.h b/src/x64/virtual-frame-x64.h index b568a78..824743d 100644 --- a/src/x64/virtual-frame-x64.h +++ b/src/x64/virtual-frame-x64.h @@ -343,7 +343,7 @@ class VirtualFrame : public ZoneObject { // Call keyed store IC. Value, key, and receiver are found on top // of the frame. All three are dropped. - Result CallKeyedStoreIC(StrictModeFlag strict_mode); + Result CallKeyedStoreIC(); // Call call IC. Function name, arguments, and receiver are found on top // of the frame and dropped by the call. diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index f450a34..b3c52f1 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -10091,11 +10091,10 @@ class RegExpStringModificationTest { // Inject the input as a global variable. i::Handle input_name = i::Factory::NewStringFromAscii(i::Vector("input", 5)); - i::Top::global_context()->global()->SetProperty( - *input_name, - *input_, - NONE, - i::kNonStrictMode)->ToObjectChecked(); + i::Top::global_context()->global()->SetProperty(*input_name, + *input_, + NONE)->ToObjectChecked(); + MorphThread morph_thread(this); morph_thread.Start(); diff --git a/test/cctest/test-compiler.cc b/test/cctest/test-compiler.cc index 9f21b78..b424b7f 100644 --- a/test/cctest/test-compiler.cc +++ b/test/cctest/test-compiler.cc @@ -108,7 +108,7 @@ static void SetGlobalProperty(const char* name, Object* value) { Handle object(value); Handle symbol = Factory::LookupAsciiSymbol(name); Handle global(Top::context()->global()); - SetProperty(global, symbol, object, NONE, kNonStrictMode); + SetProperty(global, symbol, object, NONE); } diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc index 7245e54..441aae6 100644 --- a/test/cctest/test-debug.cc +++ b/test/cctest/test-debug.cc @@ -153,8 +153,7 @@ class DebugLocalContext { Handle debug_string = v8::internal::Factory::LookupAsciiSymbol("debug"); SetProperty(global, debug_string, - Handle(Debug::debug_context()->global_proxy()), DONT_ENUM, - ::v8::internal::kNonStrictMode); + Handle(Debug::debug_context()->global_proxy()), DONT_ENUM); } private: v8::Persistent context_; diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc index 9cce01e..a23ee17 100644 --- a/test/cctest/test-heap.cc +++ b/test/cctest/test-heap.cc @@ -212,14 +212,13 @@ TEST(GarbageCollection) { Handle initial_map = Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); function->set_initial_map(*initial_map); - Top::context()->global()->SetProperty( - *name, *function, NONE, kNonStrictMode)->ToObjectChecked(); + Top::context()->global()->SetProperty(*name, + *function, + NONE)->ToObjectChecked(); // Allocate an object. Unrooted after leaving the scope. Handle obj = Factory::NewJSObject(function); - obj->SetProperty( - *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); - obj->SetProperty( - *prop_namex, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*prop_name, Smi::FromInt(23), NONE)->ToObjectChecked(); + obj->SetProperty(*prop_namex, Smi::FromInt(24), NONE)->ToObjectChecked(); CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex)); @@ -239,10 +238,10 @@ TEST(GarbageCollection) { HandleScope inner_scope; // Allocate another object, make it reachable from global. Handle obj = Factory::NewJSObject(function); - Top::context()->global()->SetProperty( - *obj_name, *obj, NONE, kNonStrictMode)->ToObjectChecked(); - obj->SetProperty( - *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); + Top::context()->global()->SetProperty(*obj_name, + *obj, + NONE)->ToObjectChecked(); + obj->SetProperty(*prop_name, Smi::FromInt(23), NONE)->ToObjectChecked(); } // After gc, it should survive. @@ -541,12 +540,12 @@ TEST(FunctionAllocation) { Handle prop_name = Factory::LookupAsciiSymbol("theSlot"); Handle obj = Factory::NewJSObject(function); - obj->SetProperty( - *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*prop_name, Smi::FromInt(23), NONE)->ToObjectChecked(); CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); // Check that we can add properties to function objects. - function->SetProperty( - *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); + function->SetProperty(*prop_name, + Smi::FromInt(24), + NONE)->ToObjectChecked(); CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); } @@ -568,8 +567,7 @@ TEST(ObjectProperties) { CHECK(!obj->HasLocalProperty(*first)); // add first - obj->SetProperty( - *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*first, Smi::FromInt(1), NONE)->ToObjectChecked(); CHECK(obj->HasLocalProperty(*first)); // delete first @@ -577,10 +575,8 @@ TEST(ObjectProperties) { CHECK(!obj->HasLocalProperty(*first)); // add first and then second - obj->SetProperty( - *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); - obj->SetProperty( - *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*first, Smi::FromInt(1), NONE)->ToObjectChecked(); + obj->SetProperty(*second, Smi::FromInt(2), NONE)->ToObjectChecked(); CHECK(obj->HasLocalProperty(*first)); CHECK(obj->HasLocalProperty(*second)); @@ -592,10 +588,8 @@ TEST(ObjectProperties) { CHECK(!obj->HasLocalProperty(*second)); // add first and then second - obj->SetProperty( - *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); - obj->SetProperty( - *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*first, Smi::FromInt(1), NONE)->ToObjectChecked(); + obj->SetProperty(*second, Smi::FromInt(2), NONE)->ToObjectChecked(); CHECK(obj->HasLocalProperty(*first)); CHECK(obj->HasLocalProperty(*second)); @@ -609,16 +603,14 @@ TEST(ObjectProperties) { // check string and symbol match static const char* string1 = "fisk"; Handle s1 = Factory::NewStringFromAscii(CStrVector(string1)); - obj->SetProperty( - *s1, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*s1, Smi::FromInt(1), NONE)->ToObjectChecked(); Handle s1_symbol = Factory::LookupAsciiSymbol(string1); CHECK(obj->HasLocalProperty(*s1_symbol)); // check symbol and string match static const char* string2 = "fugl"; Handle s2_symbol = Factory::LookupAsciiSymbol(string2); - obj->SetProperty( - *s2_symbol, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*s2_symbol, Smi::FromInt(1), NONE)->ToObjectChecked(); Handle s2 = Factory::NewStringFromAscii(CStrVector(string2)); CHECK(obj->HasLocalProperty(*s2)); } @@ -639,8 +631,7 @@ TEST(JSObjectMaps) { Handle obj = Factory::NewJSObject(function); // Set a propery - obj->SetProperty( - *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*prop_name, Smi::FromInt(23), NONE)->ToObjectChecked(); CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); // Check the map has changed @@ -707,10 +698,8 @@ TEST(JSObjectCopy) { Handle first = Factory::LookupAsciiSymbol("first"); Handle second = Factory::LookupAsciiSymbol("second"); - obj->SetProperty( - *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); - obj->SetProperty( - *second, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(*first, Smi::FromInt(1), NONE)->ToObjectChecked(); + obj->SetProperty(*second, Smi::FromInt(2), NONE)->ToObjectChecked(); Object* ok = obj->SetElement(0, *first)->ToObjectChecked(); @@ -727,10 +716,8 @@ TEST(JSObjectCopy) { CHECK_EQ(obj->GetProperty(*second), clone->GetProperty(*second)); // Flip the values. - clone->SetProperty( - *first, Smi::FromInt(2), NONE, kNonStrictMode)->ToObjectChecked(); - clone->SetProperty( - *second, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); + clone->SetProperty(*first, Smi::FromInt(2), NONE)->ToObjectChecked(); + clone->SetProperty(*second, Smi::FromInt(1), NONE)->ToObjectChecked(); ok = clone->SetElement(0, *second)->ToObjectChecked(); ok = clone->SetElement(1, *first)->ToObjectChecked(); diff --git a/test/cctest/test-mark-compact.cc b/test/cctest/test-mark-compact.cc index 3e3175e..86f105f 100644 --- a/test/cctest/test-mark-compact.cc +++ b/test/cctest/test-mark-compact.cc @@ -189,8 +189,7 @@ TEST(MarkCompactCollector) { function->set_initial_map(initial_map); Top::context()->global()->SetProperty(func_name, function, - NONE, - kNonStrictMode)->ToObjectChecked(); + NONE)->ToObjectChecked(); JSObject* obj = JSObject::cast(Heap::AllocateJSObject(function)->ToObjectChecked()); @@ -209,14 +208,10 @@ TEST(MarkCompactCollector) { String::cast(Heap::LookupAsciiSymbol("theObject")->ToObjectChecked()); Top::context()->global()->SetProperty(obj_name, obj, - NONE, - kNonStrictMode)->ToObjectChecked(); + NONE)->ToObjectChecked(); String* prop_name = String::cast(Heap::LookupAsciiSymbol("theSlot")->ToObjectChecked()); - obj->SetProperty(prop_name, - Smi::FromInt(23), - NONE, - kNonStrictMode)->ToObjectChecked(); + obj->SetProperty(prop_name, Smi::FromInt(23), NONE)->ToObjectChecked(); Heap::CollectGarbage(OLD_POINTER_SPACE); diff --git a/test/es5conform/es5conform.status b/test/es5conform/es5conform.status index d6f7caf..e021fc5 100644 --- a/test/es5conform/es5conform.status +++ b/test/es5conform/es5conform.status @@ -269,6 +269,72 @@ chapter11/11.13/11.13.1/11.13.1-4-3-s: FAIL # in strict mode (Global.length) chapter11/11.13/11.13.1/11.13.1-4-4-s: FAIL # simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Object.length) +chapter11/11.13/11.13.1/11.13.1-4-5-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Function.length) +chapter11/11.13/11.13.1/11.13.1-4-6-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Array.length) +chapter11/11.13/11.13.1/11.13.1-4-7-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (String.length) +chapter11/11.13/11.13.1/11.13.1-4-8-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Boolean.length) +chapter11/11.13/11.13.1/11.13.1-4-9-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.length) +chapter11/11.13/11.13.1/11.13.1-4-10-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Date.length) +chapter11/11.13/11.13.1/11.13.1-4-11-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (RegExp.length) +chapter11/11.13/11.13.1/11.13.1-4-12-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Error.length) +chapter11/11.13/11.13.1/11.13.1-4-13-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.MAX_VALUE) +chapter11/11.13/11.13.1/11.13.1-4-14-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.MIN_VALUE) +chapter11/11.13/11.13.1/11.13.1-4-15-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.NaN) +chapter11/11.13/11.13.1/11.13.1-4-16-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.NEGATIVE_INFINITY) +chapter11/11.13/11.13.1/11.13.1-4-17-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Number.POSITIVE_INFINITY) +chapter11/11.13/11.13.1/11.13.1-4-18-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.E) +chapter11/11.13/11.13.1/11.13.1-4-19-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LN10) +chapter11/11.13/11.13.1/11.13.1-4-20-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LN2) +chapter11/11.13/11.13.1/11.13.1-4-21-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LOG2E) +chapter11/11.13/11.13.1/11.13.1-4-22-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.LOG10E) +chapter11/11.13/11.13.1/11.13.1-4-23-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.PI) +chapter11/11.13/11.13.1/11.13.1-4-24-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.SQRT1_2) +chapter11/11.13/11.13.1/11.13.1-4-25-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property +# in strict mode (Math.SQRT2) +chapter11/11.13/11.13.1/11.13.1-4-26-s: FAIL +# simple assignment throws TypeError if LeftHandSide is a readonly property # in strict mode (Global.undefined) chapter11/11.13/11.13.1/11.13.1-4-27-s: FAIL diff --git a/test/mjsunit/strict-mode.js b/test/mjsunit/strict-mode.js index 4071232..42d8355 100644 --- a/test/mjsunit/strict-mode.js +++ b/test/mjsunit/strict-mode.js @@ -713,118 +713,3 @@ repeat(10, function() { testAssignToUndefined(false); }); cleanup(Boolean); } })(); - - -(function ObjectEnvironment() { - var o = {}; - Object.defineProperty(o, "foo", { value: "FOO", writable: false }); - assertThrows( - function () { - with (o) { - (function() { - "use strict"; - foo = "Hello"; - })(); - } - }, - TypeError); -})(); - - -(function TestSetPropertyWithoutSetter() { - var o = { get foo() { return "Yey"; } }; - assertThrows( - function broken() { - "use strict"; - o.foo = (0xBADBAD00 >> 1); - }, - TypeError); -})(); - - -(function TestSetPropertyNonConfigurable() { - var frozen = Object.freeze({}); - var sealed = Object.seal({}); - - function strict(o) { - "use strict"; - o.property = "value"; - } - - assertThrows(function() { strict(frozen); }, TypeError); - assertThrows(function() { strict(sealed); }, TypeError); -})(); - - -(function TestAssignmentToReadOnlyProperty() { - "use strict"; - - var o = {}; - Object.defineProperty(o, "property", { value: 7 }); - - assertThrows(function() { o.property = "new value"; }, TypeError); - assertThrows(function() { o.property += 10; }, TypeError); - assertThrows(function() { o.property -= 10; }, TypeError); - assertThrows(function() { o.property *= 10; }, TypeError); - assertThrows(function() { o.property /= 10; }, TypeError); - assertThrows(function() { o.property++; }, TypeError); - assertThrows(function() { o.property--; }, TypeError); - assertThrows(function() { ++o.property; }, TypeError); - assertThrows(function() { --o.property; }, TypeError); - - var name = "prop" + "erty"; // to avoid symbol path. - assertThrows(function() { o[name] = "new value"; }, TypeError); - assertThrows(function() { o[name] += 10; }, TypeError); - assertThrows(function() { o[name] -= 10; }, TypeError); - assertThrows(function() { o[name] *= 10; }, TypeError); - assertThrows(function() { o[name] /= 10; }, TypeError); - assertThrows(function() { o[name]++; }, TypeError); - assertThrows(function() { o[name]--; }, TypeError); - assertThrows(function() { ++o[name]; }, TypeError); - assertThrows(function() { --o[name]; }, TypeError); - - assertEquals(o.property, 7); -})(); - - -(function TestAssignmentToReadOnlyLoop() { - var name = "prop" + "erty"; // to avoid symbol path. - var o = {}; - Object.defineProperty(o, "property", { value: 7 }); - - function strict(o, name) { - "use strict"; - o[name] = "new value"; - } - - for (var i = 0; i < 10; i ++) { - try { - strict(o, name); - assertUnreachable(); - } catch(e) { - assertInstanceof(e, TypeError); - } - } -})(); - - -// Specialized KeyedStoreIC experiencing miss. -(function testKeyedStoreICStrict() { - var o = [9,8,7,6,5,4,3,2,1]; - - function test(o, i, v) { - "use strict"; - o[i] = v; - } - - for (var i = 0; i < 10; i ++) { - test(o, 5, 17); // start specialized for smi indices - assertEquals(o[5], 17); - test(o, "a", 19); - assertEquals(o["a"], 19); - test(o, "5", 29); - assertEquals(o[5], 29); - test(o, 100000, 31); - assertEquals(o[100000], 31); - } -})(); -- 2.7.4