| Index: src/stub-cache.cc
|
| ===================================================================
|
| --- src/stub-cache.cc (revision 5559)
|
| +++ src/stub-cache.cc (working copy)
|
| @@ -114,13 +114,17 @@
|
| Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT);
|
| Object* code = receiver->map()->FindInCodeCache(cache_name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileLoadNonexistent(cache_name, receiver, last);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| LoadStubCompiler compiler;
|
| - code = compiler.CompileLoadNonexistent(cache_name, receiver, last);
|
| - if (code->IsFailure()) return code;
|
| PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name));
|
| - Object* result =
|
| - receiver->UpdateMapCodeCache(cache_name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| + Object* result;
|
| + { TryAllocation t =
|
| + receiver->UpdateMapCodeCache(cache_name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| }
|
| return code;
|
| }
|
| @@ -134,12 +138,16 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileLoadField(receiver, holder, field_index, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| LoadStubCompiler compiler;
|
| - code = compiler.CompileLoadField(receiver, holder, field_index, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -154,12 +162,16 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| LoadStubCompiler compiler;
|
| - code = compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -174,12 +186,16 @@
|
| Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileLoadConstant(receiver, holder, value, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| LoadStubCompiler compiler;
|
| - code = compiler.CompileLoadConstant(receiver, holder, value, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -192,12 +208,15 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileLoadInterceptor(receiver, holder, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| LoadStubCompiler compiler;
|
| - code = compiler.CompileLoadInterceptor(receiver, holder, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -224,9 +243,11 @@
|
| name,
|
| is_dont_delete);
|
| if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -240,12 +261,16 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileLoadField(name, receiver, holder, field_index);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedLoadStubCompiler compiler;
|
| - code = compiler.CompileLoadField(name, receiver, holder, field_index);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -260,12 +285,16 @@
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileLoadConstant(name, receiver, holder, value);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedLoadStubCompiler compiler;
|
| - code = compiler.CompileLoadConstant(name, receiver, holder, value);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -279,12 +308,15 @@
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileLoadInterceptor(receiver, holder, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedLoadStubCompiler compiler;
|
| - code = compiler.CompileLoadInterceptor(receiver, holder, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -299,12 +331,16 @@
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedLoadStubCompiler compiler;
|
| - code = compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -318,12 +354,15 @@
|
| ASSERT(receiver->IsJSObject());
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileLoadArrayLength(name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedLoadStubCompiler compiler;
|
| - code = compiler.CompileLoadArrayLength(name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -336,12 +375,15 @@
|
| Map* map = receiver->map();
|
| Object* code = map->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileLoadStringLength(name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedLoadStubCompiler compiler;
|
| - code = compiler.CompileLoadStringLength(name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = map->UpdateCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = map->UpdateCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -353,12 +395,15 @@
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileLoadFunctionPrototype(name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedLoadStubCompiler compiler;
|
| - code = compiler.CompileLoadFunctionPrototype(name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -372,12 +417,16 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, type);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileStoreField(receiver, field_index, transition, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| StoreStubCompiler compiler;
|
| - code = compiler.CompileStoreField(receiver, field_index, transition, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -394,12 +443,15 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, NORMAL);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileStoreGlobal(receiver, cell, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| StoreStubCompiler compiler;
|
| - code = compiler.CompileStoreGlobal(receiver, cell, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -412,12 +464,15 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, CALLBACKS);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileStoreCallback(receiver, callback, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| StoreStubCompiler compiler;
|
| - code = compiler.CompileStoreCallback(receiver, callback, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -429,12 +484,15 @@
|
| Code::ComputeMonomorphicFlags(Code::STORE_IC, INTERCEPTOR);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t = compiler.CompileStoreInterceptor(receiver, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| StoreStubCompiler compiler;
|
| - code = compiler.CompileStoreInterceptor(receiver, name);
|
| - if (code->IsFailure()) return code;
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -446,13 +504,17 @@
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, type);
|
| Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| if (code->IsUndefined()) {
|
| + { TryAllocation t =
|
| + compiler.CompileStoreField(receiver, field_index, transition, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| KeyedStoreStubCompiler compiler;
|
| - code = compiler.CompileStoreField(receiver, field_index, transition, name);
|
| - if (code->IsFailure()) return code;
|
| PROFILE(CodeCreateEvent(
|
| + Object* result;
|
| + { TryAllocation t = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| Logger::KEYED_STORE_IC_TAG, Code::cast(code), name));
|
| - Object* result = receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -496,14 +558,18 @@
|
| // caches.
|
| if (!function->is_compiled()) return Failure::InternalError();
|
| // Compile the stub - only create stubs for fully compiled functions.
|
| + { TryAllocation t =
|
| + compiler.CompileCallConstant(object, holder, function, name, check);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| CallStubCompiler compiler(argc, in_loop, kind, cache_holder);
|
| - code = compiler.CompileCallConstant(object, holder, function, name, check);
|
| - if (code->IsFailure()) return code;
|
| ASSERT_EQ(flags, Code::cast(code)->flags());
|
| PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
|
| + Object* result;
|
| + { TryAllocation t = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| Code::cast(code), name));
|
| - Object* result = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -543,9 +609,11 @@
|
| if (code->IsFailure()) return code;
|
| ASSERT_EQ(flags, Code::cast(code)->flags());
|
| PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
|
| + Object* result;
|
| + { TryAllocation t = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| Code::cast(code), name));
|
| - Object* result = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -583,9 +651,11 @@
|
| if (code->IsFailure()) return code;
|
| ASSERT_EQ(flags, Code::cast(code)->flags());
|
| PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
|
| + Object* result;
|
| + { TryAllocation t = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| Code::cast(code), name));
|
| - Object* result = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -595,9 +665,11 @@
|
| InLoopFlag in_loop,
|
| Code::Kind kind,
|
| String* name,
|
| + Object* code;
|
| + { TryAllocation t = ComputeCallNormal(argc, in_loop, kind);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| JSObject* receiver) {
|
| - Object* code = ComputeCallNormal(argc, in_loop, kind);
|
| - if (code->IsFailure()) return code;
|
| return code;
|
| }
|
|
|
| @@ -626,14 +698,18 @@
|
| // internal error which will make sure we do not update any
|
| // caches.
|
| if (!function->is_compiled()) return Failure::InternalError();
|
| + { TryAllocation t =
|
| + compiler.CompileCallGlobal(receiver, holder, cell, function, name);
|
| + if (!t->ToObject(&code)) return t;
|
| + }
|
| CallStubCompiler compiler(argc, in_loop, kind, cache_holder);
|
| - code = compiler.CompileCallGlobal(receiver, holder, cell, function, name);
|
| - if (code->IsFailure()) return code;
|
| ASSERT_EQ(flags, Code::cast(code)->flags());
|
| PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
|
| + Object* result;
|
| + { TryAllocation t = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| Code::cast(code), name));
|
| - Object* result = map_holder->UpdateMapCodeCache(name, Code::cast(code));
|
| - if (result->IsFailure()) return result;
|
| }
|
| return code;
|
| }
|
| @@ -954,9 +1030,11 @@
|
| * lookup if interceptor failed.
|
| */
|
| Object* LoadPropertyWithInterceptorForLoad(Arguments args) {
|
| + Object* result;
|
| + { TryAllocation t = LoadWithInterceptor(&args, &attr);
|
| + if (!t->ToObject(&result)) return t;
|
| + }
|
| PropertyAttributes attr = NONE;
|
| - Object* result = LoadWithInterceptor(&args, &attr);
|
| - if (result->IsFailure()) return result;
|
|
|
| // If the property is present, return it.
|
| if (attr != ABSENT) return result;
|
|
|