Skip to content

Commit e0368af

Browse files
committed
Fix: 'Write*Member' functions must return non-NULL value on success.
1 parent 20c2e29 commit e0368af

File tree

2 files changed

+56
-39
lines changed

2 files changed

+56
-39
lines changed

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

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -301,87 +301,104 @@ Py_ssize_t ReadPySSizeT(PyObject* object, PyObject* offset) {
301301

302302
#undef ReadMember
303303

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

308-
void WriteShortMember(PyObject* object, PyObject* offset, PyObject* value) {
306+
PyObject* WriteShortMember(PyObject* object, PyObject* offset, PyObject* value) {
309307
WriteMember(object, offset, PyLong_AsLong(value), short);
308+
return value;
310309
}
311310

312-
void WriteIntMember(PyObject* object, PyObject* offset, PyObject* value) {
311+
PyObject* WriteIntMember(PyObject* object, PyObject* offset, PyObject* value) {
313312
WriteMember(object, offset, PyLong_AsLong(value), int);
313+
return value;
314314
}
315315

316-
void WriteLongMember(PyObject* object, PyObject* offset, PyObject* value) {
316+
PyObject* WriteLongMember(PyObject* object, PyObject* offset, PyObject* value) {
317317
WriteMember(object, offset, PyLong_AsLong(value), long);
318+
return value;
318319
}
319320

320-
void WriteFloatMember(PyObject* object, PyObject* offset, PyObject* value) {
321+
PyObject* WriteFloatMember(PyObject* object, PyObject* offset, PyObject* value) {
321322
WriteMember(object, offset, PyFloat_AsDouble(value), float);
323+
return value;
322324
}
323325

324-
void WriteDoubleMember(PyObject* object, PyObject* offset, PyObject* value) {
326+
PyObject* WriteDoubleMember(PyObject* object, PyObject* offset, PyObject* value) {
325327
WriteMember(object, offset, PyFloat_AsDouble(value), double);
328+
return value;
326329
}
327330

328-
void WriteStringMember(PyObject* object, PyObject* offset, PyObject* value) {
331+
PyObject* WriteStringMember(PyObject* object, PyObject* offset, PyObject* value) {
329332
WriteMember(object, offset, as_char_pointer(value), char*);
333+
return value;
330334
}
331335

332-
void WriteObjectMember(PyObject* object, PyObject* offset, PyObject* value) {
336+
PyObject* WriteObjectMember(PyObject* object, PyObject* offset, PyObject* value) {
333337
WriteMember(object, offset, value, PyObject*);
338+
return value;
334339
}
335340

336-
void WriteCharMember(PyObject* object, PyObject* offset, PyObject* value) {
341+
PyObject* WriteCharMember(PyObject* object, PyObject* offset, PyObject* value) {
337342
const char* ptr = as_char_pointer(value);
338343
const char c = ptr[0];
339344
truffle_free_cstr(ptr);
340345
WriteMember(object, offset, c, char);
346+
return value;
341347
}
342348

343-
void WriteByteMember(PyObject* object, PyObject* offset, PyObject* value) {
349+
PyObject* WriteByteMember(PyObject* object, PyObject* offset, PyObject* value) {
344350
WriteCharMember(object, offset, value);
351+
return value;
345352
}
346353

347-
void WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value) {
354+
PyObject* WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value) {
348355
WriteCharMember(object, offset, value);
356+
return value;
349357
}
350358

351-
void WriteUShortMember(PyObject* object, PyObject* offset, PyObject* value) {
359+
PyObject* WriteUShortMember(PyObject* object, PyObject* offset, PyObject* value) {
352360
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned short);
361+
return value;
353362
}
354363

355-
void WriteUIntMember(PyObject* object, PyObject* offset, PyObject* value) {
364+
PyObject* WriteUIntMember(PyObject* object, PyObject* offset, PyObject* value) {
356365
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned int);
366+
return value;
357367
}
358368

359-
void WriteULongMember(PyObject* object, PyObject* offset, PyObject* value) {
369+
PyObject* WriteULongMember(PyObject* object, PyObject* offset, PyObject* value) {
360370
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned long);
371+
return value;
361372
}
362373

363-
void WriteBoolMember(PyObject* object, PyObject* offset, PyObject* value) {
374+
PyObject* WriteBoolMember(PyObject* object, PyObject* offset, PyObject* value) {
364375
WriteMember(object, offset, truffle_invoke(to_java(value), "__bool__") == Py_True ? (char)1 : (char)0, char);
376+
return value;
365377
}
366378

367-
void WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* value) {
379+
PyObject* WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* value) {
368380
if (value == NULL) {
369381
PyErr_SetString(PyExc_ValueError, "member must not be NULL");
382+
return NULL;
370383
} else {
371384
WriteMember(object, offset, value, PyObject*);
385+
return value;
372386
}
373387
}
374388

375-
void WriteLongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
389+
PyObject* WriteLongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
376390
WriteMember(object, offset, value, long long);
391+
return value;
377392
}
378393

379-
void WriteULongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
394+
PyObject* WriteULongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
380395
WriteMember(object, offset, value, unsigned long long);
396+
return value;
381397
}
382398

383-
void WritePySSizeT(PyObject* object, PyObject* offset, PyObject* value) {
399+
PyObject* WritePySSizeT(PyObject* object, PyObject* offset, PyObject* value) {
384400
WriteMember(object, offset, value, Py_ssize_t);
401+
return value;
385402
}
386403

387404
PyObject marker_struct = {

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -209,24 +209,24 @@ extern long long ReadLongLongMember(PyObject* object, PyObject* offset);
209209
extern unsigned long long ReadULongLongMember(PyObject* object, PyObject* offset);
210210
extern Py_ssize_t ReadPySSizeT(PyObject* object, PyObject* offset);
211211

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);
212+
extern PyObject* WriteShortMember(PyObject* object, PyObject* offset, PyObject* value);
213+
extern PyObject* WriteIntMember(PyObject* object, PyObject* offset, PyObject* value);
214+
extern PyObject* WriteLongMember(PyObject* object, PyObject* offset, PyObject* value);
215+
extern PyObject* WriteFloatMember(PyObject* object, PyObject* offset, PyObject* value);
216+
extern PyObject* WriteDoubleMember(PyObject* object, PyObject* offset, PyObject* value);
217+
extern PyObject* WriteStringMember(PyObject* object, PyObject* offset, PyObject* value);
218+
extern PyObject* WriteObjectMember(PyObject* object, PyObject* offset, PyObject* value);
219+
extern PyObject* WriteCharMember(PyObject* object, PyObject* offset, PyObject* value);
220+
extern PyObject* WriteByteMember(PyObject* object, PyObject* offset, PyObject* value);
221+
extern PyObject* WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value);
222+
extern PyObject* WriteUShortMember(PyObject* object, PyObject* offset, PyObject* value);
223+
extern PyObject* WriteUIntMember(PyObject* object, PyObject* offset, PyObject* value);
224+
extern PyObject* WriteULongMember(PyObject* object, PyObject* offset, PyObject* value);
225+
extern PyObject* WriteBoolMember(PyObject* object, PyObject* offset, PyObject* value);
226+
extern PyObject* WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* value);
227+
extern PyObject* WriteLongLongMember(PyObject* object, PyObject* offset, PyObject* value);
228+
extern PyObject* WriteULongLongMember(PyObject* object, PyObject* offset, PyObject* value);
229+
extern PyObject* WritePySSizeT(PyObject* object, PyObject* offset, PyObject* value);
230230

231231
extern PyObject marker_struct;
232232
#define ERROR_MARKER &marker_struct

0 commit comments

Comments
 (0)