Mercurial > hg > truffle
diff graal/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java @ 21481:bb51b9a142b3
Enforcing public, one parameter constructor for each TruffleLanguage by annotation processor and required call to super.
author | Jaroslav Tulach <jaroslav.tulach@oracle.com> |
---|---|
date | Mon, 25 May 2015 12:26:53 +0200 |
parents | 99942eac9c6d |
children | 3286fb5fea4a b1530a6cce8c |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java Mon May 25 10:36:30 2015 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleLanguage.java Mon May 25 12:26:53 2015 +0200 @@ -33,6 +33,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.lang.reflect.Constructor; /** * An entry point for everyone who wants to implement a Truffle based language. By providing @@ -42,7 +43,17 @@ * language support, multi tennat hosting, debugging, etc.) will be made available to them. */ public abstract class TruffleLanguage { - private Env env; + private final Env env; + + /** + * Constructor to be called by subclasses. + * + * @param env language environment that will be available via {@link #env()} method to + * subclasses. + */ + protected TruffleLanguage(Env env) { + this.env = env; + } /** * The annotation to use to register your language to the {@link TruffleVM Truffle} system. By @@ -72,11 +83,6 @@ String[] mimeType(); } - @SuppressWarnings("all") - void attachEnv(Env env) { - this.env = env; - } - protected final Env env() { if (this.env == null) { throw new NullPointerException("Accessing env before initialization is finished"); @@ -130,9 +136,13 @@ private final TruffleVM vm; private final TruffleLanguage lang; - Env(TruffleVM vm, TruffleLanguage lang) { + Env(TruffleVM vm, Constructor<?> langConstructor) { this.vm = vm; - this.lang = lang; + try { + this.lang = (TruffleLanguage) langConstructor.newInstance(this); + } catch (Exception ex) { + throw new IllegalStateException("Cannot construct language " + langConstructor.getClass().getName(), ex); + } } /** @@ -154,10 +164,9 @@ private static final class AccessAPI extends Accessor { @Override - protected Env attachEnv(TruffleVM vm, TruffleLanguage l) { - Env env = new Env(vm, l); - l.attachEnv(env); - return env; + protected TruffleLanguage attachEnv(TruffleVM vm, Constructor<?> langClazz) { + Env env = new Env(vm, langClazz); + return env.lang; } @Override