@@ -2441,70 +2441,83 @@ MaybeLocal<Function> ScriptCompiler::CompileFunctionInContext(
2441
2441
Local<Context> v8_context, Source* source, size_t arguments_count,
2442
2442
Local<String> arguments[], size_t context_extension_count,
2443
2443
Local<Object> context_extensions[], CompileOptions options,
2444
- NoCacheReason no_cache_reason) {
2445
- PREPARE_FOR_EXECUTION (v8_context, ScriptCompiler, CompileFunctionInContext,
2446
- Function);
2447
- TRACE_EVENT_CALL_STATS_SCOPED (isolate, " v8" , " V8.ScriptCompiler" );
2444
+ NoCacheReason no_cache_reason,
2445
+ Local<ScriptOrModule>* script_or_module_out) {
2446
+ Local<Function> result;
2448
2447
2449
- DCHECK (options == CompileOptions::kConsumeCodeCache ||
2450
- options == CompileOptions::kEagerCompile ||
2451
- options == CompileOptions::kNoCompileOptions );
2448
+ {
2449
+ PREPARE_FOR_EXECUTION (v8_context, ScriptCompiler, CompileFunctionInContext,
2450
+ Function);
2451
+ TRACE_EVENT_CALL_STATS_SCOPED (isolate, " v8" , " V8.ScriptCompiler" );
2452
2452
2453
- i::Handle <i::Context> context = Utils::OpenHandle (*v8_context);
2453
+ DCHECK (options == CompileOptions::kConsumeCodeCache ||
2454
+ options == CompileOptions::kEagerCompile ||
2455
+ options == CompileOptions::kNoCompileOptions );
2454
2456
2455
- DCHECK (context->IsNativeContext ());
2456
- i::Handle <i::SharedFunctionInfo> outer_info (
2457
- context->empty_function ().shared (), isolate);
2458
-
2459
- i::Handle <i::JSFunction> fun;
2460
- i::Handle <i::FixedArray> arguments_list =
2461
- isolate->factory ()->NewFixedArray (static_cast <int >(arguments_count));
2462
- for (int i = 0 ; i < static_cast <int >(arguments_count); i++) {
2463
- i::Handle <i::String> argument = Utils::OpenHandle (*arguments[i]);
2464
- if (!IsIdentifier (isolate, argument)) return Local<Function>();
2465
- arguments_list->set (i, *argument);
2466
- }
2467
-
2468
- for (size_t i = 0 ; i < context_extension_count; ++i) {
2469
- i::Handle <i::JSReceiver> extension =
2470
- Utils::OpenHandle (*context_extensions[i]);
2471
- if (!extension->IsJSObject ()) return Local<Function>();
2472
- context = isolate->factory ()->NewWithContext (
2473
- context,
2474
- i::ScopeInfo::CreateForWithScope (
2475
- isolate,
2476
- context->IsNativeContext ()
2477
- ? i::Handle <i::ScopeInfo>::null ()
2478
- : i::Handle <i::ScopeInfo>(context->scope_info (), isolate)),
2479
- extension);
2480
- }
2457
+ i::Handle <i::Context> context = Utils::OpenHandle (*v8_context);
2481
2458
2482
- i::Compiler::ScriptDetails script_details = GetScriptDetails (
2483
- isolate, source->resource_name , source->resource_line_offset ,
2484
- source->resource_column_offset , source->source_map_url ,
2485
- source->host_defined_options );
2459
+ DCHECK (context->IsNativeContext ());
2486
2460
2487
- i::ScriptData* script_data = nullptr ;
2488
- if (options == kConsumeCodeCache ) {
2489
- DCHECK (source->cached_data );
2490
- // ScriptData takes care of pointer-aligning the data.
2491
- script_data = new i::ScriptData (source->cached_data ->data ,
2492
- source->cached_data ->length );
2461
+ i::Handle <i::FixedArray> arguments_list =
2462
+ isolate->factory ()->NewFixedArray (static_cast <int >(arguments_count));
2463
+ for (int i = 0 ; i < static_cast <int >(arguments_count); i++) {
2464
+ i::Handle <i::String> argument = Utils::OpenHandle (*arguments[i]);
2465
+ if (!IsIdentifier (isolate, argument)) return Local<Function>();
2466
+ arguments_list->set (i, *argument);
2467
+ }
2468
+
2469
+ for (size_t i = 0 ; i < context_extension_count; ++i) {
2470
+ i::Handle <i::JSReceiver> extension =
2471
+ Utils::OpenHandle (*context_extensions[i]);
2472
+ if (!extension->IsJSObject ()) return Local<Function>();
2473
+ context = isolate->factory ()->NewWithContext (
2474
+ context,
2475
+ i::ScopeInfo::CreateForWithScope (
2476
+ isolate,
2477
+ context->IsNativeContext ()
2478
+ ? i::Handle <i::ScopeInfo>::null ()
2479
+ : i::Handle <i::ScopeInfo>(context->scope_info (), isolate)),
2480
+ extension);
2481
+ }
2482
+
2483
+ i::Compiler::ScriptDetails script_details = GetScriptDetails (
2484
+ isolate, source->resource_name , source->resource_line_offset ,
2485
+ source->resource_column_offset , source->source_map_url ,
2486
+ source->host_defined_options );
2487
+
2488
+ i::ScriptData* script_data = nullptr ;
2489
+ if (options == kConsumeCodeCache ) {
2490
+ DCHECK (source->cached_data );
2491
+ // ScriptData takes care of pointer-aligning the data.
2492
+ script_data = new i::ScriptData (source->cached_data ->data ,
2493
+ source->cached_data ->length );
2494
+ }
2495
+
2496
+ i::Handle <i::JSFunction> scoped_result;
2497
+ has_pending_exception =
2498
+ !i::Compiler::GetWrappedFunction (
2499
+ Utils::OpenHandle (*source->source_string ), arguments_list, context,
2500
+ script_details, source->resource_options , script_data, options,
2501
+ no_cache_reason)
2502
+ .ToHandle (&scoped_result);
2503
+ if (options == kConsumeCodeCache ) {
2504
+ source->cached_data ->rejected = script_data->rejected ();
2505
+ }
2506
+ delete script_data;
2507
+ RETURN_ON_FAILED_EXECUTION (Function);
2508
+ result = handle_scope.Escape (Utils::CallableToLocal (scoped_result));
2493
2509
}
2494
2510
2495
- i::Handle <i::JSFunction> result;
2496
- has_pending_exception =
2497
- !i::Compiler::GetWrappedFunction (
2498
- Utils::OpenHandle (*source->source_string ), arguments_list, context,
2499
- script_details, source->resource_options , script_data, options,
2500
- no_cache_reason)
2501
- .ToHandle (&result);
2502
- if (options == kConsumeCodeCache ) {
2503
- source->cached_data ->rejected = script_data->rejected ();
2511
+ if (script_or_module_out != nullptr ) {
2512
+ i::Handle <i::JSFunction> function =
2513
+ i::Handle <i::JSFunction>::cast (Utils::OpenHandle (*result));
2514
+ i::Isolate* isolate = function->GetIsolate ();
2515
+ i::Handle <i::SharedFunctionInfo> shared (function->shared (), isolate);
2516
+ i::Handle <i::Script> script (i::Script::cast (shared->script ()), isolate);
2517
+ *script_or_module_out = v8::Utils::ScriptOrModuleToLocal (script);
2504
2518
}
2505
- delete script_data;
2506
- RETURN_ON_FAILED_EXECUTION (Function);
2507
- RETURN_ESCAPED (Utils::CallableToLocal (result));
2519
+
2520
+ return result;
2508
2521
}
2509
2522
2510
2523
void ScriptCompiler::ScriptStreamingTask::Run () { data_->task ->Run (); }
0 commit comments