free(defs);
}
-typedef union impl_val {
- char cval;
- short sval;
- int ival;
- double dval;
- zend_long lval;
- zend_string *str;
- void *ptr;
-} impl_val;
-
typedef struct decl_var {
char *name;
unsigned pointer_level;
free(decls);
}
+typedef union impl_val {
+ unsigned char bval;
+ char cval;
+ short sval;
+ int ival;
+ double dval;
+ zend_long lval;
+ zend_string *str;
+ void *ptr;
+} impl_val;
+
+static inline impl_val *deref_impl_val(unsigned level, impl_val *ret_val, decl_arg *darg) {
+ unsigned i;
+
+ for (i = level; i < darg->var->pointer_level && ret_val->ptr; ++i) {
+ ret_val = *(void **)ret_val;
+ }
+ return ret_val;
+}
+
typedef struct impl_type {
char *name;
token_t type;
stmts->fre.list = add_impl_stmt_ex(stmts->fre.list, ++stmts->fre.count, stmt->s.fre);
break;
}
+ free(stmt);
return stmts;
}
free(impls);
}
+typedef struct const_type {
+ token_t type;
+ char *name;
+} const_type;
+
+static inline const_type *init_const_type(token_t type, const char *name) {
+ const_type *ct = malloc(sizeof(*ct));
+ ct->type = type;
+ ct->name = strdup(name);
+ return ct;
+}
+
+static inline void free_const_type(const_type *type) {
+ free(type->name);
+ free(type);
+}
+
+typedef struct constant {
+ const_type *type;
+ char *name;
+ impl_def_val *val;
+} constant;
+
+static inline constant *init_constant(const_type *type, char *name, impl_def_val *val) {
+ constant *c = malloc(sizeof(*c));
+ c->type = type;
+ c->name = strdup(name);
+ c->val = val;
+ return c;
+}
+
+static inline void free_constant(constant *constant) {
+ free_const_type(constant->type);
+ free(constant->name);
+ free_impl_def_val(constant->val);
+ free(constant);
+}
+
+typedef struct constants {
+ size_t count;
+ constant **list;
+} constants;
+
+static inline constants *add_constant(constants *constants, constant *constant) {
+ if (!constants) {
+ constants = calloc(1, sizeof(*constants));
+ }
+ constants->list = realloc(constants->list, ++constants->count * sizeof(*constants->list));
+ constants->list[constants->count-1] = constant;
+ return constants;
+}
+
+static inline void free_constants(constants *c) {
+ size_t i;
+
+ for (i = 0; i < c->count; ++i) {
+ free_constant(c->list[i]);
+ }
+ free(c->list);
+ free(c);
+}
+
#define PSI_ERROR 16
#define PSI_WARNING 32
typedef void (*psi_error_cb)(int type, const char *msg, ...);
-typedef struct PSI_Data {
#define PSI_DATA_MEMBERS \
+ constants *consts; \
decl_typedefs *defs; \
decls *decls; \
impls *impls; \
char *lib; \
char *fn; \
psi_error_cb error
+typedef struct PSI_Data {
PSI_DATA_MEMBERS;
} PSI_Data;
}
static inline void PSI_DataDtor(PSI_Data *data) {
+ if (data->consts) {
+ free_constants(data->consts);
+ }
if (data->defs) {
free_decl_typedefs(data->defs);
}