X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fmodule.c;h=a883e62bd982dd721d405362166f691de90aad49;hp=628694b44840f6b4c4c54ee43389fe50fac77cf4;hb=d9a7378b795f32b91e110bd163c019aa30e79084;hpb=469fe3395cb9696e32bcd64639f22113d8fb2ec6 diff --git a/src/module.c b/src/module.c index 628694b..a883e62 100644 --- a/src/module.c +++ b/src/module.c @@ -295,11 +295,10 @@ void psi_from_zval(impl_val *mem, decl_arg *spec, zval *zv, void **tmp) void *psi_array_to_struct(decl_struct *s, HashTable *arr) { - size_t i, j = 0, size = decl_struct_size(s); - char *mem = ecalloc(1, size + s->args->count * sizeof(void *)); + size_t i, j = 0; + char *mem = ecalloc(1, s->size + s->args->count * sizeof(void *)); if (arr) for (i = 0; i < s->args->count; ++i) { - decl_struct_layout *layout = &s->layout[i]; decl_arg *darg = s->args->args[i]; zval *entry = zend_hash_str_find_ind(arr, darg->var->name, strlen(darg->var->name)); @@ -309,9 +308,9 @@ void *psi_array_to_struct(decl_struct *s, HashTable *arr) memset(&tmp, 0, sizeof(tmp)); psi_from_zval(&val, darg, entry, &tmp); - memcpy(mem + layout->pos, &val, layout->len); + memcpy(mem + darg->layout->pos, &val, darg->layout->len); if (tmp) { - ((void **)(mem + size))[j++] = tmp; + ((void **)(mem + s->size))[j++] = tmp; } } } @@ -333,13 +332,13 @@ void psi_to_array(zval *return_value, token_t t, impl_val *ret_val, decl_var *va ZEND_ASSERT(s); for (i = 0; i < s->args->count; ++i) { decl_arg *darg = s->args->args[i]; - decl_struct_layout layout = s->layout[i]; - impl_val tmp; + impl_val tmp, tmp_ptr; zval ztmp; - char *ptr = (char *) ret_val->ptr + layout.pos; + char *ptr = (char *) ret_val->ptr + darg->layout->pos; + tmp_ptr.ptr = &tmp; memset(&tmp, 0, sizeof(tmp)); - memcpy(&tmp, ptr, layout.len); + memcpy(&tmp, ptr, darg->layout->len); switch (real_decl_type(darg->type)->type) { case PSI_T_FLOAT: case PSI_T_DOUBLE: @@ -348,7 +347,7 @@ void psi_to_array(zval *return_value, token_t t, impl_val *ret_val, decl_var *va case PSI_T_INT8: case PSI_T_UINT8: if (darg->var->pointer_level) { - psi_to_string(&ztmp, real_decl_type(darg->type)->type, &tmp, darg->var); + psi_to_string(&ztmp, real_decl_type(darg->type)->type, &tmp_ptr, darg->var); break; } /* no break */ @@ -360,6 +359,9 @@ void psi_to_array(zval *return_value, token_t t, impl_val *ret_val, decl_var *va case PSI_T_UINT64: psi_to_int(&ztmp, real_decl_type(darg->type)->type, &tmp, darg->var); break; + case PSI_T_STRUCT: + psi_to_array(&ztmp, real_decl_type(darg->type)->type, &tmp_ptr, darg->var); + break; default: printf("t=%d\n", real_decl_type(darg->type)->type); abort(); @@ -452,8 +454,8 @@ void *psi_do_calloc(let_calloc *alloc) size_t size; if (type->type == PSI_T_STRUCT) { - /* psi_do_clean expects a NULL pointer after the struct */ - size = decl_struct_size(type->strct) + sizeof(void *); + /* psi_do_clean expects at least one NULL pointer after the struct */ + size = type->strct->size + sizeof(void *); } else { size = psi_t_size(type->type); } @@ -545,9 +547,9 @@ void *psi_do_let(decl_arg *darg) } } -void psi_do_set(zval *return_value, set_func *func, decl_vars *vars) +void psi_do_set(zval *return_value, set_value *set) { - impl_val *val = (impl_val *) &vars->vars[0]->arg->let->ptr; + impl_val *val = (impl_val *) &set->vars->vars[0]->arg->let->ptr; ZVAL_DEREF(return_value); zval_dtor(return_value); @@ -563,10 +565,8 @@ void psi_do_set(zval *return_value, set_func *func, decl_vars *vars) } } -void psi_do_return(impl *impl, impl_val *ret_val, zval *return_value) +void psi_do_return(return_stmt *ret, impl_val *ret_val, zval *return_value) { - return_stmt *ret = impl->stmts->ret.list[0]; - switch (ret->func->type) { case PSI_T_TO_STRING: psi_to_string(return_value, real_decl_type(impl->decl->func->type)->type, ret_val, ret->decl); @@ -618,8 +618,7 @@ void psi_do_clean(impl *impl) decl_type *type = real_decl_type(darg->type); if (type->type == PSI_T_STRUCT) { - size_t eos = decl_struct_size(type->strct); - void **ptr = (void **) ((char *) darg->let->mem + eos); + void **ptr = (void **) ((char *) darg->let->mem + type->strct->size); while (*ptr) { efree(*ptr++);