OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/frames.h" | 10 #include "src/frames.h" |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 Handle<SharedFunctionInfo> outer_info(context->closure()->shared(), isolate); | 374 Handle<SharedFunctionInfo> outer_info(context->closure()->shared(), isolate); |
375 Handle<JSFunction> fun; | 375 Handle<JSFunction> fun; |
376 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 376 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
377 isolate, fun, | 377 isolate, fun, |
378 Compiler::GetFunctionFromEval(source, outer_info, context, SLOPPY, | 378 Compiler::GetFunctionFromEval(source, outer_info, context, SLOPPY, |
379 restriction, RelocInfo::kNoPosition)); | 379 restriction, RelocInfo::kNoPosition)); |
380 return *fun; | 380 return *fun; |
381 } | 381 } |
382 | 382 |
383 | 383 |
384 static ObjectPair CompileGlobalEval(Isolate* isolate, Handle<String> source, | 384 static Object* CompileGlobalEval(Isolate* isolate, Handle<String> source, |
385 Handle<SharedFunctionInfo> outer_info, | 385 Handle<SharedFunctionInfo> outer_info, |
386 Handle<Object> receiver, | 386 LanguageMode language_mode, |
387 LanguageMode language_mode, | 387 int scope_position) { |
388 int scope_position) { | |
389 Handle<Context> context = Handle<Context>(isolate->context()); | 388 Handle<Context> context = Handle<Context>(isolate->context()); |
390 Handle<Context> native_context = Handle<Context>(context->native_context()); | 389 Handle<Context> native_context = Handle<Context>(context->native_context()); |
391 | 390 |
392 // Check if native context allows code generation from | 391 // Check if native context allows code generation from |
393 // strings. Throw an exception if it doesn't. | 392 // strings. Throw an exception if it doesn't. |
394 if (native_context->allow_code_gen_from_strings()->IsFalse() && | 393 if (native_context->allow_code_gen_from_strings()->IsFalse() && |
395 !CodeGenerationFromStringsAllowed(isolate, native_context)) { | 394 !CodeGenerationFromStringsAllowed(isolate, native_context)) { |
396 Handle<Object> error_message = | 395 Handle<Object> error_message = |
397 native_context->ErrorMessageForCodeGenerationFromStrings(); | 396 native_context->ErrorMessageForCodeGenerationFromStrings(); |
398 Handle<Object> error; | 397 Handle<Object> error; |
399 MaybeHandle<Object> maybe_error = isolate->factory()->NewEvalError( | 398 MaybeHandle<Object> maybe_error = isolate->factory()->NewEvalError( |
400 MessageTemplate::kCodeGenFromStrings, error_message); | 399 MessageTemplate::kCodeGenFromStrings, error_message); |
401 if (maybe_error.ToHandle(&error)) isolate->Throw(*error); | 400 if (maybe_error.ToHandle(&error)) isolate->Throw(*error); |
402 return MakePair(isolate->heap()->exception(), NULL); | 401 return isolate->heap()->exception(); |
403 } | 402 } |
404 | 403 |
405 // Deal with a normal eval call with a string argument. Compile it | 404 // Deal with a normal eval call with a string argument. Compile it |
406 // and return the compiled function bound in the local context. | 405 // and return the compiled function bound in the local context. |
407 static const ParseRestriction restriction = NO_PARSE_RESTRICTION; | 406 static const ParseRestriction restriction = NO_PARSE_RESTRICTION; |
408 Handle<JSFunction> compiled; | 407 Handle<JSFunction> compiled; |
409 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 408 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
410 isolate, compiled, | 409 isolate, compiled, |
411 Compiler::GetFunctionFromEval(source, outer_info, context, language_mode, | 410 Compiler::GetFunctionFromEval(source, outer_info, context, language_mode, |
412 restriction, scope_position), | 411 restriction, scope_position), |
413 MakePair(isolate->heap()->exception(), NULL)); | 412 isolate->heap()->exception()); |
414 return MakePair(*compiled, *receiver); | 413 return *compiled; |
415 } | 414 } |
416 | 415 |
417 | 416 |
418 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ResolvePossiblyDirectEval) { | 417 RUNTIME_FUNCTION(Runtime_ResolvePossiblyDirectEval) { |
419 HandleScope scope(isolate); | 418 HandleScope scope(isolate); |
420 DCHECK(args.length() == 6); | 419 DCHECK(args.length() == 5); |
421 | 420 |
422 Handle<Object> callee = args.at<Object>(0); | 421 Handle<Object> callee = args.at<Object>(0); |
423 | 422 |
424 // If "eval" didn't refer to the original GlobalEval, it's not a | 423 // If "eval" didn't refer to the original GlobalEval, it's not a |
425 // direct call to eval. | 424 // direct call to eval. |
426 // (And even if it is, but the first argument isn't a string, just let | 425 // (And even if it is, but the first argument isn't a string, just let |
427 // execution default to an indirect call to eval, which will also return | 426 // execution default to an indirect call to eval, which will also return |
428 // the first argument without doing anything). | 427 // the first argument without doing anything). |
429 if (*callee != isolate->native_context()->global_eval_fun() || | 428 if (*callee != isolate->native_context()->global_eval_fun() || |
430 !args[1]->IsString()) { | 429 !args[1]->IsString()) { |
431 return MakePair(*callee, isolate->heap()->undefined_value()); | 430 return *callee; |
432 } | 431 } |
433 | 432 |
| 433 DCHECK(args[3]->IsSmi()); |
| 434 DCHECK(is_valid_language_mode(args.smi_at(3))); |
| 435 LanguageMode language_mode = static_cast<LanguageMode>(args.smi_at(3)); |
434 DCHECK(args[4]->IsSmi()); | 436 DCHECK(args[4]->IsSmi()); |
435 DCHECK(is_valid_language_mode(args.smi_at(4))); | |
436 LanguageMode language_mode = static_cast<LanguageMode>(args.smi_at(4)); | |
437 DCHECK(args[5]->IsSmi()); | |
438 Handle<SharedFunctionInfo> outer_info(args.at<JSFunction>(2)->shared(), | 437 Handle<SharedFunctionInfo> outer_info(args.at<JSFunction>(2)->shared(), |
439 isolate); | 438 isolate); |
440 return CompileGlobalEval(isolate, args.at<String>(1), outer_info, | 439 return CompileGlobalEval(isolate, args.at<String>(1), outer_info, |
441 args.at<Object>(3), language_mode, args.smi_at(5)); | 440 language_mode, args.smi_at(4)); |
442 } | 441 } |
443 } // namespace internal | 442 } // namespace internal |
444 } // namespace v8 | 443 } // namespace v8 |
OLD | NEW |