-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathprint_args.h
73 lines (69 loc) · 2.68 KB
/
print_args.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef PRINT_ARGS_H_
#define PRINT_ARGS_H_
#include "metac/reflect.h"
#include <stdlib.h> /*free*/
#define METAC_WRAP_FN_NORES(_tag_map_, _fn_, _args_...) { \
metac_value_t * p_val = NULL; \
metac_parameter_storage_t * p_param_storage = metac_new_parameter_storage(); \
if (p_param_storage != NULL) { \
p_val = metac_value_parameter_wrap(metac_new_value(METAC_GSYM_LINK_ENTRY(_fn_), p_param_storage), _tag_map_, _args_); \
} \
if (p_val != NULL) { \
char * s = metac_value_string_ex(p_val, METAC_WMODE_deep, _tag_map_); \
if (s != NULL) { \
printf("Calling %s\n", s); \
free(s); \
} \
} \
_fn_(_args_); \
if (p_val != NULL) { \
char * s = metac_value_string_ex(p_val, METAC_WMODE_deep, _tag_map_); \
if (s != NULL) { \
printf("Returned from void %s\n", s); \
free(s); \
} \
metac_value_delete(p_val); \
} \
if (p_param_storage != NULL) { \
metac_parameter_storage_delete(p_param_storage); \
} \
}
#define METAC_WRAP_FN_RES(_type_, _tag_map_, _fn_, _args_...) ({ \
metac_value_t * p_val = NULL; \
metac_parameter_storage_t * p_param_storage = metac_new_parameter_storage(); \
if (p_param_storage != NULL) { \
p_val = metac_value_parameter_wrap(metac_new_value(METAC_GSYM_LINK_ENTRY(_fn_), p_param_storage), _tag_map_, _args_); \
} \
if (p_val != NULL) { \
char * s = metac_value_string_ex(p_val, METAC_WMODE_deep, _tag_map_); \
if (s != NULL) { \
printf("Calling %s\n", s); \
free(s); \
} \
} \
WITH_METAC_DECLLOC(loc, _type_ res = _fn_(_args_)); \
if (p_val != NULL) { \
metac_value_t *p_res_val = METAC_VALUE_FROM_DECLLOC(loc, res); \
char * s = metac_value_string_ex(p_val, METAC_WMODE_deep, _tag_map_); \
char * s_res = NULL; \
if (p_res_val != NULL) { \
s_res = metac_value_string_ex(p_res_val, METAC_WMODE_deep, _tag_map_); \
metac_value_delete(p_res_val); \
} \
if (s != NULL && s_res != NULL) { \
printf("Returned %s from %s\n", s_res, s); \
} \
if (s_res != NULL) { \
free(s_res); \
} \
if (s != NULL) { \
free(s); \
} \
metac_value_delete(p_val); \
} \
if (p_param_storage != NULL) { \
metac_parameter_storage_delete(p_param_storage); \
} \
res; \
})
#endif