Make ComputeReceiverForNonGlobal faster
authorjkummerow <jkummerow@chromium.org>
Wed, 25 Feb 2015 15:24:29 +0000 (07:24 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 25 Feb 2015 15:24:41 +0000 (15:24 +0000)
by checking instance type rather than constructor.

BUG=chromium:461734
LOG=n
R=verwaest@chromium.org

Review URL: https://codereview.chromium.org/953283004

Cr-Commit-Position: refs/heads/master@{#26856}

src/runtime/runtime-scopes.cc

index 201bf9d4c683030fcdcc3a15d94a7b51b02869ca..9706e1dc98f864776794e579abb3d709ed6018fb 100644 (file)
@@ -855,16 +855,14 @@ RUNTIME_FUNCTION(Runtime_DeleteLookupSlot) {
 
 static Object* ComputeReceiverForNonGlobal(Isolate* isolate, JSObject* holder) {
   DCHECK(!holder->IsGlobalObject());
-  Context* top = isolate->context();
-  // Get the context extension function.
-  JSFunction* context_extension_function =
-      top->native_context()->context_extension_function();
+
   // If the holder isn't a context extension object, we just return it
   // as the receiver. This allows arguments objects to be used as
   // receivers, but only if they are put in the context scope chain
   // explicitly via a with-statement.
-  Object* constructor = holder->map()->GetConstructor();
-  if (constructor != context_extension_function) return holder;
+  if (holder->map()->instance_type() != JS_CONTEXT_EXTENSION_OBJECT_TYPE) {
+    return holder;
+  }
   // Fall back to using the global object as the implicit receiver if
   // the property turns out to be a local variable allocated in a
   // context extension object - introduced via eval.