Skip to content

Commit f151a66

Browse files
committed
Enable allocation of objects if class inherits from a native class.
1 parent 93ed162 commit f151a66

28 files changed

+163
-48
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
#include <stdarg.h>
4242

43-
PyTypeObject PyBool_Type = PY_TRUFFLE_TYPE("bool", &PyType_Type, Py_TPFLAGS_DEFAULT);
43+
PyTypeObject PyBool_Type = PY_TRUFFLE_TYPE("bool", &PyType_Type, Py_TPFLAGS_DEFAULT, sizeof(struct _longobject));
4444

4545
// taken from CPython "Python/Objects/boolobject.c"
4646
PyObject *PyBool_FromLong(long ok) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@
3838
*/
3939
#include "capi.h"
4040

41-
PyTypeObject PyByteArray_Type = PY_TRUFFLE_TYPE("bytearray", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE);
41+
PyTypeObject PyByteArray_Type = PY_TRUFFLE_TYPE("bytearray", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, sizeof(PyByteArrayObject));
4242
char _PyByteArray_empty_string[] = "";

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,12 @@
3939
#include "capi.h"
4040

4141
#include <stdarg.h>
42+
#include <stddef.h>
4243

43-
PyTypeObject PyBytes_Type = PY_TRUFFLE_TYPE("bytes", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_BYTES_SUBCLASS);
44+
// taken from CPython "Objects/bytesobject.c"
45+
#define PyBytesObject_SIZE (offsetof(PyBytesObject, ob_sval) + 1)
46+
47+
PyTypeObject PyBytes_Type = PY_TRUFFLE_TYPE("bytes", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_BYTES_SUBCLASS, PyBytesObject_SIZE);
4448

