Reviewers: Mads Ager,

Description:
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.

Please review this at http://codereview.chromium.org/491075

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
   M     bleeding_edge/src/ic.h
   M     bleeding_edge/src/ic.cc
   M     bleeding_edge/src/stub-cache.cc


Index: bleeding_edge/src/ic.cc
===================================================================
--- bleeding_edge/src/ic.cc     (revision 3458)
+++ bleeding_edge/src/ic.cc     (working copy)
@@ -409,7 +409,7 @@
    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 @@
      // 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 @@

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

      // 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 @@
        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;
Index: bleeding_edge/src/ic.h
===================================================================
--- bleeding_edge/src/ic.h      (revision 3458)
+++ bleeding_edge/src/ic.h      (working copy)
@@ -104,7 +104,16 @@

    // 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;
    }

Index: bleeding_edge/src/stub-cache.cc
===================================================================
--- bleeding_edge/src/stub-cache.cc     (revision 3458)
+++ bleeding_edge/src/stub-cache.cc     (working copy)
@@ -831,7 +831,7 @@
    // 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;


-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to