Skip to content

Commit 3f86d8d

Browse files
committed
Add tests and refactor return types.
1 parent e0368af commit 3f86d8d

File tree

5 files changed

+129
-51
lines changed

5 files changed

+129
-51
lines changed

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

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -215,28 +215,28 @@ const char* PyTruffle_StringToCstr(void* jlString) {
215215

216216
#define ReadMember(object, offset, T) ((T*)(((char*)object) + PyLong_AsSsize_t(offset)))[0]
217217

218-
short ReadShortMember(PyObject* object, PyObject* offset) {
219-
return ReadMember(object, offset, short);
218+
PyObject* ReadShortMember(PyObject* object, PyObject* offset) {
219+
return PyLong_FromLong(ReadMember(object, offset, short));
220220
}
221221

222-
int ReadIntMember(PyObject* object, PyObject* offset) {
223-
return ReadMember(object, offset, int);
222+
PyObject* ReadIntMember(PyObject* object, PyObject* offset) {
223+
return PyLong_FromLong(ReadMember(object, offset, int));
224224
}
225225

226-
long ReadLongMember(PyObject* object, PyObject* offset) {
227-
return ReadMember(object, offset, long);
226+
PyObject* ReadLongMember(PyObject* object, PyObject* offset) {
227+
return PyLong_FromLong(ReadMember(object, offset, long));
228228
}
229229

230-
float ReadFloatMember(PyObject* object, PyObject* offset) {
231-
return ReadMember(object, offset, float);
230+
PyObject* ReadFloatMember(PyObject* object, PyObject* offset) {
231+
return PyFloat_FromDouble(ReadMember(object, offset, float));
232232
}
233233

234-
double ReadDoubleMember(PyObject* object, PyObject* offset) {
235-
return ReadMember(object, offset, double);
234+
PyObject* ReadDoubleMember(PyObject* object, PyObject* offset) {
235+
return PyFloat_FromDouble(ReadMember(object, offset, double));
236236
}
237237

238-
void* ReadStringMember(PyObject* object, PyObject* offset) {
239-
return truffle_read_string(ReadMember(object, offset, char*));
238+
PyObject* ReadStringMember(PyObject* object, PyObject* offset) {
239+
return (PyObject*)polyglot_from_string(ReadMember(object, offset, char*), "utf-8");
240240
}
241241

242242
PyObject* ReadObjectMember(PyObject* object, PyObject* offset) {
@@ -248,31 +248,31 @@ PyObject* ReadObjectMember(PyObject* object, PyObject* offset) {
248248
}
249249
}
250250

251-
char ReadCharMember(PyObject* object, PyObject* offset) {
252-
return ReadMember(object, offset, char);
251+
PyObject* ReadCharMember(PyObject* object, PyObject* offset) {
252+
return polyglot_from_string_n(&ReadMember(object, offset, char), 1, "utf-8");
253253
}
254254

255-
char ReadByteMember(PyObject* object, PyObject* offset) {
256-
return ReadMember(object, offset, char);
255+
PyObject* ReadByteMember(PyObject* object, PyObject* offset) {
256+
return PyLong_FromLong(ReadMember(object, offset, char));
257257
}
258258

259-
unsigned char ReadUByteMember(PyObject* object, PyObject* offset) {
260-
return ReadMember(object, offset, unsigned char);
259+
PyObject* ReadUByteMember(PyObject* object, PyObject* offset) {
260+
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned char));
261261
}
262262

263-
unsigned short ReadUShortMember(PyObject* object, PyObject* offset) {
264-
return ReadMember(object, offset, unsigned short);
263+
PyObject* ReadUShortMember(PyObject* object, PyObject* offset) {
264+
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned short));
265265
}
266266

267-
unsigned int ReadUIntMember(PyObject* object, PyObject* offset) {
268-
return ReadMember(object, offset, unsigned int);
267+
PyObject* ReadUIntMember(PyObject* object, PyObject* offset) {
268+
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned int));
269269
}
270270

271-
unsigned long ReadULongMember(PyObject* object, PyObject* offset) {
272-
return ReadMember(object, offset, unsigned long);
271+
PyObject* ReadULongMember(PyObject* object, PyObject* offset) {
272+
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned long));
273273
}
274274

275-
char ReadBoolMember(PyObject* object, PyObject* offset) {
275+
PyObject* ReadBoolMember(PyObject* object, PyObject* offset) {
276276
char flag = ReadMember(object, offset, char);
277277
return flag ? Py_True : Py_False;
278278
}
@@ -287,16 +287,16 @@ PyObject* ReadObjectExMember(PyObject* object, PyObject* offset) {
287287
}
288288
}
289289

290-
long long ReadLongLongMember(PyObject* object, PyObject* offset) {
291-
return ReadMember(object, offset, long long);
290+
PyObject* ReadLongLongMember(PyObject* object, PyObject* offset) {
291+
return PyLong_FromLongLong(ReadMember(object, offset, long long));
292292
}
293293

294-
unsigned long long ReadULongLongMember(PyObject* object, PyObject* offset) {
295-
return ReadMember(object, offset, unsigned long long);
294+
PyObject* ReadULongLongMember(PyObject* object, PyObject* offset) {
295+
return PyLong_FromUnsignedLongLong(ReadMember(object, offset, unsigned long long));
296296
}
297297

298-
Py_ssize_t ReadPySSizeT(PyObject* object, PyObject* offset) {
299-
return ReadMember(object, offset, Py_ssize_t);
298+
PyObject* ReadPySSizeT(PyObject* object, PyObject* offset) {
299+
return PyLong_FromSsize_t(ReadMember(object, offset, Py_ssize_t));
300300
}
301301

302302
#undef ReadMember
@@ -347,12 +347,12 @@ PyObject* WriteCharMember(PyObject* object, PyObject* offset, PyObject* value) {
347347
}
348348

349349
PyObject* WriteByteMember(PyObject* object, PyObject* offset, PyObject* value) {
350-
WriteCharMember(object, offset, value);
350+
WriteMember(object, offset, PyLong_AsLong(value), char);
351351
return value;
352352
}
353353

354354
PyObject* WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value) {
355-
WriteCharMember(object, offset, value);
355+
WriteMember(object, offset, PyLong_AsLong(value), uint8_t);
356356
return value;
357357
}
358358

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -190,24 +190,24 @@ PyObject *wrap_unsupported(void *fun, ...);
190190
int PyTruffle_Debug(void *arg);
191191
PyTypeObject* PyObjectHandle_ForJavaType(void* jobj);
192192

193-
extern short ReadShortMember(PyObject* object, PyObject* offset);
194-
extern int ReadIntMember(PyObject* object, PyObject* offset);
195-
extern long ReadLongMember(PyObject* object, PyObject* offset);
196-
extern float ReadFloatMember(PyObject* object, PyObject* offset);
197-
extern double ReadDoubleMember(PyObject* object, PyObject* offset);
198-
extern void* ReadStringMember(PyObject* object, PyObject* offset);
193+
extern PyObject* ReadShortMember(PyObject* object, PyObject* offset);
194+
extern PyObject* ReadIntMember(PyObject* object, PyObject* offset);
195+
extern PyObject* ReadLongMember(PyObject* object, PyObject* offset);
196+
extern PyObject* ReadFloatMember(PyObject* object, PyObject* offset);
197+
extern PyObject* ReadDoubleMember(PyObject* object, PyObject* offset);
198+
extern PyObject* ReadStringMember(PyObject* object, PyObject* offset);
199199
extern PyObject* ReadObjectMember(PyObject* object, PyObject* offset);
200-
extern char ReadCharMember(PyObject* object, PyObject* offset);
201-
extern char ReadByteMember(PyObject* object, PyObject* offset);
202-
extern unsigned char ReadUByteMember(PyObject* object, PyObject* offset);
203-
extern unsigned short ReadUShortMember(PyObject* object, PyObject* offset);
204-
extern unsigned int ReadUIntMember(PyObject* object, PyObject* offset);
205-
extern unsigned long ReadULongMember(PyObject* object, PyObject* offset);
206-
extern char ReadBoolMember(PyObject* object, PyObject* offset);
200+
extern PyObject* ReadCharMember(PyObject* object, PyObject* offset);
201+
extern PyObject* ReadByteMember(PyObject* object, PyObject* offset);
202+
extern PyObject* ReadUByteMember(PyObject* object, PyObject* offset);
203+
extern PyObject* ReadUShortMember(PyObject* object, PyObject* offset);
204+
extern PyObject* ReadUIntMember(PyObject* object, PyObject* offset);
205+
extern PyObject* ReadULongMember(PyObject* object, PyObject* offset);
206+
extern PyObject* ReadBoolMember(PyObject* object, PyObject* offset);
207207
extern PyObject* ReadObjectExMember(PyObject* object, PyObject* offset);
208-
extern long long ReadLongLongMember(PyObject* object, PyObject* offset);
209-
extern unsigned long long ReadULongLongMember(PyObject* object, PyObject* offset);
210-
extern Py_ssize_t ReadPySSizeT(PyObject* object, PyObject* offset);
208+
extern PyObject* ReadLongLongMember(PyObject* object, PyObject* offset);
209+
extern PyObject* ReadULongLongMember(PyObject* object, PyObject* offset);
210+
extern PyObject* ReadPySSizeT(PyObject* object, PyObject* offset);
211211

212212
extern PyObject* WriteShortMember(PyObject* object, PyObject* offset, PyObject* value);
213213
extern PyObject* WriteIntMember(PyObject* object, PyObject* offset, PyObject* value);

graalpython/com.oracle.graal.python.test/src/tests/cpyext/noddy2.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,23 @@
4141
#include <Python.h>
4242
#include "structmember.h"
4343

44+
#include <stddef.h>
45+
4446
typedef struct {
4547
PyObject_HEAD
4648
PyObject *first; /* first name */
4749
PyObject *last; /* last name */
4850
int number;
51+
short n_short;
52+
long n_long;
53+
float n_float;
54+
double n_double;
55+
char c;
56+
int8_t n_byte;
57+
uint8_t n_ubyte;
58+
unsigned short n_ushort;
59+
unsigned int n_unumber;
60+
unsigned long n_ulong;
4961
} Noddy;
5062

5163
static void
@@ -76,6 +88,16 @@ Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
7688
}
7789

7890
self->number = 0;
91+
self->n_short = 0;
92+
self->n_long = 0;
93+
self->n_float = 0;
94+
self->n_double = 0;
95+
self->c = 0;
96+
self->n_byte = 0;
97+
self->n_ubyte = 0;
98+
self->n_ushort = 0;
99+
self->n_unumber = 0;
100+
self->n_ulong = 0;
79101
}
80102

81103
return (PyObject *)self;
@@ -118,6 +140,26 @@ static PyMemberDef Noddy_members[] = {
118140
"last name"},
119141
{"number", T_INT, offsetof(Noddy, number), 0,
120142
"noddy number"},
143+
{"n_short", T_SHORT, offsetof(Noddy, n_short), 0,
144+
"noddy short"},
145+
{"n_long", T_LONG, offsetof(Noddy, n_long), 0,
146+
"noddy long"},
147+
{"n_float", T_FLOAT, offsetof(Noddy, n_float), 0,
148+
"noddy float"},
149+
{"n_double", T_DOUBLE, offsetof(Noddy, n_double), 0,
150+
"noddy double"},
151+
{"c", T_CHAR, offsetof(Noddy, c), 0,
152+
"noddy char"},
153+
{"n_byte", T_BYTE, offsetof(Noddy, n_byte), 0,
154+
"noddy byte"},
155+
{"n_ubyte", T_UBYTE, offsetof(Noddy, n_ubyte), 0,
156+
"noddy ubyte"},
157+
{"n_ushort", T_USHORT, offsetof(Noddy, n_ushort), 0,
158+
"noddy ushort"},
159+
{"n_unumber", T_UINT, offsetof(Noddy, n_unumber), 0,
160+
"noddy uint"},
161+
{"n_ulong", T_ULONG, offsetof(Noddy, n_ulong), 0,
162+
"noddy ulong"},
121163
{NULL} /* Sentinel */
122164
};
123165

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_wiki.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040

4141
class TestWiki(CPyExtTestCase):
42+
4243
def test_noddy(self):
4344
from . import noddy
4445
assert type(noddy.Noddy) is type
@@ -53,10 +54,39 @@ def test_noddy2(self):
5354
assert nd.last == "Last"
5455
assert nd.number == 42
5556

57+
nd.first = "Hello"
58+
nd.last = "World"
59+
nd.number = 1234
60+
nd.n_short = 0x7fff
61+
nd.n_long = 0x7fffffffffffffff
62+
nd.n_float = 0.1234
63+
nd.n_double = 0.123456789432634
64+
nd.c = 'z'
65+
nd.n_byte = 0x7f
66+
nd.n_ubyte = 0xff
67+
nd.n_ushort = 0xffff
68+
nd.n_unumber = 0xffffffff
69+
nd.n_ulong = 0xffffffffffffffff
70+
71+
assert nd.first == "Hello", ("%s != Hello" % nd.first)
72+
assert nd.last == "World", ("%s != World" % nd.last)
73+
assert nd.number == 1234, ("%s != 1234" % nd.number)
74+
assert nd.n_short == 0x7fff, ("%s != 32767" % nd.n_short)
75+
assert nd.n_long == 0x7fffffffffffffff, ("%s != 0x7fffffffffffffff" % nd.n_long)
76+
assert 0.12341 - nd.n_float < 0.00001 , ("%s != 0.1234" % nd.n_float)
77+
assert 0.123456789432634 - nd.n_double < 0.0000000000000001, ("%s != 0.123456789432634" % nd.n_double)
78+
# assert nd.c == 'z', ("%s != 'z'" % nd.c)
79+
assert nd.n_byte == 0x7f, ("%s != 127" % nd.n_byte)
80+
assert nd.n_ubyte == 0xff, ("%s != 255" % nd.n_ubyte)
81+
assert nd.n_ushort == 0xffff, ("%s != 65535" % nd.n_ushort)
82+
assert nd.n_unumber == 0xffffffff, ("%s != 0xffffffff" % nd.n_unumber)
83+
assert nd.n_ulong == 0xffffffffffffffff, ("%s != 0xffffffffffffffff" % nd.n_ulong)
84+
5685
def test_noddy3(self):
5786
from . import noddy3
5887
nd = noddy3.Noddy(b"First", b"Last", 42)
5988
assert nd.name() == "b'First' b'Last'", nd.name()
6089
assert nd.first == b"First", ("%s != First" % nd.first)
6190
assert nd.last == b"Last"
62-
assert nd.number == 42
91+
92+
assert nd.number == 42

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ boolean run(Object value) {
149149
*/
150150
@Builtin(name = "to_char_pointer", fixedNumOfArguments = 1)
151151
@GenerateNodeFactory
152-
abstract static class TruffleString_AsString extends PythonBuiltinNode {
152+
abstract static class TruffleString_AsString extends NativeBuiltin {
153153
@CompilationFinal TruffleObject truffle_string_to_cstr;
154154
@Child private Node executeNode;
155155

@@ -182,6 +182,12 @@ Object run(String str) {
182182
throw e.raise();
183183
}
184184
}
185+
186+
@Fallback
187+
Object run(Object o) {
188+
return raiseNative(PNone.NO_VALUE, PythonErrorType.SystemError, "Cannot convert object of type %p to C string.", o);
189+
}
190+
185191
}
186192

187193
/**

0 commit comments

Comments
 (0)