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 2021/04/30 18:44:01 UTC
[netbeans] branch master updated: Provide all scopes with correct
receiver information.
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 f75348c Provide all scopes with correct receiver information.
f75348c is described below
commit f75348c94d2ac869860819188f76c5344809298f
Author: Martin Entlicher <ma...@oracle.com>
AuthorDate: Thu Apr 29 10:25:03 2021 +0200
Provide all scopes with correct receiver information.
---
.../jpda/truffle/access/TruffleAccess.java | 49 ++------
.../jpda/truffle/vars/TruffleVariable.java | 4 +
.../jpda/truffle/vars/impl/TruffleScope.java | 47 +-------
.../truffle/vars/impl/TruffleStackVariable.java | 9 +-
.../vars/models/TruffleVariablesNodeModel.java | 8 +-
.../jpda/backend/truffle/JPDATruffleAccessor.java | 129 ++++-----------------
6 files changed, 49 insertions(+), 197 deletions(-)
diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/access/TruffleAccess.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/access/TruffleAccess.java
index bdcd022..976ad7e 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/access/TruffleAccess.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/access/TruffleAccess.java
@@ -510,30 +510,18 @@ public class TruffleAccess implements JPDABreakpointListener {
List<TruffleScope> scopes = new LinkedList<>();
int n = varsArr.length;
int i = 0;
- if (i < n) {
+ while (i < n) {
String scopeName = (String) varsArr[i++].createMirrorObject();
- boolean scopeFunction = (Boolean) varsArr[i++].createMirrorObject();
- int numArgs = (Integer) varsArr[i++].createMirrorObject();
+ boolean hasReceiver = (Boolean) varsArr[i++].createMirrorObject();
int numVars = (Integer) varsArr[i++].createMirrorObject();
- TruffleVariable[] arguments = new TruffleVariable[numArgs];
- i = fillVars(debugger, arguments, varsArr, i);
TruffleVariable[] variables = new TruffleVariable[numVars];
- i = fillVars(debugger, variables, varsArr, i);
- scopes.add(new TruffleScope(scopeName, scopeFunction, arguments, variables));
- }
- while (i < n) {
- // There are further scopes, retrieved lazily
- String scopeName = (String) varsArr[i++].createMirrorObject();
- boolean scopeFunction = (Boolean) varsArr[i++].createMirrorObject();
- boolean hasArgs = (Boolean) varsArr[i++].createMirrorObject();
- boolean hasVars = (Boolean) varsArr[i++].createMirrorObject();
- ObjectVariable scope = (ObjectVariable) varsArr[i++];
- scopes.add(new TruffleScope(scopeName, scopeFunction, hasArgs, hasVars, debugger, scope));
+ i = fillVars(debugger, variables, varsArr, hasReceiver, i);
+ scopes.add(new TruffleScope(scopeName, variables));
}
return scopes.toArray(new TruffleScope[scopes.size()]);
}
- private static int fillVars(JPDADebugger debugger, TruffleVariable[] vars, Field[] varsArr, int i) {
+ private static int fillVars(JPDADebugger debugger, TruffleVariable[] vars, Field[] varsArr, boolean hasReceiver, int i) {
for (int vi = 0; vi < vars.length; vi++) {
String name = (String) varsArr[i++].createMirrorObject();
LanguageName language = LanguageName.parse((String) varsArr[i++].createMirrorObject());
@@ -556,35 +544,12 @@ public class TruffleAccess implements JPDABreakpointListener {
valueSourceDef.getUniqueID() != 0L,
valueSource,
typeSourceDef.getUniqueID() != 0L,
- typeSource, value);
+ typeSource, hasReceiver, value);
+ hasReceiver = false;
}
return i;
}
- public static TruffleVariable[][] getScopeArgsAndVars(JPDADebugger debugger, ObjectVariable debugScope) {
- JPDAClassType debugAccessor = TruffleDebugManager.getDebugAccessorJPDAClass(debugger);
- try {
- Variable scopeVars = debugAccessor.invokeMethod(METHOD_GET_SCOPE_VARIABLES,
- METHOD_GET_SCOPE_VARIABLES_SGN,
- new Variable[] { debugScope });
- Field[] varsArr = ((ObjectVariable) scopeVars).getFields(0, Integer.MAX_VALUE);
- int n = varsArr.length;
- int i = 0;
- if (i < n) {
- int numArgs = (Integer) varsArr[i++].createMirrorObject();
- int numVars = (Integer) varsArr[i++].createMirrorObject();
- TruffleVariable[] arguments = new TruffleVariable[numArgs];
- i = fillVars(debugger, arguments, varsArr, i);
- TruffleVariable[] variables = new TruffleVariable[numVars];
- i = fillVars(debugger, variables, varsArr, i);
- return new TruffleVariable[][] { arguments, variables };
- }
- } catch (InvalidExpressionException | NoSuchMethodException ex) {
- Exceptions.printStackTrace(ex);
- }
- return new TruffleVariable[][] { new TruffleVariable[] {}, new TruffleVariable[] {} };
- }
-
private static Supplier<SourcePosition> parseSourceLazy(JPDADebugger debugger, Variable sourceDefVar, JDIVariable codeRefVar) {
return () -> parseSource(debugger,
(String) sourceDefVar.createMirrorObject(),
diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariable.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariable.java
index e096eb4..6bab75e 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariable.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/TruffleVariable.java
@@ -61,6 +61,10 @@ public interface TruffleVariable {
ObjectVariable setValue(JPDADebugger debugger, String newExpression);
+ default boolean isReceiver() {
+ return false;
+ }
+
public static TruffleVariable get(Variable var) {
return TruffleVariableImpl.get(var);
}
diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleScope.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleScope.java
index d787c66..dbbf66f 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleScope.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleScope.java
@@ -19,9 +19,6 @@
package org.netbeans.modules.debugger.jpda.truffle.vars.impl;
-import org.netbeans.api.debugger.jpda.JPDADebugger;
-import org.netbeans.api.debugger.jpda.ObjectVariable;
-import org.netbeans.modules.debugger.jpda.truffle.access.TruffleAccess;
import org.netbeans.modules.debugger.jpda.truffle.vars.TruffleVariable;
/**
@@ -29,61 +26,19 @@ import org.netbeans.modules.debugger.jpda.truffle.vars.TruffleVariable;
*/
public final class TruffleScope {
- private final JPDADebugger debugger;
private final String name;
- private final boolean function;
- private final ObjectVariable debugScope;
- private TruffleVariable[] arguments;
private TruffleVariable[] variables;
- public TruffleScope(String name, boolean function, TruffleVariable[] arguments, TruffleVariable[] variables) {
+ public TruffleScope(String name, TruffleVariable[] variables) {
this.name = name;
- this.function = function;
- this.arguments = arguments;
this.variables = variables;
- this.debugger = null;
- this.debugScope = null;
- }
-
- public TruffleScope(String name, boolean function, boolean hasArgs, boolean hasVars, JPDADebugger debugger, ObjectVariable debugScope) {
- this.name = name;
- this.function = function;
- if (!hasArgs) {
- arguments = new TruffleVariable[] {};
- }
- if (!hasVars) {
- variables = new TruffleVariable[] {};
- }
- this.debugger = debugger;
- this.debugScope = debugScope;
}
public String getName() {
return name;
}
- public boolean isFunction() {
- return function;
- }
-
- public synchronized TruffleVariable[] getArguments() {
- if (arguments == null) {
- loadArgsAndVars();
- }
- return arguments;
- }
-
public synchronized TruffleVariable[] getVariables() {
- if (variables == null) {
- loadArgsAndVars();
- }
return variables;
}
-
- private void loadArgsAndVars() {
- assert Thread.holdsLock(this);
- TruffleVariable[][] argsAndVars = TruffleAccess.getScopeArgsAndVars(debugger, debugScope);
- arguments = argsAndVars[0];
- variables = argsAndVars[1];
- }
}
diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleStackVariable.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleStackVariable.java
index 910720b..1a31317 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleStackVariable.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/impl/TruffleStackVariable.java
@@ -43,13 +43,14 @@ public class TruffleStackVariable implements TruffleVariable {
private SourcePosition valueSource;
private SourcePosition typeSource;
private ObjectVariable guestObj;
+ private final boolean isReceiver;
private boolean leaf;
public TruffleStackVariable(JPDADebugger debugger, String name, LanguageName language,
String type, boolean readable, boolean writable, boolean internal,
String valueStr, boolean hasValueSource, Supplier<SourcePosition> valueSource,
boolean hasTypeSource, Supplier<SourcePosition> typeSource,
- ObjectVariable truffleObj) {
+ boolean isReceiver, ObjectVariable truffleObj) {
this.debugger = debugger;
this.name = name;
this.language = language;
@@ -63,6 +64,7 @@ public class TruffleStackVariable implements TruffleVariable {
this.valueSourceSupp = valueSource;
this.typeSourceSupp = typeSource;
this.guestObj = truffleObj;
+ this.isReceiver = isReceiver;
this.leaf = TruffleVariableImpl.isLeaf(truffleObj);
}
@@ -162,4 +164,9 @@ public class TruffleStackVariable implements TruffleVariable {
public Object[] getChildren() {
return TruffleVariableImpl.getChildren(guestObj);
}
+
+ @Override
+ public boolean isReceiver() {
+ return isReceiver;
+ }
}
diff --git a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/models/TruffleVariablesNodeModel.java b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/models/TruffleVariablesNodeModel.java
index 1731ba1..fc0889e 100644
--- a/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/models/TruffleVariablesNodeModel.java
+++ b/java/debugger.jpda.truffle/src/org/netbeans/modules/debugger/jpda/truffle/vars/models/TruffleVariablesNodeModel.java
@@ -50,6 +50,8 @@ import org.openide.util.datatransfer.PasteType;
})
public class TruffleVariablesNodeModel implements ExtendedNodeModelFilter {
+ private static final String SCOPE_ICON = "org/netbeans/modules/debugger/resources/threadsView/call_stack_16.png";
+
@Override
public boolean canRename(ExtendedNodeModel original, Object node) throws UnknownTypeException {
return original.canRename(node);
@@ -88,12 +90,14 @@ public class TruffleVariablesNodeModel implements ExtendedNodeModelFilter {
@Override
public String getIconBaseWithExtension(ExtendedNodeModel original, Object node) throws UnknownTypeException {
if (node instanceof TruffleVariable) {
- String name = ((TruffleVariable) node).getName();
- if ("this".equals(name)) {
+ TruffleVariable var = (TruffleVariable) node;
+ if (var.isReceiver()) {
return original.getIconBaseWithExtension(EmptyThis.INSTANCE);
} else {
return original.getIconBaseWithExtension(EmptyVar.INSTANCE);
}
+ } else if (node instanceof TruffleScope) {
+ return SCOPE_ICON;
}
return original.getIconBaseWithExtension(node);
}
diff --git a/java/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java b/java/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java
index 6791cc1..d812372 100644
--- a/java/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java
+++ b/java/debugger.jpda.truffle/truffle-backend/org/netbeans/modules/debugger/jpda/backend/truffle/JPDATruffleAccessor.java
@@ -342,73 +342,46 @@ public class JPDATruffleAccessor extends Object {
}
// An array of scopes and their variables:
- // <scope name>, <is functional>, <num args>, <num vars>, [(num args)+(num vars) variables]
- // Variable: 11 elements: <name>, <type>, <readable>, <writable>, <internal>, <String value>,
- // <var source>, <VS code>, <type source>, <TS code>, <DebugValue>
- // Parent scopes: <scope name>, <is functional>, <has args>, <has vars>, <DebugScope>
+ // <scope name>, <has receiver>, <num vars (including receiver, if any)>, [receiver + variables]
+ // See addValueElement() for the variable format
static Object[] getVariables(DebugStackFrame sf) {
List<Object> elements = new ArrayList<>();
try {
- DebugScope scope = sf.getScope();
- while (scope != null) {
- Iterable<DebugValue> argsIt = scope.getArguments();
- Iterator<DebugValue> args;
- if (argsIt != null) {
- args = argsIt.iterator();
- } else {
- args = null;
+ DebugScope receiverScope = null;
+ for (DebugScope scope = sf.getScope(); scope != null; scope = scope.getParent()) {
+ DebugValue receiver = scope.getReceiver();
+ boolean hasReceiver = receiver != null;
+ List<DebugValue> variables = new ArrayList<>();
+ if (hasReceiver) {
+ variables.add(receiver);
+ if (receiverScope == null) {
+ receiverScope = scope;
+ }
}
Iterable<DebugValue> varsIt = scope.getDeclaredValues();
Iterator<DebugValue> vars = varsIt.iterator();
- DebugValue receiver = scope.isFunctionScope() ? scope.getReceiver() : null;
- if ((args == null || !args.hasNext()) && !vars.hasNext() && receiver == null) {
- // An empty scope, skip it
- scope = scope.getParent();
+ if (!vars.hasNext()) {
continue;
}
- elements.add(scope.getName());
- elements.add(scope.isFunctionScope());
- List<DebugValue> arguments = null;
- if (args != null && args.hasNext()) {
- arguments = new ArrayList<>();
- while (args.hasNext()) {
- arguments.add(args.next());
- }
- elements.add(arguments.size());
- } else {
- elements.add(0);
- }
- List<DebugValue> variables = new ArrayList<>();
while (vars.hasNext()) {
variables.add(vars.next());
}
- if (receiver != null) {
- variables.add(receiver);
+ if (variables.isEmpty()) {
+ continue;
}
+ elements.add(scope.getName());
+ elements.add(hasReceiver);
elements.add(variables.size());
- if (arguments != null) {
- for (DebugValue v : arguments) {
- addValueElement(v, elements);
- }
- }
for (DebugValue v : variables) {
addValueElement(v, elements);
}
- // We've filled the first scope in.
- break;
}
-
- if (scope != null) {
- while ((scope = scope.getParent()) != null) {
- elements.add(scope.getName());
- elements.add(scope.isFunctionScope());
- Iterable<DebugValue> args = scope.getArguments();
- boolean hasArgs = (args != null && args.iterator().hasNext());
- elements.add(hasArgs);
- boolean hasVars = scope.getDeclaredValues().iterator().hasNext();
- elements.add(hasVars);
- elements.add(scope);
- }
+ if (elements.isEmpty() && receiverScope != null) {
+ // No variables, provide the receiver, at least:
+ elements.add(receiverScope.getName());
+ elements.add(true);
+ elements.add(1);
+ addValueElement(receiverScope.getReceiver(), elements);
}
} catch (ThreadDeath td) {
throw td;
@@ -421,62 +394,6 @@ public class JPDATruffleAccessor extends Object {
return variables;
}
- // An array of scope's arguments and variables:
- // <num args>, <num vars>, [(num args)+(num vars) variables]
- // Variable: 11 elements: <name>, <type>, <readable>, <writable>, <internal>, <String value>,
- // <var source>, <VS code>, <type source>, <TS code>, <DebugValue>
- static Object[] getScopeVariables(DebugScope scope) {
- List<Object> elements = new ArrayList<>();
- try {
- Iterable<DebugValue> argsIt = scope.getArguments();
- Iterator<DebugValue> args;
- if (argsIt != null) {
- args = argsIt.iterator();
- } else {
- args = null;
- }
- Iterable<DebugValue> varsIt = scope.getDeclaredValues();
- Iterator<DebugValue> vars = varsIt.iterator();
- List<DebugValue> arguments = null;
- if (args != null && args.hasNext()) {
- arguments = new ArrayList<>();
- while (args.hasNext()) {
- arguments.add(args.next());
- }
- elements.add(arguments.size());
- } else {
- elements.add(0);
- }
- List<DebugValue> variables = new ArrayList<>();
- while (vars.hasNext()) {
- variables.add(vars.next());
- }
- if (scope.isFunctionScope()) {
- DebugValue receiver = scope.getReceiver();
- if (receiver != null) {
- variables.add(receiver);
- }
- }
- elements.add(variables.size());
- if (arguments != null) {
- for (DebugValue v : arguments) {
- addValueElement(v, elements);
- }
- }
- for (DebugValue v : variables) {
- addValueElement(v, elements);
- }
- } catch (ThreadDeath td) {
- throw td;
- } catch (Throwable t) {
- LangErrors.exception("An error when accessing scope "+scope, t);
- }
- Object[] variables = elements.toArray();
- Set<Object> varCache = threadVariablesCache.get();
- varCache.add(variables);
- return variables;
- }
-
// Store 12 elements: <name>, <language>, <type>, <readable>, <writable>, <internal>, <String value>,
// <var source>, <VS code>, <type source>, <TS code>, <DebugValue>
static void addValueElement(DebugValue value, List<Object> elements) {
---------------------------------------------------------------------
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