flush
[m6w6/ext-psi] / src / parser.h
index 67252e24855b9aa5cae8c0a68c01def1e2587d3b..0f2b4a072e50fe92c1c5cc9f57d2dbb82f1ee3a8 100644 (file)
@@ -141,6 +141,7 @@ static inline decl_arg *init_decl_arg(decl_type *type, decl_var *var) {
        decl_arg *arg = calloc(1, sizeof(*arg));
        arg->type = type;
        arg->var = var;
+       var->arg = arg;
        return arg;
 }
 
@@ -234,7 +235,12 @@ typedef struct decl {
        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) {
@@ -326,12 +332,16 @@ static inline void free_decl_structs(decl_structs *ss) {
 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 {
@@ -346,7 +356,7 @@ typedef union impl_val {
 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;
@@ -359,7 +369,7 @@ static inline impl_val *enref_impl_val(void *ptr, decl_var *var) {
        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;
@@ -590,7 +600,7 @@ struct set_value;
 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) {
@@ -608,6 +618,10 @@ static inline void free_set_func(set_func *func) {
 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;