Skip to content

Commit e3888ba

Browse files
committed
[GR-10189] [GR-9012] [GR-9715] C API refactoring.
PullRequest: graalpython/81
2 parents 5cf1716 + daf49b9 commit e3888ba

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1660
-1175
lines changed

graalpython/com.oracle.graal.python.cext/include/Python.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@
107107
#include "pyfpe.h"
108108
#include "memoryobject.h"
109109

110-
#undef Py_NoValue
111-
#define Py_NoValue truffle_invoke(PY_TRUFFLE_CEXT, "Py_NoValue")
110+
#define PY_TRUFFLE_CEXT ((void*)polyglot_import("python_cext"))
111+
#define PY_BUILTIN ((void*)polyglot_import("python_builtins"))
112112

113-
#define PY_TRUFFLE_CEXT ((void*)truffle_import_cached("python_cext"))
114-
#define PY_BUILTIN ((void*)truffle_import_cached("python_builtins"))
113+
#undef Py_NoValue
114+
#define Py_NoValue UPCALL_CEXT_O("Py_NoValue")
115115

116116
// TODO: we must extend the refcounting behavior to support handles to managed objects
117117
#undef Py_DECREF

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,18 @@
3939
#include "capi.h"
4040

4141
// partially taken from CPython "Python/_warnings.c"
42-
static int warn_unicode(PyObject *category, PyObject *message, Py_ssize_t stack_level, PyObject *source) {
42+
MUST_INLINE static int warn_unicode(PyObject *category, PyObject *message, Py_ssize_t stack_level, PyObject *source) {
4343
PyObject *res;
4444

4545
if (category == NULL) {
4646
category = PyExc_RuntimeWarning;
4747
}
4848

49-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "_PyErr_Warn", to_java(message), to_java(category), stack_level, to_java(source));
50-
if(result == ERROR_MARKER) {
49+
PyObject* result = UPCALL_CEXT_O("_PyErr_Warn", native_to_java(message), native_to_java(category), stack_level, native_to_java(source));
50+
if(result == NULL) {
5151
return -1;
5252
}
53-
res = to_sulong(result);
54-
Py_DECREF(res);
55-
53+
Py_DECREF(result);
5654
return 0;
5755
}
5856

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

Lines changed: 17 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,19 @@ static PyObject* null_error(void) {
5454
}
5555

5656
int PyNumber_Check(PyObject *o) {
57-
PyObject *result = to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyNumber_Check", to_java(o)));
57+
PyObject *result = UPCALL_CEXT_O("PyNumber_Check", native_to_java(o));
5858
if(result == Py_True) {
5959
return 1;
6060
}
6161
return 0;
6262
}
6363

6464
static PyObject * do_unaryop(PyObject *v, UnaryOp unaryop, char *unaryop_name) {
65-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyNumber_UnaryOp", to_java(v), unaryop, truffle_read_string(unaryop_name));
66-
if (result == ERROR_MARKER) {
67-
return NULL;
68-
}
69-
return to_sulong(result);
65+
return UPCALL_CEXT_O("PyNumber_UnaryOp", native_to_java(v), unaryop, polyglot_from_string(unaryop_name, SRC_CS));
7066
}
7167

7268
static PyObject * do_binop(PyObject *v, PyObject *w, BinOp binop, char *binop_name) {
73-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyNumber_BinOp", to_java(v), to_java(w), binop, truffle_read_string(binop_name));
74-
if (result == ERROR_MARKER) {
75-
return NULL;
76-
}
77-
return to_sulong(result);
69+
return UPCALL_CEXT_O("PyNumber_BinOp", native_to_java(v), native_to_java(w), binop, polyglot_from_string(binop_name, SRC_CS));
7870
}
7971

8072
PyObject * PyNumber_Add(PyObject *o1, PyObject *o2) {
@@ -137,11 +129,7 @@ PyObject * PyNumber_Index(PyObject *o) {
137129
if (o == NULL) {
138130
return null_error();
139131
}
140-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyNumber_Index", to_java(o));
141-
if (result == ERROR_MARKER) {
142-
return NULL;
143-
}
144-
return to_sulong(result);
132+
return UPCALL_CEXT_O("PyNumber_Index", native_to_java(o));
145133
}
146134

147135
Py_ssize_t PyNumber_AsSsize_t(PyObject *item, PyObject *err) {
@@ -179,66 +167,43 @@ Py_ssize_t PyNumber_AsSsize_t(PyObject *item, PyObject *err) {
179167
}
180168
else {
181169
/* Otherwise replace the error with caller's error object. */
182-
PyObject* t = PyTuple_New(1);
183-
PyTuple_SetItem(t, 0, PyObject_Type(item));
184-
truffle_invoke(PY_TRUFFLE_CEXT, "PyErr_Format", to_java(err), truffle_read_string("cannot fit '%s' into an index-sized integer"), to_java(t));
170+
PyErr_Format(err, "cannot fit '%s' into an index-sized integer", PyObject_Type(item));
185171
}
186172

187173
Py_DECREF(value);
188174
return -1;
189175
}
190176

191177
PyObject * PyNumber_Long(PyObject *o) {
192-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyNumber_Long", to_java(o));
193-
if (result == ERROR_MARKER) {
194-
return NULL;
195-
}
196-
return to_sulong(result);
178+
return UPCALL_CEXT_O("PyNumber_Long", native_to_java(o));
197179
}
198180

199181
PyObject * PyNumber_Float(PyObject *o) {
200-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyNumber_Float", to_java(o));
201-
if (result == ERROR_MARKER) {
202-
return NULL;
203-
}
204-
return to_sulong(result);
182+
return UPCALL_CEXT_O("PyNumber_Float", native_to_java(o));
205183
}
206184

207185
PyObject * PyNumber_Absolute(PyObject *o) {
208-
void *result = polyglot_invoke(PY_TRUFFLE_CEXT, "PyNumber_Absolute", to_java(o));
209-
if (result == ERROR_MARKER) {
210-
return NULL;
211-
}
212-
return to_sulong(result);
186+
return UPCALL_CEXT_O("PyNumber_Absolute", native_to_java(o));
213187
}
214188

215189
PyObject * PyNumber_Divmod(PyObject *a, PyObject *b) {
216-
void *result = polyglot_invoke(PY_TRUFFLE_CEXT, "PyNumber_Divmod", to_java(a), to_java(b));
217-
if (result == ERROR_MARKER) {
218-
return NULL;
219-
}
220-
return to_sulong(result);
190+
return UPCALL_CEXT_O("PyNumber_Divmod", native_to_java(a), native_to_java(b));
221191
}
222192

223193

224194
PyObject * PyIter_Next(PyObject *iter) {
225-
void* result = polyglot_invoke(PY_TRUFFLE_CEXT, "PyIter_Next", to_java(iter));
226-
if (result == ERROR_MARKER && PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) {
227-
PyErr_Clear();
228-
return NULL;
229-
}
230-
return to_sulong(result);
195+
return UPCALL_CEXT_O("PyIter_Next", native_to_java(iter));
231196
}
232197

233198
int PySequence_Check(PyObject *s) {
234199
if (s == NULL) {
235200
return 0;
236201
}
237-
return polyglot_as_i64(polyglot_invoke(PY_TRUFFLE_CEXT, "PySequence_Check", to_java(s)));
202+
return UPCALL_CEXT_I("PySequence_Check", native_to_java(s));
238203
}
239204

240205
Py_ssize_t PySequence_Size(PyObject *s) {
241-
return polyglot_as_i64(polyglot_invoke(PY_TRUFFLE_CEXT, "PyObject_Size", to_java(s)));
206+
return UPCALL_CEXT_L("PyObject_Size", native_to_java(s));
242207
}
243208

244209
// taken from CPython "Objects/abstract.c"
@@ -249,39 +214,23 @@ Py_ssize_t PySequence_Length(PyObject *s) {
249214
#define PySequence_Length PySequence_Size
250215

251216
PyObject* PySequence_GetItem(PyObject *s, Py_ssize_t i) {
252-
void* result = polyglot_invoke(PY_TRUFFLE_CEXT, "PySequence_GetItem", to_java(s), i);
253-
if(result == ERROR_MARKER) {
254-
return NULL;
255-
}
256-
return to_sulong(result);
217+
return UPCALL_CEXT_O("PySequence_GetItem", native_to_java(s), i);
257218
}
258219

259220
int PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o) {
260-
return polyglot_as_i32(polyglot_invoke(PY_TRUFFLE_CEXT, "PySequence_SetItem", to_java(s), i, to_java(o)));
221+
return UPCALL_CEXT_I("PySequence_SetItem", native_to_java(s), i, native_to_java(o));
261222
}
262223

263224
PyObject* PySequence_Tuple(PyObject *v) {
264-
void* result = polyglot_invoke(PY_TRUFFLE_CEXT, "PySequence_Tuple", to_java(v));
265-
if(result == ERROR_MARKER) {
266-
return NULL;
267-
}
268-
return to_sulong(result);
225+
return UPCALL_CEXT_O("PySequence_Tuple", native_to_java(v));
269226
}
270227

271228
PyObject * PySequence_Fast(PyObject *v, const char *m) {
272-
void* result = polyglot_invoke(PY_TRUFFLE_CEXT, "PySequence_Fast", to_java(v), polyglot_from_string(m, "ascii"));
273-
if(result == ERROR_MARKER) {
274-
return NULL;
275-
}
276-
return to_sulong(result);
229+
return UPCALL_CEXT_O("PySequence_Fast", native_to_java(v), polyglot_from_string(m, SRC_CS));
277230
}
278231

279232
PyObject * PyMapping_GetItemString(PyObject *o, const char *key) {
280-
void* result = polyglot_invoke(PY_TRUFFLE_CEXT, "PyObject_GetItem", to_java(o), polyglot_from_string(key, "utf-8"));
281-
if(result == ERROR_MARKER) {
282-
return NULL;
283-
}
284-
return to_sulong(result);
233+
return UPCALL_CEXT_O("PyObject_GetItem", native_to_java(o), polyglot_from_string(key, SRC_CS));
285234
}
286235

287236
// taken from CPython "Objects/abstract.c"

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

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -49,50 +49,32 @@ PyTypeObject PyBytes_Type = PY_TRUFFLE_TYPE("bytes", &PyType_Type, Py_TPFLAGS_DE
4949
PyObject* PyBytes_FromStringAndSize(const char* str, Py_ssize_t sz) {
5050
setlocale(LC_ALL, NULL);
5151
const char* encoding = nl_langinfo(CODESET);
52-
return to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyBytes_FromStringAndSize", truffle_read_n_string(str, sz), truffle_read_string(encoding)));
52+
void *jstr = str != NULL ? polyglot_from_string_n(str, sz, SRC_CS) : to_java(NULL);
53+
return UPCALL_CEXT_O("PyBytes_FromStringAndSize", jstr, polyglot_from_string(encoding, SRC_CS));
5354
}
5455

5556
PyObject * PyBytes_FromString(const char *str) {
5657
setlocale(LC_ALL, NULL);
5758
const char* encoding = nl_langinfo(CODESET);
58-
return to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyBytes_FromStringAndSize", truffle_read_string(str), truffle_read_string(encoding)));
59+
return UPCALL_CEXT_O("PyBytes_FromStringAndSize", polyglot_from_string(str, SRC_CS), polyglot_from_string(encoding, SRC_CS));
5960
}
6061

6162
char* PyBytes_AsString(PyObject *obj) {
62-
if (obj == NULL) {
63-
return NULL;
64-
}
65-
// returns a Java byte array
66-
void *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyTruffle_Bytes_AsString", to_java(obj), ERROR_MARKER);
67-
if (result == ERROR_MARKER) {
68-
return NULL;
69-
}
70-
if(truffle_has_size(result)) {
71-
int n = truffle_get_size(result);
72-
char *barr = (char *) malloc(n*sizeof(char));
73-
74-
// we need to read element-by-element
75-
int i;
76-
for(i=0; i < n; i++) {
77-
barr[i] = truffle_read_idx_c(result, i);
78-
}
79-
return barr;
80-
}
81-
return NULL;
63+
return UPCALL_CEXT_NOCAST("PyTruffle_Bytes_AsString", native_to_java(obj), ERROR_MARKER);
8264
}
8365

8466
int PyBytes_AsStringAndSize(PyObject *obj, char **s, Py_ssize_t *len) {
8567
setlocale(LC_ALL, NULL);
8668
const char* encoding = nl_langinfo(CODESET);
87-
PyObject *result = to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyBytes_AsStringCheckEmbeddedNull", to_java(obj), truffle_read_string(encoding)));
69+
PyObject *result = UPCALL_CEXT_O("PyBytes_AsStringCheckEmbeddedNull", native_to_java(obj), polyglot_from_string(encoding, SRC_CS));
8870
if(result == NULL) {
8971
return -1;
9072
}
9173

9274
*s = as_char_pointer(result);
9375

9476
if (len != NULL) {
95-
*len = truffle_invoke_i(PY_TRUFFLE_CEXT, "PyObject_LEN", to_java(obj));
77+
*len = polyglot_as_i64(polyglot_invoke(PY_TRUFFLE_CEXT, "PyTruffle_Object_LEN", native_to_java(obj)));
9678
}
9779

9880
return 0;
@@ -218,17 +200,16 @@ PyBytes_FromFormatV(const char *format, va_list vargs) {
218200

219201
default:
220202
// TODO correctly handle this case
221-
return to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyBytes_FromFormat", truffle_read_string(format), f+i));
222-
203+
return UPCALL_CEXT_O("PyBytes_FromFormat", polyglot_from_string(format, SRC_CS), f+i);
223204
}
224205
}
225206

226207

227-
#define SETARG(__args, __i, __arg) truffle_invoke(PY_TRUFFLE_CEXT, "PyTuple_SetItem", (__args), (__i), (__arg));
208+
#define SETARG(__args, __i, __arg) UPCALL_CEXT_I("PyTuple_SetItem", native_to_java(__args), (__i), (__arg))
228209

229210
// do actual conversion using one-character type specifiers
230211
int conversions = strlen(buffer);
231-
PyObject* args = to_java(PyTuple_New(conversions));
212+
PyObject* args = PyTuple_New(conversions);
232213
for (int i=0; i < conversions; i++) {
233214
switch(buffer[i]) {
234215
case 'c':
@@ -250,19 +231,18 @@ PyBytes_FromFormatV(const char *format, va_list vargs) {
250231
SETARG(args, i, va_arg(vargs, size_t));
251232
break;
252233
case 's':
253-
SETARG(args, i, truffle_read_string(va_arg(vargs, const char*)));
234+
SETARG(args, i, polyglot_from_string(va_arg(vargs, const char*), SRC_CS));
254235
break;
255236
case 'p':
256-
SETARG(args, i, to_java(va_arg(vargs, void*)));
237+
SETARG(args, i, native_to_java(va_arg(vargs, void*)));
257238
break;
258239
}
259240
}
260-
PyObject *res = to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyBytes_FromFormat", truffle_read_string(format), args));
261-
return res;
241+
return UPCALL_CEXT_O("PyBytes_FromFormat", polyglot_from_string(format, SRC_CS), native_to_java(args));
262242
}
263243

264244
void PyBytes_Concat(PyObject **bytes, PyObject *newpart) {
265-
*bytes = to_sulong(truffle_invoke(PY_TRUFFLE_CEXT, "PyBytes_Concat", to_java(*bytes), to_java(newpart)));
245+
*bytes = UPCALL_CEXT_O("PyBytes_Concat", native_to_java(*bytes), native_to_java(newpart));
266246
}
267247

268248
void PyBytes_ConcatAndDel(PyObject **bytes, PyObject *newpart) {
@@ -271,9 +251,17 @@ void PyBytes_ConcatAndDel(PyObject **bytes, PyObject *newpart) {
271251
}
272252

273253
Py_ssize_t PyBytes_Size(PyObject *bytes) {
274-
return truffle_invoke_i(PY_TRUFFLE_CEXT, "PyBytes_Size", to_java(bytes));
254+
return UPCALL_CEXT_L("PyBytes_Size", native_to_java(bytes));
275255
}
276256

277257
int bytes_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags) {
278258
return PyBuffer_FillInfo(view, (PyObject*)self, (void *)self->ob_sval, Py_SIZE(self), 1, flags);
279259
}
260+
261+
int bytes_copy2mem(char* target, char* source, size_t nbytes) {
262+
size_t i;
263+
for (i = 0; i < nbytes; i++) {
264+
target[i] = source[i];
265+
}
266+
return 0;
267+
}

0 commit comments

Comments
 (0)