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 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 } else { | 342 } else { |
343 // Callback set. Let it decide if code generation is allowed. | 343 // Callback set. Let it decide if code generation is allowed. |
344 VMState<EXTERNAL> state(isolate); | 344 VMState<EXTERNAL> state(isolate); |
345 return callback(v8::Utils::ToLocal(context)); | 345 return callback(v8::Utils::ToLocal(context)); |
346 } | 346 } |
347 } | 347 } |
348 | 348 |
349 | 349 |
350 RUNTIME_FUNCTION(Runtime_CompileString) { | 350 RUNTIME_FUNCTION(Runtime_CompileString) { |
351 HandleScope scope(isolate); | 351 HandleScope scope(isolate); |
352 DCHECK(args.length() == 3); | 352 DCHECK(args.length() == 2); |
353 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); | 353 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); |
354 CONVERT_BOOLEAN_ARG_CHECKED(function_literal_only, 1); | 354 CONVERT_BOOLEAN_ARG_CHECKED(function_literal_only, 1); |
355 CONVERT_SMI_ARG_CHECKED(source_offset, 2); | |
356 | 355 |
357 // Extract native context. | 356 // Extract native context. |
358 Handle<Context> context(isolate->native_context()); | 357 Handle<Context> context(isolate->native_context()); |
359 | 358 |
360 // Check if native context allows code generation from | 359 // Check if native context allows code generation from |
361 // strings. Throw an exception if it doesn't. | 360 // strings. Throw an exception if it doesn't. |
362 if (context->allow_code_gen_from_strings()->IsFalse() && | 361 if (context->allow_code_gen_from_strings()->IsFalse() && |
363 !CodeGenerationFromStringsAllowed(isolate, context)) { | 362 !CodeGenerationFromStringsAllowed(isolate, context)) { |
364 Handle<Object> error_message = | 363 Handle<Object> error_message = |
365 context->ErrorMessageForCodeGenerationFromStrings(); | 364 context->ErrorMessageForCodeGenerationFromStrings(); |
366 THROW_NEW_ERROR_RETURN_FAILURE( | 365 THROW_NEW_ERROR_RETURN_FAILURE( |
367 isolate, NewEvalError("code_gen_from_strings", | 366 isolate, NewEvalError("code_gen_from_strings", |
368 HandleVector<Object>(&error_message, 1))); | 367 HandleVector<Object>(&error_message, 1))); |
369 } | 368 } |
370 | 369 |
371 // Compile source string in the native context. | 370 // Compile source string in the native context. |
372 ParseRestriction restriction = function_literal_only | 371 ParseRestriction restriction = function_literal_only |
373 ? ONLY_SINGLE_FUNCTION_LITERAL | 372 ? ONLY_SINGLE_FUNCTION_LITERAL |
374 : NO_PARSE_RESTRICTION; | 373 : NO_PARSE_RESTRICTION; |
375 Handle<SharedFunctionInfo> outer_info(context->closure()->shared(), isolate); | 374 Handle<SharedFunctionInfo> outer_info(context->closure()->shared(), isolate); |
376 Handle<JSFunction> fun; | 375 Handle<JSFunction> fun; |
377 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 376 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
378 isolate, fun, | 377 isolate, fun, |
379 Compiler::GetFunctionFromEval(source, outer_info, context, SLOPPY, | 378 Compiler::GetFunctionFromEval(source, outer_info, context, SLOPPY, |
380 restriction, RelocInfo::kNoPosition)); | 379 restriction, RelocInfo::kNoPosition)); |
381 if (function_literal_only) { | |
382 // The actual body is wrapped, which shifts line numbers. | |
383 Handle<Script> script(Script::cast(fun->shared()->script()), isolate); | |
384 if (script->line_offset() == 0) { | |
385 int line_num = Script::GetLineNumber(script, source_offset); | |
386 script->set_line_offset(Smi::FromInt(-line_num)); | |
387 } | |
388 } | |
389 return *fun; | 380 return *fun; |
390 } | 381 } |
391 | 382 |
392 | 383 |
393 static ObjectPair CompileGlobalEval(Isolate* isolate, Handle<String> source, | 384 static ObjectPair CompileGlobalEval(Isolate* isolate, Handle<String> source, |
394 Handle<SharedFunctionInfo> outer_info, | 385 Handle<SharedFunctionInfo> outer_info, |
395 Handle<Object> receiver, | 386 Handle<Object> receiver, |
396 LanguageMode language_mode, | 387 LanguageMode language_mode, |
397 int scope_position) { | 388 int scope_position) { |
398 Handle<Context> context = Handle<Context>(isolate->context()); | 389 Handle<Context> context = Handle<Context>(isolate->context()); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 DCHECK(is_valid_language_mode(args.smi_at(4))); | 435 DCHECK(is_valid_language_mode(args.smi_at(4))); |
445 LanguageMode language_mode = static_cast<LanguageMode>(args.smi_at(4)); | 436 LanguageMode language_mode = static_cast<LanguageMode>(args.smi_at(4)); |
446 DCHECK(args[5]->IsSmi()); | 437 DCHECK(args[5]->IsSmi()); |
447 Handle<SharedFunctionInfo> outer_info(args.at<JSFunction>(2)->shared(), | 438 Handle<SharedFunctionInfo> outer_info(args.at<JSFunction>(2)->shared(), |
448 isolate); | 439 isolate); |
449 return CompileGlobalEval(isolate, args.at<String>(1), outer_info, | 440 return CompileGlobalEval(isolate, args.at<String>(1), outer_info, |
450 args.at<Object>(3), language_mode, args.smi_at(5)); | 441 args.at<Object>(3), language_mode, args.smi_at(5)); |
451 } | 442 } |
452 } | 443 } |
453 } // namespace v8::internal | 444 } // namespace v8::internal |
OLD | NEW |