Skip to content

Commit c44d9d9

Browse files
committed
Merge branch 'feature/function-args-in-local-scope' of https://github.com/Kolpa/graalpython into topic/GR-20424
2 parents 601e9e2 + fbce4ff commit c44d9d9

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-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: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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 = node.getRootNode();
24+
assert rootNode instanceof PRootNode;
25+
}
26+
27+
public ArgumentListObject collectArgs() {
28+
List<String> arguments = new LinkedList<>();
29+
30+
NodeUtil.findAllNodeInstances(rootNode, ReadArgumentNode.class).forEach(readArgumentNode -> {
31+
WriteIdentifierNode identifierNode = NodeUtil.findParent(readArgumentNode, WriteIdentifierNode.class);
32+
if (identifierNode != null) {
33+
arguments.add(identifierNode.getIdentifier().toString());
34+
}
35+
});
36+
37+
return new ArgumentListObject(arguments.toArray(new String[0]));
38+
}
39+
40+
@ExportLibrary(InteropLibrary.class)
41+
static final class ArgumentListObject implements TruffleObject {
42+
final String[] args;
43+
44+
private ArgumentListObject(String[] args) {
45+
this.args = args;
46+
}
47+
48+
@SuppressWarnings("unused")
49+
@ExportMessage
50+
boolean hasMembers() {
51+
return true;
52+
}
53+
54+
@SuppressWarnings("unused")
55+
@ExportMessage
56+
@TruffleBoundary
57+
Object getMembers(boolean includeInternal) {
58+
return new InteropArray(args);
59+
}
60+
}
61+
62+
}

0 commit comments

Comments
 (0)