Revision: 7871
Author:   [email protected]
Date:     Thu May 12 05:48:10 2011
Log:      Extend the fast case of HasLocalProperty.

Review URL: http://codereview.chromium.org/7016016
http://code.google.com/p/v8/source/detail?r=7871

Modified:
 /branches/bleeding_edge/src/runtime.cc

=======================================
--- /branches/bleeding_edge/src/runtime.cc      Mon May  9 01:58:57 2011
+++ /branches/bleeding_edge/src/runtime.cc      Thu May 12 05:48:10 2011
@@ -4166,25 +4166,33 @@
   ASSERT(args.length() == 2);
   CONVERT_CHECKED(String, key, args[1]);

+  uint32_t index;
+  const bool key_is_array_index = key->AsArrayIndex(&index);
+
   Object* obj = args[0];
   // Only JS objects can have properties.
   if (obj->IsJSObject()) {
     JSObject* object = JSObject::cast(obj);
-    // Fast case - no interceptors.
+    // Fast case: either the key is a real named property or it is not
+    // an array index and there are no interceptors or hidden
+    // prototypes.
if (object->HasRealNamedProperty(key)) return isolate->heap()->true_value(); - // Slow case. Either it's not there or we have an interceptor. We should
-    // have handles for this kind of deal.
+    Map* map = object->map();
+    if (!key_is_array_index &&
+        !map->has_named_interceptor() &&
+ !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) {
+      return isolate->heap()->false_value();
+    }
+    // Slow case.
     HandleScope scope(isolate);
     return HasLocalPropertyImplementation(isolate,
                                           Handle<JSObject>(object),
                                           Handle<String>(key));
-  } else if (obj->IsString()) {
+  } else if (obj->IsString() && key_is_array_index) {
     // Well, there is one exception:  Handle [] on strings.
-    uint32_t index;
-    if (key->AsArrayIndex(&index)) {
-      String* string = String::cast(obj);
-      if (index < static_cast<uint32_t>(string->length()))
-        return isolate->heap()->true_value();
+    String* string = String::cast(obj);
+    if (index < static_cast<uint32_t>(string->length())) {
+      return isolate->heap()->true_value();
     }
   }
   return isolate->heap()->false_value();

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

Reply via email to