Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index 75e2e94941cf92aca4b038fa1f9bbf58358b21e4..a400e4e362ccd4ece68891d2d64641ca36d7cff3 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -491,31 +491,38 @@ MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( |
} |
-MaybeObject* StubCache::ComputeStoreField(String* name, |
- JSObject* receiver, |
+Handle<Code> StoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
+ int index, |
+ Handle<Map> transition, |
+ Handle<String> name) { |
+ CALL_HEAP_FUNCTION(isolate(), |
+ CompileStoreField(*object, |
+ index, |
+ (transition.is_null() |
+ ? NULL |
+ : *transition), |
+ *name), |
+ Code); |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeStoreField(Handle<String> name, |
+ Handle<JSObject> receiver, |
int field_index, |
- Map* transition, |
+ Handle<Map> transition, |
StrictModeFlag strict_mode) { |
- PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
+ PropertyType type = (transition.is_null()) ? FIELD : MAP_TRANSITION; |
Code::Flags flags = Code::ComputeMonomorphicFlags( |
Code::STORE_IC, type, strict_mode); |
- Object* code = receiver->map()->FindInCodeCache(name, flags); |
- if (code->IsUndefined()) { |
- 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; |
- } |
- PROFILE(isolate_, |
- CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
- GDBJIT(AddCode(GDBJITInterface::STORE_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); |
+ |
+ StoreStubCompiler compiler(isolate_, strict_mode); |
+ Handle<Code> code = |
+ compiler.CompileStoreField(receiver, field_index, transition, name); |
+ PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
+ GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
+ JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
return code; |
} |
@@ -586,92 +593,91 @@ MaybeObject* StubCache::ComputeKeyedLoadOrStoreElement( |
} |
-MaybeObject* StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { |
- return isolate_->builtins()->builtin((strict_mode == kStrictMode) |
- ? Builtins::kStoreIC_Normal_Strict |
- : Builtins::kStoreIC_Normal); |
+Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { |
+ return (strict_mode == kStrictMode) |
+ ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() |
+ : isolate_->builtins()->Builtins::StoreIC_Normal(); |
+} |
+ |
+ |
+Handle<Code> StoreStubCompiler::CompileStoreGlobal( |
+ Handle<GlobalObject> object, |
+ Handle<JSGlobalPropertyCell> holder, |
+ Handle<String> name) { |
+ CALL_HEAP_FUNCTION(isolate(), |
+ CompileStoreGlobal(*object, *holder, *name), |
+ Code); |
} |
-MaybeObject* StubCache::ComputeStoreGlobal(String* name, |
- GlobalObject* receiver, |
- JSGlobalPropertyCell* cell, |
+Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, |
+ Handle<GlobalObject> receiver, |
+ Handle<JSGlobalPropertyCell> cell, |
StrictModeFlag strict_mode) { |
Code::Flags flags = Code::ComputeMonomorphicFlags( |
Code::STORE_IC, NORMAL, strict_mode); |
- Object* code = receiver->map()->FindInCodeCache(name, flags); |
- if (code->IsUndefined()) { |
- HandleScope scope(isolate_); |
- StoreStubCompiler compiler(isolate_, strict_mode); |
- { MaybeObject* maybe_code = |
- compiler.CompileStoreGlobal(receiver, cell, name); |
- if (!maybe_code->ToObject(&code)) return maybe_code; |
- } |
- PROFILE(isolate_, |
- CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
- GDBJIT(AddCode(GDBJITInterface::STORE_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); |
+ |
+ StoreStubCompiler compiler(isolate_, strict_mode); |
+ Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); |
+ PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
+ GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
+ JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
return code; |
} |
-MaybeObject* StubCache::ComputeStoreCallback( |
- String* name, |
- JSObject* receiver, |
- AccessorInfo* callback, |
- StrictModeFlag strict_mode) { |
+Handle<Code> StoreStubCompiler::CompileStoreCallback( |
+ Handle<JSObject> object, |
+ Handle<AccessorInfo> callback, |
+ Handle<String> name) { |
+ CALL_HEAP_FUNCTION(isolate(), |
+ CompileStoreCallback(*object, *callback, *name), |
+ Code); |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, |
+ Handle<JSObject> receiver, |
+ Handle<AccessorInfo> callback, |
+ StrictModeFlag strict_mode) { |
ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
Code::Flags flags = Code::ComputeMonomorphicFlags( |
Code::STORE_IC, CALLBACKS, strict_mode); |
- Object* code = receiver->map()->FindInCodeCache(name, flags); |
- if (code->IsUndefined()) { |
- HandleScope scope(isolate_); |
- StoreStubCompiler compiler(isolate_, strict_mode); |
- { MaybeObject* maybe_code = |
- compiler.CompileStoreCallback(receiver, callback, name); |
- if (!maybe_code->ToObject(&code)) return maybe_code; |
- } |
- PROFILE(isolate_, |
- CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
- GDBJIT(AddCode(GDBJITInterface::STORE_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); |
+ |
+ StoreStubCompiler compiler(isolate_, strict_mode); |
+ Handle<Code> code = compiler.CompileStoreCallback(receiver, callback, name); |
+ PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
+ GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
+ JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
return code; |
} |
-MaybeObject* StubCache::ComputeStoreInterceptor( |
- String* name, |
- JSObject* receiver, |
- StrictModeFlag strict_mode) { |
+Handle<Code> StoreStubCompiler::CompileStoreInterceptor(Handle<JSObject> object, |
+ Handle<String> name) { |
+ CALL_HEAP_FUNCTION(isolate(), |
+ CompileStoreInterceptor(*object, *name), |
+ Code); |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeStoreInterceptor(Handle<String> name, |
+ Handle<JSObject> receiver, |
+ StrictModeFlag strict_mode) { |
Code::Flags flags = Code::ComputeMonomorphicFlags( |
Code::STORE_IC, INTERCEPTOR, strict_mode); |
- Object* code = receiver->map()->FindInCodeCache(name, flags); |
- if (code->IsUndefined()) { |
- HandleScope scope(isolate_); |
- StoreStubCompiler compiler(isolate_, strict_mode); |
- { MaybeObject* maybe_code = |
- compiler.CompileStoreInterceptor(receiver, name); |
- if (!maybe_code->ToObject(&code)) return maybe_code; |
- } |
- PROFILE(isolate_, |
- CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
- GDBJIT(AddCode(GDBJITInterface::STORE_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); |
+ |
+ StoreStubCompiler compiler(isolate_, strict_mode); |
+ Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); |
+ PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
+ GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
+ JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
return code; |
} |