Skip to content

Commit 9cc9e20

Browse files
committed
SysModuleBuiltins: fix breakpointhook builin
1 parent c9418c6 commit 9cc9e20

File tree

6 files changed

+43
-45
lines changed

6 files changed

+43
-45
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.IndentationError;
2929
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TabError;
30+
import static com.oracle.graal.python.nodes.BuiltinNames.MODULES;
3031
import static com.oracle.graal.python.nodes.BuiltinNames.PRINT;
3132
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__PACKAGE__;
3233
import static com.oracle.graal.python.runtime.exception.PythonErrorType.SyntaxError;
@@ -877,7 +878,7 @@ private void populateBuiltins() {
877878

878879
// core machinery
879880
sysModule = builtinModules.get("sys");
880-
sysModules = (PDict) sysModule.getAttribute("modules");
881+
sysModules = (PDict) sysModule.getAttribute(MODULES);
881882

882883
PythonModule bootstrapExternal = createModule("importlib._bootstrap_external");
883884
bootstrapExternal.setAttribute(__PACKAGE__, "importlib");

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

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import static com.oracle.graal.python.nodes.BuiltinNames.DISPLAYHOOK;
7272
import static com.oracle.graal.python.nodes.BuiltinNames.EXCEPTHOOK;
7373
import static com.oracle.graal.python.nodes.BuiltinNames.EXIT;
74+
import static com.oracle.graal.python.nodes.BuiltinNames.MODULES;
7475
import static com.oracle.graal.python.nodes.BuiltinNames.PYTHONBREAKPOINT;
7576
import static com.oracle.graal.python.nodes.BuiltinNames.STDERR;
7677
import static com.oracle.graal.python.nodes.BuiltinNames.STDIN;
@@ -106,8 +107,7 @@
106107
import java.util.Map;
107108
import java.util.Set;
108109

109-
import com.oracle.graal.python.lib.PyTraceBackPrintNode;
110-
import com.oracle.graal.python.nodes.subscript.GetItemNode;
110+
import com.oracle.graal.python.nodes.util.CannotCastException;
111111
import org.graalvm.nativeimage.ImageInfo;
112112

113113
import com.oracle.graal.python.PythonLanguage;
@@ -148,6 +148,7 @@
148148
import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins;
149149
import com.oracle.graal.python.lib.PyFloatAsDoubleNode;
150150
import com.oracle.graal.python.lib.PyFloatCheckExactNode;
151+
import com.oracle.graal.python.lib.PyImportImport;
151152
import com.oracle.graal.python.lib.PyLongAsIntNode;
152153
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
153154
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
@@ -156,6 +157,7 @@
156157
import com.oracle.graal.python.lib.PyObjectReprAsObjectNode;
157158
import com.oracle.graal.python.lib.PyObjectSetAttr;
158159
import com.oracle.graal.python.lib.PyObjectStrAsObjectNode;
160+
import com.oracle.graal.python.lib.PyTraceBackPrintNode;
159161
import com.oracle.graal.python.lib.PyUnicodeAsEncodedString;
160162
import com.oracle.graal.python.lib.PyUnicodeFromEncodedObject;
161163
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -171,7 +173,6 @@
171173
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
172174
import com.oracle.graal.python.nodes.object.GetClassNode;
173175
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
174-
import com.oracle.graal.python.nodes.statement.ImportNode;
175176
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
176177
import com.oracle.graal.python.nodes.util.ExceptionStateNodes.GetCaughtExceptionNode;
177178
import com.oracle.graal.python.runtime.PosixSupportLibrary;
@@ -394,7 +395,7 @@ public void initialize(Python3Core core) {
394395
builtinConstants.put("byteorder", ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? "little" : "big");
395396
builtinConstants.put("copyright", LICENSE);
396397
final PythonObjectFactory factory = PythonObjectFactory.getUncached();
397-
builtinConstants.put("modules", factory.createDict());
398+
builtinConstants.put(MODULES, factory.createDict());
398399
builtinConstants.put("path", factory.createList());
399400
builtinConstants.put("builtin_module_names", factory.createTuple(core.builtinModuleNames()));
400401
builtinConstants.put("maxsize", MAXSIZE);
@@ -1356,48 +1357,34 @@ abstract static class BreakpointHookNode extends PythonBuiltinNode {
13561357
static final String VAL_PDB_SETTRACE = "pdb.set_trace";
13571358
static final String MOD_OS = "os";
13581359
static final String ATTR_ENVIRON = "environ";
1360+
static final String METH_GET = "get";
13591361

1360-
@Child private ImportNode.ImportExpression importOsNode;
1361-
@Child private ImportNode.ImportExpression importNode;
1362-
1363-
private ImportNode.ImportExpression ensureImportNode(String name) {
1364-
if (importNode == null) {
1365-
CompilerDirectives.transferToInterpreterAndInvalidate();
1366-
importNode = insert(ImportNode.createAsExpression(name));
1367-
}
1368-
return importNode;
1369-
}
1370-
1371-
private Object importOs(VirtualFrame frame) {
1372-
if (importOsNode == null) {
1373-
CompilerDirectives.transferToInterpreterAndInvalidate();
1374-
importOsNode = insert(ImportNode.createAsExpression(MOD_OS));
1375-
}
1376-
return importOsNode.execute(frame);
1377-
}
1378-
1379-
private Object getEnv(VirtualFrame frame, PyObjectGetAttr getAttr, GetItemNode getItemNode, String name) {
1380-
Object os = importOs(frame);
1362+
private String getEnvVar(VirtualFrame frame, PyImportImport importNode, PyObjectGetAttr getAttr, PyObjectCallMethodObjArgs callMethodObjArgs,
1363+
CastToJavaStringNode castToJavaStringNode) {
1364+
Object os = importNode.execute(frame, MOD_OS);
13811365
final Object environ = getAttr.execute(frame, os, ATTR_ENVIRON);
1382-
return getItemNode.execute(frame, environ, name);
1366+
Object var = callMethodObjArgs.execute(frame, environ, METH_GET, PYTHONBREAKPOINT);
1367+
try {
1368+
return castToString(var, castToJavaStringNode);
1369+
} catch (CannotCastException cce) {
1370+
return null;
1371+
}
13831372
}
13841373

13851374
@Specialization
13861375
Object doHook(VirtualFrame frame, Object[] args, PKeyword[] keywords,
13871376
@Cached CallNode callNode,
13881377
@Cached PyObjectGetAttr getAttr,
1389-
@Cached GetItemNode getItemNode,
1390-
@Cached IsBuiltinClassProfile importErrorProfile,
1378+
@Cached PyImportImport importNode,
1379+
@Cached PyObjectCallMethodObjArgs callMethodObjArgs,
13911380
@Cached IsBuiltinClassProfile attrErrorProfile,
13921381
@Cached CastToJavaStringNode castToJavaStringNode,
1382+
@Cached BuiltinFunctions.IsInstanceNode isInstanceNode,
13931383
@Cached WarningsModuleBuiltins.WarnNode warnNode) {
1394-
Object v = getEnv(frame, getAttr, getItemNode, PYTHONBREAKPOINT);
1395-
final String hookName;
1396-
if (v == PNone.NO_VALUE) {
1384+
String hookName = getEnvVar(frame, importNode, getAttr, callMethodObjArgs, castToJavaStringNode);
1385+
if (hookName == null || hookName.length() == 0) {
13971386
warnNode.warnFormat(frame, RuntimeWarning, WARN_CANNOT_RUN_PDB_YET);
13981387
hookName = VAL_PDB_SETTRACE;
1399-
} else {
1400-
hookName = castToString(v, castToJavaStringNode);
14011388
}
14021389

14031390
if (hookName.length() == 1 && hookName.charAt(0) == '0') {
@@ -1406,33 +1393,38 @@ Object doHook(VirtualFrame frame, Object[] args, PKeyword[] keywords,
14061393
}
14071394

14081395
final int lastDot = PythonUtils.lastIndexOf(hookName, '.');
1409-
final String modName;
1396+
final String modPath;
14101397
final String attrName;
14111398
if (lastDot == -1) {
14121399
// The breakpoint is a built-in, e.g. PYTHONBREAKPOINT=int
1413-
modName = BUILTINS;
1400+
modPath = BUILTINS;
14141401
attrName = hookName;
1415-
} else {
1402+
} else if (lastDot != 0) {
14161403
// Split on the last dot
1417-
modName = PythonUtils.substring(hookName, 0, lastDot);
1404+
modPath = PythonUtils.substring(hookName, 0, lastDot);
14181405
attrName = PythonUtils.substring(hookName, lastDot + 1);
1406+
} else {
1407+
warnNode.warnFormat(frame, RuntimeWarning, WARN_IGNORE_UNIMPORTABLE_BREAKPOINT_S, hookName);
1408+
return PNone.NONE;
14191409
}
14201410

14211411
final Object module;
14221412
try {
1423-
module = ensureImportNode(modName).execute(frame);
1413+
module = importNode.execute(frame, modPath);
14241414
} catch (PException pe) {
1425-
pe.expect(ImportError, importErrorProfile);
1426-
warnNode.warnFormat(frame, RuntimeWarning, WARN_IGNORE_UNIMPORTABLE_BREAKPOINT_S, hookName);
1415+
if (isInstanceNode.executeWith(frame, pe.getUnreifiedException(), ImportError)) {
1416+
warnNode.warnFormat(frame, RuntimeWarning, WARN_IGNORE_UNIMPORTABLE_BREAKPOINT_S, hookName);
1417+
}
14271418
return PNone.NONE;
14281419
}
14291420

14301421
final Object hook;
14311422
try {
14321423
hook = getAttr.execute(frame, module, attrName);
14331424
} catch (PException pe) {
1434-
pe.expect(AttributeError, attrErrorProfile);
1435-
warnNode.warnFormat(frame, RuntimeWarning, WARN_IGNORE_UNIMPORTABLE_BREAKPOINT_S, hookName);
1425+
if (attrErrorProfile.profileException(pe, AttributeError)) {
1426+
warnNode.warnFormat(frame, RuntimeWarning, WARN_IGNORE_UNIMPORTABLE_BREAKPOINT_S, hookName);
1427+
}
14361428
return PNone.NONE;
14371429
}
14381430

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@
121121
import com.oracle.truffle.api.object.HiddenKey;
122122
import com.oracle.truffle.api.profiles.BranchProfile;
123123

124+
import static com.oracle.graal.python.nodes.BuiltinNames.MODULES;
125+
124126
@CoreFunctions(defineModule = "_warnings")
125127
public class WarningsModuleBuiltins extends PythonBuiltins {
126128
private static final HiddenKey FILTERS_VERSION = new HiddenKey("filters_version");
@@ -469,7 +471,7 @@ private static Object getWarningsAttr(VirtualFrame frame, String attr, boolean t
469471
}
470472
} else {
471473
Object sys = context.lookupBuiltinModule("sys");
472-
Object modules = lookup.execute(frame, sys, "modules");
474+
Object modules = lookup.execute(frame, sys, MODULES);
473475
try {
474476
warningsModule = callMethod.execute(frame, modules, "get", WARNINGS, PNone.NONE);
475477
} catch (PException e) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/zipimporter/ZipImporterBuiltins.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626
package com.oracle.graal.python.builtins.objects.zipimporter;
2727

28+
import static com.oracle.graal.python.nodes.BuiltinNames.MODULES;
2829
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
2930
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
3031
import static com.oracle.graal.python.nodes.SpecialMethodNames.__STR__;
@@ -691,7 +692,7 @@ public Object doit(VirtualFrame frame, PZipImporter self, String fullname,
691692
PCode code = getCodeNode.doit(frame, self, fullname, canNotFind, initWasNotCalled);
692693

693694
PythonModule sysModule = getCore().lookupBuiltinModule("sys");
694-
PDict sysModules = (PDict) sysModule.getAttribute("modules");
695+
PDict sysModules = (PDict) sysModule.getAttribute(MODULES);
695696
PythonModule module = (PythonModule) sysModules.getItem(fullname);
696697
if (module == null) {
697698
module = factory().createPythonModule(fullname);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public abstract class BuiltinNames {
7676
public static final String STDOUT = "stdout";
7777
public static final String PYTHONBREAKPOINT = "PYTHONBREAKPOINT";
7878
public static final String EXIT = "exit";
79+
public static final String MODULES = "modules";
7980

8081
// builtin functions
8182
public static final String ABS = "abs";

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,7 @@ public abstract class ErrorMessages {
641641
public static final String TYPE_P_NOT_SUPPORTED_BY_FOREIGN_OBJ = "type '%p' is not supported by the foreign object";
642642
public static final String TYPE_DOESNT_SUPPORT_MRO_ENTRY_RESOLUTION = "type() doesn't support MRO entry resolution; use types.new_class()";
643643
public static final String TYPE_DOESNT_DEFINE_FORMAT = "Type %p doesn't define __format__";
644+
public static final String UNABLE_TO_GET_S = "unable to get %";
644645
public static final String UNAVAILABLE_ON_THIS_PLATFORM = "%s: %s unavailable on this platform";
645646
public static final String UNAVAILABLE_ON_THIS_PLATFORM_NO_FUNC = "%s unavailable on this platform";
646647
public static final String UNEXPECTED_KEYWORD_ARGS = "%s: unexpected keyword arguments";

0 commit comments

Comments
 (0)