Skip to content

Commit 1707fab

Browse files
committed
Correctly initialize 'tp_basicsize' for 'PythonNativeClass'.
1 parent 0e7f3db commit 1707fab

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ int PyType_Ready(PyTypeObject* cls) {
251251
cls->tp_bases = bases;
252252
}
253253

254+
PyObject* native_members = PyDict_New();
255+
PyDict_SetItemString(native_members, "tp_name", polyglot_from_string(cls->tp_name, "utf-8"));
256+
PyDict_SetItemString(native_members, "tp_doc", polyglot_from_string(cls->tp_doc ? cls->tp_doc : "", "utf-8"));
257+
PyDict_SetItemString(native_members, "tp_basicsize", PyLong_FromSsize_t(cls->tp_basicsize));
254258

255259
PyTypeObject* javacls = truffle_invoke(PY_TRUFFLE_CEXT,
256260
"PyType_Ready",
@@ -259,8 +263,7 @@ int PyType_Ready(PyTypeObject* cls) {
259263
cls,
260264
to_java_type(metaclass),
261265
to_java(bases),
262-
truffle_read_string(cls->tp_name),
263-
truffle_read_string(cls->tp_doc ? cls->tp_doc : ""));
266+
to_java(native_members));
264267
if (polyglot_is_value(javacls)) {
265268
javacls = polyglot_as__typeobject(javacls);
266269
}

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

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@
6363
import com.oracle.graal.python.builtins.objects.cext.PythonClassNativeWrapper;
6464
import com.oracle.graal.python.builtins.objects.cext.PythonObjectNativeWrapper;
6565
import com.oracle.graal.python.builtins.objects.cext.UnicodeObjectNodes.UnicodeAsWideCharNode;
66+
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes;
6667
import com.oracle.graal.python.builtins.objects.complex.PComplex;
68+
import com.oracle.graal.python.builtins.objects.dict.PDict;
6769
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
6870
import com.oracle.graal.python.builtins.objects.floats.PFloat;
6971
import com.oracle.graal.python.builtins.objects.function.Arity;
@@ -487,27 +489,50 @@ boolean op5(Object a, Object b, @SuppressWarnings("unused") int op,
487489
}
488490
}
489491

490-
@Builtin(name = "PyType_Ready", fixedNumOfArguments = 5)
492+
@Builtin(name = "PyType_Ready", fixedNumOfArguments = 4)
491493
@GenerateNodeFactory
492494
abstract static class PyType_ReadyNode extends PythonBuiltinNode {
493495
@Child WriteAttributeToObjectNode writeNode = WriteAttributeToObjectNode.create();
496+
@Child private HashingStorageNodes.GetItemNode getItemNode;
497+
498+
private HashingStorageNodes.GetItemNode getGetItemNode() {
499+
if (getItemNode == null) {
500+
CompilerDirectives.transferToInterpreterAndInvalidate();
501+
getItemNode = insert(HashingStorageNodes.GetItemNode.create());
502+
}
503+
return getItemNode;
504+
}
494505

495506
@Specialization
496-
PythonClass run(TruffleObject typestruct, PythonClass metaClass, PTuple baseClasses, String name, String doc) {
507+
PythonClass run(TruffleObject typestruct, PythonClass metaClass, PTuple baseClasses, PDict nativeMembers) {
497508
Object[] array = baseClasses.getArray();
498509
PythonClass[] bases = new PythonClass[array.length];
499510
for (int i = 0; i < array.length; i++) {
500511
bases[i] = (PythonClass) array[i];
501512
}
502513

514+
String name = getStringItem(nativeMembers, "tp_name");
515+
String doc = getStringItem(nativeMembers, "tp_doc");
503516
PythonClass cclass = factory().createNativeClassWrapper(typestruct, metaClass, name, bases);
504517
writeNode.execute(cclass, SpecialAttributeNames.__DOC__, doc);
518+
writeNode.execute(cclass, SpecialAttributeNames.__BASICSIZE__, getLongItem(nativeMembers, "tp_basicsize"));
505519
return cclass;
506520
}
507521

508-
@Specialization
509-
PythonClass run(TruffleObject typestruct, PythonClass metaClass, PTuple baseClasses, PString name, PString doc) {
510-
return run(typestruct, metaClass, baseClasses, name.getValue(), doc.getValue());
522+
private String getStringItem(PDict nativeMembers, String key) {
523+
Object item = getGetItemNode().execute(nativeMembers.getDictStorage(), key);
524+
if (item instanceof PString) {
525+
return ((PString) item).getValue();
526+
}
527+
return (String) item;
528+
}
529+
530+
private Object getLongItem(PDict nativeMembers, String key) {
531+
Object item = getGetItemNode().execute(nativeMembers.getDictStorage(), key);
532+
if (item instanceof PInt || item instanceof Number) {
533+
return item;
534+
}
535+
return (long) item;
511536
}
512537
}
513538

0 commit comments

Comments
 (0)