Skip to content

Commit

Permalink
fix(typescript): fixup ts module loader
Browse files Browse the repository at this point in the history
- fix: truffle boundary for native ts module loader
- chore: general typescript cleanup

Fixes and closes #824

Signed-off-by: Sam Gammon <sam@elide.ventures>
  • Loading branch information
sgammon committed Jun 13, 2024
1 parent 616f63d commit 86cdb09
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,10 @@
*/
package elide.runtime.lang.typescript;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.js.runtime.JSRealm;
import java.lang.reflect.Field;

class JSRealmPatcher {
@CompilerDirectives.TruffleBoundary
public static void setTSModuleLoader(JSRealm jsRealm, TypeScriptModuleLoader newModuleLoader) {
try {
Field moduleLoaderField = JSRealm.class.getDeclaredField("moduleLoader");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.oracle.truffle.js.lang.JavaScriptLanguage;
import com.oracle.truffle.js.runtime.JSEngine;
import com.oracle.truffle.js.runtime.JSRealm;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.List;
import org.graalvm.polyglot.SandboxPolicy;

Expand Down Expand Up @@ -61,19 +62,26 @@ public class TypeScriptLanguage extends TruffleLanguage<JSRealm> {
public static final String IMPLEMENTATION_NAME = "TypeScript";
public static final String ID = "ts";
public static final String TYPESCRIPT_VERSION = "5.4.5";
private TypeScriptCompiler tsCompiler;

@SuppressWarnings("java:S3077")
@CompilerDirectives.CompilationFinal private volatile TypeScriptCompiler tsCompiler = null;
private final AtomicBoolean compilerInitialized = new AtomicBoolean(false);
private Env env;

@Override
protected JSRealm createContext(Env env) {
protected JSRealm createContext(Env currentEnv) {
CompilerAsserts.neverPartOfCompilation();
var js = JavaScriptLanguage.getCurrentLanguage();
LanguageInfo jsInfo = env.getInternalLanguages().get("js");
env.initializeLanguage(jsInfo);
LanguageInfo jsInfo = currentEnv.getInternalLanguages().get("js");
currentEnv.initializeLanguage(jsInfo);
var jsEnv = JavaScriptLanguage.getCurrentEnv();

if (!compilerInitialized.get()) {
compilerInitialized.compareAndSet(false, true);
tsCompiler = new TypeScriptCompiler(jsEnv);
env = jsEnv;
}
var ctx = JSEngine.createJSContext(js, jsEnv);
tsCompiler = new TypeScriptCompiler(jsEnv);
this.env = jsEnv;
var realm = ctx.createRealm(jsEnv);
JSRealmPatcher.setTSModuleLoader(realm, new TypeScriptModuleLoader(realm, tsCompiler));
return realm;
Expand All @@ -98,19 +106,23 @@ protected CallTarget parse(ParsingRequest parsingRequest) {
return wrapper.getCallTarget();
}

private static class TSRootNode extends RootNode {
private class TSRootNode extends RootNode {
private final RootNode delegate;

protected TSRootNode(TruffleLanguage<?> language, RootNode delegate) {
super(language);
this.delegate = delegate;
}

@TruffleBoundary
private void setModuleLoader() {
JSRealm realm = JSRealm.get(delegate);
JSRealmPatcher.setTSModuleLoader(realm, new TypeScriptModuleLoader(realm, tsCompiler));
}

@Override
public Object execute(VirtualFrame frame) {
// @TODO(sgammon): causes restricted types to be reached
// JSRealm realm = JSRealm.get(delegate);
// JSRealmPatcher.setTSModuleLoader(realm, new TypeScriptModuleLoader(realm, tsCompiler));
setModuleLoader();
return delegate.execute(frame);
}
}
Expand Down

0 comments on commit 86cdb09

Please sign in to comment.