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