| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 76a2c0415d69b66b1cce5a0da38f08d39841b23b..044a4491ab27129e42acc0695822b661a0ffc29e 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -9452,80 +9452,12 @@ RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) {
|
|
|
| HandleScope scope(isolate);
|
| Handle<Object> callee = args.at<Object>(0);
|
| - Handle<Object> receiver; // Will be overwritten.
|
|
|
| - // Compute the calling context.
|
| - Handle<Context> context = Handle<Context>(isolate->context(), isolate);
|
| -#ifdef DEBUG
|
| - // Make sure Isolate::context() agrees with the old code that traversed
|
| - // the stack frames to compute the context.
|
| - StackFrameLocator locator;
|
| - JavaScriptFrame* frame = locator.FindJavaScriptFrame(0);
|
| - ASSERT(Context::cast(frame->context()) == *context);
|
| -#endif
|
| -
|
| - // Find where the 'eval' symbol is bound. It is unaliased only if
|
| - // it is bound in the global context.
|
| - int index = -1;
|
| - PropertyAttributes attributes = ABSENT;
|
| - BindingFlags binding_flags;
|
| - while (true) {
|
| - // Don't follow context chains in Context::Lookup and implement the loop
|
| - // up the context chain here, so that we can know the context where eval
|
| - // was found.
|
| - receiver = context->Lookup(isolate->factory()->eval_symbol(),
|
| - FOLLOW_PROTOTYPE_CHAIN,
|
| - &index,
|
| - &attributes,
|
| - &binding_flags);
|
| - // Stop search when eval is found or when the global context is
|
| - // reached.
|
| - if (attributes != ABSENT || context->IsGlobalContext()) break;
|
| - context = Handle<Context>(context->previous(), isolate);
|
| - }
|
| -
|
| - // If eval could not be resolved, it has been deleted and we need to
|
| - // throw a reference error.
|
| - if (attributes == ABSENT) {
|
| - Handle<Object> name = isolate->factory()->eval_symbol();
|
| - Handle<Object> reference_error =
|
| - isolate->factory()->NewReferenceError("not_defined",
|
| - HandleVector(&name, 1));
|
| - return MakePair(isolate->Throw(*reference_error), NULL);
|
| - }
|
| -
|
| - if (!context->IsGlobalContext()) {
|
| - // '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 = isolate->factory()->the_hole_value();
|
| - }
|
| - return MakePair(*callee, *receiver);
|
| - }
|
| -
|
| - // 'eval' is bound in the global context, but it may have been overwritten.
|
| - // 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->heap()->the_hole_value());
|
| - }
|
| -
|
| - CONVERT_STRICT_MODE_ARG(strict_mode, 3);
|
| - return CompileGlobalEval(isolate,
|
| - args.at<String>(1),
|
| - args.at<Object>(2),
|
| - strict_mode);
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEvalNoLookup) {
|
| - ASSERT(args.length() == 4);
|
| -
|
| - HandleScope scope(isolate);
|
| - Handle<Object> callee = args.at<Object>(0);
|
| -
|
| - // 'eval' is bound in the global context, but it may have been overwritten.
|
| - // Compare it to the builtin 'GlobalEval' function to make sure.
|
| + // If "eval" didn't refer to the original GlobalEval, it's not a
|
| + // direct call to eval.
|
| + // (And even if it is, but the first argument isn't a string, just let
|
| + // execution default to an indirect call to eval, which will also return
|
| + // the first argument without doing anything).
|
| if (*callee != isolate->global_context()->global_eval_fun() ||
|
| !args[1]->IsString()) {
|
| return MakePair(*callee, isolate->heap()->the_hole_value());
|
|
|