diff truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLContext.java @ 22046:e7c2d36daf72

TruffleLanguage.parse method to convert a source to CallTarget. Basic caching to make sure the code is shared among tenants in one JVM.
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Thu, 30 Jul 2015 17:36:34 +0200
parents 5bc7f7b867ab
children 503529c65456
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLContext.java	Thu Jul 30 17:16:59 2015 +0200
+++ b/truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/runtime/SLContext.java	Thu Jul 30 17:36:34 2015 +0200
@@ -74,11 +74,19 @@
     private final Shape emptyShape;
 
     public SLContext(SLLanguage language, BufferedReader input, PrintWriter output) {
+        this(language, input, output, true);
+    }
+
+    public SLContext(SLLanguage language) {
+        this(language, null, null, false);
+    }
+
+    private SLContext(SLLanguage language, BufferedReader input, PrintWriter output, boolean installBuiltins) {
         this.language = language;
         this.input = input;
         this.output = output;
         this.functionRegistry = new SLFunctionRegistry();
-        installBuiltins();
+        installBuiltins(installBuiltins);
 
         this.emptyShape = LAYOUT.createShape(new ObjectType());
     }
@@ -114,19 +122,19 @@
      * Adds all builtin functions to the {@link SLFunctionRegistry}. This method lists all
      * {@link SLBuiltinNode builtin implementation classes}.
      */
-    private void installBuiltins() {
-        installBuiltin(SLReadlnBuiltinFactory.getInstance());
-        installBuiltin(SLPrintlnBuiltinFactory.getInstance());
-        installBuiltin(SLNanoTimeBuiltinFactory.getInstance());
-        installBuiltin(SLDefineFunctionBuiltinFactory.getInstance());
-        installBuiltin(SLStackTraceBuiltinFactory.getInstance());
-        installBuiltin(SLHelloEqualsWorldBuiltinFactory.getInstance());
-        installBuiltin(SLAssertTrueBuiltinFactory.getInstance());
-        installBuiltin(SLAssertFalseBuiltinFactory.getInstance());
-        installBuiltin(SLNewObjectBuiltinFactory.getInstance());
+    private void installBuiltins(boolean registerRootNodes) {
+        installBuiltin(SLReadlnBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLPrintlnBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLNanoTimeBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLDefineFunctionBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLStackTraceBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLHelloEqualsWorldBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLAssertTrueBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLAssertFalseBuiltinFactory.getInstance(), registerRootNodes);
+        installBuiltin(SLNewObjectBuiltinFactory.getInstance(), registerRootNodes);
     }
 
-    public void installBuiltin(NodeFactory<? extends SLBuiltinNode> factory) {
+    public void installBuiltin(NodeFactory<? extends SLBuiltinNode> factory, boolean registerRootNodes) {
         /*
          * The builtin node factory is a class that is automatically generated by the Truffle DSL.
          * The signature returned by the factory reflects the signature of the @Specialization
@@ -149,8 +157,13 @@
         /* Wrap the builtin in a RootNode. Truffle requires all AST to start with a RootNode. */
         SLRootNode rootNode = new SLRootNode(this, new FrameDescriptor(), builtinBodyNode, name);
 
-        /* Register the builtin function in our function registry. */
-        getFunctionRegistry().register(name, rootNode);
+        if (registerRootNodes) {
+            /* Register the builtin function in our function registry. */
+            getFunctionRegistry().register(name, rootNode);
+        } else {
+            // make sure the function is known
+            getFunctionRegistry().lookup(name);
+        }
     }
 
     public static NodeInfo lookupNodeInfo(Class<?> clazz) {