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
This commit is contained in:
kasperl@chromium.org 2009-12-14 09:54:13 +00:00
parent f74429b917
commit 4839eb611f
3 changed files with 17 additions and 8 deletions

View File

@ -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> object, Handle<String> 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> object, Handle<String> 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;

View File

@ -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<Object> receiver) {
if (receiver->IsGlobalObject()) {
return SlowIsContextual();
} else {
ASSERT(!SlowIsContextual());
return false;
}
}
bool SlowIsContextual() {
return ComputeMode() == RelocInfo::CODE_TARGET_CONTEXT;
}

View File

@ -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;