Skip to content

Commit 34afd52

Browse files
committed
added first impl of function arg resolution in findLocalScopes
1 parent 8a48496 commit 34afd52

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import com.oracle.graal.python.runtime.PythonParser.ParserMode;
6666
import com.oracle.graal.python.runtime.exception.PException;
6767
import com.oracle.graal.python.runtime.interop.InteropMap;
68+
import com.oracle.graal.python.util.PFunctionArgsFinder;
6869
import com.oracle.truffle.api.Assumption;
6970
import com.oracle.truffle.api.CallTarget;
7071
import com.oracle.truffle.api.CompilerAsserts;
@@ -359,8 +360,21 @@ protected boolean isVisible(PythonContext context, Object value) {
359360
protected Iterable<Scope> findLocalScopes(PythonContext context, Node node, Frame frame) {
360361
ArrayList<Scope> scopes = new ArrayList<>();
361362
for (Scope s : super.findLocalScopes(context, node, frame)) {
362-
scopes.add(s);
363+
if (frame == null) {
364+
PFunctionArgsFinder argsFinder = new PFunctionArgsFinder(node);
365+
366+
Scope.Builder scopeBuilder = Scope.newBuilder(s.getName(), s.getVariables())
367+
.node(s.getNode())
368+
.receiver(s.getReceiverName(), s.getReceiver())
369+
.rootInstance(s.getRootInstance())
370+
.arguments(argsFinder.collectArgs());
371+
372+
scopes.add(scopeBuilder.build());
373+
} else {
374+
scopes.add(s);
375+
}
363376
}
377+
364378
if (frame != null) {
365379
PythonObject globals = PArguments.getGlobalsSafe(frame);
366380
if (globals != null) {
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.oracle.graal.python.util;
2+
3+
import com.oracle.graal.python.nodes.PRootNode;
4+
import com.oracle.graal.python.nodes.argument.ReadArgumentNode;
5+
import com.oracle.graal.python.nodes.frame.WriteIdentifierNode;
6+
import com.oracle.graal.python.runtime.interop.InteropArray;
7+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
8+
import com.oracle.truffle.api.interop.InteropLibrary;
9+
import com.oracle.truffle.api.interop.TruffleObject;
10+
import com.oracle.truffle.api.library.ExportLibrary;
11+
import com.oracle.truffle.api.library.ExportMessage;
12+
import com.oracle.truffle.api.nodes.Node;
13+
import com.oracle.truffle.api.nodes.NodeUtil;
14+
import com.oracle.truffle.api.nodes.RootNode;
15+
16+
import java.util.LinkedList;
17+
import java.util.List;
18+
19+
public class PFunctionArgsFinder {
20+
private final RootNode rootNode;
21+
22+
public PFunctionArgsFinder(Node node) {
23+
this.rootNode = findRootNode(node);
24+
assert rootNode instanceof PRootNode;
25+
}
26+
27+
private static RootNode findRootNode(Node node) {
28+
Node n = node;
29+
while (!(n instanceof RootNode) && (n != null)) {
30+
n = n.getParent();
31+
}
32+
return (RootNode) n;
33+
}
34+
35+
public ArgumentListObject collectArgs() {
36+
List<String> arguments = new LinkedList<>();
37+
38+
NodeUtil.findAllNodeInstances(rootNode, ReadArgumentNode.class).forEach(readArgumentNode -> {
39+
WriteIdentifierNode identifierNode = NodeUtil.findParent(readArgumentNode, WriteIdentifierNode.class);
40+
if (identifierNode != null) {
41+
arguments.add(identifierNode.getIdentifier().toString());
42+
}
43+
});
44+
45+
return new ArgumentListObject(arguments.toArray(new String[0]));
46+
}
47+
48+
@ExportLibrary(InteropLibrary.class)
49+
static final class ArgumentListObject implements TruffleObject {
50+
final String[] args;
51+
52+
private ArgumentListObject(String[] args) {
53+
this.args = args;
54+
}
55+
56+
@SuppressWarnings("unused")
57+
@ExportMessage
58+
boolean hasMembers() {
59+
return true;
60+
}
61+
62+
@SuppressWarnings("unused")
63+
@ExportMessage
64+
@TruffleBoundary
65+
Object getMembers(boolean includeInternal) {
66+
return new InteropArray(args);
67+
}
68+
}
69+
70+
}

0 commit comments

Comments
 (0)