+ /* set up defaults */
+ for (i = 0; i < impl->func->args->count; ++i) {
+ iarg = impl->func->args->args[i];
+
+ if (i < EX_NUM_ARGS()) {
+ iarg->_zv = ++zarg;
+ ZVAL_DEREF(iarg->_zv);
+ if (iarg->var->reference) {
+ zval_dtor(iarg->_zv);
+ ZVAL_NULL(iarg->_zv);
+ }
+ }
+
+ if (iarg->def) {
+ switch (iarg->type->type) {
+ case PSI_T_BOOL:
+ iarg->val.zend.bval = iarg->def->type == PSI_T_TRUE ? 1 : 0;
+ break;
+ case PSI_T_INT:
+ iarg->val.zend.lval = zend_atol(iarg->def->text, strlen(iarg->def->text));
+ break;
+ case PSI_T_FLOAT:
+ case PSI_T_DOUBLE:
+ iarg->val.dval = zend_strtod(iarg->def->text, NULL);
+ break;
+ case PSI_T_STRING:
+ /* FIXME */
+ iarg->val.zend.str = zend_string_init(&iarg->def->text[1], strlen(iarg->def->text) - 2, 0);
+ break;
+ }
+ }
+ }
+