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:
parent
f74429b917
commit
4839eb611f
12
src/ic.cc
12
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> 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;
|
||||
|
11
src/ic.h
11
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<Object> receiver) {
|
||||
if (receiver->IsGlobalObject()) {
|
||||
return SlowIsContextual();
|
||||
} else {
|
||||
ASSERT(!SlowIsContextual());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool SlowIsContextual() {
|
||||
return ComputeMode() == RelocInfo::CODE_TARGET_CONTEXT;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user