|
52 | 52 | import static com.oracle.graal.python.nodes.BuiltinNames.T_GLOBALS;
|
53 | 53 | import static com.oracle.graal.python.nodes.BuiltinNames.T_LOCALS;
|
54 | 54 | 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; |
55 | 58 |
|
56 | 59 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode;
|
57 | 60 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
|
58 | 61 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode;
|
59 | 62 | 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; |
60 | 65 | import com.oracle.graal.python.builtins.objects.function.PKeyword;
|
| 66 | +import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; |
61 | 67 | import com.oracle.graal.python.lib.PyObjectGetAttr;
|
| 68 | +import com.oracle.graal.python.lib.PyObjectGetItem; |
| 69 | +import com.oracle.graal.python.lib.PyObjectIsTrueNode; |
62 | 70 | import com.oracle.graal.python.nodes.call.CallNode;
|
63 | 71 | 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; |
64 | 75 | import com.oracle.truffle.api.dsl.Bind;
|
65 | 76 | import com.oracle.truffle.api.dsl.Cached;
|
66 | 77 | import com.oracle.truffle.api.dsl.Specialization;
|
@@ -103,4 +114,39 @@ Object importModuleLevelObject(TruffleString name, Object globals, Object locals
|
103 | 114 | });
|
104 | 115 | }
|
105 | 116 | }
|
| 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 | + } |
106 | 152 | }
|
0 commit comments