| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index 68fc4c2f6691e8107cb7c93f8a221c5d57eb9793..9af56bfb5900ca634b576d98e64165c3e17b0af2 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -118,7 +118,7 @@ void IC::TraceIC(const char* type,
|
| #endif // DEBUG
|
|
|
| #define TRACE_IC(type, name, old_state, new_target) \
|
| - ASSERT((TraceIC(type, name, old_state, new_target), true))
|
| + ASSERT((TraceIC(type, name, old_state, *new_target), true))
|
|
|
| IC::IC(FrameDepth depth, Isolate* isolate) : isolate_(isolate) {
|
| // To improve the performance of the (much used) IC code, we unfold a few
|
| @@ -145,6 +145,7 @@ IC::IC(FrameDepth depth, Isolate* isolate) : isolate_(isolate) {
|
| #endif
|
| fp_ = fp;
|
| pc_address_ = StackFrame::ResolveReturnAddressLocation(pc_address);
|
| + target_ = handle(raw_target(), isolate);
|
| }
|
|
|
|
|
| @@ -752,7 +753,7 @@ void CallICBase::UpdateCaches(LookupResult* lookup,
|
| TryUpdateExtraICState(lookup, object, &extra_ic_state)) {
|
| code = ComputeMonomorphicStub(lookup, state, extra_ic_state,
|
| object, name);
|
| - } else if (TryRemoveInvalidPrototypeDependentStub(target(),
|
| + } else if (TryRemoveInvalidPrototypeDependentStub(*target(),
|
| *object,
|
| *name)) {
|
| state = MONOMORPHIC_PROTOTYPE_FAILURE;
|
| @@ -1087,8 +1088,6 @@ bool IC::IsTransitionedMapOfMonomorphicTarget(Map* receiver_map) {
|
| }
|
|
|
|
|
| -// Since GC may have been invoked, by the time PatchCache is called, |state| is
|
| -// not necessarily equal to target()->state().
|
| void IC::PatchCache(State state,
|
| Handle<HeapObject> receiver,
|
| Handle<String> name,
|
| @@ -1100,7 +1099,7 @@ void IC::PatchCache(State state,
|
| UpdateMonomorphicIC(receiver, code, name);
|
| break;
|
| case MONOMORPHIC:
|
| - ASSERT(target() != *code);
|
| + ASSERT(!target().is_identical_to(code));
|
| if (!target()->is_keyed_stub()) {
|
| bool is_same_handler = false;
|
| {
|
| @@ -1365,11 +1364,10 @@ Handle<Code> KeyedLoadIC::LoadElementStub(Handle<JSObject> receiver) {
|
| return isolate()->stub_cache()->ComputeKeyedLoadElement(receiver_map);
|
| }
|
|
|
| - if (target() == *string_stub()) {
|
| + if (target().is_identical_to(string_stub())) {
|
| target_receiver_maps.Add(isolate()->factory()->string_map());
|
| } else {
|
| - GetReceiverMapsForStub(Handle<Code>(target(), isolate()),
|
| - &target_receiver_maps);
|
| + GetReceiverMapsForStub(target(), &target_receiver_maps);
|
| if (target_receiver_maps.length() == 0) {
|
| return isolate()->stub_cache()->ComputeKeyedLoadElement(receiver_map);
|
| }
|
| @@ -1447,7 +1445,7 @@ MaybeObject* KeyedLoadIC::Load(State state,
|
| } else if (receiver->HasIndexedInterceptor()) {
|
| stub = indexed_interceptor_stub();
|
| } else if (!key->ToSmi()->IsFailure() &&
|
| - (target() != *non_strict_arguments_stub())) {
|
| + (!target().is_identical_to(non_strict_arguments_stub()))) {
|
| stub = LoadElementStub(receiver);
|
| }
|
| }
|
| @@ -1658,7 +1656,7 @@ MaybeObject* StoreIC::Store(State state,
|
| Handle<Code> stub =
|
| StoreArrayLengthStub(kind(), strict_mode()).GetCode(isolate());
|
| set_target(*stub);
|
| - TRACE_IC("StoreIC", name, state, *stub);
|
| + TRACE_IC("StoreIC", name, state, stub);
|
| Handle<Object> result = JSReceiver::SetProperty(
|
| receiver, name, value, NONE, strict_mode(), store_mode);
|
| RETURN_IF_EMPTY_HANDLE(isolate(), result);
|
| @@ -1671,7 +1669,7 @@ MaybeObject* StoreIC::Store(State state,
|
| // proxy as receiver.
|
| Handle<Code> stub = global_proxy_stub();
|
| set_target(*stub);
|
| - TRACE_IC("StoreIC", name, state, *stub);
|
| + TRACE_IC("StoreIC", name, state, stub);
|
| }
|
| Handle<Object> result = JSReceiver::SetProperty(
|
| receiver, name, value, NONE, strict_mode(), store_mode);
|
| @@ -1692,7 +1690,7 @@ MaybeObject* StoreIC::Store(State state,
|
| if (state == UNINITIALIZED) {
|
| Handle<Code> stub = pre_monomorphic_stub();
|
| set_target(*stub);
|
| - TRACE_IC("StoreIC", name, state, *stub);
|
| + TRACE_IC("StoreIC", name, state, stub);
|
| } else if (can_store) {
|
| UpdateCaches(&lookup, state, receiver, name, value);
|
| } else if (!name->IsCacheable(isolate()) ||
|
| @@ -2103,7 +2101,7 @@ MaybeObject* KeyedStoreIC::Store(State state,
|
| isolate()->heap()->non_strict_arguments_elements_map()) {
|
| stub = non_strict_arguments_stub();
|
| } else if (key_is_smi_like &&
|
| - (target() != *non_strict_arguments_stub())) {
|
| + (!target().is_identical_to(non_strict_arguments_stub()))) {
|
| KeyedAccessStoreMode store_mode = GetStoreMode(receiver, key, value);
|
| stub = StoreElementStub(receiver, store_mode);
|
| } else {
|
| @@ -2180,7 +2178,7 @@ RUNTIME_FUNCTION(MaybeObject*, CallIC_Miss) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| CallIC ic(isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| MaybeObject* maybe_result = ic.LoadFunction(state,
|
| extra_ic_state,
|
| @@ -2207,7 +2205,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedCallIC_Miss) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| KeyedCallIC ic(isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| MaybeObject* maybe_result =
|
| ic.LoadFunction(state, args.at<Object>(0), args.at<Object>(1));
|
| // Result could be a function or a failure.
|
| @@ -2227,7 +2225,7 @@ RUNTIME_FUNCTION(MaybeObject*, LoadIC_Miss) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| LoadIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Load(state, args.at<Object>(0), args.at<String>(1));
|
| }
|
|
|
| @@ -2237,7 +2235,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_Miss) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Load(state, args.at<Object>(0), args.at<Object>(1), MISS);
|
| }
|
|
|
| @@ -2246,7 +2244,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_MissFromStubFailure) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Load(state, args.at<Object>(0), args.at<Object>(1), MISS);
|
| }
|
|
|
| @@ -2255,7 +2253,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_MissForceGeneric) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| KeyedLoadIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Load(state,
|
| args.at<Object>(0),
|
| args.at<Object>(1),
|
| @@ -2268,7 +2266,7 @@ RUNTIME_FUNCTION(MaybeObject*, StoreIC_Miss) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| StoreIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Store(state,
|
| args.at<Object>(0),
|
| args.at<String>(1),
|
| @@ -2280,7 +2278,7 @@ RUNTIME_FUNCTION(MaybeObject*, StoreIC_MissFromStubFailure) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| StoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Store(state,
|
| args.at<Object>(0),
|
| args.at<String>(1),
|
| @@ -2367,7 +2365,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Miss) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Store(state,
|
| args.at<Object>(0),
|
| args.at<Object>(1),
|
| @@ -2380,7 +2378,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_MissFromStubFailure) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Store(state,
|
| args.at<Object>(0),
|
| args.at<Object>(1),
|
| @@ -2390,7 +2388,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_MissFromStubFailure) {
|
|
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, StoreIC_Slow) {
|
| - SealHandleScope shs(isolate);
|
| + HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| StoreIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| @@ -2408,7 +2406,7 @@ RUNTIME_FUNCTION(MaybeObject*, StoreIC_Slow) {
|
|
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Slow) {
|
| - SealHandleScope shs(isolate);
|
| + HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| @@ -2429,7 +2427,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_MissForceGeneric) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - IC::State state = IC::StateFrom(ic.target(), args[0], args[1]);
|
| + IC::State state = IC::StateFrom(*ic.target(), args[0], args[1]);
|
| return ic.Store(state,
|
| args.at<Object>(0),
|
| args.at<Object>(1),
|
| @@ -2439,7 +2437,7 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_MissForceGeneric) {
|
|
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss) {
|
| - SealHandleScope scope(isolate);
|
| + HandleScope scope(isolate);
|
| ASSERT(args.length() == 4);
|
| KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
|
| Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| @@ -2951,11 +2949,11 @@ void CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) {
|
|
|
| // Used from ICCompareStub::GenerateMiss in code-stubs-<arch>.cc.
|
| RUNTIME_FUNCTION(Code*, CompareIC_Miss) {
|
| - SealHandleScope shs(isolate);
|
| + HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2)));
|
| ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1));
|
| - return ic.target();
|
| + return ic.raw_target();
|
| }
|
|
|
|
|
|
|