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