Skip to content

Commit 0f24ef8

Browse files
committed
Wrap OOM into Python MemoryError in PBytecodeRootNode and in TopLevelExceptionHandler
1 parent 59808cb commit 0f24ef8

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
*/
4141
package com.oracle.graal.python.nodes.bytecode;
4242

43-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RecursionError;
4443
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
4544
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
4645
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ZeroDivisionError;
@@ -4645,12 +4644,7 @@ protected PException wrapJavaExceptionIfApplicable(Throwable e) {
46454644
if (PythonLanguage.get(this).getEngineOption(PythonOptions.CatchAllExceptions) && (e instanceof Exception || e instanceof AssertionError)) {
46464645
return ExceptionUtils.wrapJavaException(e, this, factory.createBaseException(SystemError, ErrorMessages.M, new Object[]{e}));
46474646
}
4648-
if (e instanceof StackOverflowError) {
4649-
CompilerDirectives.transferToInterpreterAndInvalidate();
4650-
PythonContext.get(this).reacquireGilAfterStackOverflow();
4651-
return ExceptionUtils.wrapJavaException(e, this, factory.createBaseException(RecursionError, ErrorMessages.MAXIMUM_RECURSION_DEPTH_EXCEEDED, new Object[]{}));
4652-
}
4653-
return null;
4647+
return ExceptionUtils.wrapJavaExceptionIfApplicable(this, e, factory);
46544648
}
46554649

46564650
@ExplodeLoop

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/TopLevelExceptionHandler.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
*/
4141
package com.oracle.graal.python.nodes.exception;
4242

43-
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RecursionError;
4443
import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE;
4544
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
4645
import static com.oracle.graal.python.runtime.exception.ExceptionUtils.printToStdErr;
@@ -58,7 +57,6 @@
5857
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
5958
import com.oracle.graal.python.lib.PyObjectStrAsObjectNode;
6059
import com.oracle.graal.python.nodes.BuiltinNames;
61-
import com.oracle.graal.python.nodes.ErrorMessages;
6260
import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode;
6361
import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassProfile;
6462
import com.oracle.graal.python.nodes.object.GetClassNode;
@@ -73,6 +71,7 @@
7371
import com.oracle.graal.python.runtime.exception.ExceptionUtils;
7472
import com.oracle.graal.python.runtime.exception.PException;
7573
import com.oracle.graal.python.runtime.exception.PythonExitException;
74+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
7675
import com.oracle.graal.python.util.PythonUtils;
7776
import com.oracle.truffle.api.CompilerDirectives;
7877
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -151,13 +150,6 @@ public Object execute(VirtualFrame frame) {
151150
return handleChildContextExit(managedException);
152151
}
153152
throw handlePythonException(e);
154-
} catch (StackOverflowError e) {
155-
CompilerDirectives.transferToInterpreter();
156-
PythonContext context = getContext();
157-
context.reacquireGilAfterStackOverflow();
158-
PBaseException newException = context.factory().createBaseException(RecursionError, ErrorMessages.MAXIMUM_RECURSION_DEPTH_EXCEEDED, new Object[]{});
159-
PException pe = ExceptionUtils.wrapJavaException(e, this, newException);
160-
throw handlePythonException(pe);
161153
} catch (ThreadDeath e) {
162154
// do not handle, result of TruffleContext.closeCancelled()
163155
throw e;
@@ -218,6 +210,10 @@ private static boolean isSystemExit(PBaseException pythonException) {
218210

219211
@TruffleBoundary
220212
private void handleJavaException(Throwable e) {
213+
PException pe = ExceptionUtils.wrapJavaExceptionIfApplicable(this, e, PythonObjectFactory.getUncached());
214+
if (pe != null) {
215+
throw handlePythonException(pe);
216+
}
221217
try {
222218
boolean exitException = InteropLibrary.getUncached().isException(e) && InteropLibrary.getUncached().getExceptionType(e) == ExceptionType.EXIT;
223219
if (!exitException) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/ExceptionUtils.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
*/
4141
package com.oracle.graal.python.runtime.exception;
4242

43+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.MemoryError;
44+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RecursionError;
4345
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
4446

4547
import java.io.IOException;
@@ -54,15 +56,18 @@
5456
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5557
import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback;
5658
import com.oracle.graal.python.nodes.BuiltinNames;
59+
import com.oracle.graal.python.nodes.ErrorMessages;
5760
import com.oracle.graal.python.nodes.bytecode.FrameInfo;
5861
import com.oracle.graal.python.nodes.call.CallNode;
5962
import com.oracle.graal.python.nodes.exception.TopLevelExceptionHandler;
6063
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
6164
import com.oracle.graal.python.nodes.object.GetClassNode;
6265
import com.oracle.graal.python.runtime.PythonContext;
66+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
6367
import com.oracle.truffle.api.CompilerAsserts;
6468
import com.oracle.truffle.api.CompilerDirectives;
6569
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
70+
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
6671
import com.oracle.truffle.api.RootCallTarget;
6772
import com.oracle.truffle.api.Truffle;
6873
import com.oracle.truffle.api.TruffleStackTrace;
@@ -263,4 +268,18 @@ public static void printJavaStackTrace(PException e) {
263268
public static PException wrapJavaException(Throwable e, Node node, PBaseException pythonException) {
264269
return PException.fromObject(pythonException, node, e);
265270
}
271+
272+
@InliningCutoff
273+
public static PException wrapJavaExceptionIfApplicable(Node location, Throwable e, PythonObjectFactory factory) {
274+
if (e instanceof StackOverflowError) {
275+
CompilerDirectives.transferToInterpreterAndInvalidate();
276+
PythonContext.get(null).reacquireGilAfterStackOverflow();
277+
return ExceptionUtils.wrapJavaException(e, location, factory.createBaseException(RecursionError, ErrorMessages.MAXIMUM_RECURSION_DEPTH_EXCEEDED, new Object[]{}));
278+
}
279+
if (e instanceof OutOfMemoryError) {
280+
CompilerDirectives.transferToInterpreterAndInvalidate();
281+
return ExceptionUtils.wrapJavaException(e, location, factory.createBaseException(MemoryError));
282+
}
283+
return null;
284+
}
266285
}

0 commit comments

Comments
 (0)