4549
PyObject* PyBytes_FromStringAndSize(const char* str, Py_ssize_t sz) {
4650
setlocale(LC_ALL, NULL);

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,11 @@ static void initialize_type_structure(PyTypeObject* structure, const char* typna
4848
truffle_invoke(PY_TRUFFLE_CEXT, "PyTruffle_Set_Ptr", ptype, nativePointer);
4949

5050
unsigned long original_flags = structure->tp_flags;
51+
Py_ssize_t basicsize = structure->tp_basicsize;
5152
PyTypeObject* type_handle = truffle_assign_managed(structure, polyglot_as__typeobject(ptype));
5253
// write flags as specified in the dummy to the PythonClass object
5354
type_handle->tp_flags = original_flags | Py_TPFLAGS_READY;
55+
type_handle->tp_basicsize = basicsize;
5456
}
5557

5658
static void initialize_globals() {
@@ -170,7 +172,7 @@ static inline PyObject* PyTruffle_Explicit_Cast(PyObject* cobj, unsigned long fl
170172

171173

172174
__attribute__((always_inline))
173-
static inline PyObject* _explicit_cast(PyObject* cobj) {
175+
inline PyObject* explicit_cast(PyObject* cobj) {
174176
if(polyglot_is_value(cobj)) {
175177
unsigned long flags = polyglot_as_i64(polyglot_invoke(PY_TRUFFLE_CEXT, "PyTruffle_GetTpFlags", cobj));
176178
return PyTruffle_Explicit_Cast(cobj, flags);
@@ -179,7 +181,7 @@ static inline PyObject* _explicit_cast(PyObject* cobj) {
179181
}
180182

181183
PyObject* to_sulong(void *o) {
182-
return _explicit_cast(truffle_invoke(PY_TRUFFLE_CEXT, "to_sulong", o));
184+
return explicit_cast(truffle_invoke(PY_TRUFFLE_CEXT, "to_sulong", o));
183185
}
184186

185187
void* get_ob_type(PyObject* obj) {
@@ -443,7 +445,7 @@ typedef PyObject* (*f20)(PyObject*, PyObject*, PyObject*, PyObject*, PyObject*,
443445

444446
#define _PICK_FUN_CAST(DUMMY, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, NAME, ...) NAME
445447
#define _CALL_ARITY(FUN, ...) ( (_PICK_FUN_CAST(NULL, ##__VA_ARGS__, f20, f19, f18, f17, f16, f15, f14, f13, f12, f11, f10, f9, f8, f7, f6, f5, f4, f3, f2, f1, f0))(FUN))(__VA_ARGS__)
446-
#define ARG(__n) _explicit_cast((PyObject*)polyglot_get_arg((__n)))
448+
#define ARG(__n) explicit_cast((PyObject*)polyglot_get_arg((__n)))
447449

448450
PyObject *wrap_direct(PyCFunction fun, ...) {
449451
PyObject *res = NULL;
@@ -496,23 +498,23 @@ PyObject *wrap_direct(PyCFunction fun, ...) {
496498
}
497499

498500
PyObject *wrap_varargs(PyCFunction fun, PyObject *module, PyObject *varargs) {
499-
return fun(_explicit_cast(module), _explicit_cast(varargs));
501+
return fun(explicit_cast(module), explicit_cast(varargs));
500502
}
501503

502504
PyObject *wrap_keywords(PyCFunctionWithKeywords fun, PyObject *module, PyObject *varargs, PyObject *kwargs) {
503-
return fun(_explicit_cast(module), _explicit_cast(varargs), _explicit_cast(kwargs));
505+
return fun(explicit_cast(module), explicit_cast(varargs), explicit_cast(kwargs));
504506
}
505507

506508
PyObject *wrap_noargs(PyCFunction fun, PyObject *module, PyObject *pnone) {
507-
return fun(_explicit_cast(module), _explicit_cast(pnone));
509+
return fun(explicit_cast(module), explicit_cast(pnone));
508510
}
509511

510512
PyObject *wrap_fastcall(_PyCFunctionFast fun, PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) {
511513
Py_ssize_t i;
512514
for (i=0; i < nargs; i++) {
513-
args[i] = _explicit_cast(args[i]);
515+
args[i] = explicit_cast(args[i]);
514516
}
515-
return fun(_explicit_cast(self), args, nargs, _explicit_cast(kwnames));
517+
return fun(explicit_cast(self), args, nargs, explicit_cast(kwnames));
516518
}
517519

518520
PyObject *wrap_unsupported(void *fun, ...) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ POLYGLOT_DECLARE_TYPE(PySetObject);
8383
extern void* to_java(PyObject* obj);
8484
extern void* to_java_type(PyTypeObject* cls);
8585
extern PyObject* to_sulong(void *o);
86+
extern PyObject* explicit_cast(PyObject* cobj);
8687
#define as_char_pointer(obj) polyglot_invoke(PY_TRUFFLE_CEXT, "to_char_pointer", to_java(obj))
8788
#define as_long(obj) ((long)polyglot_as_i64(polyglot_invoke(PY_TRUFFLE_CEXT, "to_long", to_java(obj))))
8889
#define as_int(obj) ((int)as_long(obj))
@@ -146,10 +147,10 @@ PyObject *wrap_unsupported(void *fun, ...);
146147
wrap_unsupported)))))))
147148

148149

149-
#define PY_TRUFFLE_TYPE(__TYPE_NAME__, __SUPER_TYPE__, __FLAGS__) {\
150+
#define PY_TRUFFLE_TYPE(__TYPE_NAME__, __SUPER_TYPE__, __FLAGS__, __SIZE__) {\
150151
PyVarObject_HEAD_INIT((__SUPER_TYPE__), 0)\
151152
__TYPE_NAME__, /* tp_name */\
152-
0, /* tp_basicsize */\
153+
(__SIZE__), /* tp_basicsize */\
153154
0, /* tp_itemsize */\
154155
0, /* tp_dealloc */\
155156
0, /* tp_print */\

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
*/
3939
#include "capi.h"
4040

41-
PyTypeObject PyCapsule_Type = PY_TRUFFLE_TYPE("PyCapsule", &PyType_Type, 0);
41+
PyTypeObject PyCapsule_Type = PY_TRUFFLE_TYPE("PyCapsule", &PyType_Type, 0, sizeof(PyCapsule));
4242

4343
PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor) {
4444
return (PyObject *)polyglot_as_PyCapsule(to_sulong(polyglot_invoke(PY_TRUFFLE_CEXT, "PyCapsule", name ? polyglot_from_string(name, "ascii") : to_java(Py_None), pointer, destructor)));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@
3838
*/
3939
#include "capi.h"
4040

41-
PyTypeObject PyComplex_Type = PY_TRUFFLE_TYPE("complex", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC);
41+
PyTypeObject PyComplex_Type = PY_TRUFFLE_TYPE("complex", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, sizeof(PyComplexObject));

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@
3838
*/
3939
#include "capi.h"
4040

41-
PyTypeObject PyDictProxy_Type = PY_TRUFFLE_TYPE("mappingproxy", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC);
41+
// taken from CPython "Objects/descrobject.c"
42+
typedef struct {
43+
PyObject_HEAD
44+
PyObject *mapping;
45+
} mappingproxyobject;
46+
47+
PyTypeObject PyDictProxy_Type = PY_TRUFFLE_TYPE("mappingproxy", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, sizeof(mappingproxyobject));
4248

4349
/* Dicts */
4450
PyObject* PyDictProxy_New(PyObject *mapping) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
/* Dicts */
4242

43-
PyTypeObject PyDict_Type = PY_TRUFFLE_TYPE("dict", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS);
43+
PyTypeObject PyDict_Type = PY_TRUFFLE_TYPE("dict", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS, sizeof(PyDictObject));
4444

4545
PyObject* PyDict_New(void) {
4646
return to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyDict_New"));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#include "capi.h"
4040

4141

42-
PyTypeObject PyFloat_Type = PY_TRUFFLE_TYPE("float", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE);
42+
PyTypeObject PyFloat_Type = PY_TRUFFLE_TYPE("float", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, sizeof(PyFloatObject));
4343

4444
double PyFloat_AsDouble(PyObject *op) {
4545
if (op == NULL) {

0 commit comments

Comments
 (0)