| Index: src/ic.cc
|
| diff --git a/src/ic.cc b/src/ic.cc
|
| index e7a8eaa8491f2a17cdcbced3a294e7a2def2d956..f74a9a8ea6b4f16129696f95b536a49f1d531d71 100644
|
| --- a/src/ic.cc
|
| +++ b/src/ic.cc
|
| @@ -539,8 +539,7 @@ void CallICBase::ReceiverToObjectIfRequired(Handle<Object> callee,
|
| }
|
|
|
|
|
| -MaybeObject* CallICBase::LoadFunction(Code::ExtraICState extra_ic_state,
|
| - Handle<Object> object,
|
| +MaybeObject* CallICBase::LoadFunction(Handle<Object> object,
|
| Handle<String> name) {
|
| bool use_ic = FLAG_use_ic;
|
| if (object->IsJSObject()) {
|
| @@ -585,7 +584,7 @@ MaybeObject* CallICBase::LoadFunction(Code::ExtraICState extra_ic_state,
|
| }
|
|
|
| // Lookup is valid: Update inline cache and stub cache.
|
| - if (use_ic) UpdateCaches(&lookup, extra_ic_state, object, name);
|
| + if (use_ic) UpdateCaches(&lookup, object, name);
|
|
|
| // Get the property.
|
| PropertyAttributes attr;
|
| @@ -630,10 +629,8 @@ MaybeObject* CallICBase::LoadFunction(Code::ExtraICState extra_ic_state,
|
| }
|
|
|
|
|
| -bool CallICBase::TryUpdateExtraICState(LookupResult* lookup,
|
| - Handle<Object> object,
|
| - Code::ExtraICState* extra_ic_state) {
|
| - ASSERT(kind_ == Code::CALL_IC);
|
| +bool CallIC::TryUpdateExtraICState(LookupResult* lookup,
|
| + Handle<Object> object) {
|
| if (!lookup->IsConstantFunction()) return false;
|
| JSFunction* function = lookup->GetConstantFunction();
|
| if (!function->shared()->HasBuiltinFunctionId()) return false;
|
| @@ -655,12 +652,12 @@ bool CallICBase::TryUpdateExtraICState(LookupResult* lookup,
|
| ASSERT(string == args[0] || string == JSValue::cast(args[0])->value());
|
| // If we're in the default (fastest) state and the index is
|
| // out of bounds, update the state to record this fact.
|
| - if (StringStubState::decode(*extra_ic_state) == DEFAULT_STRING_STUB &&
|
| + if (StringStubState::decode(extra_ic_state()) == DEFAULT_STRING_STUB &&
|
| argc >= 1 && args[1]->IsNumber()) {
|
| double index = DoubleToInteger(args.number_at(1));
|
| if (index < 0 || index >= string->length()) {
|
| - *extra_ic_state =
|
| - StringStubState::update(*extra_ic_state,
|
| + extra_ic_state_ =
|
| + StringStubState::update(extra_ic_state(),
|
| STRING_INDEX_OUT_OF_BOUNDS);
|
| return true;
|
| }
|
| @@ -730,7 +727,6 @@ Handle<Code> CallICBase::ComputeMonomorphicStub(LookupResult* lookup,
|
|
|
|
|
| void CallICBase::UpdateCaches(LookupResult* lookup,
|
| - Code::ExtraICState extra_ic_state,
|
| Handle<Object> object,
|
| Handle<String> name) {
|
| // Bail out if we didn't find a result.
|
| @@ -744,20 +740,20 @@ void CallICBase::UpdateCaches(LookupResult* lookup,
|
| // Set the target to the pre monomorphic stub to delay
|
| // setting the monomorphic state.
|
| code = isolate()->stub_cache()->ComputeCallPreMonomorphic(
|
| - argc, kind_, extra_ic_state);
|
| + argc, kind_, extra_ic_state());
|
| } else if (state() == MONOMORPHIC) {
|
| if (kind_ == Code::CALL_IC &&
|
| - TryUpdateExtraICState(lookup, object, &extra_ic_state)) {
|
| - code = ComputeMonomorphicStub(lookup, extra_ic_state, object, name);
|
| + static_cast<CallIC*>(this)->TryUpdateExtraICState(lookup, object)) {
|
| + code = ComputeMonomorphicStub(lookup, extra_ic_state(), object, name);
|
| } else if (TryRemoveInvalidPrototypeDependentStub(*object, *name)) {
|
| MarkMonomorphicPrototypeFailure();
|
| - code = ComputeMonomorphicStub(lookup, extra_ic_state, object, name);
|
| + code = ComputeMonomorphicStub(lookup, extra_ic_state(), object, name);
|
| } else {
|
| code = isolate()->stub_cache()->ComputeCallMegamorphic(
|
| - argc, kind_, extra_ic_state);
|
| + argc, kind_, extra_ic_state());
|
| }
|
| } else {
|
| - code = ComputeMonomorphicStub(lookup, extra_ic_state, object, name);
|
| + code = ComputeMonomorphicStub(lookup, extra_ic_state(), object, name);
|
| }
|
|
|
| // If there's no appropriate stub we simply avoid updating the caches.
|
| @@ -797,9 +793,7 @@ void CallICBase::UpdateCaches(LookupResult* lookup,
|
| MaybeObject* KeyedCallIC::LoadFunction(Handle<Object> object,
|
| Handle<Object> key) {
|
| if (key->IsInternalizedString()) {
|
| - return CallICBase::LoadFunction(Code::kNoExtraICState,
|
| - object,
|
| - Handle<String>::cast(key));
|
| + return CallICBase::LoadFunction(object, Handle<String>::cast(key));
|
| }
|
|
|
| bool use_ic = FLAG_use_ic && !object->IsAccessCheckNeeded();
|
| @@ -2114,9 +2108,7 @@ RUNTIME_FUNCTION(MaybeObject*, CallIC_Miss) {
|
| ASSERT(args.length() == 2);
|
| CallIC ic(isolate);
|
| ic.UpdateState(args[0], args[1]);
|
| - Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| - MaybeObject* maybe_result = ic.LoadFunction(extra_ic_state,
|
| - args.at<Object>(0),
|
| + MaybeObject* maybe_result = ic.LoadFunction(args.at<Object>(0),
|
| args.at<String>(1));
|
| JSFunction* raw_function;
|
| if (!maybe_result->To(&raw_function)) return maybe_result;
|
| @@ -2320,11 +2312,10 @@ RUNTIME_FUNCTION(MaybeObject*, StoreIC_Slow) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| StoreIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| Handle<Object> object = args.at<Object>(0);
|
| Handle<Object> key = args.at<Object>(1);
|
| Handle<Object> value = args.at<Object>(2);
|
| - StrictModeFlag strict_mode = Code::GetStrictMode(extra_ic_state);
|
| + StrictModeFlag strict_mode = ic.strict_mode();
|
| return Runtime::SetObjectProperty(isolate,
|
| object,
|
| key,
|
| @@ -2338,11 +2329,10 @@ RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_Slow) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| KeyedStoreIC ic(IC::NO_EXTRA_FRAME, isolate);
|
| - Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| Handle<Object> object = args.at<Object>(0);
|
| Handle<Object> key = args.at<Object>(1);
|
| Handle<Object> value = args.at<Object>(2);
|
| - StrictModeFlag strict_mode = Code::GetStrictMode(extra_ic_state);
|
| + StrictModeFlag strict_mode = ic.strict_mode();
|
| return Runtime::SetObjectProperty(isolate,
|
| object,
|
| key,
|
| @@ -2368,11 +2358,10 @@ RUNTIME_FUNCTION(MaybeObject*, ElementsTransitionAndStoreIC_Miss) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 4);
|
| KeyedStoreIC ic(IC::EXTRA_CALL_FRAME, isolate);
|
| - Code::ExtraICState extra_ic_state = ic.target()->extra_ic_state();
|
| Handle<Object> value = args.at<Object>(0);
|
| Handle<Object> key = args.at<Object>(2);
|
| Handle<Object> object = args.at<Object>(3);
|
| - StrictModeFlag strict_mode = Code::GetStrictMode(extra_ic_state);
|
| + StrictModeFlag strict_mode = ic.strict_mode();
|
| return Runtime::SetObjectProperty(isolate,
|
| object,
|
| key,
|
|
|