Skip to content

Commit 4401ad3

Browse files
committed
intrinsified PyErr
1 parent 866e6ae commit 4401ad3

File tree

10 files changed

+707
-341
lines changed

10 files changed

+707
-341
lines changed

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_err.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
1+
# Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
22
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33
#
44
# The Universal Permissive License (UPL), Version 1.0
@@ -46,6 +46,16 @@
4646
def _reference_setstring(args):
4747
raise args[0](args[1])
4848

49+
def _new_ex_result_check(x, y):
50+
name = y[0]
51+
base = y[1]
52+
return name in str(x) and issubclass(x, base)
53+
54+
def _new_ex_with_doc_result_check(x, y):
55+
name = y[0]
56+
doc = y[1]
57+
base = y[2]
58+
return name in str(x) and issubclass(x, base) and x.__doc__ == doc
4959

5060
def _reference_setnone(args):
5161
raise args[0]()
@@ -154,7 +164,29 @@ def compile_module(self, name):
154164
resultval="NULL",
155165
cmpfunc=unhandled_error_compare
156166
)
157-
167+
168+
test_PyErr_NewException = CPyExtFunction(
169+
lambda args: args,
170+
lambda: (
171+
("main.TestException", TypeError, {}),
172+
),
173+
resultspec="O",
174+
argspec='sOO',
175+
arguments=["char* name", "PyObject* base", "PyObject* dict"],
176+
cmpfunc=_new_ex_result_check
177+
)
178+
179+
test_PyErr_NewExceptionWithDoc = CPyExtFunction(
180+
lambda args: args,
181+
lambda: (
182+
("main.TestException", "new exception doc", TypeError, {}),
183+
),
184+
resultspec="O",
185+
argspec='ssOO',
186+
arguments=["char* name", "char* doc", "PyObject* base", "PyObject* dict"],
187+
cmpfunc=_new_ex_with_doc_result_check
188+
)
189+
158190
test_PyErr_SetObject = CPyExtFunctionVoid(
159191
_reference_setstring,
160192
lambda: (

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exceptions.txt

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,3 @@
33
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testChainingDescriptors
44
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testExceptionCleanupNames
55
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testExceptionCleanupState
6-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testInfiniteRecursion
7-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testInvalidAttrs
8-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testInvalidTraceback
9-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testKeywordArgs
10-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testNoneClearsTracebackAttr
11-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testRaising
12-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testSettingException
13-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testSyntaxErrorMessage
14-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testSyntaxErrorMissingParens
15-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testWithTraceback
16-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_3114
17-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_MemoryError
18-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_WindowsError
19-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_badisinstance
20-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_errno_ENOTDIR
21-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_exception_target_in_nested_scope
22-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_exception_with_doc
23-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_close_cleanup_exc_state
24-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_del_cleanup_exc_state
25-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_doesnt_retain_old_exc
26-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_doesnt_retain_old_exc2
27-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_finalizing_and_exc_info
28-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking
29-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking2
30-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking3
31-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking4
32-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_next_cleanup_exc_state
33-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_send_cleanup_exc_state
34-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_throw_cleanup_exc_state
35-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_memory_error_cleanup
36-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_memory_error_in_PyErr_PrintEx
37-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_raise_in_generator
38-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_error_cleanup
39-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_normalizing_exception
40-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_normalizing_infinite_exception
41-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_normalizing_with_no_memory
42-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_str
43-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unhandled
44-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unicode_change_attributes
45-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unicode_errors_no_object
46-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unraisable
47-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_windows_message
48-
*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_yield_in_nested_try_excepts
49-
*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_attributes
50-
*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_copy_pickle
51-
*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_non_str_argument
52-
*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_reset_attributes

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
import com.oracle.graal.python.builtins.modules.cext.PythonCextImportBuiltins;
122122
import com.oracle.graal.python.builtins.modules.cext.PythonCextMemoryViewBuiltins;
123123
import com.oracle.graal.python.builtins.modules.cext.PythonCextAbstractBuiltins;
124+
import com.oracle.graal.python.builtins.modules.cext.PythonCextErrBuiltins;
124125
import com.oracle.graal.python.builtins.modules.cext.PythonCextIterBuiltins;
125126
import com.oracle.graal.python.builtins.modules.cext.PythonCextModuleBuiltins;
126127
import com.oracle.graal.python.builtins.modules.cext.PythonCextNamespaceBuiltins;
@@ -492,6 +493,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
492493
new PythonCextCodeBuiltins(),
493494
new PythonCextComplexBuiltins(),
494495
new PythonCextDictBuiltins(),
496+
new PythonCextErrBuiltins(),
495497
new PythonCextFileBuiltins(),
496498
new PythonCextFloatBuiltins(),
497499
new PythonCextImportBuiltins(),

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2021, Oracle and/or its affiliates.
2+
* Copyright (c) 2018, 2022, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -1800,7 +1800,7 @@ String getStrError(int code,
18001800
@Builtin(name = "_exit", minNumOfPositionalArgs = 1)
18011801
@GenerateNodeFactory
18021802
@TypeSystemReference(PythonArithmeticTypes.class)
1803-
public abstract static class ExitNode extends PythonBuiltinNode {
1803+
public abstract static class ExitNode extends PythonUnaryBuiltinNode {
18041804
@TruffleBoundary
18051805
@Specialization
18061806
Object exit(int status) {

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
import com.oracle.graal.python.builtins.PythonBuiltins;
122122
import com.oracle.graal.python.builtins.PythonOS;
123123
import com.oracle.graal.python.builtins.modules.SysModuleBuiltinsClinicProviders.GetFrameNodeClinicProviderGen;
124+
import com.oracle.graal.python.builtins.modules.SysModuleBuiltinsFactory.ExcInfoNodeFactory;
124125
import com.oracle.graal.python.builtins.modules.io.BufferedReaderBuiltins;
125126
import com.oracle.graal.python.builtins.modules.io.BufferedWriterBuiltins;
126127
import com.oracle.graal.python.builtins.modules.io.FileIOBuiltins;
@@ -647,10 +648,22 @@ public PDict getModules() {
647648
return (PDict) getBuiltinConstants().get(MODULES);
648649
}
649650

651+
@TruffleBoundary
652+
public Object getStdErr() {
653+
return getBuiltinConstants().get(STDERR);
654+
}
655+
656+
@TruffleBoundary
657+
public Object getStdOut() {
658+
return getBuiltinConstants().get(STDOUT);
659+
}
660+
650661
@Builtin(name = "exc_info", needsFrame = true)
651662
@GenerateNodeFactory
652663
public abstract static class ExcInfoNode extends PythonBuiltinNode {
653664

665+
public abstract PTuple execute(VirtualFrame frame);
666+
654667
public static Object fast(VirtualFrame frame, GetClassNode getClassNode, GetCaughtExceptionNode getCaughtExceptionNode, PythonObjectFactory factory) {
655668
final PException currentException = getCaughtExceptionNode.execute(frame);
656669
if (currentException == null) {
@@ -660,7 +673,7 @@ public static Object fast(VirtualFrame frame, GetClassNode getClassNode, GetCaug
660673
}
661674

662675
@Specialization
663-
public Object run(VirtualFrame frame,
676+
public PTuple run(VirtualFrame frame,
664677
@Cached GetClassNode getClassNode,
665678
@Cached GetCaughtExceptionNode getCaughtExceptionNode,
666679
@Cached GetTracebackNode getTracebackNode) {
@@ -679,6 +692,10 @@ public Object run(VirtualFrame frame,
679692
}
680693
}
681694

695+
public static ExcInfoNode create() {
696+
return ExcInfoNodeFactory.create(null);
697+
}
698+
682699
}
683700

684701
// ATTENTION: this is intentionally a PythonBuiltinNode and not PythonUnaryBuiltinNode,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
import com.oracle.graal.python.builtins.modules.BuiltinFunctions.NextNode;
7474
import com.oracle.graal.python.builtins.modules.BuiltinFunctions.OctNode;
7575
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.NativeBuiltin;
76-
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PyErrRestoreNode;
76+
import com.oracle.graal.python.builtins.modules.cext.PythonCextErrBuiltins.PyErrRestoreNode;
7777
import com.oracle.graal.python.builtins.objects.PNone;
7878
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AddRefCntNode;
7979
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 1 addition & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@
189189
import com.oracle.graal.python.builtins.objects.object.PythonObject;
190190
import com.oracle.graal.python.builtins.objects.str.PString;
191191
import com.oracle.graal.python.builtins.objects.traceback.GetTracebackNode;
192-
import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback;
193192
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
194193
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
195194
import com.oracle.graal.python.builtins.objects.tuple.StructSequence;
@@ -249,7 +248,6 @@
249248
import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
250249
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
251250
import com.oracle.graal.python.runtime.PythonOptions;
252-
import com.oracle.graal.python.runtime.exception.ExceptionUtils;
253251
import com.oracle.graal.python.runtime.exception.PException;
254252
import com.oracle.graal.python.runtime.exception.PythonErrorType;
255253
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -637,129 +635,9 @@ static boolean isDecoratedManagedFunction(Object obj) {
637635
}
638636
}
639637

640-
@Builtin(name = "PyErr_Restore", minNumOfPositionalArgs = 3)
641-
@GenerateNodeFactory
642-
abstract static class PyErrRestoreNode extends PythonTernaryBuiltinNode {
643-
@Specialization
644-
@SuppressWarnings("unused")
645-
Object run(PNone typ, PNone val, PNone tb) {
646-
getContext().setCurrentException(getLanguage(), null);
647-
return PNone.NONE;
648-
}
649-
650-
@Specialization
651-
Object run(@SuppressWarnings("unused") Object typ, PBaseException val, @SuppressWarnings("unused") PNone tb) {
652-
PythonContext context = getContext();
653-
PythonLanguage language = getLanguage();
654-
context.setCurrentException(language, PException.fromExceptionInfo(val, (LazyTraceback) null, PythonOptions.isPExceptionWithJavaStacktrace(language)));
655-
return PNone.NONE;
656-
}
657-
658-
@Specialization
659-
Object run(@SuppressWarnings("unused") Object typ, PBaseException val, PTraceback tb) {
660-
PythonContext context = getContext();
661-
PythonLanguage language = getLanguage();
662-
context.setCurrentException(language, PException.fromExceptionInfo(val, tb, PythonOptions.isPExceptionWithJavaStacktrace(language)));
663-
return PNone.NONE;
664-
}
665-
}
666-
667-
@Builtin(name = "PyErr_Fetch")
668-
@GenerateNodeFactory
669-
abstract static class PyErrFetchNode extends NativeBuiltin {
670-
@Specialization
671-
public Object run(@Cached GetThreadStateNode getThreadStateNode,
672-
@Cached GetClassNode getClassNode,
673-
@Cached GetTracebackNode getTracebackNode) {
674-
PException currentException = getThreadStateNode.getCurrentException();
675-
Object result;
676-
if (currentException == null) {
677-
result = getContext().getNativeNull();
678-
} else {
679-
PBaseException exception = currentException.getEscapedException();
680-
Object traceback = null;
681-
if (currentException.getTraceback() != null) {
682-
traceback = getTracebackNode.execute(currentException.getTraceback());
683-
}
684-
if (traceback == null) {
685-
traceback = getContext().getNativeNull();
686-
}
687-
result = factory().createTuple(new Object[]{getClassNode.execute(exception), exception, traceback});
688-
getThreadStateNode.setCurrentException(null);
689-
}
690-
return result;
691-
}
692-
}
693-
694-
@Builtin(name = "PyErr_Occurred", maxNumOfPositionalArgs = 1)
695-
@GenerateNodeFactory
696-
abstract static class PyErrOccurred extends PythonUnaryBuiltinNode {
697-
@Specialization
698-
static Object run(Object errorMarker,
699-
@Cached GetThreadStateNode getThreadStateNode,
700-
@Cached GetClassNode getClassNode) {
701-
PException currentException = getThreadStateNode.getCurrentException();
702-
if (currentException != null) {
703-
// getClassNode acts as a branch profile
704-
return getClassNode.execute(currentException.getUnreifiedException());
705-
}
706-
return errorMarker;
707-
}
708-
}
709-
710-
@Builtin(name = "PyErr_SetExcInfo", minNumOfPositionalArgs = 3)
711-
@GenerateNodeFactory
712-
abstract static class PyErrSetExcInfo extends PythonBuiltinNode {
713-
@Specialization
714-
@SuppressWarnings("unused")
715-
Object doClear(PNone typ, PNone val, PNone tb) {
716-
getContext().setCaughtException(getLanguage(), PException.NO_EXCEPTION);
717-
return PNone.NONE;
718-
}
719-
720-
@Specialization
721-
Object doFull(@SuppressWarnings("unused") Object typ, PBaseException val, PTraceback tb) {
722-
PythonContext context = getContext();
723-
PythonLanguage language = getLanguage();
724-
context.setCaughtException(language, PException.fromExceptionInfo(val, tb, PythonOptions.isPExceptionWithJavaStacktrace(language)));
725-
return PNone.NONE;
726-
}
727-
728-
@Specialization
729-
Object doWithoutTraceback(@SuppressWarnings("unused") Object typ, PBaseException val, @SuppressWarnings("unused") PNone tb) {
730-
return doFull(typ, val, null);
731-
}
732-
733-
@Fallback
734-
@SuppressWarnings("unused")
735-
static Object doFallback(Object typ, Object val, Object tb) {
736-
// TODO we should still store the values to return them with 'PyErr_GetExcInfo' (or
737-
// 'sys.exc_info')
738-
return PNone.NONE;
739-
}
740-
}
741-
742-
/**
743-
* Exceptions are usually printed using the traceback module or the hook function
744-
* {@code sys.excepthook}. This is the last resort if the hook function itself failed.
745-
*/
746-
@Builtin(name = "PyErr_Display", minNumOfPositionalArgs = 3)
747-
@GenerateNodeFactory
748-
abstract static class PyErrDisplay extends PythonBuiltinNode {
749-
750-
@Specialization
751-
@SuppressWarnings("unused")
752-
static Object run(Object typ, PBaseException val, Object tb) {
753-
if (val.getException() != null) {
754-
ExceptionUtils.printPythonLikeStackTrace(val.getException());
755-
}
756-
return PNone.NO_VALUE;
757-
}
758-
}
759-
760638
@Builtin(name = "PyTruffle_WriteUnraisable", minNumOfPositionalArgs = 2)
761639
@GenerateNodeFactory
762-
abstract static class PyTruffleWriteUnraisable extends PythonBuiltinNode {
640+
abstract static class PyTruffleWriteUnraisable extends PythonBinaryBuiltinNode {
763641

764642
@Specialization
765643
static Object run(PBaseException exception, Object object,

0 commit comments

Comments
 (0)