Skip to content

Commit ce7c23e

Browse files
committed
Fix: Did not resolve handles for return values of C landing functions.
1 parent 1fa6cfb commit ce7c23e

File tree

2 files changed

+62
-39
lines changed

2 files changed

+62
-39
lines changed

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

Lines changed: 56 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -461,76 +461,99 @@ typedef PyObject* (*f20)(PyObject*, PyObject*, PyObject*, PyObject*, PyObject*,
461461
#define _CALL_ARITY(FUN, ...) ( (_PICK_FUN_CAST(NULL, ##__VA_ARGS__, f20, f19, f18, f17, f16, f15, f14, f13, f12, f11, f10, f9, f8, f7, f6, f5, f4, f3, f2, f1, f0))(FUN))(__VA_ARGS__)
462462
#define ARG(__n) explicit_cast((PyObject*)polyglot_get_arg((__n)))
463463

464-
PyObject *wrap_direct(PyCFunction fun, ...) {
464+
void* wrap_direct(PyCFunction fun, ...) {
465465
PyObject *res = NULL;
466466
switch(polyglot_get_arg_count()-1) {
467467
case 0:
468-
return _CALL_ARITY(fun);
468+
res = _CALL_ARITY(fun);
469+
break;
469470
case 1:
470-
return _CALL_ARITY(fun, ARG(1));
471+
res = _CALL_ARITY(fun, ARG(1));
472+
break;
471473
case 2:
472-
return _CALL_ARITY(fun, ARG(1), ARG(2));
474+
res = _CALL_ARITY(fun, ARG(1), ARG(2));
475+
break;
473476
case 3:
474-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3));
477+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3));
478+
break;
475479
case 4:
476-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4));
480+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4));
481+
break;
477482
case 5:
478-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5));
483+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5));
484+
break;
479485
case 6:
480-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6));
486+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6));
487+
break;
481488
case 7:
482-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7));
489+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7));
490+
break;
483491
case 8:
484-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8));
492+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8));
493+
break;
485494
case 9:
486-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9));
495+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9));
496+
break;
487497
case 10:
488-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10));
498+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10));
499+
break;
489500
case 11:
490-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11));
501+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11));
502+
break;
491503
case 12:
492-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12));
504+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12));
505+
break;
493506
case 13:
494-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13));
507+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13));
508+
break;
495509
case 14:
496-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14));
510+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14));
511+
break;
497512
case 15:
498-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15));
513+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15));
514+
break;
499515
case 16:
500-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16));
516+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16));
517+
break;
501518
case 17:
502-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17));
519+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17));
520+
break;
503521
case 18:
504-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17), ARG(18));
522+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17), ARG(18));
523+
break;
505524
case 19:
506-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17), ARG(18), ARG(19));
525+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17), ARG(18), ARG(19));
526+
break;
507527
case 20:
508-
return _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17), ARG(18), ARG(19), ARG(20));
528+
res = _CALL_ARITY(fun, ARG(1), ARG(2), ARG(3), ARG(4), ARG(5), ARG(6), ARG(7), ARG(8), ARG(9), ARG(10), ARG(11), ARG(12), ARG(13), ARG(14), ARG(15), ARG(16), ARG(17), ARG(18), ARG(19), ARG(20));
529+
break;
530+
default:
531+
_PyErr_BadInternalCall(__FILE__, __LINE__);
532+
res = NULL;
509533
}
510-
_PyErr_BadInternalCall(__FILE__, __LINE__);
511-
return NULL;
534+
return native_to_java(res);
512535
}
513536

514-
PyObject *wrap_varargs(PyCFunction fun, PyObject *module, PyObject *varargs) {
515-
return fun(explicit_cast(module), explicit_cast(varargs));
537+
void* wrap_varargs(PyCFunction fun, PyObject *module, PyObject *varargs) {
538+
return native_to_java(fun(explicit_cast(module), explicit_cast(varargs)));
516539
}
517540

518-
PyObject *wrap_keywords(PyCFunctionWithKeywords fun, PyObject *module, PyObject *varargs, PyObject *kwargs) {
519-
return fun(explicit_cast(module), explicit_cast(varargs), explicit_cast(kwargs));
541+
void* wrap_keywords(PyCFunctionWithKeywords fun, PyObject *module, PyObject *varargs, PyObject *kwargs) {
542+
return native_to_java(fun(explicit_cast(module), explicit_cast(varargs), explicit_cast(kwargs)));
520543
}
521544

522-
PyObject *wrap_noargs(PyCFunction fun, PyObject *module, PyObject *pnone) {
523-
return fun(explicit_cast(module), explicit_cast(pnone));
545+
void* wrap_noargs(PyCFunction fun, PyObject *module, PyObject *pnone) {
546+
return native_to_java(fun(explicit_cast(module), explicit_cast(pnone)));
524547
}
525548

526-
PyObject *wrap_fastcall(_PyCFunctionFast fun, PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) {
549+
void* wrap_fastcall(_PyCFunctionFast fun, PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) {
527550
Py_ssize_t i;
528551
for (i=0; i < nargs; i++) {
529552
args[i] = explicit_cast(args[i]);
530553
}
531-
return fun(explicit_cast(self), args, nargs, explicit_cast(kwnames));
554+
return native_to_java(fun(explicit_cast(self), args, nargs, explicit_cast(kwnames)));
532555
}
533556

534-
PyObject *wrap_unsupported(void *fun, ...) {
557+
void* wrap_unsupported(void *fun, ...) {
535558
return NULL;
536559
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,12 @@ void initialize_exceptions();
109109
void initialize_hashes();
110110

111111
// prototype of C landing function
112-
PyObject *wrap_direct(PyCFunction fun, ...);
113-
PyObject *wrap_varargs(PyCFunction fun, PyObject *module, PyObject *varargs);
114-
PyObject *wrap_keywords(PyCFunctionWithKeywords fun, PyObject *module, PyObject *varargs, PyObject *kwargs);
115-
PyObject *wrap_noargs(PyCFunction fun, PyObject *module, PyObject *pnone);
116-
PyObject *wrap_fastcall(_PyCFunctionFast fun, PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames);
117-
PyObject *wrap_unsupported(void *fun, ...);
112+
void* wrap_direct(PyCFunction fun, ...);
113+
void* wrap_varargs(PyCFunction fun, PyObject *module, PyObject *varargs);
114+
void* wrap_keywords(PyCFunctionWithKeywords fun, PyObject *module, PyObject *varargs, PyObject *kwargs);
115+
void* wrap_noargs(PyCFunction fun, PyObject *module, PyObject *pnone);
116+
void* wrap_fastcall(_PyCFunctionFast fun, PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames);
117+
void* wrap_unsupported(void *fun, ...);
118118

119119
#define write_struct_field(object, struct, fieldname, value) \
120120
truffle_write(to_java(object), \

0 commit comments

Comments
 (0)