api refactoring
[m6w6/ext-psi] / src / types / decl_arg.h
diff --git a/src/types/decl_arg.h b/src/types/decl_arg.h
new file mode 100644 (file)
index 0000000..22eb0f0
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _PSI_TYPES_DECL_ARG_H
+#define _PSI_TYPES_DECL_ARG_H
+
+typedef struct decl_arg {
+       struct psi_token *token;
+       decl_type *type;
+       decl_var *var;
+       decl_struct_layout *layout;
+       impl_val val;
+       void *ptr;
+       void *let;
+       void *mem;
+} decl_arg;
+
+static inline decl_arg *init_decl_arg(decl_type *type, decl_var *var) {
+       decl_arg *arg = calloc(1, sizeof(*arg));
+       arg->token = var->token;
+       arg->type = type;
+       arg->var = var;
+       var->arg = arg;
+       arg->ptr = &arg->val;
+       arg->let = arg->ptr;
+       return arg;
+}
+
+static inline void free_decl_arg(decl_arg *arg) {
+       if (arg->token && arg->token != arg->var->token) {
+               free(arg->token);
+       }
+       free_decl_type(arg->type);
+       free_decl_var(arg->var);
+       if (arg->layout) {
+               free_decl_struct_layout(arg->layout);
+       }
+       free(arg);
+}
+
+#endif