You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by en...@apache.org on 2022/02/24 16:34:02 UTC

[netbeans] branch master updated: Export the Truffle packages explicitly, since TruffleJDKServices class was removed.

This is an automated email from the ASF dual-hosted git repository.

entl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 7fe5a90  Export the Truffle packages explicitly, since TruffleJDKServices class was removed.
7fe5a90 is described below

commit 7fe5a907401aac2be35744586c710a49e6699823
Author: Martin Entlicher <ma...@oracle.com>
AuthorDate: Wed Feb 23 19:11:06 2022 +0100

    Export the Truffle packages explicitly, since TruffleJDKServices class was removed.
---
 .../debugger/jpda/truffle/DebugManagerHandler.java | 12 ++++--
 .../debugger/jpda/truffle/RemoteServices.java      | 33 +++++++++------
 .../debugger/jpda/truffle/TruffleDebugManager.java | 48 ++++++++++++++++++++--
 3 files changed, 72 insertions(+), 21 deletions(-)

diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/DebugManagerHandler.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/DebugManagerHandler.java
index f2b03f6..396aa72 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/DebugManagerHandler.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/DebugManagerHandler.java
@@ -118,9 +118,7 @@ final class DebugManagerHandler {
     
     void newPolyglotEngineInstance(ObjectReference engine, JPDAThreadImpl thread) {
         LOG.log(Level.FINE, "Engine created breakpoint hit: engine = {0} in thread = {1}", new Object[] { engine, thread.getThreadReference()});
-        if (inited.compareAndSet(false, true)) {
-            initDebuggerRemoteService(thread);
-        }
+        assert inited.get(): "The remote services should have been initialized already from a Truffle class.";
         if (accessorClass == null) {
             // No accessor
             return ;
@@ -163,7 +161,13 @@ final class DebugManagerHandler {
         }
     }
 
-    private void initDebuggerRemoteService(JPDAThread thread) {
+    void initDebuggerRemoteService(JPDAThread thread) {
+        if (inited.compareAndSet(false, true)) {
+            doInitDebuggerRemoteService(thread);
+        }
+    }
+
+    private void doInitDebuggerRemoteService(JPDAThread thread) {
         if (LOG.isLoggable(Level.FINE)) {
             LOG.log(Level.FINE, "initDebuggerRemoteService({0})", thread);
         }
diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/RemoteServices.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/RemoteServices.java
index 69af7cb..7c18aeb 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/RemoteServices.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/RemoteServices.java
@@ -98,9 +98,13 @@ public final class RemoteServices {
     static final String REMOTE_CLASSES_ZIPFILE = "/org/netbeans/modules/debugger/jpda/truffle/resources/JPDATruffleBackend.jar";    // NOI18N
 
     private static final String TRUFFLE_CLASS = "com.oracle.truffle.api.Truffle";       // NOI18N
-    private static final String EXPORT_TRUFFLE_CLASS = "com.oracle.truffle.api.impl.TruffleJDKServices";    // NOI18N
-    private static final String EXPORT_TRUFFLE_METHOD = "exportTo";                                         // NOI18N
-    private static final String EXPORT_TRUFFLE_SIGNAT = "(Ljava/lang/ClassLoader;Ljava/lang/String;)V";     // NOI18N
+    private static final String[] TRUFFLE_PACKAGES = {
+            "com.oracle.truffle.api",           // NOI18N
+            "com.oracle.truffle.api.debug",     // NOI18N
+            "com.oracle.truffle.api.frame",     // NOI18N
+            "com.oracle.truffle.api.instrumentation",   // NOI18N
+            "com.oracle.truffle.api.nodes",     // NOI18N
+            "com.oracle.truffle.api.source" };  // NOI18N
     
     private static final Map<JPDADebugger, ClassObjectReference> remoteServiceClasses = new WeakHashMap<>();
     private static final Map<JPDADebugger, ThreadReference> remoteServiceAccess = new WeakHashMap<>();
@@ -269,17 +273,20 @@ public final class RemoteServices {
 
                 // We have an agent class loader that we'll use to define Truffle backend debugging classes.
                 // We need to export the agent class loader to Truffle so that we can upload classes that access Truffle APIs.
-                ClassType languageLoader = getClass(vm, EXPORT_TRUFFLE_CLASS);
-                if (languageLoader == null) {
-                    Exceptions.printStackTrace(new IllegalStateException("Class " + EXPORT_TRUFFLE_CLASS + " not found in the debuggee."));
-                    return null;
+                // We need to export packages from Truffle to our unnamed module.
+                // We must call the Modeule.addExports() method from the Truffle module, we must be suspended in a Truffle class.
+                Method getModule = ClassTypeWrapper.concreteMethodByName(theClass, "getModule", "()Ljava/lang/Module;");
+                // truffleModule = Truffle.class.getModule()
+                ObjectReference truffleModule = (ObjectReference) ObjectReferenceWrapper.invokeMethod(ReferenceTypeWrapper.classObject(truffleLocatorClass), tawt, getModule, Collections.emptyList(), ObjectReference.INVOKE_SINGLE_THREADED);
+                ClassType newClassLoaderClass = (ClassType) ObjectReferenceWrapper.referenceType(classLoader);
+                Method getUnnamedModule = ClassTypeWrapper.concreteMethodByName(newClassLoaderClass, "getUnnamedModule", "()Ljava/lang/Module;");
+                // unnamedModule = newInstanceOfClassLoader.getUnnamedModule()
+                ObjectReference unnamedModule = (ObjectReference) ObjectReferenceWrapper.invokeMethod(classLoader, tawt, getUnnamedModule, Collections.emptyList(), ObjectReference.INVOKE_SINGLE_THREADED);
+                Method addExports = ClassTypeWrapper.concreteMethodByName((ClassType) ObjectReferenceWrapper.referenceType(truffleModule), "addExports", "(Ljava/lang/String;Ljava/lang/Module;)Ljava/lang/Module;");
+                for (String tPackage : TRUFFLE_PACKAGES) {
+                    // Add exports: truffleModule.addExports(package, unnamedModule)
+                    ObjectReferenceWrapper.invokeMethod(truffleModule, tawt, addExports, Arrays.asList(values.mirrorOf(tPackage), unnamedModule), ObjectReference.INVOKE_SINGLE_THREADED);
                 }
-                Method exportTruffle = ClassTypeWrapper.concreteMethodByName(languageLoader, EXPORT_TRUFFLE_METHOD, EXPORT_TRUFFLE_SIGNAT);
-                if (exportTruffle == null) {
-                    Exceptions.printStackTrace(new IllegalStateException("Method " + EXPORT_TRUFFLE_METHOD + " was not found in " + EXPORT_TRUFFLE_CLASS +" in the debuggee."));
-                    return null;
-                }
-                ClassTypeWrapper.invokeMethod(languageLoader, tawt, exportTruffle, Arrays.asList(classLoader, null), ObjectReference.INVOKE_SINGLE_THREADED);
             } else {
                 ObjectReference cl;
                 cl = getTruffleClassLoader(tawt, vm);
diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/TruffleDebugManager.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/TruffleDebugManager.java
index 14aa3f0..083558d 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/TruffleDebugManager.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/TruffleDebugManager.java
@@ -62,12 +62,15 @@ public class TruffleDebugManager extends DebuggerManagerAdapter {
     
     private static final Logger LOG = Logger.getLogger(TruffleDebugManager.class.getName());
     
-    private static final String ENGINE_CLASS = "org.graalvm.polyglot.Engine";
-    private static final String ENGINE_BUILDER_CLASS = "org.graalvm.polyglot.Engine$Builder";
+    private static final String ENGINE_CLASS = "org.graalvm.polyglot.Engine";   // NOI18N
+    private static final String ENGINE_BUILDER_CLASS = "org.graalvm.polyglot.Engine$Builder";   // NOI18N
+    private static final String REMOTE_SERVICES_TRIGGER_CLASS = "com.oracle.truffle.api.Truffle";   // NOI18N
+    private static final String REMOTE_SERVICES_TRIGGER_METHOD = "getRuntime";                      // NOI18N
     // Breakpoint on this class triggers search of existing engines
-    private static final String EXISTING_ENGINES_TRIGGER = "com.oracle.truffle.api.frame.Frame";
+    private static final String EXISTING_ENGINES_TRIGGER = "com.oracle.truffle.api.frame.Frame";    // NOI18N
     
     private JPDABreakpoint debugManagerLoadBP;
+    private Map<JPDADebugger, JPDABreakpoint> initServiceBPs = new HashMap<>();
     private static final Map<JPDADebugger, Boolean> haveExistingEnginesTrigger = new WeakHashMap<>();
     private static final Map<JPDADebugger, DebugManagerHandler> dmHandlers = new HashMap<>();
     private static final Map<JPDADebugger, JPDABreakpointListener> debugBPListeners = new HashMap<>();
@@ -110,9 +113,12 @@ public class TruffleDebugManager extends DebuggerManagerAdapter {
             }
         }
         initLoadBP();
+        JPDABreakpoint bpService = addRemoteServiceInitBP(debugger);
+        DebuggerManager.getDebuggerManager().addBreakpoint(bpService);
         JPDABreakpointListener bpl = addPolyglotEngineCreationBP(debugger);
         LOG.log(Level.FINE, "TruffleDebugManager.sessionAdded({0}), adding BP listener to {1}", new Object[]{session, debugManagerLoadBP});
         synchronized (debugBPListeners) {
+            initServiceBPs.put(debugger, bpService);
             debugBPListeners.put(debugger, bpl);
         }
     }
@@ -123,10 +129,15 @@ public class TruffleDebugManager extends DebuggerManagerAdapter {
         if (debugger == null) {
             return ;
         }
+        JPDABreakpoint bpService;
         JPDABreakpointListener bpl;
         synchronized (debugBPListeners) {
+            bpService = initServiceBPs.remove(debugger);
             bpl = debugBPListeners.remove(debugger);
         }
+        if (bpService != null) {
+            DebuggerManager.getDebuggerManager().removeBreakpoint(bpService);
+        }
         if (bpl != null) {
             LOG.log(Level.FINE, "TruffleDebugManager.engineRemoved({0}), removing BP listener from {1}", new Object[]{session, debugManagerLoadBP});
             debugManagerLoadBP.removeJPDABreakpointListener(bpl);
@@ -141,6 +152,30 @@ public class TruffleDebugManager extends DebuggerManagerAdapter {
         }
     }
 
+    private JPDABreakpoint addRemoteServiceInitBP(final JPDADebugger debugger) {
+        MethodBreakpoint bp = MethodBreakpoint.create(REMOTE_SERVICES_TRIGGER_CLASS, REMOTE_SERVICES_TRIGGER_METHOD);
+        bp.setBreakpointType(MethodBreakpoint.TYPE_METHOD_ENTRY);
+        bp.setHidden(true);
+        bp.setSession(debugger);
+
+        JPDABreakpointListener bpl = new JPDABreakpointListener() {
+            @Override
+            public void breakpointReached(JPDABreakpointEvent event) {
+                try {
+                    if (event.getDebugger() == debugger) {
+                        DebugManagerHandler dmh = getDebugManagerHandler(debugger);
+                        dmh.initDebuggerRemoteService(event.getThread());
+                        DebuggerManager.getDebuggerManager().removeBreakpoint(bp);
+                    }
+                } finally {
+                    event.resume();
+                }
+            }
+        };
+        bp.addJPDABreakpointListener(bpl);
+        return bp;
+    }
+
     private JPDABreakpointListener addPolyglotEngineCreationBP(final JPDADebugger debugger) {
         JPDABreakpointListener bpl = new JPDABreakpointListener() {
             @Override
@@ -249,7 +284,7 @@ public class TruffleDebugManager extends DebuggerManagerAdapter {
         DebuggerManager.getDebuggerManager().addBreakpoint(execTrigger);
     }
 
-    private void haveNewPE(JPDADebugger debugger, JPDAThreadImpl thread, ObjectReference engine) {
+    private DebugManagerHandler getDebugManagerHandler(JPDADebugger debugger) {
         DebugManagerHandler dmh;
         synchronized (dmHandlers) {
             dmh = dmHandlers.get(debugger);
@@ -258,6 +293,11 @@ public class TruffleDebugManager extends DebuggerManagerAdapter {
                 dmHandlers.put(debugger, dmh);
             }
         }
+        return dmh;
+    }
+
+    private void haveNewPE(JPDADebugger debugger, JPDAThreadImpl thread, ObjectReference engine) {
+        DebugManagerHandler dmh = getDebugManagerHandler(debugger);
         dmh.newPolyglotEngineInstance(engine, thread);
     }
 

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists