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;
char *name;
token_t type;
struct decl_type *real;
+ struct decl_struct *strct;
} 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->real = NULL;
return t;
}
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(decls);
}
+typedef struct decl_struct_layout {
+ size_t pos;
+ size_t len;
+} decl_struct_layout;
+
+typedef struct decl_struct {
+ char *name;
+ decl_args *args;
+ decl_struct_layout *layout;
+} decl_struct;
+
+static inline decl_struct *init_decl_struct(char *name, decl_args *args) {
+ decl_struct *s = calloc(1, sizeof(*s));
+ s->name = strdup(name);
+ s->args = args;
+ return s;
+}
+
+static inline void free_decl_struct(decl_struct *s) {
+ if (s->args) {
+ free_decl_args(s->args);
+ }
+ if (s->layout) {
+ free(s->layout);
+ }
+ 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;
+} decl_structs;
+
+static inline decl_structs *add_decl_struct(decl_structs *ss, decl_struct *s) {
+ if (!ss) {
+ ss = calloc(1, sizeof(*ss));
+ }
+ ss->list = realloc(ss->list, ++ss->count * sizeof(*ss->list));
+ ss->list[ss->count-1] = s;
+ return ss;
+}
+
+static inline void free_decl_structs(decl_structs *ss) {
+ size_t i;
+
+ for (i = 0; i < ss->count; ++i) {
+ free_decl_struct(ss->list[i]);
+ }
+ free(ss->list);
+ free(ss);
+}
+
typedef union impl_val {
unsigned char bval;
char cval;
short sval;
int ival;
+ float fval;
double dval;
zend_long lval;
zend_string *str;
typedef struct let_func {
token_t type;
char *name;
+ size_t size;
} let_func;
-static inline let_func *init_let_func(token_t type, char *name) {
+static inline let_func *init_let_func(token_t type, char *name, size_t size) {
let_func *func = malloc(sizeof(*func));
func->type = type;
- func->name = (char *) strdup((const char *) name);
+ func->name = strdup(name);
+ func->size = size;
return func;
}
#define PSI_DATA_MEMBERS \
constants *consts; \
decl_typedefs *defs; \
+ decl_structs *structs; \
decls *decls; \
impls *impls; \
char *lib; \
if (data->defs) {
free_decl_typedefs(data->defs);
}
+ if (data->structs) {
+ free_decl_structs(data->structs);
+ }
if (data->decls) {
free_decls(data->decls);
}