Skip to content

Commit 95cf5aa

Browse files
committed
SysModuleBuiltins: materialize the frame and run all other methods under a truffle boundary
1 parent 5f4e633 commit 95cf5aa

File tree

3 files changed

+30
-29
lines changed

3 files changed

+30
-29
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,15 @@
4545
import static com.oracle.graal.python.builtins.modules.io.IONodes.FLUSH;
4646
import static com.oracle.graal.python.builtins.modules.io.IONodes.WRITE;
4747
import static com.oracle.graal.python.nodes.BuiltinNames.BUILTINS;
48-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.STDERR;
49-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.STDIN;
50-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.STDOUT;
51-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__EXCEPTHOOK__;
48+
import static com.oracle.graal.python.nodes.BuiltinNames.EXCEPTHOOK;
49+
import static com.oracle.graal.python.nodes.BuiltinNames.STDERR;
50+
import static com.oracle.graal.python.nodes.BuiltinNames.STDIN;
51+
import static com.oracle.graal.python.nodes.BuiltinNames.STDOUT;
52+
import static com.oracle.graal.python.nodes.BuiltinNames.__EXCEPTHOOK__;
53+
import static com.oracle.graal.python.nodes.BuiltinNames.__STDERR__;
54+
import static com.oracle.graal.python.nodes.BuiltinNames.__STDIN__;
55+
import static com.oracle.graal.python.nodes.BuiltinNames.__STDOUT__;
5256
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MODULE__;
53-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__STDERR__;
54-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__STDIN__;
55-
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__STDOUT__;
5657
import static com.oracle.graal.python.nodes.SpecialMethodNames.__SIZEOF__;
5758

5859
import java.io.BufferedReader;
@@ -153,6 +154,7 @@
153154
import com.oracle.truffle.api.dsl.GenerateUncached;
154155
import com.oracle.truffle.api.dsl.NodeFactory;
155156
import com.oracle.truffle.api.dsl.Specialization;
157+
import com.oracle.truffle.api.frame.MaterializedFrame;
156158
import com.oracle.truffle.api.frame.VirtualFrame;
157159
import com.oracle.truffle.api.nodes.Node;
158160
import com.oracle.truffle.api.profiles.ConditionProfile;
@@ -530,7 +532,7 @@ public void postInitialize0(Python3Core core) {
530532
false, // dev_mode
531533
0 // utf8_mode
532534
));
533-
sys.setAttribute(__EXCEPTHOOK__, sys.getAttribute("excepthook"));
535+
sys.setAttribute(__EXCEPTHOOK__, sys.getAttribute(EXCEPTHOOK));
534536
}
535537

536538
@Override
@@ -817,7 +819,7 @@ static Object gettrace() {
817819
}
818820
}
819821

820-
@Builtin(name = "excepthook", minNumOfPositionalArgs = 4, maxNumOfPositionalArgs = 4, declaresExplicitSelf = true, doc = "excepthook($module, exctype, value, traceback, /)\n" +
822+
@Builtin(name = EXCEPTHOOK, minNumOfPositionalArgs = 4, maxNumOfPositionalArgs = 4, declaresExplicitSelf = true, doc = "excepthook($module, exctype, value, traceback, /)\n" +
821823
"--\n" +
822824
"\n" +
823825
"Handle an exception by displaying it with a traceback on sys.stderr.")
@@ -1298,7 +1300,8 @@ void printException(VirtualFrame frame, PythonModule sys, Object out, Object exc
12981300
print(frame, out, NL);
12991301
}
13001302

1301-
void printExceptionRecursive(VirtualFrame frame, PythonModule sys, Object out, Object value, Set<Object> seen) {
1303+
@TruffleBoundary
1304+
void printExceptionRecursive(MaterializedFrame frame, PythonModule sys, Object out, Object value, Set<Object> seen) {
13021305
if (seen != null) {
13031306
// Exception chaining
13041307
add(seen, value);
@@ -1338,15 +1341,6 @@ static Set<Object> createSet() {
13381341
return new HashSet<>();
13391342
}
13401343

1341-
@Specialization
1342-
Object doWithoutTb(VirtualFrame frame, PythonModule sys, @SuppressWarnings("unused") Object excType, Object value, @SuppressWarnings("unused") PNone traceBack) {
1343-
Object stdErr = lookupAttr(frame, sys, STDERR);
1344-
printExceptionRecursive(frame, sys, stdErr, value, createSet());
1345-
flush(frame, stdErr);
1346-
1347-
return PNone.NONE;
1348-
}
1349-
13501344
@Specialization
13511345
Object doWithTb(VirtualFrame frame, PythonModule sys, @SuppressWarnings("unused") Object excType, Object value, PTraceback traceBack) {
13521346
if (PGuards.isPBaseException(value)) {
@@ -1358,7 +1352,16 @@ Object doWithTb(VirtualFrame frame, PythonModule sys, @SuppressWarnings("unused"
13581352
}
13591353

13601354
Object stdErr = lookupAttr(frame, sys, STDERR);
1361-
printExceptionRecursive(frame, sys, stdErr, value, createSet());
1355+
printExceptionRecursive(frame.materialize(), sys, stdErr, value, createSet());
1356+
flush(frame, stdErr);
1357+
1358+
return PNone.NONE;
1359+
}
1360+
1361+
@Specialization(guards = "!isPTraceback(traceBack)")
1362+
Object doWithoutTb(VirtualFrame frame, PythonModule sys, @SuppressWarnings("unused") Object excType, Object value, @SuppressWarnings("unused") Object traceBack) {
1363+
Object stdErr = lookupAttr(frame, sys, STDERR);
1364+
printExceptionRecursive(frame.materialize(), sys, stdErr, value, createSet());
13621365
flush(frame, stdErr);
13631366

13641367
return PNone.NONE;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ public abstract class BuiltinNames {
6363
public static final String LAST_TYPE = "last_type";
6464
public static final String LAST_VALUE = "last_value";
6565
public static final String LAST_TRACEBACK = "last_traceback";
66+
public static final String __EXCEPTHOOK__ = "__excepthook__";
67+
public static final String __STDERR__ = "__stderr__";
68+
public static final String STDERR = "stderr";
69+
public static final String __STDIN__ = "__stdin__";
70+
public static final String STDIN = "stdin";
71+
public static final String __STDOUT__ = "__stdout__";
72+
public static final String STDOUT = "stdout";
6673

6774
// builtin functions
6875
public static final String ABS = "abs";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialAttributeNames.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,4 @@ public abstract class SpecialAttributeNames {
8484
public static final String __FLAGS__ = "__flags__";
8585
public static final String __ABSTRACTMETHODS__ = "__abstractmethods__";
8686
public static final String __ORIG_BASES__ = "__orig_bases__";
87-
// these are special attrs used in the sys module
88-
public static final String __EXCEPTHOOK__ = "__excepthook__";
89-
public static final String EXCEPTHOOK = "excepthook";
90-
public static final String __STDERR__ = "__stderr__";
91-
public static final String STDERR = "stderr";
92-
public static final String __STDIN__ = "__stdin__";
93-
public static final String STDIN = "stdin";
94-
public static final String __STDOUT__ = "__stdout__";
95-
public static final String STDOUT = "stdout";
9687
}

0 commit comments

Comments
 (0)