diff options
author | Lars Kanis <lars@greiz-reinsdorf.de> | 2021-02-27 10:18:27 +0100 |
---|---|---|
committer | Lars Kanis <lars@greiz-reinsdorf.de> | 2021-02-28 17:15:02 +0100 |
commit | f22bbe49d716a6361ba7832f9262ed4e16649275 (patch) | |
tree | 8eb65b83f26220c8a549c611ab13a8e311209d9e | |
parent | ba59d99c3ecf756a2a1ac26ab634768ffc452697 (diff) | |
download | ffi-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.c | 18 |
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: |