From 4839eb611fe191f6b2e9eff838aff1951da6d358 Mon Sep 17 00:00:00 2001 From: "kasperl@chromium.org" Date: Mon, 14 Dec 2009 09:54:13 +0000 Subject: [PATCH] Try to make the contextuality check in the IC code faster by checking if the receiver is a global object before diving into traversing reloc info. Review URL: http://codereview.chromium.org/491075 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3459 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ic.cc | 12 ++++++------ src/ic.h | 11 ++++++++++- src/stub-cache.cc | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/ic.cc b/src/ic.cc index 2779356..57c9af2 100644 --- a/src/ic.cc +++ b/src/ic.cc @@ -409,7 +409,7 @@ Object* CallIC::LoadFunction(State state, if (!lookup.IsValid()) { // If the object does not have the requested property, check which // exception we need to throw. - if (is_contextual()) { + if (IsContextual(object)) { return ReferenceError("not_defined", name); } return TypeError("undefined_method", object, name); @@ -428,7 +428,7 @@ Object* CallIC::LoadFunction(State state, // If the object does not have the requested property, check which // exception we need to throw. if (attr == ABSENT) { - if (is_contextual()) { + if (IsContextual(object)) { return ReferenceError("not_defined", name); } return TypeError("undefined_method", object, name); @@ -628,7 +628,7 @@ Object* LoadIC::Load(State state, Handle object, Handle name) { // If lookup is invalid, check if we need to throw an exception. if (!lookup.IsValid()) { - if (FLAG_strict || is_contextual()) { + if (FLAG_strict || IsContextual(object)) { return ReferenceError("not_defined", name); } LOG(SuspectReadEvent(*name, *object)); @@ -671,7 +671,7 @@ Object* LoadIC::Load(State state, Handle object, Handle name) { if (result->IsFailure()) return result; // If the property is not present, check if we need to throw an // exception. - if (attr == ABSENT && is_contextual()) { + if (attr == ABSENT && IsContextual(object)) { return ReferenceError("not_defined", name); } return result; @@ -843,7 +843,7 @@ Object* KeyedLoadIC::Load(State state, // If lookup is invalid, check if we need to throw an exception. if (!lookup.IsValid()) { - if (FLAG_strict || is_contextual()) { + if (FLAG_strict || IsContextual(object)) { return ReferenceError("not_defined", name); } } @@ -859,7 +859,7 @@ Object* KeyedLoadIC::Load(State state, if (result->IsFailure()) return result; // If the property is not present, check if we need to throw an // exception. - if (attr == ABSENT && is_contextual()) { + if (attr == ABSENT && IsContextual(object)) { return ReferenceError("not_defined", name); } return result; diff --git a/src/ic.h b/src/ic.h index 3725145..f71eaaa 100644 --- a/src/ic.h +++ b/src/ic.h @@ -104,7 +104,16 @@ class IC { // Returns if this IC is for contextual (no explicit receiver) // access to properties. - bool is_contextual() { + bool IsContextual(Handle receiver) { + if (receiver->IsGlobalObject()) { + return SlowIsContextual(); + } else { + ASSERT(!SlowIsContextual()); + return false; + } + } + + bool SlowIsContextual() { return ComputeMode() == RelocInfo::CODE_TARGET_CONTEXT; } diff --git a/src/stub-cache.cc b/src/stub-cache.cc index a6ec306..9ab83be 100644 --- a/src/stub-cache.cc +++ b/src/stub-cache.cc @@ -831,7 +831,7 @@ static Object* ThrowReferenceError(String* name) { // can't use either LoadIC or KeyedLoadIC constructors. IC ic(IC::NO_EXTRA_FRAME); ASSERT(ic.target()->is_load_stub() || ic.target()->is_keyed_load_stub()); - if (!ic.is_contextual()) return Heap::undefined_value(); + if (!ic.SlowIsContextual()) return Heap::undefined_value(); // Throw a reference error. HandleScope scope; -- 2.7.4