fix leak
[m6w6/ext-psi] / src / parser.h
index 8df41eafe50cf95aceba8e8fd9e32a938c809d1f..1321f6cc8b4292948f2a793cba4f8184b9be33ea 100644 (file)
 
 typedef int token_t;
 
 
 typedef int token_t;
 
+/* in php_psi.h */
+size_t psi_t_alignment(token_t);
+size_t psi_t_size(token_t);
+
 typedef struct PSI_Token {
        token_t type;
        unsigned line;
 typedef struct PSI_Token {
        token_t type;
        unsigned line;
@@ -29,10 +33,9 @@ typedef struct decl_type {
 } decl_type;
 
 static inline decl_type *init_decl_type(token_t type, char *name) {
 } decl_type;
 
 static inline decl_type *init_decl_type(token_t type, char *name) {
-       decl_type *t = malloc(sizeof(*t));
+       decl_type *t = calloc(1, sizeof(*t));
        t->type = type;
        t->name = strdup(name);
        t->type = type;
        t->name = strdup(name);
-       t->real = NULL;
        return t;
 }
 
        return t;
 }
 
@@ -221,7 +224,9 @@ static inline decl* init_decl(decl_abi *abi, decl_arg *func, decl_args *args) {
 static inline void free_decl(decl *d) {
        free_decl_abi(d->abi);
        free_decl_arg(d->func);
 static inline void free_decl(decl *d) {
        free_decl_abi(d->abi);
        free_decl_arg(d->func);
-       free_decl_args(d->args);
+       if (d->args) {
+               free_decl_args(d->args);
+       }
        free(d);
 }
 
        free(d);
 }
 
@@ -268,11 +273,22 @@ static inline decl_struct *init_decl_struct(char *name, decl_args *args) {
 }
 
 static inline void free_decl_struct(decl_struct *s) {
 }
 
 static inline void free_decl_struct(decl_struct *s) {
-       free_decl_args(s->args);
+       if (s->args) {
+               free_decl_args(s->args);
+       }
+       if (s->layout) {
+               free(s->layout);
+       }
        free(s->name);
        free(s);
 }
 
        free(s->name);
        free(s);
 }
 
+static inline size_t decl_struct_size(decl_struct *s) {
+       size_t c = s->args->count - 1;
+       decl_type *type = real_decl_type(s->args->args[c]->type);
+       return s->layout[c].pos + psi_t_alignment(type->type);
+}
+
 typedef struct decl_structs {
        size_t count;
        decl_struct **list;
 typedef struct decl_structs {
        size_t count;
        decl_struct **list;
@@ -302,6 +318,7 @@ typedef union impl_val {
        char cval;
        short sval;
        int ival;
        char cval;
        short sval;
        int ival;
+       float fval;
        double dval;
        zend_long lval;
        zend_string *str;
        double dval;
        zend_long lval;
        zend_string *str;