@@ -5437,6 +5437,215 @@ TEST(WeakArraySerializationInCodeCache) {
5437
5437
delete cache;
5438
5438
}
5439
5439
5440
+ v8::MaybeLocal<v8::Promise> TestHostDefinedOptionFromCachedScript (
5441
+ Local<v8::Context> context, Local<v8::Data> host_defined_options,
5442
+ Local<v8::Value> resource_name, Local<v8::String> specifier,
5443
+ Local<v8::FixedArray> import_attributes) {
5444
+ CHECK (host_defined_options->IsFixedArray ());
5445
+ auto arr = host_defined_options.As <v8::FixedArray>();
5446
+ CHECK_EQ (arr->Length (), 1 );
5447
+ v8::Local<v8::Symbol> expected =
5448
+ v8::Symbol::For (context->GetIsolate (), v8_str (" hdo" ));
5449
+ CHECK_EQ (arr->Get (context, 0 ), expected);
5450
+ CHECK (resource_name->Equals (context, v8_str (" test_hdo" )).FromJust ());
5451
+ CHECK (specifier->Equals (context, v8_str (" foo" )).FromJust ());
5452
+
5453
+ Local<v8::Promise::Resolver> resolver =
5454
+ v8::Promise::Resolver::New (context).ToLocalChecked ();
5455
+ resolver->Resolve (context, v8_str (" hello" )).ToChecked ();
5456
+ return resolver->GetPromise ();
5457
+ }
5458
+
5459
+ TEST (CachedFunctionHostDefinedOption) {
5460
+ DisableAlwaysOpt ();
5461
+ LocalContext env;
5462
+ v8::Isolate* isolate = env->GetIsolate ();
5463
+ i::Isolate* i_isolate = reinterpret_cast <i::Isolate*>(isolate);
5464
+ i_isolate->compilation_cache ()
5465
+ ->DisableScriptAndEval (); // Disable same-isolate code cache.
5466
+ isolate->SetHostImportModuleDynamicallyCallback (
5467
+ TestHostDefinedOptionFromCachedScript);
5468
+
5469
+ v8::HandleScope scope (isolate);
5470
+
5471
+ v8::Local<v8::String> source = v8_str (" return import(x)" );
5472
+ v8::Local<v8::String> arg_str = v8_str (" x" );
5473
+
5474
+ v8::Local<v8::PrimitiveArray> hdo = v8::PrimitiveArray::New (isolate, 1 );
5475
+ hdo->Set (isolate, 0 , v8::Symbol::For (isolate, v8_str (" hdo" )));
5476
+ v8::ScriptOrigin origin (v8_str (" test_hdo" ), // resource_name
5477
+ 0 , // resource_line_offset
5478
+ 0 , // resource_column_offset
5479
+ false , // resource_is_shared_cross_origin
5480
+ -1 , // script_id
5481
+ {}, // source_map_url
5482
+ false , // resource_is_opaque
5483
+ false , // is_wasm
5484
+ false , // is_module
5485
+ hdo // host_defined_options
5486
+ );
5487
+ ScriptCompiler::CachedData* cache;
5488
+ {
5489
+ v8::ScriptCompiler::Source script_source (source, origin);
5490
+ v8::Local<v8::Function> fun =
5491
+ v8::ScriptCompiler::CompileFunction (
5492
+ env.local (), &script_source, 1 , &arg_str, 0 , nullptr ,
5493
+ v8::ScriptCompiler::kNoCompileOptions )
5494
+ .ToLocalChecked ();
5495
+ cache = v8::ScriptCompiler::CreateCodeCacheForFunction (fun);
5496
+ }
5497
+
5498
+ {
5499
+ DisallowCompilation no_compile_expected (i_isolate);
5500
+ v8::ScriptCompiler::Source script_source (source, origin, cache);
5501
+ v8::Local<v8::Function> fun =
5502
+ v8::ScriptCompiler::CompileFunction (
5503
+ env.local (), &script_source, 1 , &arg_str, 0 , nullptr ,
5504
+ v8::ScriptCompiler::kConsumeCodeCache )
5505
+ .ToLocalChecked ();
5506
+ v8::Local<v8::Value> arg = v8_str (" foo" );
5507
+ v8::Local<v8::Value> result =
5508
+ fun->Call (env.local (), v8::Undefined (isolate), 1 , &arg)
5509
+ .ToLocalChecked ();
5510
+ CHECK (result->IsPromise ());
5511
+ v8::Local<v8::Promise> promise = result.As <v8::Promise>();
5512
+ isolate->PerformMicrotaskCheckpoint ();
5513
+ v8::Local<v8::Value> resolved = promise->Result ();
5514
+ CHECK (resolved->IsString ());
5515
+ CHECK (resolved.As <v8::String>()
5516
+ ->Equals (env.local (), v8_str (" hello" ))
5517
+ .FromJust ());
5518
+ }
5519
+ }
5520
+
5521
+ TEST (CachedUnboundScriptHostDefinedOption) {
5522
+ DisableAlwaysOpt ();
5523
+ LocalContext env;
5524
+ v8::Isolate* isolate = env->GetIsolate ();
5525
+ i::Isolate* i_isolate = reinterpret_cast <i::Isolate*>(isolate);
5526
+ i_isolate->compilation_cache ()
5527
+ ->DisableScriptAndEval (); // Disable same-isolate code cache.
5528
+ isolate->SetHostImportModuleDynamicallyCallback (
5529
+ TestHostDefinedOptionFromCachedScript);
5530
+
5531
+ v8::HandleScope scope (isolate);
5532
+
5533
+ v8::Local<v8::String> source = v8_str (" globalThis.foo =import('foo')" );
5534
+
5535
+ v8::Local<v8::PrimitiveArray> hdo = v8::PrimitiveArray::New (isolate, 1 );
5536
+ hdo->Set (isolate, 0 , v8::Symbol::For (isolate, v8_str (" hdo" )));
5537
+ v8::ScriptOrigin origin (v8_str (" test_hdo" ), // resource_name
5538
+ 0 , // resource_line_offset
5539
+ 0 , // resource_column_offset
5540
+ false , // resource_is_shared_cross_origin
5541
+ -1 , // script_id
5542
+ {}, // source_map_url
5543
+ false , // resource_is_opaque
5544
+ false , // is_wasm
5545
+ false , // is_module
5546
+ hdo // host_defined_options
5547
+ );
5548
+ ScriptCompiler::CachedData* cache;
5549
+ {
5550
+ v8::ScriptCompiler::Source script_source (source, origin);
5551
+ v8::Local<v8::UnboundScript> script =
5552
+ v8::ScriptCompiler::CompileUnboundScript (
5553
+ isolate, &script_source, v8::ScriptCompiler::kNoCompileOptions )
5554
+ .ToLocalChecked ();
5555
+ cache = v8::ScriptCompiler::CreateCodeCache (script);
5556
+ }
5557
+
5558
+ {
5559
+ DisallowCompilation no_compile_expected (i_isolate);
5560
+ v8::ScriptCompiler::Source script_source (source, origin, cache);
5561
+ v8::Local<v8::UnboundScript> script =
5562
+ v8::ScriptCompiler::CompileUnboundScript (
5563
+ isolate, &script_source, v8::ScriptCompiler::kConsumeCodeCache )
5564
+ .ToLocalChecked ();
5565
+ v8::Local<v8::Script> bound = script->BindToCurrentContext ();
5566
+ USE (bound->Run (env.local (), hdo).ToLocalChecked ());
5567
+ v8::Local<v8::Value> result =
5568
+ env.local ()->Global ()->Get (env.local (), v8_str (" foo" )).ToLocalChecked ();
5569
+ CHECK (result->IsPromise ());
5570
+ v8::Local<v8::Promise> promise = result.As <v8::Promise>();
5571
+ isolate->PerformMicrotaskCheckpoint ();
5572
+ v8::Local<v8::Value> resolved = promise->Result ();
5573
+ CHECK (resolved->IsString ());
5574
+ CHECK (resolved.As <v8::String>()
5575
+ ->Equals (env.local (), v8_str (" hello" ))
5576
+ .FromJust ());
5577
+ }
5578
+ }
5579
+
5580
+ v8::MaybeLocal<v8::Module> UnexpectedModuleResolveCallback (
5581
+ v8::Local<v8::Context> context, v8::Local<v8::String> specifier,
5582
+ v8::Local<v8::FixedArray> import_attributes,
5583
+ v8::Local<v8::Module> referrer) {
5584
+ CHECK_WITH_MSG (false , " Unexpected call to resolve callback" );
5585
+ }
5586
+
5587
+ TEST (CachedModuleScriptFunctionHostDefinedOption) {
5588
+ DisableAlwaysOpt ();
5589
+ LocalContext env;
5590
+ v8::Isolate* isolate = env->GetIsolate ();
5591
+ i::Isolate* i_isolate = reinterpret_cast <i::Isolate*>(isolate);
5592
+ i_isolate->compilation_cache ()
5593
+ ->DisableScriptAndEval (); // Disable same-isolate code cache.
5594
+ isolate->SetHostImportModuleDynamicallyCallback (
5595
+ TestHostDefinedOptionFromCachedScript);
5596
+
5597
+ v8::HandleScope scope (isolate);
5598
+
5599
+ v8::Local<v8::String> source = v8_str (" globalThis.foo = import('foo')" );
5600
+
5601
+ v8::Local<v8::PrimitiveArray> hdo = v8::PrimitiveArray::New (isolate, 1 );
5602
+ hdo->Set (isolate, 0 , v8::Symbol::For (isolate, v8_str (" hdo" )));
5603
+ v8::ScriptOrigin origin (v8_str (" test_hdo" ), // resource_name
5604
+ 0 , // resource_line_offset
5605
+ 0 , // resource_column_offset
5606
+ false , // resource_is_shared_cross_origin
5607
+ -1 , // script_id
5608
+ {}, // source_map_url
5609
+ false , // resource_is_opaque
5610
+ false , // is_wasm
5611
+ true , // is_module
5612
+ hdo // host_defined_options
5613
+ );
5614
+ ScriptCompiler::CachedData* cache;
5615
+ {
5616
+ v8::ScriptCompiler::Source script_source (source, origin);
5617
+ v8::Local<v8::Module> mod =
5618
+ v8::ScriptCompiler::CompileModule (isolate, &script_source,
5619
+ v8::ScriptCompiler::kNoCompileOptions )
5620
+ .ToLocalChecked ();
5621
+ cache = v8::ScriptCompiler::CreateCodeCache (mod->GetUnboundModuleScript ());
5622
+ }
5623
+
5624
+ {
5625
+ DisallowCompilation no_compile_expected (i_isolate);
5626
+ v8::ScriptCompiler::Source script_source (source, origin, cache);
5627
+ v8::Local<v8::Module> mod =
5628
+ v8::ScriptCompiler::CompileModule (isolate, &script_source,
5629
+ v8::ScriptCompiler::kConsumeCodeCache )
5630
+ .ToLocalChecked ();
5631
+ mod->InstantiateModule (env.local (), UnexpectedModuleResolveCallback)
5632
+ .Check ();
5633
+ v8::Local<v8::Value> evaluted = mod->Evaluate (env.local ()).ToLocalChecked ();
5634
+ CHECK (evaluted->IsPromise ());
5635
+ CHECK_EQ (evaluted.As <v8::Promise>()->State (),
5636
+ v8::Promise::PromiseState::kFulfilled );
5637
+ v8::Local<v8::Value> result =
5638
+ env.local ()->Global ()->Get (env.local (), v8_str (" foo" )).ToLocalChecked ();
5639
+ v8::Local<v8::Promise> promise = result.As <v8::Promise>();
5640
+ isolate->PerformMicrotaskCheckpoint ();
5641
+ v8::Local<v8::Value> resolved = promise->Result ();
5642
+ CHECK (resolved->IsString ());
5643
+ CHECK (resolved.As <v8::String>()
5644
+ ->Equals (env.local (), v8_str (" hello" ))
5645
+ .FromJust ());
5646
+ }
5647
+ }
5648
+
5440
5649
TEST (CachedCompileFunction) {
5441
5650
DisableAlwaysOpt ();
5442
5651
LocalContext env;
0 commit comments