static zend_object_handlers psi_object_handlers;
static zend_class_entry *psi_class_entry;
-void psi_error(int type, const char *msg, ...)
+void psi_error_wrapper(PSI_Token *t, int type, const char *msg, ...)
{
- char buf[0x1000];
va_list argv;
va_start(argv, msg);
- vslprintf(buf, 0x1000, msg, argv);
+ psi_verror(type, t?t->file:"Unknown", t?*t->line:0, msg, argv);
va_end(argv);
+}
+void psi_error(int type, const char *fn, unsigned ln, const char *msg, ...)
+{
+ va_list argv;
- php_error(type, buf);
+ va_start(argv, msg);
+ psi_verror(type, fn, ln, msg, argv);
+ va_end(argv);
+}
+void psi_verror(int type, const char *fn, unsigned ln, const char *msg, va_list argv)
+{
+ zend_error_cb(type, fn, ln, msg, argv);
}
size_t psi_t_alignment(token_t t)
token_t t = real_decl_type(var->arg->type)->type;
switch (t) {
+ case PSI_T_FLOAT:
+ RETVAL_DOUBLE((double) deref_impl_val(ret_val, var)->fval);
+ break;
+ case PSI_T_DOUBLE:
+ RETVAL_DOUBLE(deref_impl_val(ret_val, var)->dval);
+ break;
+ default:
case PSI_T_VOID:
case PSI_T_INT8:
case PSI_T_UINT8:
}
}
return;
- case PSI_T_FLOAT:
- RETVAL_DOUBLE((double) deref_impl_val(ret_val, var)->fval);
- break;
- case PSI_T_DOUBLE:
- RETVAL_DOUBLE(deref_impl_val(ret_val, var)->dval);
- break;
- default:
psi_to_int(return_value, set, ret_val);
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->outer.set, r_val->ptr);
+}
+
void psi_to_array(zval *return_value, set_value *set, impl_val *r_val)
{
size_t i;
static inline ZEND_RESULT_CODE psi_parse_args(zend_execute_data *execute_data, impl *impl)
{
size_t i;
- zval *zarg = ZEND_CALL_ARG(execute_data, 0);
impl_arg *iarg;
zend_error_handling zeh;
/* set up defaults */
for (i = 0; i < impl->func->args->count; ++i) {
- iarg = impl->func->args->args[i];
+ if (i >= EX_NUM_ARGS() && iarg->def) {
+ iarg = impl->func->args->args[i];
- if (i < EX_NUM_ARGS()) {
- } else if (iarg->def) {
switch (iarg->type->type) {
case PSI_T_BOOL:
iarg->val.zend.bval = iarg->def->type == PSI_T_TRUE ? 1 : 0;
return FAILURE;
}
- PSI_ContextInit(&PSI_G(context), ops, psi_error);
+ PSI_ContextInit(&PSI_G(context), ops, psi_error_wrapper);
PSI_ContextBuild(&PSI_G(context), PSI_G(directory));
if (psi_check_env("PSI_DUMP")) {