Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index 47e7f64c44cc591ce1865c9a3bdb61e500f14811..3049f9188ef33a5709d6e9722ebf4f8f7b13e285 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -542,8 +542,23 @@ Handle<Code> StubCache::ComputeStoreField(Handle<String> name, |
} |
-MaybeObject* StubCache::ComputeKeyedLoadOrStoreElement( |
- JSObject* receiver, |
+Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(Handle<Map> map) { |
+ CALL_HEAP_FUNCTION(isolate(), |
+ (set_failure(NULL), CompileLoadElement(*map)), |
+ Code); |
+} |
+ |
+ |
+Handle<Code> KeyedStoreStubCompiler::CompileStoreElement(Handle<Map> map) { |
+ CALL_HEAP_FUNCTION(isolate(), |
+ (set_failure(NULL), |
+ CompileStoreElement(*map)), |
+ Code); |
+} |
+ |
+ |
+Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( |
+ Handle<JSObject> receiver, |
KeyedIC::StubKind stub_kind, |
StrictModeFlag strict_mode) { |
Code::Flags flags = |
@@ -552,62 +567,92 @@ MaybeObject* StubCache::ComputeKeyedLoadOrStoreElement( |
: Code::KEYED_STORE_IC, |
NORMAL, |
strict_mode); |
- String* name = NULL; |
+ Handle<String> name; |
switch (stub_kind) { |
case KeyedIC::LOAD: |
- name = isolate()->heap()->KeyedLoadElementMonomorphic_symbol(); |
+ name = isolate()->factory()->KeyedLoadElementMonomorphic_symbol(); |
break; |
case KeyedIC::STORE_NO_TRANSITION: |
- name = isolate()->heap()->KeyedStoreElementMonomorphic_symbol(); |
+ name = isolate()->factory()->KeyedStoreElementMonomorphic_symbol(); |
break; |
default: |
UNREACHABLE(); |
break; |
} |
- Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); |
- if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); |
+ Handle<Map> receiver_map(receiver->map()); |
+ Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags)); |
+ if (probe->IsCode()) return Handle<Code>::cast(probe); |
- Map* receiver_map = receiver->map(); |
- MaybeObject* maybe_new_code = NULL; |
+ Handle<Code> code; |
switch (stub_kind) { |
case KeyedIC::LOAD: { |
- HandleScope scope(isolate_); |
KeyedLoadStubCompiler compiler(isolate_); |
- maybe_new_code = compiler.CompileLoadElement(receiver_map); |
+ code = compiler.CompileLoadElement(receiver_map); |
break; |
} |
case KeyedIC::STORE_NO_TRANSITION: { |
- HandleScope scope(isolate_); |
KeyedStoreStubCompiler compiler(isolate_, strict_mode); |
- maybe_new_code = compiler.CompileStoreElement(receiver_map); |
+ code = compiler.CompileStoreElement(receiver_map); |
break; |
} |
default: |
UNREACHABLE(); |
break; |
} |
- Code* code = NULL; |
- if (!maybe_new_code->To(&code)) return maybe_new_code; |
+ |
+ ASSERT(!code.is_null()); |
if (stub_kind == KeyedIC::LOAD) { |
- PROFILE(isolate_, |
- CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, |
- Code::cast(code), 0)); |
+ PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); |
} else { |
- PROFILE(isolate_, |
- CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
- Code::cast(code), 0)); |
- } |
- ASSERT(code->IsCode()); |
- Object* result; |
- { MaybeObject* maybe_result = |
- receiver->UpdateMapCodeCache(name, Code::cast(code)); |
- if (!maybe_result->ToObject(&result)) return maybe_result; |
+ PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, 0)); |
} |
+ JSObject::UpdateMapCodeCache(receiver, name, code); |
return code; |
} |
+Handle<Code> KeyedLoadStubCompiler::CompileLoadPolymorphic( |
+ MapHandleList* receiver_maps, |
+ CodeHandleList* handler_stubs) { |
+ MapList raw_receiver_maps(receiver_maps->length()); |
+ CodeList raw_handler_stubs(handler_stubs->length()); |
+ CALL_HEAP_FUNCTION( |
+ isolate(), |
+ (set_failure(NULL), |
+ raw_receiver_maps.Clear(), |
+ raw_handler_stubs.Clear(), |
+ CompileLoadPolymorphic(UnwrapHandleList(&raw_receiver_maps, |
+ receiver_maps), |
+ UnwrapHandleList(&raw_handler_stubs, |
+ handler_stubs))), |
+ Code); |
+} |
+ |
+ |
+Handle<Code> KeyedStoreStubCompiler::CompileStorePolymorphic( |
+ MapHandleList* receiver_maps, |
+ CodeHandleList* handler_stubs, |
+ MapHandleList* transitioned_maps) { |
+ MapList raw_receiver_maps(receiver_maps->length()); |
+ CodeList raw_handler_stubs(handler_stubs->length()); |
+ MapList raw_transitioned_maps(transitioned_maps->length()); |
+ CALL_HEAP_FUNCTION( |
+ isolate(), |
+ (set_failure(NULL), |
+ raw_receiver_maps.Clear(), |
+ raw_handler_stubs.Clear(), |
+ raw_transitioned_maps.Clear(), |
+ CompileStorePolymorphic(UnwrapHandleList(&raw_receiver_maps, |
+ receiver_maps), |
+ UnwrapHandleList(&raw_handler_stubs, |
+ handler_stubs), |
+ UnwrapHandleList(&raw_transitioned_maps, |
+ transitioned_maps))), |
+ Code); |
+} |
+ |
+ |
Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { |
return (strict_mode == kStrictMode) |
? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() |