decl_abi *abi;
decl_arg *func;
decl_args *args;
- void *dlptr;
+ struct impl *impl;
+ struct {
+ void *sym;
+ void *info;
+ void **args;
+ } call;
} decl;
static inline decl* init_decl(decl_abi *abi, decl_arg *func, decl_args *args) {
typedef union impl_val {
char cval;
int8_t i8;
+ uint8_t u8;
short sval;
int16_t i16;
+ uint16_t u16;
int ival;
int32_t i32;
+ uint32_t u32;
long lval;
int64_t i64;
+ uint64_t u64;
float fval;
double dval;
union {
static inline impl_val *deref_impl_val(impl_val *ret_val, decl_var *var) {
unsigned i;
- if (var->arg->var != var) for (i = 0; i < var->pointer_level; ++i) {
+ if (var->arg->var != var) for (i = 1; i < var->pointer_level; ++i) {
ret_val = *(void **) ret_val;
}
return ret_val;
if (!var->pointer_level && real_decl_type(var->arg->type)->type != PSI_T_STRUCT) {
return ptr;
}
- val = val_ptr = calloc(var->pointer_level, sizeof(void *));
+ val = val_ptr = calloc(var->pointer_level + 1, sizeof(void *));
for (i = 1; i < var->pointer_level; ++i) {
val_ptr->ptr = (void **) val_ptr + 1;
val_ptr = val_ptr->ptr;
typedef struct set_func {
token_t type;
char *name;
- void (*handler)(zval *, token_t, impl_val *, struct set_value *set, decl_var *);
+ void (*handler)(zval *, struct set_value *set, impl_val *ret_val);
} set_func;
static inline set_func *init_set_func(token_t type, const char *name) {
typedef struct set_value {
set_func *func;
decl_vars *vars;
+ struct {
+ struct set_value *set;
+ impl_val *val;
+ } outer;
struct set_value **inner;
size_t count;
} set_value;
free(ret);
}
-typedef struct free_stmt {
+typedef struct free_call {
+ char *func;
decl_vars *vars;
+ decl *decl;
+} free_call;
+
+static inline free_call *init_free_call(const char *func, decl_vars *vars) {
+ free_call *f = calloc(1, sizeof(*f));
+ f->func = strdup(func);
+ f->vars = vars;
+ return f;
+}
+
+static inline void free_free_call(free_call *f) {
+ free(f->func);
+ free(f);
+}
+
+typedef struct free_calls {
+ free_call **list;
+ size_t count;
+} free_calls;
+
+static inline free_calls *init_free_calls(free_call *f) {
+ free_calls *fcs = calloc(1, sizeof(*fcs));
+ if (f) {
+ fcs->count = 1;
+ fcs->list = calloc(1, sizeof(*fcs->list));
+ fcs->list[0] = f;
+ }
+ return fcs;
+}
+
+static inline void free_free_calls(free_calls *fcs) {
+ size_t i;
+
+ for (i = 0; i < fcs->count; ++i) {
+ free_free_call(fcs->list[i]);
+ }
+ free(fcs->list);
+ free(fcs);
+}
+
+static inline free_calls *add_free_call(free_calls *fcs, free_call *f) {
+ fcs->list = realloc(fcs->list, ++fcs->count * sizeof(*fcs->list));
+ fcs->list[fcs->count-1] = f;
+ return fcs;
+}
+
+typedef struct free_stmt {
+ free_calls *calls;
} free_stmt;
-static inline free_stmt *init_free_stmt(decl_vars *vars) {
- free_stmt *free_ = calloc(1, sizeof(*free_));
- free_->vars = vars;
- return free_;
+static inline free_stmt *init_free_stmt(free_calls *calls) {
+ free_stmt *f = calloc(1, sizeof(*f));
+ f->calls = calls;
+ return f;
}
-static inline void free_free_stmt(free_stmt *free_) {
- free_decl_vars(free_->vars);
- free(free_);
+static inline void free_free_stmt(free_stmt *f) {
+ free_free_calls(f->calls);
+ free(f);
}
typedef struct impl_stmt {