| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 7a2d46c4b4315a96ad86ef7cb8c79458fef66b9b..7db68b4191a4f8232d56c057d8ac8bc1332c88fa 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -9170,9 +9170,8 @@ static Object* ComputeReceiverForNonGlobal(Isolate* isolate,
|
| if (constructor != context_extension_function) 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. Implicit global
|
| - // receivers are indicated with the hole value.
|
| - return isolate->heap()->the_hole_value();
|
| + // context extension object - introduced via eval.
|
| + return isolate->heap()->undefined_value();
|
| }
|
|
|
|
|
| @@ -9206,11 +9205,7 @@ static ObjectPair LoadContextSlotHelper(Arguments args,
|
| ASSERT(holder->IsContext());
|
| // If the "property" we were looking for is a local variable, the
|
| // receiver is the global object; see ECMA-262, 3rd., 10.1.6 and 10.2.3.
|
| - //
|
| - // Use the hole as the receiver to signal that the receiver is implicit
|
| - // and that the global receiver should be used (as distinguished from an
|
| - // explicit receiver that happens to be a global object).
|
| - Handle<Object> receiver = isolate->factory()->the_hole_value();
|
| + Handle<Object> receiver = isolate->factory()->undefined_value();
|
| Object* value = Context::cast(*holder)->get(index);
|
| // Check for uninitialized bindings.
|
| switch (binding_flags) {
|
| @@ -9245,7 +9240,7 @@ static ObjectPair LoadContextSlotHelper(Arguments args,
|
| // GetProperty below can cause GC.
|
| Handle<Object> receiver_handle(
|
| object->IsGlobalObject()
|
| - ? Object::cast(isolate->heap()->the_hole_value())
|
| + ? Object::cast(isolate->heap()->undefined_value())
|
| : object->IsJSProxy() ? static_cast<Object*>(*object)
|
| : ComputeReceiverForNonGlobal(isolate, JSObject::cast(*object)),
|
| isolate);
|
| @@ -9744,7 +9739,7 @@ RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) {
|
| // the first argument without doing anything).
|
| if (*callee != isolate->native_context()->global_eval_fun() ||
|
| !args[1]->IsString()) {
|
| - return MakePair(*callee, isolate->heap()->the_hole_value());
|
| + return MakePair(*callee, isolate->heap()->undefined_value());
|
| }
|
|
|
| CONVERT_LANGUAGE_MODE_ARG(language_mode, 3);
|
| @@ -11336,11 +11331,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFrameDetails) {
|
| // by creating correct wrapper object based on the calling frame's
|
| // native context.
|
| it.Advance();
|
| - Handle<Context> calling_frames_native_context(
|
| - Context::cast(Context::cast(it.frame()->context())->native_context()));
|
| - ASSERT(!receiver->IsUndefined() && !receiver->IsNull());
|
| - receiver =
|
| - isolate->factory()->ToObject(receiver, calling_frames_native_context);
|
| + if (receiver->IsUndefined()) {
|
| + Context* context = function->context();
|
| + receiver = handle(context->global_object()->global_receiver());
|
| + } else {
|
| + ASSERT(!receiver->IsNull());
|
| + Context* context = Context::cast(it.frame()->context());
|
| + Handle<Context> native_context(Context::cast(context->native_context()));
|
| + receiver = isolate->factory()->ToObject(receiver, native_context);
|
| + }
|
| }
|
| details->set(kFrameDetailsReceiverIndex, *receiver);
|
|
|
|
|