7d5acfd7e4703b25ee8ce5ab10a4d33f91ba14a8
[m6w6/ext-psi] / src / types / let_val.h
1 #ifndef _PSI_TYPES_LET_VAL_H
2 #define _PSI_TYPES_LET_VAL_H
3
4
5 enum let_val_kind {
6 PSI_LET_NULL,
7 PSI_LET_NUMEXP,
8 PSI_LET_CALLOC,
9 PSI_LET_CALLBACK,
10 PSI_LET_FUNC,
11 PSI_LET_TMP,
12 };
13 #define PSI_LET_REFERENCE 0x1;
14 typedef struct let_val {
15 enum let_val_kind kind;
16 union {
17 num_exp *num;
18 let_calloc *alloc;
19 let_callback *callback;
20 let_func *func;
21 decl_var *var;
22 } data;
23 union {
24 struct {
25 unsigned is_reference:1;
26 } one;
27 unsigned all;
28 } flags;
29 } let_val;
30
31 static inline let_val *init_let_val(enum let_val_kind kind, void *data) {
32 let_val *let = calloc(1, sizeof(*let));
33 switch (let->kind = kind) {
34 case PSI_LET_NULL:
35 break;
36 case PSI_LET_NUMEXP:
37 let->data.num = data;
38 break;
39 case PSI_LET_CALLOC:
40 let->data.alloc = data;
41 break;
42 case PSI_LET_CALLBACK:
43 let->data.callback = data;
44 break;
45 case PSI_LET_FUNC:
46 let->data.func = data;
47 break;
48 case PSI_LET_TMP:
49 let->data.var = data;
50 break;
51 EMPTY_SWITCH_DEFAULT_CASE();
52 }
53 return let;
54 }
55
56 static inline void free_let_val(let_val *let) {
57 switch (let->kind) {
58 case PSI_LET_NULL:
59 break;
60 case PSI_LET_NUMEXP:
61 free_num_exp(let->data.num);
62 break;
63 case PSI_LET_CALLOC:
64 free_let_calloc(let->data.alloc);
65 break;
66 case PSI_LET_CALLBACK:
67 free_let_callback(let->data.callback);
68 break;
69 case PSI_LET_FUNC:
70 free_let_func(let->data.func);
71 break;
72 case PSI_LET_TMP:
73 free_decl_var(let->data.var);
74 break;
75 EMPTY_SWITCH_DEFAULT_CASE();
76 }
77 free(let);
78 }
79
80 #endif