Skip to content

Commit f80ced3

Browse files
committed
moved some generic functions to the core library from ffi
1 parent 6618b12 commit f80ced3

File tree

6 files changed

+71
-63
lines changed

6 files changed

+71
-63
lines changed

examples/c_ffi_call/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ int main() {
2626
free(s);
2727
}
2828

29-
metac_value_t *p_res_val = metac_new_value_with_call_result(p_params_val);
29+
metac_value_t *p_res_val = metac_new_value_with_call_result(metac_value_entry(p_params_val));
3030
if (metac_value_call(p_params_val, (void (*)(void))test_function1_with_args, p_res_val) == 0) {
3131
char * ret = NULL;
3232
if (p_res_val != NULL) {

examples/c_ffi_call/value_ffi.c

+1-55
Original file line numberDiff line numberDiff line change
@@ -301,61 +301,6 @@ void _cleanup_ffi_type(ffi_type * p_rtype) {
301301
free(p_rtype);
302302
}
303303

304-
metac_value_t * metac_new_value_with_call_params(metac_entry_t *p_entry) {
305-
metac_value_t * p_val = NULL;
306-
metac_parameter_storage_t * p_param_storage = metac_new_parameter_storage();
307-
if (p_param_storage != NULL) {
308-
p_val = metac_new_value(p_entry, p_param_storage);
309-
}
310-
return p_val;
311-
}
312-
313-
void metac_value_with_call_params_delete(metac_value_t * p_param_value) {
314-
metac_parameter_storage_t * p_param_storage = (metac_parameter_storage_t *)metac_value_addr(p_param_value);
315-
metac_value_delete(p_param_value);
316-
metac_parameter_storage_delete(p_param_storage);
317-
}
318-
319-
metac_value_t * metac_new_value_with_call_result(metac_value_t * p_param_storage_val) {
320-
_check_(
321-
p_param_storage_val == NULL ||
322-
metac_value_has_parameter_load(p_param_storage_val) == 0, NULL);
323-
324-
metac_value_t * p_res_value = NULL;
325-
metac_size_t res_sz = 0;
326-
327-
metac_entry_t *p_param_storage_entry = metac_value_entry(p_param_storage_val);
328-
_check_(p_param_storage_entry == NULL, NULL);
329-
_check_(metac_entry_has_parameters(p_param_storage_entry) == 0, NULL);
330-
331-
if (metac_entry_has_result(p_param_storage_entry) != 0) {
332-
metac_entry_t *p_res_entry = metac_entry_result_type(p_param_storage_entry);
333-
_check_(p_res_entry == NULL, NULL);
334-
335-
if (metac_entry_byte_size(p_res_entry, &res_sz) != 0) {
336-
return NULL;
337-
}
338-
_check_(res_sz <= 0, NULL);
339-
340-
void * p_res_mem = calloc(1, res_sz);
341-
p_res_value = metac_new_value(p_res_entry, p_res_mem);
342-
if (p_res_value == NULL) {
343-
free(p_res_mem);
344-
return NULL;
345-
}
346-
}
347-
348-
return p_res_value;
349-
}
350-
351-
void metac_value_with_call_result_delete(metac_value_t * p_res_value) {
352-
if (p_res_value == NULL) {
353-
return;
354-
}
355-
free(metac_value_addr(p_res_value));
356-
metac_value_delete(p_res_value);
357-
}
358-
359304
int metac_value_call(metac_value_t * p_param_storage_val, void (*fn)(void), metac_value_t * p_res_value) {
360305
_check_(
361306
p_param_storage_val == NULL ||
@@ -475,6 +420,7 @@ int metac_value_call(metac_value_t * p_param_storage_val, void (*fn)(void), meta
475420

476421
_cleanup_ffi_type(rtype);
477422
if (res_addr == &rc) {
423+
assert(metac_entry_has_result(p_param_storage_entry) != 0);
478424
// we need to pass result back to p_res_value if we used rc as buf (for small data)
479425
uint8_t * p_res_buf = metac_value_addr(p_res_value);
480426
for (metac_size_t i = 0; i < res_sz; ++i) {

examples/c_ffi_call/value_ffi.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
#include "metac/reflect.h"
22

3-
metac_value_t * metac_new_value_with_call_params(metac_entry_t *p_entry);
4-
53
#define METAC_NEW_VALUE_WITH_CALL_PARAMS_AND_WRAP(_tag_map_, _fn_entry_, _fn_, _args_...) ({ \
64
metac_value_t * p_val = metac_value_parameter_wrap( \
75
metac_new_value_with_call_params(_fn_entry_), _tag_map_, _args_); \
@@ -12,7 +10,5 @@ metac_value_t * metac_new_value_with_call_params(metac_entry_t *p_entry);
1210
p_val; \
1311
})
1412

15-
metac_value_t * metac_new_value_with_call_result(metac_value_t * p_param_storage_val);
1613
int metac_value_call(metac_value_t * p_param_storage_val, void (*fn)(void), metac_value_t * p_res_value);
17-
void metac_value_with_call_result_delete(metac_value_t * p_res_value);
18-
void metac_value_with_call_params_delete(metac_value_t * p_param_value);
14+

examples/c_ffi_call/value_ffi_test.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ static char called[1024];
1111
called[0] = 0; \
1212
metac_entry_t * p_entry = METAC_GSYM_LINK_ENTRY(_fn_); \
1313
metac_value_t * p_params_val = METAC_NEW_VALUE_WITH_CALL_PARAMS_AND_WRAP(_tag_map_, p_entry, _fn_, _args_); \
14-
metac_value_t *p_res_val = metac_new_value_with_call_result(p_params_val); \
14+
metac_value_t *p_res_val = metac_new_value_with_call_result(p_entry); \
1515
int res = metac_value_call(p_params_val, (void (*)(void)) _fn_, p_res_val);
1616

1717
#define _CALL_PROCESS_FN_PTR(_tag_map_, _type_, _fn_, _args_...) { \
1818
called[0] = 0; \
1919
WITH_METAC_DECLLOC(dec, _type_ * p = _fn_); \
2020
metac_entry_t * p_entry = METAC_ENTRY_FROM_DECLLOC(dec, p); \
2121
metac_value_t * p_params_val = METAC_NEW_VALUE_WITH_CALL_PARAMS_AND_WRAP(_tag_map_, metac_entry_pointer_entry(p_entry), _fn_, _args_); \
22-
metac_value_t *p_res_val = metac_new_value_with_call_result(p_params_val); \
22+
metac_value_t *p_res_val = metac_new_value_with_call_result(metac_entry_pointer_entry(p_entry)); \
2323
int res = metac_value_call(p_params_val, (void (*)(void)) p, p_res_val);
2424

2525

include/metac/reflect/value.h

+11
Original file line numberDiff line numberDiff line change
@@ -397,4 +397,15 @@ metac_value_t * metac_value_parameter_wrap(metac_value_t * p_val,metac_tag_map_t
397397
tag_map is needed in case the function in p_entry has unspecified parameter or va_list */
398398
metac_value_t * metac_value_parameter_vwrap(metac_value_t * p_val,metac_tag_map_t * p_tag_map, va_list parameters);
399399

400+
/** @brief function to create parameter_storage and wrap it into subprogram/subroutine entry */
401+
metac_value_t * metac_new_value_with_call_params(metac_entry_t *p_entry);
402+
/** @brief cleanup value created by metac_new_value_with_call_params (including parameter_storage) */
403+
void metac_value_with_call_params_delete(metac_value_t * p_param_value);
404+
405+
/** @brief function to reserve memory for the result subprogram/subroutine and wrap it into subprogram/subroutine entry
406+
* return NULL if function/subroutine doesn't have result */
407+
metac_value_t * metac_new_value_with_call_result(metac_entry_t * p_entry);
408+
/** @brief cleanup value created by metac_new_value_with_call_result (including place). handles NULL argument correctly */
409+
void metac_value_with_call_result_delete(metac_value_t * p_res_value);
410+
400411
#endif

src/value.c

+55
Original file line numberDiff line numberDiff line change
@@ -795,3 +795,58 @@ void metac_value_delete(metac_value_t * p_val) {
795795
// clean our mem
796796
free(p_val);
797797
}
798+
799+
// extended functions
800+
metac_value_t * metac_new_value_with_call_params(metac_entry_t *p_entry) {
801+
metac_value_t * p_val = NULL;
802+
metac_parameter_storage_t * p_param_storage = metac_new_parameter_storage();
803+
if (p_param_storage != NULL) {
804+
p_val = metac_new_value(p_entry, p_param_storage);
805+
}
806+
return p_val;
807+
}
808+
809+
void metac_value_with_call_params_delete(metac_value_t * p_param_value) {
810+
metac_parameter_storage_t * p_param_storage = (metac_parameter_storage_t *)metac_value_addr(p_param_value);
811+
metac_value_delete(p_param_value);
812+
metac_parameter_storage_delete(p_param_storage);
813+
}
814+
815+
metac_value_t * metac_new_value_with_call_result(metac_entry_t * p_entry) {
816+
_check_(
817+
p_entry == NULL ||
818+
metac_entry_has_parameter_load(p_entry) == 0, NULL);
819+
820+
metac_value_t * p_res_value = NULL;
821+
metac_size_t res_sz = 0;
822+
823+
_check_(metac_entry_has_parameters(p_entry) == 0, NULL);
824+
825+
if (metac_entry_has_result(p_entry) != 0) {
826+
metac_entry_t *p_res_entry = metac_entry_result_type(p_entry);
827+
_check_(p_res_entry == NULL, NULL);
828+
829+
if (metac_entry_byte_size(p_res_entry, &res_sz) != 0) {
830+
return NULL;
831+
}
832+
_check_(res_sz <= 0, NULL);
833+
834+
void * p_res_mem = calloc(1, res_sz);
835+
p_res_value = metac_new_value(p_res_entry, p_res_mem);
836+
if (p_res_value == NULL) {
837+
free(p_res_mem);
838+
return NULL;
839+
}
840+
}
841+
842+
return p_res_value;
843+
}
844+
845+
void metac_value_with_call_result_delete(metac_value_t * p_res_value) {
846+
if (p_res_value == NULL) {
847+
return;
848+
}
849+
free(metac_value_addr(p_res_value));
850+
metac_value_delete(p_res_value);
851+
}
852+

0 commit comments

Comments
 (0)