@@ -5660,6 +5660,215 @@ TEST(WeakArraySerializationInCodeCache) {
5660
5660
delete cache;
5661
5661
}
5662
5662
5663
+ v8::MaybeLocal<v8::Promise> TestHostDefinedOptionFromCachedScript (
5664
+ Local<v8::Context> context, Local<v8::Data> host_defined_options,
5665
+ Local<v8::Value> resource_name, Local<v8::String> specifier,
5666
+ Local<v8::FixedArray> import_attributes) {
5667
+ CHECK (host_defined_options->IsFixedArray ());
5668
+ auto arr = host_defined_options.As <v8::FixedArray>();
5669
+ CHECK_EQ (arr->Length (), 1 );
5670
+ v8::Local<v8::Symbol> expected =
5671
+ v8::Symbol::For (context->GetIsolate (), v8_str (" hdo" ));
5672
+ CHECK_EQ (arr->Get (context, 0 ), expected);
5673
+ CHECK (resource_name->Equals (context, v8_str (" test_hdo" )).FromJust ());
5674
+ CHECK (specifier->Equals (context, v8_str (" foo" )).FromJust ());
5675
+
5676
+ Local<v8::Promise::Resolver> resolver =
5677
+ v8::Promise::Resolver::New (context).ToLocalChecked ();
5678
+ resolver->Resolve (context, v8_str (" hello" )).ToChecked ();
5679
+ return resolver->GetPromise ();
5680
+ }
5681
+
5682
+ TEST (CachedFunctionHostDefinedOption) {
5683
+ DisableAlwaysOpt ();
5684
+ LocalContext env;
5685
+ v8::Isolate* isolate = env->GetIsolate ();
5686
+ i::Isolate* i_isolate = reinterpret_cast <i::Isolate*>(isolate);
5687
+ i_isolate->compilation_cache ()
5688
+ ->DisableScriptAndEval (); // Disable same-isolate code cache.
5689
+ isolate->SetHostImportModuleDynamicallyCallback (
5690
+ TestHostDefinedOptionFromCachedScript);
5691
+
5692
+ v8::HandleScope scope (isolate);
5693
+
5694
+ v8::Local<v8::String> source = v8_str (" return import(x)" );
5695
+ v8::Local<v8::String> arg_str = v8_str (" x" );
5696
+
5697
+ v8::Local<v8::PrimitiveArray> hdo = v8::PrimitiveArray::New (isolate, 1 );
5698
+ hdo->Set (isolate, 0 , v8::Symbol::For (isolate, v8_str (" hdo" )));
5699
+ v8::ScriptOrigin origin (v8_str (" test_hdo" ), // resource_name
5700
+ 0 , // resource_line_offset
5701
+ 0 , // resource_column_offset
5702
+ false , // resource_is_shared_cross_origin
5703
+ -1 , // script_id
5704
+ {}, // source_map_url
5705
+ false , // resource_is_opaque
5706
+ false , // is_wasm
5707
+ false , // is_module
5708
+ hdo // host_defined_options
5709
+ );
5710
+ ScriptCompiler::CachedData* cache;
5711
+ {
5712
+ v8::ScriptCompiler::Source script_source (source, origin);
5713
+ v8::Local<v8::Function> fun =
5714
+ v8::ScriptCompiler::CompileFunction (
5715
+ env.local (), &script_source, 1 , &arg_str, 0 , nullptr ,
5716
+ v8::ScriptCompiler::kNoCompileOptions )
5717
+ .ToLocalChecked ();
5718
+ cache = v8::ScriptCompiler::CreateCodeCacheForFunction (fun);
5719
+ }
5720
+
5721
+ {
5722
+ DisallowCompilation no_compile_expected (i_isolate);
5723
+ v8::ScriptCompiler::Source script_source (source, origin, cache);
5724
+ v8::Local<v8::Function> fun =
5725
+ v8::ScriptCompiler::CompileFunction (
5726
+ env.local (), &script_source, 1 , &arg_str, 0 , nullptr ,
5727
+ v8::ScriptCompiler::kConsumeCodeCache )
5728
+ .ToLocalChecked ();
5729
+ v8::Local<v8::Value> arg = v8_str (" foo" );
5730
+ v8::Local<v8::Value> result =
5731
+ fun->Call (env.local (), v8::Undefined (isolate), 1 , &arg)
5732
+ .ToLocalChecked ();
5733
+ CHECK (result->IsPromise ());
5734
+ v8::Local<v8::Promise> promise = result.As <v8::Promise>();
5735
+ isolate->PerformMicrotaskCheckpoint ();
5736
+ v8::Local<v8::Value> resolved = promise->Result ();
5737
+ CHECK (resolved->IsString ());
5738
+ CHECK (resolved.As <v8::String>()
5739
+ ->Equals (env.local (), v8_str (" hello" ))
5740
+ .FromJust ());
5741
+ }
5742
+ }
5743
+
5744
+ TEST (CachedUnboundScriptHostDefinedOption) {
5745
+ DisableAlwaysOpt ();
5746
+ LocalContext env;
5747
+ v8::Isolate* isolate = env->GetIsolate ();
5748
+ i::Isolate* i_isolate = reinterpret_cast <i::Isolate*>(isolate);
5749
+ i_isolate->compilation_cache ()
5750
+ ->DisableScriptAndEval (); // Disable same-isolate code cache.
5751
+ isolate->SetHostImportModuleDynamicallyCallback (
5752
+ TestHostDefinedOptionFromCachedScript);
5753
+
5754
+ v8::HandleScope scope (isolate);
5755
+
5756
+ v8::Local<v8::String> source = v8_str (" globalThis.foo =import('foo')" );
5757
+
5758
+ v8::Local<v8::PrimitiveArray> hdo = v8::PrimitiveArray::New (isolate, 1 );
5759
+ hdo->Set (isolate, 0 , v8::Symbol::For (isolate, v8_str (" hdo" )));
5760
+ v8::ScriptOrigin origin (v8_str (" test_hdo" ), // resource_name
5761
+ 0 , // resource_line_offset
5762
+ 0 , // resource_column_offset
5763
+ false , // resource_is_shared_cross_origin
5764
+ -1 , // script_id
5765
+ {}, // source_map_url
5766
+ false , // resource_is_opaque
5767
+ false , // is_wasm
5768
+ false , // is_module
5769
+ hdo // host_defined_options
5770
+ );
5771
+ ScriptCompiler::CachedData* cache;
5772
+ {
5773
+ v8::ScriptCompiler::Source script_source (source, origin);
5774
+ v8::Local<v8::UnboundScript> script =
5775
+ v8::ScriptCompiler::CompileUnboundScript (
5776
+ isolate, &script_source, v8::ScriptCompiler::kNoCompileOptions )
5777
+ .ToLocalChecked ();
5778
+ cache = v8::ScriptCompiler::CreateCodeCache (script);
5779
+ }
5780
+
5781
+ {
5782
+ DisallowCompilation no_compile_expected (i_isolate);
5783
+ v8::ScriptCompiler::Source script_source (source, origin, cache);
5784
+ v8::Local<v8::UnboundScript> script =
5785
+ v8::ScriptCompiler::CompileUnboundScript (
5786
+ isolate, &script_source, v8::ScriptCompiler::kConsumeCodeCache )
5787
+ .ToLocalChecked ();
5788
+ v8::Local<v8::Script> bound = script->BindToCurrentContext ();
5789
+ USE (bound->Run (env.local (), hdo).ToLocalChecked ());
5790
+ v8::Local<v8::Value> result =
5791
+ env.local ()->Global ()->Get (env.local (), v8_str (" foo" )).ToLocalChecked ();
5792
+ CHECK (result->IsPromise ());
5793
+ v8::Local<v8::Promise> promise = result.As <v8::Promise>();
5794
+ isolate->PerformMicrotaskCheckpoint ();
5795
+ v8::Local<v8::Value> resolved = promise->Result ();
5796
+ CHECK (resolved->IsString ());
5797
+ CHECK (resolved.As <v8::String>()
5798
+ ->Equals (env.local (), v8_str (" hello" ))
5799
+ .FromJust ());
5800
+ }
5801
+ }
5802
+
5803
+ v8::MaybeLocal<v8::Module> UnexpectedModuleResolveCallback (
5804
+ v8::Local<v8::Context> context, v8::Local<v8::String> specifier,
5805
+ v8::Local<v8::FixedArray> import_attributes,
5806
+ v8::Local<v8::Module> referrer) {
5807
+ CHECK_WITH_MSG (false , " Unexpected call to resolve callback" );
5808
+ }
5809
+
5810
+ TEST (CachedModuleScriptFunctionHostDefinedOption) {
5811
+ DisableAlwaysOpt ();
5812
+ LocalContext env;
5813
+ v8::Isolate* isolate = env->GetIsolate ();
5814
+ i::Isolate* i_isolate = reinterpret_cast <i::Isolate*>(isolate);
5815
+ i_isolate->compilation_cache ()
5816
+ ->DisableScriptAndEval (); // Disable same-isolate code cache.
5817
+ isolate->SetHostImportModuleDynamicallyCallback (
5818
+ TestHostDefinedOptionFromCachedScript);
5819
+
5820
+ v8::HandleScope scope (isolate);
5821
+
5822
+ v8::Local<v8::String> source = v8_str (" globalThis.foo = import('foo')" );
5823
+
5824
+ v8::Local<v8::PrimitiveArray> hdo = v8::PrimitiveArray::New (isolate, 1 );
5825
+ hdo->Set (isolate, 0 , v8::Symbol::For (isolate, v8_str (" hdo" )));
5826
+ v8::ScriptOrigin origin (v8_str (" test_hdo" ), // resource_name
5827
+ 0 , // resource_line_offset
5828
+ 0 , // resource_column_offset
5829
+ false , // resource_is_shared_cross_origin
5830
+ -1 , // script_id
5831
+ {}, // source_map_url
5832
+ false , // resource_is_opaque
5833
+ false , // is_wasm
5834
+ true , // is_module
5835
+ hdo // host_defined_options
5836
+ );
5837
+ ScriptCompiler::CachedData* cache;
5838
+ {
5839
+ v8::ScriptCompiler::Source script_source (source, origin);
5840
+ v8::Local<v8::Module> mod =
5841
+ v8::ScriptCompiler::CompileModule (isolate, &script_source,
5842
+ v8::ScriptCompiler::kNoCompileOptions )
5843
+ .ToLocalChecked ();
5844
+ cache = v8::ScriptCompiler::CreateCodeCache (mod->GetUnboundModuleScript ());
5845
+ }
5846
+
5847
+ {
5848
+ DisallowCompilation no_compile_expected (i_isolate);
5849
+ v8::ScriptCompiler::Source script_source (source, origin, cache);
5850
+ v8::Local<v8::Module> mod =
5851
+ v8::ScriptCompiler::CompileModule (isolate, &script_source,
5852
+ v8::ScriptCompiler::kConsumeCodeCache )
5853
+ .ToLocalChecked ();
5854
+ mod->InstantiateModule (env.local (), UnexpectedModuleResolveCallback)
5855
+ .Check ();
5856
+ v8::Local<v8::Value> evaluted = mod->Evaluate (env.local ()).ToLocalChecked ();
5857
+ CHECK (evaluted->IsPromise ());
5858
+ CHECK_EQ (evaluted.As <v8::Promise>()->State (),
5859
+ v8::Promise::PromiseState::kFulfilled );
5860
+ v8::Local<v8::Value> result =
5861
+ env.local ()->Global ()->Get (env.local (), v8_str (" foo" )).ToLocalChecked ();
5862
+ v8::Local<v8::Promise> promise = result.As <v8::Promise>();
5863
+ isolate->PerformMicrotaskCheckpoint ();
5864
+ v8::Local<v8::Value> resolved = promise->Result ();
5865
+ CHECK (resolved->IsString ());
5866
+ CHECK (resolved.As <v8::String>()
5867
+ ->Equals (env.local (), v8_str (" hello" ))
5868
+ .FromJust ());
5869
+ }
5870
+ }
5871
+
5663
5872
TEST (CachedCompileFunction) {
5664
5873
DisableAlwaysOpt ();
5665
5874
LocalContext env;
0 commit comments