functor types
[m6w6/ext-psi] / src / marshal.c
index 28553173862e69caebfb0f1d474fd77a777bd2a6..622db12bd817ce05ea02573c65fafe370541c934 100644 (file)
@@ -348,6 +348,8 @@ void psi_from_zval(impl_val *mem, decl_arg *spec, zval *zv, void **tmp)
        decl_type *type = real_decl_type(spec->type);
 
        switch (type->type) {
+       case PSI_T_FUNCTION:
+               break;
        case PSI_T_FLOAT:
                mem->fval = (float) zval_get_double(zv);
                break;
@@ -394,6 +396,32 @@ void *psi_array_to_struct(decl_struct *s, HashTable *arr)
        return mem;
 }
 
+void *psi_array_to_union(decl_union *u, HashTable *arr) {
+       size_t i;
+       char *mem = ecalloc(1, u->size + sizeof(void *));
+
+       if (arr) for (i = 0; i < u->args->count; ++i) {
+               decl_arg *darg = u->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, &val, darg->layout->len);
+                       if (tmp) {
+                               ((void **)(mem + u->size))[0] = tmp;
+                       }
+                       /* first found entry wins */
+                       break;
+               }
+       }
+
+       return mem;
+}
+
 void psi_to_recursive(zval *return_value, set_value *set, impl_val *r_val)
 {
        set->outer.set->func->handler(return_value, set, r_val);
@@ -507,6 +535,9 @@ impl_val *psi_let_arrval(impl_val *tmp, decl_type *type, impl_arg *iarg, void **
        case PSI_T_STRUCT:
                *to_free = tmp = psi_array_to_struct(real->real.strct, arr);
                break;
+       case PSI_T_UNION:
+               *to_free = tmp = psi_array_to_union(real->real.unn, arr);
+               break;
        EMPTY_SWITCH_DEFAULT_CASE();
        }