Skip to content

Commit 1720a58

Browse files
fangerercosminbasca
authored andcommitted
Implement C API function PyModuleDef_Init
1 parent 572cb12 commit 1720a58

File tree

6 files changed

+48
-2
lines changed

6 files changed

+48
-2
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ declare_type(PyTuple_Type, tuple, PyTupleObject);
171171
declare_type(PyList_Type, list, PyListObject);
172172
declare_type(PyComplex_Type, complex, PyComplexObject);
173173
declare_type(PyModule_Type, module, PyModuleObject);
174+
declare_type(PyModuleDef_Type, moduledef, PyModuleDef);
174175
declare_type(PyCapsule_Type, PyCapsule, PyCapsule);
175176
declare_type(PyMemoryView_Type, memoryview, PyMemoryViewObject);
176177
declare_type(PySet_Type, set, PySetObject);

graalpython/com.oracle.graal.python.cext/src/moduleobject.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,29 @@
4242

4343
PyTypeObject PyModule_Type = PY_TRUFFLE_TYPE("module", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, sizeof(PyModuleObject));
4444

45-
/* Modules */
45+
PyTypeObject PyModuleDef_Type = {
46+
PyVarObject_HEAD_INIT(&PyType_Type, 0)
47+
"moduledef", /* tp_name */
48+
sizeof(struct PyModuleDef), /* tp_basicsize */
49+
0, /* tp_itemsize */
50+
};
51+
52+
53+
UPCALL_ID(_PyModule_GetAndIncMaxModuleNumber);
54+
// partially taken from CPython "Objects/moduleobject.c"
55+
PyObject*
56+
PyModuleDef_Init(struct PyModuleDef* def)
57+
{
58+
if (PyType_Ready(&PyModuleDef_Type) < 0)
59+
return NULL;
60+
if (def->m_base.m_index == 0) {
61+
Py_REFCNT(def) = 1;
62+
Py_TYPE(def) = &PyModuleDef_Type;
63+
def->m_base.m_index = UPCALL_CEXT_L(_jls__PyModule_GetAndIncMaxModuleNumber);
64+
}
65+
return (PyObject*)def;
66+
}
67+
4668
int PyModule_AddFunctions(PyObject* mod, PyMethodDef* methods) {
4769
if (!methods) {
4870
return -1;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ public enum PythonBuiltinClassType implements TruffleObject {
108108
PTuple("tuple", BuiltinNames.BUILTINS),
109109
PythonClass("type", BuiltinNames.BUILTINS),
110110
PythonModule("module"),
111+
PythonModuleDef("moduledef", false),
111112
PythonObject("object", BuiltinNames.BUILTINS),
112113
Super("super", BuiltinNames.BUILTINS),
113114
PCode("code", false),

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3655,4 +3655,17 @@ static Object doGeneric(Object object) {
36553655
return new PyDateTimeCAPIWrapper(object);
36563656
}
36573657
}
3658+
3659+
@Builtin(name = "_PyModule_GetAndIncMaxModuleNumber")
3660+
@GenerateNodeFactory
3661+
abstract static class PyModuleGetAndIncMaxModuleNumber extends PythonBuiltinNode {
3662+
3663+
@Specialization
3664+
static long doIt(
3665+
@CachedContext(PythonLanguage.class) PythonContext context) {
3666+
CApiContext nativeContext = context.getCApiContext();
3667+
return nativeContext.getAndIncMaxModuleNumber();
3668+
3669+
}
3670+
}
36583671
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ public final class CApiContext extends CExtContext {
132132
/** Cache for polyglot types of primitive and pointer types. */
133133
@CompilationFinal(dimensions = 1) private final TruffleObject[] llvmTypeCache;
134134

135+
/** same as {@code moduleobject.c: max_module_number} */
136+
private long maxModuleNumber;
137+
135138
public CApiContext(PythonContext context, Object hpyLibrary) {
136139
super(context, hpyLibrary, CAPIConversionNodeSupplier.INSTANCE);
137140
nativeObjectsQueue = new ReferenceQueue<>();
@@ -193,6 +196,10 @@ public void setLLVMTypeID(LLVMType llvmType, TruffleObject llvmTypeId) {
193196
llvmTypeCache[llvmType.ordinal()] = llvmTypeId;
194197
}
195198

199+
public long getAndIncMaxModuleNumber() {
200+
return maxModuleNumber++;
201+
}
202+
196203
@TruffleBoundary
197204
public static Object asHex(Object ptr) {
198205
if (ptr instanceof Number) {
@@ -802,5 +809,4 @@ public static boolean isPointerToPrimitive(LLVMType llvmType) {
802809
return false;
803810
}
804811
}
805-
806812
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ static long doBuiltinClassType(PythonBuiltinClassType clazz) {
214214
case PTuple:
215215
result = DEFAULT | HAVE_GC | BASETYPE | TUPLE_SUBCLASS;
216216
break;
217+
case PythonModuleDef:
218+
result = 0;
219+
break;
217220
default:
218221
// default case; this includes:
219222
// PythonObject, PByteArray, PCode, PInstancemethod, PFloat, PNone,

0 commit comments

Comments
 (0)