Skip to content

Commit 20c2e29

Browse files
committed
Do not expect primitive values in 'Read/WriteMember' functions.
1 parent 535459f commit 20c2e29

File tree

2 files changed

+85
-83
lines changed

2 files changed

+85
-83
lines changed

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

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -213,33 +213,33 @@ const char* PyTruffle_StringToCstr(void* jlString) {
213213
return truffle_string_to_cstr(jlString);
214214
}
215215

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

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

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

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

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

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

238-
void* ReadStringMember(PyObject* object, int offset) {
238+
void* ReadStringMember(PyObject* object, PyObject* offset) {
239239
return truffle_read_string(ReadMember(object, offset, char*));
240240
}
241241

242-
PyObject* ReadObjectMember(PyObject* object, int offset) {
242+
PyObject* ReadObjectMember(PyObject* object, PyObject* offset) {
243243
PyObject* member = ReadMember(object, offset, PyObject*);
244244
if (member == NULL) {
245245
return Py_None;
@@ -248,36 +248,36 @@ PyObject* ReadObjectMember(PyObject* object, int offset) {
248248
}
249249
}
250250

251-
char ReadCharMember(PyObject* object, int offset) {
251+
char ReadCharMember(PyObject* object, PyObject* offset) {
252252
return ReadMember(object, offset, char);
253253
}
254254

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

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

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

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

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

275-
char ReadBoolMember(PyObject* object, int offset) {
275+
char ReadBoolMember(PyObject* object, PyObject* offset) {
276276
char flag = ReadMember(object, offset, char);
277277
return flag ? Py_True : Py_False;
278278
}
279279

280-
PyObject* ReadObjectExMember(PyObject* object, int offset) {
280+
PyObject* ReadObjectExMember(PyObject* object, PyObject* offset) {
281281
PyObject* member = ReadMember(object, offset, PyObject*);
282282
if (member == NULL) {
283283
PyErr_SetString(PyExc_ValueError, "member must not be NULL");
@@ -287,98 +287,100 @@ PyObject* ReadObjectExMember(PyObject* object, int offset) {
287287
}
288288
}
289289

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

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

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

302302
#undef ReadMember
303303

304-
#define WriteMember(object, offset, value, T) *(T*)(((char*)object) + offset) = value;
304+
#define WriteMember(object, offset, value, T) do {\
305+
*(T*)(((char*)object) + PyLong_AsSsize_t(offset)) = (T)(value); \
306+
} while(0)
305307

306-
void WriteShortMember(PyObject* object, int offset, short value) {
307-
WriteMember(object, offset, value, short);
308+
void WriteShortMember(PyObject* object, PyObject* offset, PyObject* value) {
309+
WriteMember(object, offset, PyLong_AsLong(value), short);
308310
}
309311

310-
void WriteIntMember(PyObject* object, int offset, int value) {
311-
WriteMember(object, offset, value, int);
312+
void WriteIntMember(PyObject* object, PyObject* offset, PyObject* value) {
313+
WriteMember(object, offset, PyLong_AsLong(value), int);
312314
}
313315

314-
void WriteLongMember(PyObject* object, int offset, long value) {
315-
WriteMember(object, offset, value, long);
316+
void WriteLongMember(PyObject* object, PyObject* offset, PyObject* value) {
317+
WriteMember(object, offset, PyLong_AsLong(value), long);
316318
}
317319

318-
void WriteFloatMember(PyObject* object, int offset, float value) {
319-
WriteMember(object, offset, value, float);
320+
void WriteFloatMember(PyObject* object, PyObject* offset, PyObject* value) {
321+
WriteMember(object, offset, PyFloat_AsDouble(value), float);
320322
}
321323

322-
void WriteDoubleMember(PyObject* object, int offset, double value) {
323-
WriteMember(object, offset, value, double);
324+
void WriteDoubleMember(PyObject* object, PyObject* offset, PyObject* value) {
325+
WriteMember(object, offset, PyFloat_AsDouble(value), double);
324326
}
325327

326-
void WriteStringMember(PyObject* object, int offset, PyObject* value) {
328+
void WriteStringMember(PyObject* object, PyObject* offset, PyObject* value) {
327329
WriteMember(object, offset, as_char_pointer(value), char*);
328330
}
329331

330-
void WriteObjectMember(PyObject* object, int offset, PyObject* value) {
332+
void WriteObjectMember(PyObject* object, PyObject* offset, PyObject* value) {
331333
WriteMember(object, offset, value, PyObject*);
332334
}
333335

334-
void WriteCharMember(PyObject* object, int offset, PyObject* value) {
336+
void WriteCharMember(PyObject* object, PyObject* offset, PyObject* value) {
335337
const char* ptr = as_char_pointer(value);
336338
const char c = ptr[0];
337339
truffle_free_cstr(ptr);
338340
WriteMember(object, offset, c, char);
339341
}
340342

341-
void WriteByteMember(PyObject* object, int offset, PyObject* value) {
343+
void WriteByteMember(PyObject* object, PyObject* offset, PyObject* value) {
342344
WriteCharMember(object, offset, value);
343345
}
344346

345-
void WriteUByteMember(PyObject* object, int offset, PyObject* value) {
347+
void WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value) {
346348
WriteCharMember(object, offset, value);
347349
}
348350

349-
void WriteUShortMember(PyObject* object, int offset, unsigned short value) {
350-
WriteMember(object, offset, value, unsigned short);
351+
void WriteUShortMember(PyObject* object, PyObject* offset, PyObject* value) {
352+
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned short);
351353
}
352354

353-
void WriteUIntMember(PyObject* object, int offset, unsigned int value) {
354-
WriteMember(object, offset, value, unsigned int);
355+
void WriteUIntMember(PyObject* object, PyObject* offset, PyObject* value) {
356+
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned int);
355357
}
356358

357-
void WriteULongMember(PyObject* object, int offset, unsigned long value) {
358-
WriteMember(object, offset, value, unsigned long);
359+
void WriteULongMember(PyObject* object, PyObject* offset, PyObject* value) {
360+
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned long);
359361
}
360362

361-
void WriteBoolMember(PyObject* object, int offset, PyObject* value) {
363+
void WriteBoolMember(PyObject* object, PyObject* offset, PyObject* value) {
362364
WriteMember(object, offset, truffle_invoke(to_java(value), "__bool__") == Py_True ? (char)1 : (char)0, char);
363365
}
364366

365-
void WriteObjectExMember(PyObject* object, int offset, PyObject* value) {
367+
void WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* value) {
366368
if (value == NULL) {
367369
PyErr_SetString(PyExc_ValueError, "member must not be NULL");
368370
} else {
369371
WriteMember(object, offset, value, PyObject*);
370372
}
371373
}
372374

373-
void WriteLongLongMember(PyObject* object, int offset, long long value) {
375+
void WriteLongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
374376
WriteMember(object, offset, value, long long);
375377
}
376378

377-
void WriteULongLongMember(PyObject* object, int offset, unsigned long long value) {
379+
void WriteULongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
378380
WriteMember(object, offset, value, unsigned long long);
379381
}
380382

381-
void WritePySSizeT(PyObject* object, int offset, Py_ssize_t value) {
383+
void WritePySSizeT(PyObject* object, PyObject* offset, PyObject* value) {
382384
WriteMember(object, offset, value, Py_ssize_t);
383385
}
384386

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

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

193-
extern short ReadShortMember(PyObject* object, int offset);
194-
extern int ReadIntMember(PyObject* object, int offset);
195-
extern long ReadLongMember(PyObject* object, int offset);
196-
extern float ReadFloatMember(PyObject* object, int offset);
197-
extern double ReadDoubleMember(PyObject* object, int offset);
198-
extern void* ReadStringMember(PyObject* object, int offset);
199-
extern PyObject* ReadObjectMember(PyObject* object, int offset);
200-
extern char ReadCharMember(PyObject* object, int offset);
201-
extern char ReadByteMember(PyObject* object, int offset);
202-
extern unsigned char ReadUByteMember(PyObject* object, int offset);
203-
extern unsigned short ReadUShortMember(PyObject* object, int offset);
204-
extern unsigned int ReadUIntMember(PyObject* object, int offset);
205-
extern unsigned long ReadULongMember(PyObject* object, int offset);
206-
extern char ReadBoolMember(PyObject* object, int offset);
207-
extern PyObject* ReadObjectExMember(PyObject* object, int offset);
208-
extern long long ReadLongLongMember(PyObject* object, int offset);
209-
extern unsigned long long ReadULongLongMember(PyObject* object, int offset);
210-
extern Py_ssize_t ReadPySSizeT(PyObject* object, int offset);
211-
212-
extern void WriteShortMember(PyObject* object, int offset, short value);
213-
extern void WriteIntMember(PyObject* object, int offset, int value);
214-
extern void WriteLongMember(PyObject* object, int offset, long value);
215-
extern void WriteFloatMember(PyObject* object, int offset, float value);
216-
extern void WriteDoubleMember(PyObject* object, int offset, double value);
217-
extern void WriteStringMember(PyObject* object, int offset, PyObject* value);
218-
extern void WriteObjectMember(PyObject* object, int offset, PyObject* value);
219-
extern void WriteCharMember(PyObject* object, int offset, PyObject* value);
220-
extern void WriteByteMember(PyObject* object, int offset, PyObject* value);
221-
extern void WriteUByteMember(PyObject* object, int offset, PyObject* value);
222-
extern void WriteUShortMember(PyObject* object, int offset, unsigned short value);
223-
extern void WriteUIntMember(PyObject* object, int offset, unsigned int value);
224-
extern void WriteULongMember(PyObject* object, int offset, unsigned long value);
225-
extern void WriteBoolMember(PyObject* object, int offset, PyObject* value);
226-
extern void WriteObjectExMember(PyObject* object, int offset, PyObject* value);
227-
extern void WriteLongLongMember(PyObject* object, int offset, long long value);
228-
extern void WriteULongLongMember(PyObject* object, int offset, unsigned long long value);
229-
extern void WritePySSizeT(PyObject* object, int offset, Py_ssize_t value);
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);
199+
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);
207+
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);
211+
212+
extern void WriteShortMember(PyObject* object, PyObject* offset, PyObject* value);
213+
extern void WriteIntMember(PyObject* object, PyObject* offset, PyObject* value);
214+
extern void WriteLongMember(PyObject* object, PyObject* offset, PyObject* value);
215+
extern void WriteFloatMember(PyObject* object, PyObject* offset, PyObject* value);
216+
extern void WriteDoubleMember(PyObject* object, PyObject* offset, PyObject* value);
217+
extern void WriteStringMember(PyObject* object, PyObject* offset, PyObject* value);
218+
extern void WriteObjectMember(PyObject* object, PyObject* offset, PyObject* value);
219+
extern void WriteCharMember(PyObject* object, PyObject* offset, PyObject* value);
220+
extern void WriteByteMember(PyObject* object, PyObject* offset, PyObject* value);
221+
extern void WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value);
222+
extern void WriteUShortMember(PyObject* object, PyObject* offset, PyObject* value);
223+
extern void WriteUIntMember(PyObject* object, PyObject* offset, PyObject* value);
224+
extern void WriteULongMember(PyObject* object, PyObject* offset, PyObject* value);
225+
extern void WriteBoolMember(PyObject* object, PyObject* offset, PyObject* value);
226+
extern void WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* value);
227+
extern void WriteLongLongMember(PyObject* object, PyObject* offset, PyObject* value);
228+
extern void WriteULongLongMember(PyObject* object, PyObject* offset, PyObject* value);
229+
extern void WritePySSizeT(PyObject* object, PyObject* offset, PyObject* value);
230230

231231
extern PyObject marker_struct;
232232
#define ERROR_MARKER &marker_struct

0 commit comments

Comments
 (0)