EOF
[m6w6/ext-psi] / src / parser.h
index d8955e56d2294394b996f260bc98b040d7ea59fe..5ec0b95e6354875c2f4fa7aa881df78c9b11c67b 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;
 }
 
@@ -331,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 {
@@ -351,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;
@@ -595,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) {
@@ -613,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;
@@ -1056,7 +1065,7 @@ static inline PSI_Token *PSI_TokenAlloc(PSI_Parser *P) {
        PSI_Token *T;
        size_t token_len;
 
-       if (P->cur <= P->tok) {
+       if (P->cur < P->tok) {
                return NULL;
        }