Skip to content

Commit d8f9f6e

Browse files
committed
Implement PyImport_GetModule
1 parent 04bb7e7 commit d8f9f6e

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,17 @@ class TestMisc(CPyExtTestCase):
165165
cmpfunc=unhandled_error_compare
166166
)
167167

168+
test_PyImport_GetModule = CPyExtFunction(
169+
lambda args: sys.modules.get(args[0]),
170+
lambda: (
171+
("os",),
172+
),
173+
resultspec="O",
174+
argspec="O",
175+
arguments=["PyObject* name"],
176+
cmpfunc=unhandled_error_compare
177+
)
178+
168179
test_PyTruffle_Intrinsic_Pmovmskb = CPyExtFunction(
169180
lambda args: True,
170181
lambda: (

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,26 @@
5252
import static com.oracle.graal.python.nodes.BuiltinNames.T_GLOBALS;
5353
import static com.oracle.graal.python.nodes.BuiltinNames.T_LOCALS;
5454
import static com.oracle.graal.python.nodes.BuiltinNames.T___IMPORT__;
55+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___INITIALIZING__;
56+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___SPEC__;
57+
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
5558

5659
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode;
5760
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
5861
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode;
5962
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
63+
import com.oracle.graal.python.builtins.objects.PNone;
64+
import com.oracle.graal.python.builtins.objects.dict.PDict;
6065
import com.oracle.graal.python.builtins.objects.function.PKeyword;
66+
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
6167
import com.oracle.graal.python.lib.PyObjectGetAttr;
68+
import com.oracle.graal.python.lib.PyObjectGetItem;
69+
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
6270
import com.oracle.graal.python.nodes.call.CallNode;
6371
import com.oracle.graal.python.nodes.statement.AbstractImportNode;
72+
import com.oracle.graal.python.runtime.PythonContext;
73+
import com.oracle.graal.python.runtime.exception.PException;
74+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6475
import com.oracle.truffle.api.dsl.Bind;
6576
import com.oracle.truffle.api.dsl.Cached;
6677
import com.oracle.truffle.api.dsl.Specialization;
@@ -103,4 +114,39 @@ Object importModuleLevelObject(TruffleString name, Object globals, Object locals
103114
});
104115
}
105116
}
117+
118+
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct)
119+
abstract static class PyImport_GetModule extends CApiUnaryBuiltinNode {
120+
121+
private static final TruffleString T__LOCK_UNLOCK_MODULE = tsLiteral("_lock_unlock_module");
122+
123+
@Specialization
124+
@TruffleBoundary
125+
Object getModule(Object name) {
126+
PythonContext context = PythonContext.get(null);
127+
PDict modules = context.getSysModules();
128+
Object m;
129+
try {
130+
m = PyObjectGetItem.executeUncached(modules, name);
131+
} catch (PException e) {
132+
return context.getNativeNull();
133+
}
134+
if (m != PNone.NONE) {
135+
boolean initializing = false;
136+
try {
137+
Object spec = PyObjectGetAttr.executeUncached(m, T___SPEC__);
138+
Object initializingObj = PyObjectGetAttr.executeUncached(spec, T___INITIALIZING__);
139+
if (PyObjectIsTrueNode.executeUncached(initializingObj)) {
140+
initializing = true;
141+
}
142+
} catch (PException e) {
143+
// ignore
144+
}
145+
if (initializing) {
146+
PyObjectCallMethodObjArgs.executeUncached(context.getImportlib(), T__LOCK_UNLOCK_MODULE, name);
147+
}
148+
}
149+
return m;
150+
}
151+
}
106152
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,6 @@ public final class CApiFunction {
770770
@CApiBuiltin(name = "PyImport_GetImporter", ret = PyObject, args = {PyObject}, call = NotImplemented)
771771
@CApiBuiltin(name = "PyImport_GetMagicNumber", ret = Long, args = {}, call = NotImplemented)
772772
@CApiBuiltin(name = "PyImport_GetMagicTag", ret = ConstCharPtrAsTruffleString, args = {}, call = NotImplemented)
773-
@CApiBuiltin(name = "PyImport_GetModule", ret = PyObject, args = {PyObject}, call = NotImplemented)
774773
@CApiBuiltin(name = "PyImport_ImportFrozenModule", ret = Int, args = {ConstCharPtrAsTruffleString}, call = NotImplemented)
775774
@CApiBuiltin(name = "PyImport_ImportFrozenModuleObject", ret = Int, args = {PyObject}, call = NotImplemented)
776775
@CApiBuiltin(name = "PyImport_ReloadModule", ret = PyObject, args = {PyObject}, call = NotImplemented)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ public abstract class SpecialAttributeNames {
114114

115115
public static final TruffleString T___CACHED__ = tsLiteral("__cached__");
116116

117+
public static final TruffleString T___INITIALIZING__ = tsLiteral("__initializing__");
118+
117119
public static final String J___TEXT_SIGNATURE__ = "__text_signature__";
118120
public static final TruffleString T___TEXT_SIGNATURE__ = tsLiteral(J___TEXT_SIGNATURE__);
119121

0 commit comments

Comments
 (0)