| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index c7f4f9438602ac44dee8de379b6ee1f1265f92b0..4bbfe176875852072578e068ef96663b56a4ce83 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2011 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -397,12 +397,16 @@ Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement(
|
| Handle<JSObject> receiver,
|
| KeyedIC::StubKind stub_kind,
|
| StrictModeFlag strict_mode) {
|
| + KeyedAccessGrowMode grow_mode =
|
| + KeyedIC::GetGrowModeFromStubKind(stub_kind);
|
| + Code::ExtraICState extra_state =
|
| + Code::ComputeExtraICState(grow_mode, strict_mode);
|
| Code::Flags flags =
|
| Code::ComputeMonomorphicFlags(
|
| stub_kind == KeyedIC::LOAD ? Code::KEYED_LOAD_IC
|
| : Code::KEYED_STORE_IC,
|
| NORMAL,
|
| - strict_mode);
|
| + extra_state);
|
| Handle<String> name;
|
| switch (stub_kind) {
|
| case KeyedIC::LOAD:
|
| @@ -411,6 +415,9 @@ Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement(
|
| case KeyedIC::STORE_NO_TRANSITION:
|
| name = isolate()->factory()->KeyedStoreElementMonomorphic_symbol();
|
| break;
|
| + case KeyedIC::STORE_AND_GROW_NO_TRANSITION:
|
| + name = isolate()->factory()->KeyedStoreAndGrowElementMonomorphic_symbol();
|
| + break;
|
| default:
|
| UNREACHABLE();
|
| break;
|
| @@ -426,8 +433,15 @@ Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement(
|
| code = compiler.CompileLoadElement(receiver_map);
|
| break;
|
| }
|
| + case KeyedIC::STORE_AND_GROW_NO_TRANSITION: {
|
| + KeyedStoreStubCompiler compiler(isolate_, strict_mode,
|
| + ALLOW_JSARRAY_GROWTH);
|
| + code = compiler.CompileStoreElement(receiver_map);
|
| + break;
|
| + }
|
| case KeyedIC::STORE_NO_TRANSITION: {
|
| - KeyedStoreStubCompiler compiler(isolate_, strict_mode);
|
| + KeyedStoreStubCompiler compiler(isolate_, strict_mode,
|
| + DO_NOT_ALLOW_JSARRAY_GROWTH);
|
| code = compiler.CompileStoreElement(receiver_map);
|
| break;
|
| }
|
| @@ -519,7 +533,8 @@ Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name,
|
| Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
| if (probe->IsCode()) return Handle<Code>::cast(probe);
|
|
|
| - KeyedStoreStubCompiler compiler(isolate(), strict_mode);
|
| + KeyedStoreStubCompiler compiler(isolate(), strict_mode,
|
| + DO_NOT_ALLOW_JSARRAY_GROWTH);
|
| Handle<Code> code =
|
| compiler.CompileStoreField(receiver, field_index, transition, name);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name));
|
| @@ -1349,8 +1364,10 @@ Handle<Code> StoreStubCompiler::GetCode(PropertyType type,
|
| Handle<Code> KeyedStoreStubCompiler::GetCode(PropertyType type,
|
| Handle<String> name,
|
| InlineCacheState state) {
|
| + Code::ExtraICState extra_state =
|
| + Code::ComputeExtraICState(grow_mode_, strict_mode_);
|
| Code::Flags flags =
|
| - Code::ComputeFlags(Code::KEYED_STORE_IC, state, strict_mode_, type);
|
| + Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type);
|
| Handle<Code> code = GetCodeWithFlags(flags, name);
|
| PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code));
|
|
|