Make ComputeReceiverForNonGlobal faster

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}
This commit is contained in:
jkummerow 2015-02-25 07:24:29 -08:00 committed by Commit bot
parent 726eb0582b
commit c8479785fc

View 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.