changeset 22238:cccb1ac700bd

Team/Instrumentation: the TruflfeVM Debugger is now created eagerly at VM "build" time
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Tue, 22 Sep 2015 15:08:18 -0700
parents c4e7737981d3
children e7e3826801d6
files truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/debug/Debugger.java truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java
diffstat 3 files changed, 31 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java	Tue Sep 22 10:14:41 2015 -0700
+++ b/truffle/com.oracle.truffle.api.vm/src/com/oracle/truffle/api/vm/TruffleVM.java	Tue Sep 22 15:08:18 2015 -0700
@@ -113,7 +113,7 @@
     private final EventConsumer<?>[] handlers;
     private final Map<String, Object> globals;
     private final Instrumenter instrumenter;
-    private Debugger debugger;
+    private final Debugger debugger;
 
     /**
      * Private & temporary only constructor.
@@ -128,6 +128,7 @@
         this.globals = null;
         this.executor = null;
         this.instrumenter = null;
+        this.debugger = null;
     }
 
     /**
@@ -142,6 +143,7 @@
         this.initThread = Thread.currentThread();
         this.globals = new HashMap<>(globals);
         this.instrumenter = SPI.createInstrumenter(this);
+        this.debugger = SPI.createDebugger(this, this.instrumenter);
         Map<String, Language> map = new HashMap<>();
         for (Map.Entry<String, LanguageCache> en : LanguageCache.languages().entrySet()) {
             map.put(en.getKey(), new Language(en.getValue()));
@@ -450,14 +452,13 @@
     }
 
     private Symbol eval(final Language l, final Source s) throws IOException {
-        final Debugger[] fillIn = {debugger};
         final Object[] result = {null, null};
         final CountDownLatch ready = new CountDownLatch(1);
         final TruffleLanguage[] lang = {null};
         executor.execute(new Runnable() {
             @Override
             public void run() {
-                evalImpl(fillIn, lang, s, result, l, ready);
+                evalImpl(lang, s, result, l, ready);
             }
         });
         exceptionCheck(result);
@@ -465,13 +466,10 @@
     }
 
     @SuppressWarnings("try")
-    private void evalImpl(Debugger[] fillIn, TruffleLanguage<?>[] fillLang, Source s, Object[] result, Language l, CountDownLatch ready) {
-        try (Closeable d = SPI.executionStart(this, fillIn, s)) {
+    private void evalImpl(TruffleLanguage<?>[] fillLang, Source s, Object[] result, Language l, CountDownLatch ready) {
+        try (Closeable d = SPI.executionStart(this, debugger, s)) {
             TruffleLanguage<?> langImpl = l.getImpl(true);
             fillLang[0] = langImpl;
-            if (debugger == null) {
-                debugger = fillIn[0];
-            }
             result[0] = SPI.eval(langImpl, s);
         } catch (IOException ex) {
             result[1] = ex;
@@ -661,13 +659,12 @@
          */
         public Symbol invoke(final Object thiz, final Object... args) throws IOException {
             get();
-            final Debugger[] fillIn = {debugger};
             final CountDownLatch done = new CountDownLatch(1);
             final Object[] res = {null, null};
             executor.execute(new Runnable() {
                 @Override
                 public void run() {
-                    invokeImpl(fillIn, thiz, args, res, done);
+                    invokeImpl(thiz, args, res, done);
                 }
             });
             exceptionCheck(res);
@@ -676,16 +673,12 @@
 
         @SuppressWarnings("try")
         final Symbol invokeProxy(final InvocationHandler chain, final Object wrapper, final Method method, final Object[] args) throws IOException {
-            final Debugger[] fillIn = {debugger};
             final CountDownLatch done = new CountDownLatch(1);
             final Object[] res = {null, null};
             executor.execute(new Runnable() {
                 @Override
                 public void run() {
-                    try (final Closeable c = SPI.executionStart(TruffleVM.this, fillIn, null)) {
-                        if (debugger == null) {
-                            debugger = fillIn[0];
-                        }
+                    try (final Closeable c = SPI.executionStart(TruffleVM.this, debugger, null)) {
                         res[0] = chain.invoke(wrapper, method, args);
                     } catch (IOException ex) {
                         res[1] = ex;
@@ -701,11 +694,8 @@
         }
 
         @SuppressWarnings("try")
-        private void invokeImpl(Debugger[] fillIn, Object thiz, Object[] args, Object[] res, CountDownLatch done) {
-            try (final Closeable c = SPI.executionStart(TruffleVM.this, fillIn, null)) {
-                if (debugger == null) {
-                    debugger = fillIn[0];
-                }
+        private void invokeImpl(Object thiz, Object[] args, Object[] res, CountDownLatch done) {
+            try (final Closeable c = SPI.executionStart(TruffleVM.this, debugger, null)) {
                 List<Object> arr = new ArrayList<>();
                 if (thiz == null && language != null) {
                     Object global = SPI.languageGlobal(SPI.findLanguage(TruffleVM.this, language.getClass()));
@@ -927,6 +917,11 @@
         }
 
         @Override
+        protected Debugger createDebugger(Object vm, Instrumenter instrumenter) {
+            return super.createDebugger(vm, instrumenter);
+        }
+
+        @Override
         protected ASTProber getDefaultASTProber(TruffleLanguage impl) {
             return super.getDefaultASTProber(impl);
         }
@@ -955,9 +950,9 @@
         }
 
         @Override
-        protected Closeable executionStart(Object obj, Debugger[] fillIn, Source s) {
+        protected Closeable executionStart(Object obj, Debugger debugger, Source s) {
             TruffleVM vm = (TruffleVM) obj;
-            return super.executionStart(vm, fillIn, s);
+            return super.executionStart(vm, debugger, s);
         }
 
         @Override
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/debug/Debugger.java	Tue Sep 22 10:14:41 2015 -0700
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/debug/Debugger.java	Tue Sep 22 15:08:18 2015 -0700
@@ -808,42 +808,26 @@
 
     @SuppressWarnings("rawtypes")
     private static final class AccessorDebug extends Accessor {
+
         @Override
-        protected Closeable executionStart(Object vm, Debugger[] fillIn, Source s) {
-            final Debugger d;
-            if (fillIn[0] == null) {
-                final Instrumenter instrumenter = ACCESSOR.getInstrumenter(vm);
-                d = fillIn[0] = new Debugger(vm, instrumenter);
-            } else {
-                d = fillIn[0];
-            }
-            d.executionStarted(s);
+        protected Closeable executionStart(Object vm, final Debugger debugger, Source s) {
+            debugger.executionStarted(s);
             return new Closeable() {
                 @Override
                 public void close() throws IOException {
-                    d.executionEnded();
+                    debugger.executionEnded();
                 }
             };
         }
 
         @Override
-        protected Class<? extends TruffleLanguage> findLanguage(Probe probe) {
-            return super.findLanguage(probe);
+        protected Debugger createDebugger(Object vm, Instrumenter instrumenter) {
+            return new Debugger(vm, instrumenter);
         }
 
         @Override
-        protected TruffleLanguage.Env findLanguage(Object vm, Class<? extends TruffleLanguage> languageClass) {
-            return super.findLanguage(vm, languageClass);
-        }
-
-        @Override
-        protected TruffleLanguage<?> findLanguage(TruffleLanguage.Env env) {
-            return super.findLanguage(env);
-        }
-
-        @Override
-        protected Instrumenter getInstrumenter(Object vm) {
-            return super.getInstrumenter(vm);
+        protected Class<? extends TruffleLanguage> findLanguage(Probe probe) {
+            return super.findLanguage(probe);
         }
 
         @Override
--- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Tue Sep 22 10:14:41 2015 -0700
+++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/Accessor.java	Tue Sep 22 15:08:18 2015 -0700
@@ -309,11 +309,15 @@
         return INSTRUMENT.createInstrumenter(vm);
     }
 
+    protected Debugger createDebugger(Object vm, Instrumenter instrumenter) {
+        return DEBUG.createDebugger(vm, instrumenter);
+    }
+
     private static Reference<Object> previousVM = new WeakReference<>(null);
     private static Assumption oneVM = Truffle.getRuntime().createAssumption();
 
-    protected Closeable executionStart(Object vm, Debugger[] fillIn, Source s) {
-        final Closeable debugClose = DEBUG.executionStart(vm, fillIn, s);
+    protected Closeable executionStart(Object vm, Debugger debugger, Source s) {
+        final Closeable debugClose = DEBUG.executionStart(vm, debugger, s);
         final Object prev = CURRENT_VM.get();
         if (!(vm == previousVM.get())) {
             previousVM = new WeakReference<>(vm);