Skip to content

Commit c40b707

Browse files
committed
[GR-72926] Implementation of v8::Module::ResolveSourceCallback.
PullRequest: js/3672
2 parents ae8a95b + 9aedbdd commit c40b707

File tree

9 files changed

+62
-38
lines changed

9 files changed

+62
-38
lines changed

graal-nodejs/deps/v8/src/graal/callbacks.cc

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static const JNINativeMethod callbacks[] = {
113113
CALLBACK("notifyPromiseHook", "(ILjava/lang/Object;Ljava/lang/Object;)V", &GraalNotifyPromiseHook),
114114
CALLBACK("notifyPromiseRejectionTracker", "(Ljava/lang/Object;ILjava/lang/Object;)V", &GraalNotifyPromiseRejectionTracker),
115115
CALLBACK("notifyImportMetaInitializer", "(Ljava/lang/Object;Ljava/lang/Object;)V", &GraalNotifyImportMetaInitializer),
116-
CALLBACK("executeResolveCallback", "(JLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", &GraalExecuteResolveCallback),
116+
CALLBACK("executeResolveCallback", "(JLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;", &GraalExecuteResolveCallback),
117117
CALLBACK("executeImportModuleDynamicallyCallback", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", &GraalExecuteImportModuleDynamicallyCallback),
118118
CALLBACK("executeImportModuleWithPhaseDynamicallyCallback", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;ILjava/lang/Object;)Ljava/lang/Object;", &GraalExecuteImportModuleWithPhaseDynamicallyCallback),
119119
CALLBACK("executePrepareStackTraceCallback", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", &GraalExecutePrepareStackTraceCallback),
@@ -771,7 +771,7 @@ void GraalNotifyImportMetaInitializer(JNIEnv* env, jclass nativeAccess, jobject
771771
);
772772
}
773773

774-
jobject GraalExecuteResolveCallback(JNIEnv* env, jclass nativeAccess, jlong callback, jobject java_context, jobject java_specifier, jobject java_import_attributes, jobject java_referrer) {
774+
jobject GraalExecuteResolveCallback(JNIEnv* env, jclass nativeAccess, jlong callback, jobject java_context, jobject java_specifier, jobject java_import_attributes, jobject java_referrer, jboolean source_phase) {
775775
GraalIsolate* graal_isolate = CurrentIsolateChecked();
776776
v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*> (graal_isolate);
777777
v8::HandleScope scope(v8_isolate);
@@ -783,18 +783,32 @@ jobject GraalExecuteResolveCallback(JNIEnv* env, jclass nativeAccess, jlong call
783783
v8::String* v8_specifier = reinterpret_cast<v8::String*> (graal_specifier);
784784
v8::FixedArray* v8_import_attributes = reinterpret_cast<v8::FixedArray*> (graal_import_attributes);
785785
v8::Module* v8_referrer = reinterpret_cast<v8::Module*> (graal_referrer);
786-
v8::MaybeLocal<v8::Module> v8_result = ((v8::Module::ResolveModuleCallback) callback)(
787-
v8::Local<v8::Context>::New(v8_isolate, v8_context),
788-
v8::Local<v8::String>::New(v8_isolate, v8_specifier),
789-
v8::Local<v8::FixedArray>::New(v8_isolate, v8_import_attributes),
790-
v8::Local<v8::Module>::New(v8_isolate, v8_referrer)
791-
);
786+
v8::Local<v8::Context> local_context = v8::Local<v8::Context>::New(v8_isolate, v8_context);
787+
v8::Local<v8::String> local_specifier = v8::Local<v8::String>::New(v8_isolate, v8_specifier);
788+
v8::Local<v8::FixedArray> local_import_attributes = v8::Local<v8::FixedArray>::New(v8_isolate, v8_import_attributes);
789+
v8::Local<v8::Module> local_referrer = v8::Local<v8::Module>::New(v8_isolate, v8_referrer);
790+
v8::MaybeLocal<v8::Data> v8_result;
791+
if (source_phase) {
792+
v8_result = ((v8::Module::ResolveSourceCallback) callback)(
793+
local_context,
794+
local_specifier,
795+
local_import_attributes,
796+
local_referrer
797+
);
798+
} else {
799+
v8_result = ((v8::Module::ResolveModuleCallback) callback)(
800+
local_context,
801+
local_specifier,
802+
local_import_attributes,
803+
local_referrer
804+
);
805+
}
792806
if (v8_result.IsEmpty()) {
793807
return NULL;
794808
} else {
795-
v8::Local<v8::Module> v8_module = v8_result.ToLocalChecked();
796-
GraalModule* graal_module = reinterpret_cast<GraalModule*> (*v8_module);
797-
return env->NewLocalRef(graal_module->GetJavaObject());
809+
v8::Local<v8::Data> local_result = v8_result.ToLocalChecked();
810+
GraalHandleContent* graal_result = reinterpret_cast<GraalHandleContent*> (*local_result);
811+
return env->NewLocalRef(graal_result->GetJavaObject());
798812
}
799813
}
800814

graal-nodejs/deps/v8/src/graal/callbacks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ jobject GraalExecuteImportModuleDynamicallyCallback(JNIEnv* env, jclass nativeAc
142142

143143
jobject GraalExecuteImportModuleWithPhaseDynamicallyCallback(JNIEnv* env, jclass nativeAccess, jobject java_context, jobject java_host_defined_options, jobject java_resource_name, jobject java_specifier, jint java_phase, jobject java_import_attributes);
144144

145-
jobject GraalExecuteResolveCallback(JNIEnv* env, jclass nativeAccess, jlong callback, jobject java_context, jobject java_specifier, jobject java_import_attributes, jobject java_referrer);
145+
jobject GraalExecuteResolveCallback(JNIEnv* env, jclass nativeAccess, jlong callback, jobject java_context, jobject java_specifier, jobject java_import_attributes, jobject java_referrer, jboolean source_phase);
146146

147147
jboolean GraalHasCustomHostObject(JNIEnv* env, jclass nativeAccess, jlong delegate);
148148

graal-nodejs/deps/v8/src/graal/graal_isolate.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ GraalIsolate::GraalIsolate(JavaVM* jvm, JNIEnv* env, v8::Isolate::CreateParams c
972972
ACCESS_METHOD(GraalAccessMethod::promise_resolver_resolve, "promiseResolverResolve", "(Ljava/lang/Object;Ljava/lang/Object;)Z")
973973
ACCESS_METHOD(GraalAccessMethod::promise_then, "promiseThen", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
974974
ACCESS_METHOD(GraalAccessMethod::module_compile, "moduleCompile", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
975-
ACCESS_METHOD(GraalAccessMethod::module_instantiate, "moduleInstantiate", "(Ljava/lang/Object;Ljava/lang/Object;J)V")
975+
ACCESS_METHOD(GraalAccessMethod::module_instantiate, "moduleInstantiate", "(Ljava/lang/Object;Ljava/lang/Object;JJ)V")
976976
ACCESS_METHOD(GraalAccessMethod::module_evaluate, "moduleEvaluate", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")
977977
ACCESS_METHOD(GraalAccessMethod::module_get_status, "moduleGetStatus", "(Ljava/lang/Object;)I")
978978
ACCESS_METHOD(GraalAccessMethod::module_get_namespace, "moduleGetNamespace", "(Ljava/lang/Object;)Ljava/lang/Object;")

graal-nodejs/deps/v8/src/graal/graal_module.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -74,12 +74,13 @@ v8::MaybeLocal<v8::Module> GraalModule::Compile(v8::Local<v8::String> source, v8
7474
}
7575
}
7676

77-
v8::Maybe<bool> GraalModule::InstantiateModule(v8::Local<v8::Context> context, v8::Module::ResolveModuleCallback callback) {
77+
v8::Maybe<bool> GraalModule::InstantiateModule(v8::Local<v8::Context> context, v8::Module::ResolveModuleCallback module_callback, v8::Module::ResolveSourceCallback source_callback) {
7878
GraalIsolate* graal_isolate = Isolate();
7979
GraalContext* graal_context = reinterpret_cast<GraalContext*> (*context);
8080
jobject java_context = graal_context->GetJavaObject();
81-
jlong java_callback = (jlong) callback;
82-
JNI_CALL_VOID(graal_isolate, GraalAccessMethod::module_instantiate, java_context, GetJavaObject(), java_callback);
81+
jlong java_module_callback = (jlong) module_callback;
82+
jlong java_source_callback = (jlong) source_callback;
83+
JNI_CALL_VOID(graal_isolate, GraalAccessMethod::module_instantiate, java_context, GetJavaObject(), java_module_callback, java_source_callback);
8384
return v8::Just(!graal_isolate->GetJNIEnv()->ExceptionCheck());
8485
}
8586

graal-nodejs/deps/v8/src/graal/graal_module.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -51,7 +51,7 @@ class GraalModule : public GraalHandleContent {
5151
public:
5252
inline static GraalModule* Allocate(GraalIsolate* isolate, jobject java_module);
5353
static v8::MaybeLocal<v8::Module> Compile(v8::Local<v8::String> source, v8::Local<v8::String> name, v8::Local<v8::Data> options);
54-
v8::Maybe<bool> InstantiateModule(v8::Local<v8::Context> context, v8::Module::ResolveModuleCallback callback);
54+
v8::Maybe<bool> InstantiateModule(v8::Local<v8::Context> context, v8::Module::ResolveModuleCallback module_callback, v8::Module::ResolveSourceCallback source_callback);
5555
v8::MaybeLocal<v8::Value> Evaluate(v8::Local<v8::Context> context);
5656
v8::Module::Status GetStatus() const;
5757
v8::Local<v8::Value> GetModuleNamespace();

graal-nodejs/deps/v8/src/graal/v8.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -2409,8 +2409,8 @@ namespace v8 {
24092409
return reinterpret_cast<GraalModule*> (this)->Evaluate(context);
24102410
}
24112411

2412-
Maybe<bool> Module::InstantiateModule(Local<Context> context, ResolveModuleCallback callback, ResolveSourceCallback source_callback) {
2413-
return reinterpret_cast<GraalModule*> (this)->InstantiateModule(context, callback);
2412+
Maybe<bool> Module::InstantiateModule(Local<Context> context, ResolveModuleCallback module_callback, ResolveSourceCallback source_callback) {
2413+
return reinterpret_cast<GraalModule*> (this)->InstantiateModule(context, module_callback, source_callback);
24142414
}
24152415

24162416
Module::Status Module::GetStatus() const {

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/GraalJSAccess.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@
272272
import com.oracle.truffle.js.runtime.objects.ScriptOrModule;
273273
import com.oracle.truffle.js.runtime.objects.SyntheticModuleRecord;
274274
import com.oracle.truffle.js.runtime.objects.Undefined;
275+
import com.oracle.truffle.js.runtime.objects.WebAssemblyModuleRecord;
275276
import com.oracle.truffle.js.runtime.util.DirectByteBufferHelper;
276277
import com.oracle.truffle.js.runtime.util.JSHashMap;
277278
import com.oracle.truffle.js.runtime.util.Pair;
@@ -3961,16 +3962,16 @@ public Object moduleCompile(Object context, Object sourceCode, Object name, Obje
39613962
return new JSModuleRecord(parsedModule, getModuleLoader(), new NodeHostDefined());
39623963
}
39633964

3964-
public void moduleInstantiate(Object context, Object module, long resolveCallback) {
3965+
public void moduleInstantiate(Object context, Object module, long moduleCallback, long sourceCallback) {
39653966
JSRealm jsRealm = (JSRealm) context;
39663967
AbstractModuleRecord moduleRecord = (AbstractModuleRecord) module;
39673968
ESModuleLoader loader = getModuleLoader();
3968-
loader.setResolver(resolveCallback);
3969+
loader.setCallbacks(moduleCallback, sourceCallback);
39693970
try {
39703971
moduleRecord.loadRequestedModulesSync(jsRealm, moduleRecord.getHostDefined());
39713972
moduleRecord.link(jsRealm);
39723973
} finally {
3973-
loader.setResolver(0);
3974+
loader.setCallbacks(0L, 0L);
39743975
}
39753976
}
39763977

@@ -4426,10 +4427,12 @@ public Object execute(VirtualFrame vf) {
44264427

44274428
static class ESModuleLoader implements JSModuleLoader {
44284429
private final Map<ScriptOrModule, Map<ModuleRequest, AbstractModuleRecord>> cache = new HashMap<>();
4429-
private long resolver;
4430+
private long moduleCallback;
4431+
private long sourceCallback;
44304432

4431-
void setResolver(long resolver) {
4432-
this.resolver = resolver;
4433+
void setCallbacks(long moduleCallback, long sourceCallback) {
4434+
this.moduleCallback = moduleCallback;
4435+
this.sourceCallback = sourceCallback;
44334436
}
44344437

44354438
@Override
@@ -4444,17 +4447,26 @@ public AbstractModuleRecord resolveImportedModule(ScriptOrModule referrer, Modul
44444447
return cached;
44454448
}
44464449
}
4447-
if (resolver == 0) {
4450+
TruffleString specifier = moduleRequest.specifier();
4451+
Object importAttributes = moduleRequestGetImportAttributesImpl(moduleRequest, true);
4452+
boolean sourcePhase = (moduleRequest.phase() == Module.ImportPhase.Source);
4453+
long callback = sourcePhase ? sourceCallback : moduleCallback;
4454+
if (callback == 0) {
44484455
Thread.dumpStack();
44494456
System.err.println("Cannot resolve module outside module instantiation!");
44504457
System.exit(1);
44514458
}
4452-
TruffleString specifier = moduleRequest.specifier();
4453-
Object importAttributes = moduleRequestGetImportAttributesImpl(moduleRequest, true);
44544459
JSRealm realm = JSRealm.get(null);
4455-
AbstractModuleRecord result = (AbstractModuleRecord) NativeAccess.executeResolveCallback(resolver, realm, specifier, importAttributes, referrer);
4456-
referrerCache.put(moduleRequest, result);
4457-
return result;
4460+
Object result = NativeAccess.executeResolveCallback(callback, realm, specifier, importAttributes, referrer, sourcePhase);
4461+
AbstractModuleRecord module;
4462+
if (sourcePhase) {
4463+
JSWebAssemblyModuleObject moduleObject = (JSWebAssemblyModuleObject) result;
4464+
module = new WebAssemblyModuleRecord(realm.getContext(), moduleObject.getWASMSource(), moduleObject);
4465+
} else {
4466+
module = (AbstractModuleRecord) result;
4467+
}
4468+
referrerCache.put(moduleRequest, module);
4469+
return module;
44584470
}
44594471
}
44604472

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/NativeAccess.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public static native Object executePropertyHandlerDefiner(long functionPointer,
146146

147147
public static native void notifyImportMetaInitializer(Object importMeta, Object module);
148148

149-
public static native Object executeResolveCallback(long callback, Object context, Object specifier, Object importAttributes, Object referrer);
149+
public static native Object executeResolveCallback(long callback, Object context, Object specifier, Object importAttributes, Object referrer, boolean sourcePhase);
150150

151151
public static native Object executeImportModuleDynamicallyCallback(Object context, Object hostDefinedOptions, Object resourceName, Object specifier, Object importAttributes);
152152

graal-nodejs/test/es-module/es-module.status

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ test-esm-wasm-js-string-builtins : FAIL
2828
test-typescript-eval : FAIL
2929

3030
# Unclassified
31-
test-esm-wasm-source-phase-dynamic : FAIL
32-
test-esm-wasm-source-phase-no-execute: FAIL
33-
test-esm-wasm-source-phase-static : FAIL
3431
test-require-module-tla : SKIP
3532

3633
# transient test failure tracked under GR-61384

0 commit comments

Comments
 (0)