-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 *));
-
- 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));
-
- if (entry) {
- impl_val val;
- void *tmp = NULL;
-
- memset(&tmp, 0, sizeof(tmp));
- psi_from_zval(&val, darg, entry, &tmp);
- memcpy(mem + layout->pos, &val, layout->len);
- if (tmp) {
- ((void **)(mem + size))[j++] = tmp;
- }
- }
- }
- return mem;
-}
-
-void psi_to_array(zval *return_value, token_t t, impl_val *ret_val, decl_var *var)
-{
- zval ele;
- unsigned i;
- impl_val tmp;
-
- array_init(return_value);
-
- if (t == PSI_T_STRUCT) {
- decl_struct *s = real_decl_type(var->arg->type)->strct;
- ret_val = deref_impl_val(ret_val, var);
-
- 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;
- zval ztmp;
- char *ptr = (char *) ret_val->ptr + layout.pos;
-
- memset(&tmp, 0, sizeof(tmp));
- memcpy(&tmp, ptr, layout.len);
- switch (real_decl_type(darg->type)->type) {
- case PSI_T_FLOAT:
- case PSI_T_DOUBLE:
- psi_to_double(&ztmp, real_decl_type(darg->type)->type, &tmp, darg->var);
- break;
- 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);
- break;
- }
- /* no break */
- case PSI_T_INT16:
- case PSI_T_UINT16:
- case PSI_T_INT32:
- case PSI_T_UINT32:
- case PSI_T_INT64:
- case PSI_T_UINT64:
- psi_to_int(&ztmp, real_decl_type(darg->type)->type, &tmp, darg->var);
- break;
- default:
- printf("t=%d\n", real_decl_type(darg->type)->type);
- abort();
- }
- add_assoc_zval(return_value, darg->var->name, &ztmp);
- }