summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Kanis <lars@greiz-reinsdorf.de>2021-02-27 10:18:27 +0100
committerLars Kanis <lars@greiz-reinsdorf.de>2021-02-28 17:15:02 +0100
commitf22bbe49d716a6361ba7832f9262ed4e16649275 (patch)
tree8eb65b83f26220c8a549c611ab13a8e311209d9e
parentba59d99c3ecf756a2a1ac26ab634768ffc452697 (diff)
downloadffi-f22bbe49d716a6361ba7832f9262ed4e16649275.tar.gz
Use ALLOCA_N to preallocate callback param memory
Because it's freed when function returns.
-rw-r--r--ext/ffi_c/Variadic.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/ext/ffi_c/Variadic.c b/ext/ffi_c/Variadic.c
index d18a143..190c65f 100644
--- a/ext/ffi_c/Variadic.c
+++ b/ext/ffi_c/Variadic.c
@@ -168,8 +168,8 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
ffi_type* ffiReturnType;
Type** paramTypes;
VALUE* argv;
- VALUE* callbackParameters = NULL;
- int paramCount = 0, fixedCount = 0, callbackCount = 0, i;
+ VALUE* callbackParameters;
+ int paramCount = 0, fixedCount = 0, callbackCount = 0, callbackIndex = 0, i;
ffi_status ffiStatus;
rbffi_frame_t frame = { 0 };
@@ -194,6 +194,16 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
Data_Get_Struct(rbType, Type, paramTypes[i]);
switch (paramTypes[i]->nativeType) {
+ case NATIVE_FUNCTION:
+ case NATIVE_CALLBACK:
+ callbackCount++;
+ }
+ }
+ callbackParameters = ALLOCA_N(VALUE, callbackCount);
+
+ for (i = 0; i < paramCount; ++i) {
+ VALUE rbType;
+ switch (paramTypes[i]->nativeType) {
case NATIVE_INT8:
case NATIVE_INT16:
case NATIVE_INT32:
@@ -214,12 +224,12 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
case NATIVE_FUNCTION:
case NATIVE_CALLBACK:
+ rbType = rb_ary_entry(parameterTypes, i);
if (!rb_obj_is_kind_of(rbType, rbffi_FunctionTypeClass)) {
VALUE typeName = rb_funcall2(rbType, rb_intern("inspect"), 0, NULL);
rb_raise(rb_eTypeError, "Incorrect parameter type (%s)", RSTRING_PTR(typeName));
}
- REALLOC_N(callbackParameters, VALUE, callbackCount + 1);
- callbackParameters[callbackCount++] = rbType;
+ callbackParameters[callbackIndex++] = rbType;
break;
default: