- zend_fcall_info_argp(iarg->val.zend.cb->fci, argc, argv);
- zend_fcall_info_call(&iarg->val.zend.cb->fci, &iarg->val.zend.cb->fcc,
- &return_value, NULL);
- // marshal return value of the userland call
- switch (cb->func->type) {
- case PSI_T_BOOLVAL:
- break;
- case PSI_T_INTVAL:
- break;
- case PSI_T_FLOATVAL:
- break;
- case PSI_T_PATHVAL:
- case PSI_T_STRVAL:
- break;
- case PSI_T_STRLEN:
- break;
- case PSI_T_ARRVAL:
- break;
- case PSI_T_OBJVAL:
- break;
- case PSI_T_CALLBACK:
- break;
- EMPTY_SWITCH_DEFAULT_CASE();
+ zend_fcall_info_argp(&iarg->val.zend.cb->fci, cb->args->count, zargv);
+
+ /* callback into userland */
+ ZVAL_UNDEF(&return_value);
+ iarg->_zv = &return_value;
+ zend_fcall_info_call(&iarg->val.zend.cb->fci, &iarg->val.zend.cb->fcc, iarg->_zv, NULL);
+
+ /* marshal return value of the userland call */
+ switch (iarg->type->type) {
+ case PSI_T_BOOL: zend_parse_arg_bool(iarg->_zv, &iarg->val.zend.bval, NULL, 0); break;
+ case PSI_T_LONG: zend_parse_arg_long(iarg->_zv, &iarg->val.zend.lval, NULL, 0, 1); break;
+ case PSI_T_FLOAT:
+ case PSI_T_DOUBLE: zend_parse_arg_double(iarg->_zv, &iarg->val.dval, NULL, 0); break;
+ case PSI_T_STRING: zend_parse_arg_str(iarg->_zv, &iarg->val.zend.str, 0); break;
+ }
+ result = cb->func->handler(_result, decl_cb->func->type, iarg, &to_free);
+
+ if (result != _result) {
+ *(void **)_result = result;