Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 88cca47baab6e36f9dd494879a295624b5f05423..922225f4d155db5c6e435840599528f01e2f6cfb 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -7886,8 +7886,8 @@ static inline MaybeObject* Unhole(Heap* heap, |
} |
-static JSObject* ComputeReceiverForNonGlobal(Isolate* isolate, |
- JSObject* holder) { |
+static Object* ComputeReceiverForNonGlobal(Isolate* isolate, |
+ JSObject* holder) { |
ASSERT(!holder->IsGlobalObject()); |
Context* top = isolate->context(); |
// Get the context extension function. |
@@ -7899,10 +7899,11 @@ static JSObject* ComputeReceiverForNonGlobal(Isolate* isolate, |
// explicitly via a with-statement. |
Object* constructor = holder->map()->constructor(); |
if (constructor != context_extension_function) return holder; |
- // Fall back to using the global object as the receiver if the |
- // property turns out to be a local variable allocated in a context |
- // extension object - introduced via eval. |
- return top->global()->global_receiver(); |
+ // 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. Implicit global |
+ // receivers are indicated with the hole value. |
+ return isolate->heap()->the_hole_value(); |
} |
@@ -7930,9 +7931,10 @@ static ObjectPair LoadContextSlotHelper(Arguments args, |
// If the "property" we were looking for is a local variable or an |
// argument in a context, the receiver is the global object; see |
// ECMA-262, 3rd., 10.1.6 and 10.2.3. |
- // GetElement below can cause GC. |
- Handle<JSObject> receiver( |
- isolate->context()->global()->global_receiver()); |
+ // |
+ // Use the hole as the receiver to signal that the receiver is |
+ // implicit and that the global receiver should be used. |
+ Handle<Object> receiver = isolate->factory()->the_hole_value(); |
MaybeObject* value = (holder->IsContext()) |
? Context::cast(*holder)->get(index) |
: JSObject::cast(*holder)->GetElement(index); |
@@ -7943,17 +7945,19 @@ static ObjectPair LoadContextSlotHelper(Arguments args, |
if (!holder.is_null() && holder->IsJSObject()) { |
ASSERT(Handle<JSObject>::cast(holder)->HasProperty(*name)); |
JSObject* object = JSObject::cast(*holder); |
- JSObject* receiver; |
+ Object* receiver; |
if (object->IsGlobalObject()) { |
receiver = GlobalObject::cast(object)->global_receiver(); |
} else if (context->is_exception_holder(*holder)) { |
- receiver = isolate->context()->global()->global_receiver(); |
+ // Use the hole as the receiver to signal that the receiver is |
+ // implicit and that the global receiver should be used. |
+ receiver = isolate->heap()->the_hole_value(); |
} else { |
receiver = ComputeReceiverForNonGlobal(isolate, object); |
} |
// GetProperty below can cause GC. |
- Handle<JSObject> receiver_handle(receiver); |
+ Handle<Object> receiver_handle(receiver); |
// No need to unhole the value here. This is taken care of by the |
// GetProperty function. |
@@ -7968,7 +7972,7 @@ static ObjectPair LoadContextSlotHelper(Arguments args, |
HandleVector(&name, 1)); |
return MakePair(isolate->Throw(*reference_error), NULL); |
} else { |
- // The property doesn't exist - return undefined |
+ // The property doesn't exist - return undefined. |
return MakePair(isolate->heap()->undefined_value(), |
isolate->heap()->undefined_value()); |
} |
@@ -8480,8 +8484,7 @@ RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { |
// 'eval' is not bound in the global context. Just call the function |
// with the given arguments. This is not necessarily the global eval. |
if (receiver->IsContext() || receiver->IsJSContextExtensionObject()) { |
- receiver = Handle<JSObject>( |
- isolate->context()->global()->global_receiver(), isolate); |
+ receiver = isolate->factory()->the_hole_value(); |
} |
return MakePair(*callee, *receiver); |
} |
@@ -8490,8 +8493,7 @@ RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { |
// Compare it to the builtin 'GlobalEval' function to make sure. |
if (*callee != isolate->global_context()->global_eval_fun() || |
!args[1]->IsString()) { |
- return MakePair(*callee, |
- isolate->context()->global()->global_receiver()); |
+ return MakePair(*callee, isolate->heap()->the_hole_value()); |
} |
ASSERT(args[3]->IsSmi()); |
@@ -8513,8 +8515,7 @@ RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEvalNoLookup) { |
// Compare it to the builtin 'GlobalEval' function to make sure. |
if (*callee != isolate->global_context()->global_eval_fun() || |
!args[1]->IsString()) { |
- return MakePair(*callee, |
- isolate->context()->global()->global_receiver()); |
+ return MakePair(*callee, isolate->heap()->the_hole_value()); |
} |
ASSERT(args[3]->IsSmi()); |