Skip to content

Commit 40bfbb6

Browse files
committed
don't use landing functions for member access to avoid conversions to and from integers
1 parent 4fcd925 commit 40bfbb6

File tree

4 files changed

+54
-85
lines changed

4 files changed

+54
-85
lines changed

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

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -315,33 +315,33 @@ PRIMITIVE_ARRAY_TO_NATIVE(Long, int64_t, i64, polyglot_as_i64);
315315
PRIMITIVE_ARRAY_TO_NATIVE(Double, double, double, polyglot_as_double);
316316
PRIMITIVE_ARRAY_TO_NATIVE(Object, PyObjectPtr, PyObjectPtr, (PyObjectPtr));
317317

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

320-
PyObject* ReadShortMember(PyObject* object, PyObject* offset) {
321-
return PyLong_FromLong(ReadMember(object, offset, short));
320+
int ReadShortMember(PyObject* object, Py_ssize_t offset) {
321+
return ReadMember(object, offset, short);
322322
}
323323

324-
PyObject* ReadIntMember(PyObject* object, PyObject* offset) {
325-
return PyLong_FromLong(ReadMember(object, offset, int));
324+
int ReadIntMember(PyObject* object, Py_ssize_t offset) {
325+
return ReadMember(object, offset, int);
326326
}
327327

328-
PyObject* ReadLongMember(PyObject* object, PyObject* offset) {
329-
return PyLong_FromLong(ReadMember(object, offset, long));
328+
long ReadLongMember(PyObject* object, Py_ssize_t offset) {
329+
return ReadMember(object, offset, long);
330330
}
331331

332-
PyObject* ReadFloatMember(PyObject* object, PyObject* offset) {
333-
return PyFloat_FromDouble(ReadMember(object, offset, float));
332+
double ReadFloatMember(PyObject* object, Py_ssize_t offset) {
333+
return ReadMember(object, offset, float);
334334
}
335335

336-
PyObject* ReadDoubleMember(PyObject* object, PyObject* offset) {
337-
return PyFloat_FromDouble(ReadMember(object, offset, double));
336+
double ReadDoubleMember(PyObject* object, Py_ssize_t offset) {
337+
return ReadMember(object, offset, double);
338338
}
339339

340-
PyObject* ReadStringMember(PyObject* object, PyObject* offset) {
340+
PyObject* ReadStringMember(PyObject* object, Py_ssize_t offset) {
341341
return (PyObject*)polyglot_from_string(ReadMember(object, offset, char*), "utf-8");
342342
}
343343

344-
PyObject* ReadObjectMember(PyObject* object, PyObject* offset) {
344+
PyObject* ReadObjectMember(PyObject* object, Py_ssize_t offset) {
345345
PyObject* member = ReadMember(object, offset, PyObject*);
346346
if (member == NULL) {
347347
return Py_None;
@@ -350,36 +350,36 @@ PyObject* ReadObjectMember(PyObject* object, PyObject* offset) {
350350
}
351351
}
352352

353-
PyObject* ReadCharMember(PyObject* object, PyObject* offset) {
353+
PyObject* ReadCharMember(PyObject* object, Py_ssize_t offset) {
354354
return polyglot_from_string_n(&ReadMember(object, offset, char), 1, "utf-8");
355355
}
356356

357-
PyObject* ReadByteMember(PyObject* object, PyObject* offset) {
358-
return PyLong_FromLong(ReadMember(object, offset, char));
357+
int ReadByteMember(PyObject* object, Py_ssize_t offset) {
358+
return ReadMember(object, offset, char);
359359
}
360360

361-
PyObject* ReadUByteMember(PyObject* object, PyObject* offset) {
361+
PyObject* ReadUByteMember(PyObject* object, Py_ssize_t offset) {
362362
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned char));
363363
}
364364

365-
PyObject* ReadUShortMember(PyObject* object, PyObject* offset) {
365+
PyObject* ReadUShortMember(PyObject* object, Py_ssize_t offset) {
366366
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned short));
367367
}
368368

369-
PyObject* ReadUIntMember(PyObject* object, PyObject* offset) {
369+
PyObject* ReadUIntMember(PyObject* object, Py_ssize_t offset) {
370370
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned int));
371371
}
372372

373-
PyObject* ReadULongMember(PyObject* object, PyObject* offset) {
373+
PyObject* ReadULongMember(PyObject* object, Py_ssize_t offset) {
374374
return PyLong_FromUnsignedLong(ReadMember(object, offset, unsigned long));
375375
}
376376

377-
PyObject* ReadBoolMember(PyObject* object, PyObject* offset) {
377+
PyObject* ReadBoolMember(PyObject* object, Py_ssize_t offset) {
378378
char flag = ReadMember(object, offset, char);
379379
return flag ? Py_True : Py_False;
380380
}
381381

382-
PyObject* ReadObjectExMember(PyObject* object, PyObject* offset) {
382+
PyObject* ReadObjectExMember(PyObject* object, Py_ssize_t offset) {
383383
PyObject* member = ReadMember(object, offset, PyObject*);
384384
if (member == NULL) {
385385
PyErr_SetString(PyExc_ValueError, "member must not be NULL");
@@ -389,97 +389,97 @@ PyObject* ReadObjectExMember(PyObject* object, PyObject* offset) {
389389
}
390390
}
391391

392-
PyObject* ReadLongLongMember(PyObject* object, PyObject* offset) {
392+
PyObject* ReadLongLongMember(PyObject* object, Py_ssize_t offset) {
393393
return PyLong_FromLongLong(ReadMember(object, offset, long long));
394394
}
395395

396-
PyObject* ReadULongLongMember(PyObject* object, PyObject* offset) {
396+
PyObject* ReadULongLongMember(PyObject* object, Py_ssize_t offset) {
397397
return PyLong_FromUnsignedLongLong(ReadMember(object, offset, unsigned long long));
398398
}
399399

400-
PyObject* ReadPySSizeT(PyObject* object, PyObject* offset) {
400+
PyObject* ReadPySSizeT(PyObject* object, Py_ssize_t offset) {
401401
return PyLong_FromSsize_t(ReadMember(object, offset, Py_ssize_t));
402402
}
403403

404404
#undef ReadMember
405405

406406
#define WriteMember(object, offset, value, T) *(T*)(((char*)object) + PyLong_AsSsize_t(offset)) = (T)(value)
407407

408-
PyObject* WriteShortMember(PyObject* object, PyObject* offset, PyObject* value) {
408+
PyObject* WriteShortMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
409409
WriteMember(object, offset, PyLong_AsLong(value), short);
410410
return value;
411411
}
412412

413-
PyObject* WriteIntMember(PyObject* object, PyObject* offset, PyObject* value) {
413+
PyObject* WriteIntMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
414414
WriteMember(object, offset, PyLong_AsLong(value), int);
415415
return value;
416416
}
417417

418-
PyObject* WriteLongMember(PyObject* object, PyObject* offset, PyObject* value) {
418+
PyObject* WriteLongMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
419419
WriteMember(object, offset, PyLong_AsLong(value), long);
420420
return value;
421421
}
422422

423-
PyObject* WriteFloatMember(PyObject* object, PyObject* offset, PyObject* value) {
423+
PyObject* WriteFloatMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
424424
WriteMember(object, offset, PyFloat_AsDouble(value), float);
425425
return value;
426426
}
427427

428-
PyObject* WriteDoubleMember(PyObject* object, PyObject* offset, PyObject* value) {
428+
PyObject* WriteDoubleMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
429429
WriteMember(object, offset, PyFloat_AsDouble(value), double);
430430
return value;
431431
}
432432

433-
PyObject* WriteStringMember(PyObject* object, PyObject* offset, PyObject* value) {
433+
PyObject* WriteStringMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
434434
WriteMember(object, offset, as_char_pointer(value), char*);
435435
return value;
436436
}
437437

438-
PyObject* WriteObjectMember(PyObject* object, PyObject* offset, PyObject* value) {
438+
PyObject* WriteObjectMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
439439
WriteMember(object, offset, value, PyObject*);
440440
return value;
441441
}
442442

443-
PyObject* WriteCharMember(PyObject* object, PyObject* offset, PyObject* value) {
443+
PyObject* WriteCharMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
444444
const char* ptr = as_char_pointer(value);
445445
const char c = ptr[0];
446446
truffle_free_cstr(ptr);
447447
WriteMember(object, offset, c, char);
448448
return value;
449449
}
450450

451-
PyObject* WriteByteMember(PyObject* object, PyObject* offset, PyObject* value) {
451+
PyObject* WriteByteMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
452452
WriteMember(object, offset, PyLong_AsLong(value), char);
453453
return value;
454454
}
455455

456-
PyObject* WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value) {
456+
PyObject* WriteUByteMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
457457
WriteMember(object, offset, PyLong_AsLong(value), uint8_t);
458458
return value;
459459
}
460460

461-
PyObject* WriteUShortMember(PyObject* object, PyObject* offset, PyObject* value) {
461+
PyObject* WriteUShortMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
462462
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned short);
463463
return value;
464464
}
465465

466-
PyObject* WriteUIntMember(PyObject* object, PyObject* offset, PyObject* value) {
466+
PyObject* WriteUIntMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
467467
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned int);
468468
return value;
469469
}
470470

471-
PyObject* WriteULongMember(PyObject* object, PyObject* offset, PyObject* value) {
471+
PyObject* WriteULongMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
472472
WriteMember(object, offset, PyLong_AsUnsignedLong(value), unsigned long);
473473
return value;
474474
}
475475

476476
UPCALL_ID(__bool__);
477-
PyObject* WriteBoolMember(PyObject* object, PyObject* offset, PyObject* value) {
477+
PyObject* WriteBoolMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
478478
WriteMember(object, offset, UPCALL_O(native_to_java(value), _jls___bool__) == Py_True ? (char)1 : (char)0, char);
479479
return value;
480480
}
481481

482-
PyObject* WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* value) {
482+
PyObject* WriteObjectExMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
483483
if (value == NULL) {
484484
PyErr_SetString(PyExc_ValueError, "member must not be NULL");
485485
return NULL;
@@ -489,17 +489,17 @@ PyObject* WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* valu
489489
}
490490
}
491491

492-
PyObject* WriteLongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
492+
PyObject* WriteLongLongMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
493493
WriteMember(object, offset, value, long long);
494494
return value;
495495
}
496496

497-
PyObject* WriteULongLongMember(PyObject* object, PyObject* offset, PyObject* value) {
497+
PyObject* WriteULongLongMember(PyObject* object, Py_ssize_t offset, PyObject* value) {
498498
WriteMember(object, offset, value, unsigned long long);
499499
return value;
500500
}
501501

502-
PyObject* WritePySSizeT(PyObject* object, PyObject* offset, PyObject* value) {
502+
PyObject* WritePySSizeT(PyObject* object, Py_ssize_t offset, PyObject* value) {
503503
WriteMember(object, offset, value, Py_ssize_t);
504504
return value;
505505
}

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

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -248,44 +248,6 @@ void* wrap_unsupported(void *fun, ...);
248248
int PyTruffle_Debug(void *arg);
249249
void* PyObjectHandle_ForJavaType(void* jobj);
250250

251-
extern PyObject* ReadShortMember(PyObject* object, PyObject* offset);
252-
extern PyObject* ReadIntMember(PyObject* object, PyObject* offset);
253-
extern PyObject* ReadLongMember(PyObject* object, PyObject* offset);
254-
extern PyObject* ReadFloatMember(PyObject* object, PyObject* offset);
255-
extern PyObject* ReadDoubleMember(PyObject* object, PyObject* offset);
256-
extern PyObject* ReadStringMember(PyObject* object, PyObject* offset);
257-
extern PyObject* ReadObjectMember(PyObject* object, PyObject* offset);
258-
extern PyObject* ReadCharMember(PyObject* object, PyObject* offset);
259-
extern PyObject* ReadByteMember(PyObject* object, PyObject* offset);
260-
extern PyObject* ReadUByteMember(PyObject* object, PyObject* offset);
261-
extern PyObject* ReadUShortMember(PyObject* object, PyObject* offset);
262-
extern PyObject* ReadUIntMember(PyObject* object, PyObject* offset);
263-
extern PyObject* ReadULongMember(PyObject* object, PyObject* offset);
264-
extern PyObject* ReadBoolMember(PyObject* object, PyObject* offset);
265-
extern PyObject* ReadObjectExMember(PyObject* object, PyObject* offset);
266-
extern PyObject* ReadLongLongMember(PyObject* object, PyObject* offset);
267-
extern PyObject* ReadULongLongMember(PyObject* object, PyObject* offset);
268-
extern PyObject* ReadPySSizeT(PyObject* object, PyObject* offset);
269-
270-
extern PyObject* WriteShortMember(PyObject* object, PyObject* offset, PyObject* value);
271-
extern PyObject* WriteIntMember(PyObject* object, PyObject* offset, PyObject* value);
272-
extern PyObject* WriteLongMember(PyObject* object, PyObject* offset, PyObject* value);
273-
extern PyObject* WriteFloatMember(PyObject* object, PyObject* offset, PyObject* value);
274-
extern PyObject* WriteDoubleMember(PyObject* object, PyObject* offset, PyObject* value);
275-
extern PyObject* WriteStringMember(PyObject* object, PyObject* offset, PyObject* value);
276-
extern PyObject* WriteObjectMember(PyObject* object, PyObject* offset, PyObject* value);
277-
extern PyObject* WriteCharMember(PyObject* object, PyObject* offset, PyObject* value);
278-
extern PyObject* WriteByteMember(PyObject* object, PyObject* offset, PyObject* value);
279-
extern PyObject* WriteUByteMember(PyObject* object, PyObject* offset, PyObject* value);
280-
extern PyObject* WriteUShortMember(PyObject* object, PyObject* offset, PyObject* value);
281-
extern PyObject* WriteUIntMember(PyObject* object, PyObject* offset, PyObject* value);
282-
extern PyObject* WriteULongMember(PyObject* object, PyObject* offset, PyObject* value);
283-
extern PyObject* WriteBoolMember(PyObject* object, PyObject* offset, PyObject* value);
284-
extern PyObject* WriteObjectExMember(PyObject* object, PyObject* offset, PyObject* value);
285-
extern PyObject* WriteLongLongMember(PyObject* object, PyObject* offset, PyObject* value);
286-
extern PyObject* WriteULongLongMember(PyObject* object, PyObject* offset, PyObject* value);
287-
extern PyObject* WritePySSizeT(PyObject* object, PyObject* offset, PyObject* value);
288-
289251
extern PyObject marker_struct;
290252
#define ERROR_MARKER &marker_struct
291253

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,11 @@ int doLong4(@SuppressWarnings("unused") long obj, @SuppressWarnings("unused") in
789789
return raiseNative(-1, PythonErrorType.OverflowError, "Python int too large to convert to C %s", targetTypeName);
790790
}
791791

792+
@Specialization(guards = "targetTypeSize == 8")
793+
long doLong8(long obj, @SuppressWarnings("unused") int signed, @SuppressWarnings("unused") int targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
794+
return obj;
795+
}
796+
792797
@Specialization(guards = "targetTypeSize == 8")
793798
long doLong8(long obj, @SuppressWarnings("unused") int signed, @SuppressWarnings("unused") long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
794799
return obj;

graalpython/lib-graalpython/python_cext.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -734,16 +734,18 @@ def PyCFunction_NewEx(name, cfunc, cwrapper, wrapper, self, module, doc):
734734

735735

736736
def AddMember(primary, name, memberType, offset, canSet, doc):
737+
# the ReadMemberFunctions and WriteMemberFunctions don't have a wrapper to
738+
# convert arguments to Sulong, so we can avoid boxing the offsets into PInts
737739
pclass = to_java(primary)
738740
member = property()
739741
getter = ReadMemberFunctions[memberType]
740742
def member_getter(self):
741-
return getter(self, offset)
743+
return getter(to_sulong(self), TrufflePInt_AsPrimitive(offset, 1, 8, ""))
742744
member.getter(member_getter)
743745
if to_java(canSet):
744746
setter = WriteMemberFunctions[memberType]
745747
def member_setter(self, value):
746-
setter(self, offset, value)
748+
setter(to_sulong(self), TrufflePInt_AsPrimitive(offset, 1, 8, ""), to_sulong(value))
747749
member.setter(member_setter)
748750
member.__doc__ = doc
749751
object.__setattr__(pclass, name, member)
@@ -1232,7 +1234,7 @@ def initialize_member_accessors():
12321234
"ReadBoolMember", "ReadObjectExMember",
12331235
"ReadObjectExMember", "ReadLongLongMember",
12341236
"ReadULongLongMember", "ReadPySSizeT"]:
1235-
ReadMemberFunctions.append(import_c_func(memberFunc))
1237+
ReadMemberFunctions.append(capi[memberFunc])
12361238
ReadMemberFunctions.append(lambda x: None)
12371239
for memberFunc in ["WriteShortMember", "WriteIntMember", "WriteLongMember",
12381240
"WriteFloatMember", "WriteDoubleMember",
@@ -1243,7 +1245,7 @@ def initialize_member_accessors():
12431245
"WriteBoolMember", "WriteObjectExMember",
12441246
"WriteObjectExMember", "WriteLongLongMember",
12451247
"WriteULongLongMember", "WritePySSizeT"]:
1246-
WriteMemberFunctions.append(import_c_func(memberFunc))
1248+
WriteMemberFunctions.append(capi[memberFunc])
12471249
WriteMemberFunctions.append(lambda x,v: None)
12481250

12491251

0 commit comments

Comments
 (0)