Skip to content

Commit f10664b

Browse files
committed
test_import: circular import fix error message
1 parent f02b6d2 commit f10664b

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

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
@@ -128,6 +128,7 @@ public abstract class ErrorMessages {
128128
public static final String CANNOT_GET_CONSISTEMT_METHOD_RESOLUTION = "Cannot create a consistent method resolution\norder (MRO) for bases %s";
129129
public static final String CANNOT_HANDLE_ZIP_FILE = "cannot handle Zip file: '%s'";
130130
public static final String CANNOT_IMPORT_NAME = "cannot import name '%s' from '%s' (%s)";
131+
public static final String CANNOT_IMPORT_NAME_CIRCULAR = "cannot import name '%s' from partially initialized module '%s' (most likely due to a circular import)";
131132
public static final String CANNOT_INITIALIZE_WITH = "cannot initialize %s with %s%s";
132133
public static final String CANNOT_LOAD = "cannot load %s: %s";
133134
public static final String CANNOT_LOAD_M = "cannot load %s: %m";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/statement/ImportFromNode.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727

2828
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__FILE__;
2929
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
30+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__SPEC__;
3031

3132
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3233
import com.oracle.graal.python.builtins.objects.function.PArguments;
34+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
3335
import com.oracle.graal.python.builtins.objects.str.PString;
3436
import com.oracle.graal.python.nodes.ErrorMessages;
3537
import com.oracle.graal.python.nodes.PRaiseImportErrorNode;
@@ -40,6 +42,7 @@
4042
import com.oracle.graal.python.nodes.frame.WriteNode;
4143
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
4244
import com.oracle.graal.python.nodes.subscript.GetItemNode;
45+
import com.oracle.graal.python.runtime.PythonOptions;
4346
import com.oracle.graal.python.runtime.exception.PException;
4447
import com.oracle.truffle.api.CompilerDirectives;
4548
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -55,6 +58,7 @@ public class ImportFromNode extends AbstractImportNode {
5558
@Child private ReadAttributeFromObjectNode readModules;
5659
@Child private GetAnyAttributeNode getAttributeNode = GetAnyAttributeNodeGen.create();
5760
@Child private PRaiseImportErrorNode raiseNode;
61+
@Child private PythonObjectLibrary pythonLibrary;
5862

5963
private final String importee;
6064
private final int level;
@@ -121,12 +125,32 @@ public void executeVoid(VirtualFrame frame) {
121125
e3.expectAttributeError(getFileErrorProfile);
122126
}
123127
}
124-
throw ensureRaiseNode().raiseImportError(frame, moduleName, modulePath, ErrorMessages.CANNOT_IMPORT_NAME, attr, moduleName, modulePath);
128+
129+
PythonObjectLibrary pol = ensurePythonLibrary();
130+
if (isModuleInitialising(frame, pol, importedModule)) {
131+
throw ensureRaiseNode().raiseImportError(frame, moduleName, modulePath, ErrorMessages.CANNOT_IMPORT_NAME_CIRCULAR, attr, moduleName);
132+
} else {
133+
throw ensureRaiseNode().raiseImportError(frame, moduleName, modulePath, ErrorMessages.CANNOT_IMPORT_NAME, attr, moduleName, modulePath);
134+
}
125135
}
126136
}
127137
}
128138
}
129139

140+
private boolean isModuleInitialising(VirtualFrame frame, PythonObjectLibrary pol, Object importedModule) {
141+
Object spec = pol.lookupAttribute(importedModule, frame, __SPEC__);
142+
Object initializing = pol.lookupAttribute(spec, frame, "_initializing");
143+
return pol.isTrue(initializing);
144+
}
145+
146+
private PythonObjectLibrary ensurePythonLibrary() {
147+
if (pythonLibrary == null) {
148+
CompilerDirectives.transferToInterpreterAndInvalidate();
149+
pythonLibrary = insert(PythonObjectLibrary.getFactory().createDispatched(PythonOptions.getCallSiteInlineCacheMaxDepth()));
150+
}
151+
return pythonLibrary;
152+
}
153+
130154
private GetAttributeNode ensureGetNameNode() {
131155
if (getName == null) {
132156
CompilerDirectives.transferToInterpreterAndInvalidate();

0 commit comments

Comments
 (0)