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()); |