decl_typedef **list;
} decl_typedefs;
-static decl_typedefs *add_decl_typedef(decl_typedefs *defs, decl_typedef *def) {
+static inline decl_typedefs *add_decl_typedef(decl_typedefs *defs, decl_typedef *def) {
if (!defs) {
defs = calloc(1, sizeof(*defs));
}
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;
+ unsigned array_size;
struct decl_arg *arg;
} decl_var;
-static inline decl_var *init_decl_var(char *name, unsigned pl) {
+static inline decl_var *init_decl_var(char *name, unsigned pl, unsigned as) {
decl_var *v = malloc(sizeof(*v));
v->name = (char *) strdup((const char *) name);
v->pointer_level = pl;
+ v->array_size = as;
return v;
}
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;
static inline void free_let_stmt(let_stmt *stmt) {
free_decl_var(stmt->var);
- free_let_value(stmt->val);
+ if (stmt->val) {
+ free_let_value(stmt->val);
+ }
free(stmt);
}
stmts->fre.list = add_impl_stmt_ex(stmts->fre.list, ++stmts->fre.count, stmt->s.fre);
break;
}
+ free(stmt);
return stmts;
}
impl **list;
} impls;
-static impls *add_impl(impls *impls, impl *impl) {
+static inline impls *add_impl(impls *impls, impl *impl) {
if (!impls) {
impls = calloc(1, sizeof(*impls));
}