| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index 67451f2b88febf0739ad4b2c7d6682f2d96fd349..75e2e94941cf92aca4b038fa1f9bbf58358b21e4 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -109,8 +109,17 @@ Code* StubCache::Set(String* name, Map* map, Code* code) {
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeLoadNonexistent(String* name,
|
| - JSObject* receiver) {
|
| +Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name,
|
| + Handle<JSObject> object,
|
| + Handle<JSObject> last) {
|
| + CALL_HEAP_FUNCTION(isolate(),
|
| + CompileLoadNonexistent(*name, *object, *last),
|
| + Code);
|
| +}
|
| +
|
| +
|
| +Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name,
|
| + Handle<JSObject> receiver) {
|
| ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties());
|
| // If no global objects are present in the prototype chain, the load
|
| // nonexistent IC stub can be shared for all names for a given map
|
| @@ -118,173 +127,181 @@ MaybeObject* StubCache::ComputeLoadNonexistent(String* name,
|
| // there are global objects involved, we need to check global
|
| // property cells in the stub and therefore the stub will be
|
| // specific to the name.
|
| - String* cache_name = heap()->empty_string();
|
| + Handle<String> cache_name = factory()->empty_string();
|
| if (receiver->IsGlobalObject()) cache_name = name;
|
| - JSObject* last = receiver;
|
| + Handle<JSObject> last = receiver;
|
| while (last->GetPrototype() != heap()->null_value()) {
|
| - last = JSObject::cast(last->GetPrototype());
|
| + last = Handle<JSObject>(JSObject::cast(last->GetPrototype()));
|
| if (last->IsGlobalObject()) cache_name = name;
|
| }
|
| // Compile the stub that is either shared for all names or
|
| // name specific if there are global objects involved.
|
| Code::Flags flags =
|
| Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT);
|
| - Object* code = receiver->map()->FindInCodeCache(cache_name, flags);
|
| - if (code->IsUndefined()) {
|
| - LoadStubCompiler compiler;
|
| - { MaybeObject* maybe_code =
|
| - compiler.CompileLoadNonexistent(cache_name, receiver, last);
|
| - if (!maybe_code->ToObject(&code)) return maybe_code;
|
| - }
|
| - PROFILE(isolate_,
|
| - CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name));
|
| - GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code)));
|
| - Object* result;
|
| - { MaybeObject* maybe_result =
|
| - receiver->UpdateMapCodeCache(cache_name, Code::cast(code));
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| - }
|
| - }
|
| + Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags));
|
| + if (probe->IsCode()) return Handle<Code>::cast(probe);
|
| +
|
| + LoadStubCompiler compiler(isolate_);
|
| + Handle<Code> code =
|
| + compiler.CompileLoadNonexistent(cache_name, receiver, last);
|
| + PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name));
|
| + GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code));
|
| + JSObject::UpdateMapCodeCache(isolate_, receiver, cache_name, code);
|
| return code;
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeLoadField(String* name,
|
| - JSObject* receiver,
|
| - JSObject* holder,
|
| +Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + int index,
|
| + Handle<String> name) {
|
| + CALL_HEAP_FUNCTION(isolate(),
|
| + CompileLoadField(*object, *holder, index, *name),
|
| + Code);
|
| +}
|
| +
|
| +
|
| +Handle<Code> StubCache::ComputeLoadField(Handle<String> name,
|
| + Handle<JSObject> receiver,
|
| + Handle<JSObject> holder,
|
| int field_index) {
|
| - ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
|
| + ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD);
|
| - Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| - if (code->IsUndefined()) {
|
| - LoadStubCompiler compiler;
|
| - { MaybeObject* maybe_code =
|
| - compiler.CompileLoadField(receiver, holder, field_index, name);
|
| - if (!maybe_code->ToObject(&code)) return maybe_code;
|
| - }
|
| - PROFILE(isolate_,
|
| - CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code)));
|
| - Object* result;
|
| - { MaybeObject* maybe_result =
|
| - receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| - }
|
| - }
|
| + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
| + if (probe->IsCode()) return Handle<Code>::cast(probe);
|
| +
|
| + LoadStubCompiler compiler(isolate_);
|
| + Handle<Code> code =
|
| + compiler.CompileLoadField(receiver, holder, field_index, name);
|
| + PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| + GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| + JSObject::UpdateMapCodeCache(isolate_, receiver, name, code);
|
| return code;
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeLoadCallback(String* name,
|
| - JSObject* receiver,
|
| - JSObject* holder,
|
| - AccessorInfo* callback) {
|
| +Handle<Code> LoadStubCompiler::CompileLoadCallback(
|
| + Handle<String> name,
|
| + Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<AccessorInfo> callback) {
|
| + CALL_HEAP_FUNCTION(isolate(),
|
| + CompileLoadCallback(*name, *object, *holder, *callback),
|
| + Code);
|
| +}
|
| +
|
| +
|
| +Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name,
|
| + Handle<JSObject> receiver,
|
| + Handle<JSObject> holder,
|
| + Handle<AccessorInfo> callback) {
|
| ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
|
| - ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
|
| + ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS);
|
| - Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| - if (code->IsUndefined()) {
|
| - LoadStubCompiler compiler;
|
| - { MaybeObject* maybe_code =
|
| - compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| - if (!maybe_code->ToObject(&code)) return maybe_code;
|
| - }
|
| - PROFILE(isolate_,
|
| - CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code)));
|
| - Object* result;
|
| - { MaybeObject* maybe_result =
|
| - receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| - }
|
| - }
|
| + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
| + if (probe->IsCode()) return Handle<Code>::cast(probe);
|
| +
|
| + LoadStubCompiler compiler(isolate_);
|
| + Handle<Code> code =
|
| + compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| + PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| + GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| + JSObject::UpdateMapCodeCache(isolate_, receiver, name, code);
|
| return code;
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeLoadConstant(String* name,
|
| - JSObject* receiver,
|
| - JSObject* holder,
|
| - Object* value) {
|
| - ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
|
| +Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<Object> value,
|
| + Handle<String> name) {
|
| + CALL_HEAP_FUNCTION(isolate(),
|
| + CompileLoadConstant(*object, *holder, *value, *name),
|
| + Code);
|
| +}
|
| +
|
| +
|
| +Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name,
|
| + Handle<JSObject> receiver,
|
| + Handle<JSObject> holder,
|
| + Handle<Object> value) {
|
| + ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
| Code::Flags flags =
|
| Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION);
|
| - Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| - if (code->IsUndefined()) {
|
| - LoadStubCompiler compiler;
|
| - { MaybeObject* maybe_code =
|
| - compiler.CompileLoadConstant(receiver, holder, value, name);
|
| - if (!maybe_code->ToObject(&code)) return maybe_code;
|
| - }
|
| - PROFILE(isolate_,
|
| - CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code)));
|
| - Object* result;
|
| - { MaybeObject* maybe_result =
|
| - receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| - }
|
| - }
|
| + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
| + if (probe->IsCode()) return Handle<Code>::cast(probe);
|
| +
|
| + LoadStubCompiler compiler(isolate_);
|
| + Handle<Code> code =
|
| + compiler.CompileLoadConstant(receiver, holder, value, name);
|
| + PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| + GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| + JSObject::UpdateMapCodeCache(isolate_, receiver, name, code);
|
| return code;
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeLoadInterceptor(String* name,
|
| - JSObject* receiver,
|
| - JSObject* holder) {
|
| - ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
|
| +Handle<Code> LoadStubCompiler::CompileLoadInterceptor(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<String> name) {
|
| + CALL_HEAP_FUNCTION(isolate(),
|
| + CompileLoadInterceptor(*object, *holder, *name),
|
| + Code);
|
| +}
|
| +
|
| +
|
| +Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name,
|
| + Handle<JSObject> receiver,
|
| + Handle<JSObject> holder) {
|
| + ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR);
|
| - Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| - if (code->IsUndefined()) {
|
| - LoadStubCompiler compiler;
|
| - { MaybeObject* maybe_code =
|
| - compiler.CompileLoadInterceptor(receiver, holder, name);
|
| - if (!maybe_code->ToObject(&code)) return maybe_code;
|
| - }
|
| - PROFILE(isolate_,
|
| - CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code)));
|
| - Object* result;
|
| - { MaybeObject* maybe_result =
|
| - receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| - }
|
| - }
|
| + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
| + if (probe->IsCode()) return Handle<Code>::cast(probe);
|
| +
|
| + LoadStubCompiler compiler(isolate_);
|
| + Handle<Code> code =
|
| + compiler.CompileLoadInterceptor(receiver, holder, name);
|
| + PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| + GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| + JSObject::UpdateMapCodeCache(isolate_, receiver, name, code);
|
| return code;
|
| }
|
|
|
|
|
| -MaybeObject* StubCache::ComputeLoadNormal() {
|
| - return isolate_->builtins()->builtin(Builtins::kLoadIC_Normal);
|
| +Handle<Code> StubCache::ComputeLoadNormal() {
|
| + return isolate_->builtins()->LoadIC_Normal();
|
| }
|
|
|
| -
|
| -MaybeObject* StubCache::ComputeLoadGlobal(String* name,
|
| - JSObject* receiver,
|
| - GlobalObject* holder,
|
| - JSGlobalPropertyCell* cell,
|
| +Handle<Code> LoadStubCompiler::CompileLoadGlobal(
|
| + Handle<JSObject> object,
|
| + Handle<GlobalObject> holder,
|
| + Handle<JSGlobalPropertyCell> cell,
|
| + Handle<String> name,
|
| + bool is_dont_delete) {
|
| + CALL_HEAP_FUNCTION(isolate(),
|
| + CompileLoadGlobal(*object,
|
| + *holder,
|
| + *cell,
|
| + *name,
|
| + is_dont_delete),
|
| + Code);
|
| +}
|
| +Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name,
|
| + Handle<JSObject> receiver,
|
| + Handle<GlobalObject> holder,
|
| + Handle<JSGlobalPropertyCell> cell,
|
| bool is_dont_delete) {
|
| - ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
|
| + ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL);
|
| - Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| - if (code->IsUndefined()) {
|
| - LoadStubCompiler compiler;
|
| - { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver,
|
| - holder,
|
| - cell,
|
| - name,
|
| - is_dont_delete);
|
| - if (!maybe_code->ToObject(&code)) return maybe_code;
|
| - }
|
| - PROFILE(isolate_,
|
| - CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code)));
|
| - Object* result;
|
| - { MaybeObject* maybe_result =
|
| - receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (!maybe_result->ToObject(&result)) return maybe_result;
|
| - }
|
| - }
|
| + Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
|
| + if (probe->IsCode()) return Handle<Code>::cast(probe);
|
| +
|
| + LoadStubCompiler compiler(isolate_);
|
| + Handle<Code> code =
|
| + compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete);
|
| + PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| + GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| + JSObject::UpdateMapCodeCache(isolate_, receiver, name, code);
|
| return code;
|
| }
|
|
|
| @@ -297,7 +314,8 @@ MaybeObject* StubCache::ComputeKeyedLoadField(String* name,
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileLoadField(name, receiver, holder, field_index);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -324,7 +342,8 @@ MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name,
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileLoadConstant(name, receiver, holder, value);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -350,7 +369,8 @@ MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name,
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileLoadInterceptor(receiver, holder, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -377,7 +397,8 @@ MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name,
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -403,7 +424,8 @@ MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name,
|
| ASSERT(receiver->IsJSObject());
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| }
|
| @@ -427,7 +449,8 @@ MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name,
|
| Map* map = receiver->map();
|
| Object* code = map->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| }
|
| @@ -450,7 +473,8 @@ MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype(
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| }
|
| @@ -477,7 +501,8 @@ MaybeObject* StubCache::ComputeStoreField(String* name,
|
| Code::STORE_IC, type, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(strict_mode);
|
| + HandleScope scope(isolate_);
|
| + StoreStubCompiler compiler(isolate_, strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreField(receiver, field_index, transition, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -524,12 +549,14 @@ MaybeObject* StubCache::ComputeKeyedLoadOrStoreElement(
|
| MaybeObject* maybe_new_code = NULL;
|
| switch (stub_kind) {
|
| case KeyedIC::LOAD: {
|
| - KeyedLoadStubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + KeyedLoadStubCompiler compiler(isolate_);
|
| maybe_new_code = compiler.CompileLoadElement(receiver_map);
|
| break;
|
| }
|
| case KeyedIC::STORE_NO_TRANSITION: {
|
| - KeyedStoreStubCompiler compiler(strict_mode);
|
| + HandleScope scope(isolate_);
|
| + KeyedStoreStubCompiler compiler(isolate_, strict_mode);
|
| maybe_new_code = compiler.CompileStoreElement(receiver_map);
|
| break;
|
| }
|
| @@ -574,7 +601,8 @@ MaybeObject* StubCache::ComputeStoreGlobal(String* name,
|
| Code::STORE_IC, NORMAL, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(strict_mode);
|
| + HandleScope scope(isolate_);
|
| + StoreStubCompiler compiler(isolate_, strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreGlobal(receiver, cell, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -602,7 +630,8 @@ MaybeObject* StubCache::ComputeStoreCallback(
|
| Code::STORE_IC, CALLBACKS, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(strict_mode);
|
| + HandleScope scope(isolate_);
|
| + StoreStubCompiler compiler(isolate_, strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreCallback(receiver, callback, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -628,7 +657,8 @@ MaybeObject* StubCache::ComputeStoreInterceptor(
|
| Code::STORE_IC, INTERCEPTOR, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - StoreStubCompiler compiler(strict_mode);
|
| + HandleScope scope(isolate_);
|
| + StoreStubCompiler compiler(isolate_, strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreInterceptor(receiver, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -656,7 +686,8 @@ MaybeObject* StubCache::ComputeKeyedStoreField(String* name,
|
| Code::KEYED_STORE_IC, type, strict_mode);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - KeyedStoreStubCompiler compiler(strict_mode);
|
| + HandleScope scope(isolate());
|
| + KeyedStoreStubCompiler compiler(isolate(), strict_mode);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileStoreField(receiver, field_index, transition, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -712,7 +743,12 @@ MaybeObject* StubCache::ComputeCallConstant(int argc,
|
| // caches.
|
| if (!function->is_compiled()) return Failure::InternalError();
|
| // Compile the stub - only create stubs for fully compiled functions.
|
| - CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder);
|
| + HandleScope scope(isolate_);
|
| + CallStubCompiler compiler(isolate_,
|
| + argc,
|
| + kind,
|
| + extra_ic_state,
|
| + cache_holder);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileCallConstant(object, holder, function, name, check);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -759,7 +795,12 @@ MaybeObject* StubCache::ComputeCallField(int argc,
|
| argc);
|
| Object* code = map_holder->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder);
|
| + HandleScope scope(isolate_);
|
| + CallStubCompiler compiler(isolate_,
|
| + argc,
|
| + kind,
|
| + extra_ic_state,
|
| + cache_holder);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileCallField(JSObject::cast(object),
|
| holder,
|
| @@ -808,7 +849,12 @@ MaybeObject* StubCache::ComputeCallInterceptor(
|
| argc);
|
| Object* code = map_holder->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| - CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder);
|
| + HandleScope scope(isolate());
|
| + CallStubCompiler compiler(isolate(),
|
| + argc,
|
| + kind,
|
| + extra_ic_state,
|
| + cache_holder);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileCallInterceptor(JSObject::cast(object), holder, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -864,7 +910,12 @@ MaybeObject* StubCache::ComputeCallGlobal(int argc,
|
| // internal error which will make sure we do not update any
|
| // caches.
|
| if (!function->is_compiled()) return Failure::InternalError();
|
| - CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder);
|
| + HandleScope scope(isolate());
|
| + CallStubCompiler compiler(isolate(),
|
| + argc,
|
| + kind,
|
| + extra_ic_state,
|
| + cache_holder);
|
| { MaybeObject* maybe_code =
|
| compiler.CompileCallGlobal(receiver, holder, cell, function, name);
|
| if (!maybe_code->ToObject(&code)) return maybe_code;
|
| @@ -967,7 +1018,8 @@ MaybeObject* StubCache::ComputeCallInitialize(int argc,
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallInitialize(flags));
|
| }
|
|
|
| @@ -1002,7 +1054,8 @@ MaybeObject* StubCache::ComputeCallPreMonomorphic(
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags));
|
| }
|
|
|
| @@ -1020,7 +1073,8 @@ MaybeObject* StubCache::ComputeCallNormal(int argc,
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallNormal(flags));
|
| }
|
|
|
| @@ -1037,7 +1091,8 @@ MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) {
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallArguments(flags));
|
| }
|
|
|
| @@ -1056,7 +1111,8 @@ MaybeObject* StubCache::ComputeCallMegamorphic(
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallMegamorphic(flags));
|
| }
|
|
|
| @@ -1077,7 +1133,8 @@ MaybeObject* StubCache::ComputeCallMiss(int argc,
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallMiss(flags));
|
| }
|
|
|
| @@ -1098,7 +1155,8 @@ MaybeObject* StubCache::ComputeCallDebugBreak(
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallDebugBreak(flags));
|
| }
|
|
|
| @@ -1118,7 +1176,8 @@ MaybeObject* StubCache::ComputeCallDebugPrepareStepIn(
|
| if (!maybe_probe->ToObject(&probe)) return maybe_probe;
|
| }
|
| if (!probe->IsUndefined()) return probe;
|
| - StubCompiler compiler;
|
| + HandleScope scope(isolate_);
|
| + StubCompiler compiler(isolate_);
|
| return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags));
|
| }
|
| #endif
|
| @@ -1704,11 +1763,13 @@ void KeyedStoreStubCompiler::GenerateStoreDictionaryElement(
|
| }
|
|
|
|
|
| -CallStubCompiler::CallStubCompiler(int argc,
|
| +CallStubCompiler::CallStubCompiler(Isolate* isolate,
|
| + int argc,
|
| Code::Kind kind,
|
| Code::ExtraICState extra_ic_state,
|
| InlineCacheHolderFlag cache_holder)
|
| - : arguments_(argc),
|
| + : StubCompiler(isolate),
|
| + arguments_(argc),
|
| kind_(kind),
|
| extra_ic_state_(extra_ic_state),
|
| cache_holder_(cache_holder) {
|
|
|