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