| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index abb26d6ed423a6c231ae288baa37fa18bc498a86..360f0b743ebebaa99bd51325cc1840992601e62f 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,
|
| - Code::ExtraICState extra_ic_state) {
|
| + StrictModeFlag strict_mode) {
|
| PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION;
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(
|
| - Code::STORE_IC, type, extra_ic_state);
|
| + Code::STORE_IC, type, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(extra_ic_state);
|
| + StoreStubCompiler compiler(strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreField(receiver, field_index, transition, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -521,13 +521,15 @@ MaybeObject* StubCache::ComputeStoreField(String* name,
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeKeyedStoreSpecialized(JSObject* receiver) {
|
| +MaybeObject* StubCache::ComputeKeyedStoreSpecialized(
|
| + JSObject* receiver,
|
| + StrictModeFlag strict_mode) {
|
| Code::Flags flags =
|
| - Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL);
|
| + Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode);
|
| String* name = Heap::KeyedStoreSpecialized_symbol();
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedStoreStubCompiler compiler;
|
| + KeyedStoreStubCompiler compiler(strict_mode);
|
| { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| }
|
| @@ -542,7 +544,9 @@ MaybeObject* StubCache::ComputeKeyedStoreSpecialized(JSObject* receiver) {
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeKeyedStorePixelArray(JSObject* receiver) {
|
| +MaybeObject* StubCache::ComputeKeyedStorePixelArray(
|
| + JSObject* receiver,
|
| + StrictModeFlag strict_mode) {
|
| // 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
|
| @@ -550,11 +554,11 @@ MaybeObject* StubCache::ComputeKeyedStorePixelArray(JSObject* receiver) {
|
| // 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);
|
| + Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode);
|
| String* name = Heap::KeyedStorePixelArray_symbol();
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedStoreStubCompiler compiler;
|
| + KeyedStoreStubCompiler compiler(strict_mode);
|
| { MaybeObject* maybe_code = compiler.CompileStorePixelArray(receiver);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| }
|
| @@ -598,11 +602,13 @@ ExternalArrayType ElementsKindToExternalArrayType(JSObject::ElementsKind kind) {
|
|
|
| MaybeObject* StubCache::ComputeKeyedLoadOrStoreExternalArray(
|
| JSObject* receiver,
|
| - bool is_store) {
|
| + bool is_store,
|
| + StrictModeFlag strict_mode) {
|
| Code::Flags flags =
|
| Code::ComputeMonomorphicFlags(
|
| is_store ? Code::KEYED_STORE_IC : Code::KEYED_LOAD_IC,
|
| - NORMAL);
|
| + NORMAL,
|
| + strict_mode);
|
| ExternalArrayType array_type =
|
| ElementsKindToExternalArrayType(receiver->GetElementsKind());
|
| String* name =
|
| @@ -615,9 +621,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) {
|
| @@ -637,8 +643,8 @@ MaybeObject* StubCache::ComputeKeyedLoadOrStoreExternalArray(
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeStoreNormal(Code::ExtraICState extra_ic_state) {
|
| - return Builtins::builtin(extra_ic_state == StoreIC::kStoreICStrict
|
| +MaybeObject* StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) {
|
| + return Builtins::builtin((strict_mode == kStrictMode)
|
| ? Builtins::StoreIC_Normal_Strict
|
| : Builtins::StoreIC_Normal);
|
| }
|
| @@ -647,12 +653,12 @@ MaybeObject* StubCache::ComputeStoreNormal(Code::ExtraICState extra_ic_state) {
|
| MaybeObject* StubCache::ComputeStoreGlobal(String* name,
|
| GlobalObject* receiver,
|
| JSGlobalPropertyCell* cell,
|
| - Code::ExtraICState extra_ic_state) {
|
| + StrictModeFlag strict_mode) {
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(
|
| - Code::STORE_IC, NORMAL, extra_ic_state);
|
| + Code::STORE_IC, NORMAL, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(extra_ic_state);
|
| + StoreStubCompiler compiler(strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreGlobal(receiver, cell, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -673,13 +679,13 @@ MaybeObject* StubCache::ComputeStoreCallback(
|
| String* name,
|
| JSObject* receiver,
|
| AccessorInfo* callback,
|
| - Code::ExtraICState extra_ic_state) {
|
| + StrictModeFlag strict_mode) {
|
| ASSERT(v8::ToCData<Address>(callback->setter()) != 0);
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(
|
| - Code::STORE_IC, CALLBACKS, extra_ic_state);
|
| + Code::STORE_IC, CALLBACKS, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(extra_ic_state);
|
| + StoreStubCompiler compiler(strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreCallback(receiver, callback, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -699,12 +705,12 @@ MaybeObject* StubCache::ComputeStoreCallback(
|
| MaybeObject* StubCache::ComputeStoreInterceptor(
|
| String* name,
|
| JSObject* receiver,
|
| - Code::ExtraICState extra_ic_state) {
|
| + StrictModeFlag strict_mode) {
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(
|
| - Code::STORE_IC, INTERCEPTOR, extra_ic_state);
|
| + Code::STORE_IC, INTERCEPTOR, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(extra_ic_state);
|
| + StoreStubCompiler compiler(strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreInterceptor(receiver, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -724,12 +730,14 @@ MaybeObject* StubCache::ComputeStoreInterceptor(
|
| MaybeObject* StubCache::ComputeKeyedStoreField(String* name,
|
| JSObject* receiver,
|
| int field_index,
|
| - Map* transition) {
|
| + Map* transition,
|
| + StrictModeFlag strict_mode) {
|
| PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION;
|
| - Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, type);
|
| + Code::Flags flags = Code::ComputeMonomorphicFlags(
|
| + Code::KEYED_STORE_IC, type, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedStoreStubCompiler compiler;
|
| + KeyedStoreStubCompiler compiler(strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreField(receiver, field_index, transition, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -1417,12 +1425,17 @@ 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<StrictModeFlag>(Smi::cast(args[3])->value());
|
| + ASSERT(strict == kStrictMode || strict == kNonStrictMode);
|
| ASSERT(recv->HasNamedInterceptor());
|
| PropertyAttributes attr = NONE;
|
| - MaybeObject* result = recv->SetPropertyWithInterceptor(name, value, attr);
|
| + MaybeObject* result = recv->SetPropertyWithInterceptor(
|
| + name, value, attr, strict);
|
| return result;
|
| }
|
|
|
| @@ -1675,8 +1688,8 @@ MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) {
|
|
|
|
|
| MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) {
|
| - Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, type,
|
| - extra_ic_state_);
|
| + Code::Flags flags = Code::ComputeMonomorphicFlags(
|
| + Code::STORE_IC, type, strict_mode_);
|
| MaybeObject* result = GetCodeWithFlags(flags, name);
|
| if (!result->IsFailure()) {
|
| PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG,
|
| @@ -1691,7 +1704,8 @@ MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) {
|
|
|
|
|
| MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) {
|
| - Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, type);
|
| + Code::Flags flags = Code::ComputeMonomorphicFlags(
|
| + Code::KEYED_STORE_IC, type, strict_mode_);
|
| MaybeObject* result = GetCodeWithFlags(flags, name);
|
| if (!result->IsFailure()) {
|
| PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG,
|
|
|