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 <martin.entlic...@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-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

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

Reply via email to