flush
[m6w6/ext-psi] / src / module.c
index ff7353aeeac9cc272a030fd98181f1e5468718c0..607015d29e1412ee70ec207a14c57048e10b4d9c 100644 (file)
@@ -33,16 +33,25 @@ PHP_INI_END();
 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)
@@ -288,6 +297,13 @@ void psi_to_string(zval *return_value, set_value *set, impl_val *ret_val)
        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:
@@ -306,13 +322,6 @@ void psi_to_string(zval *return_value, set_value *set, impl_val *ret_val)
                        }
                }
                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;
        }
@@ -377,6 +386,11 @@ void *psi_array_to_struct(decl_struct *s, HashTable *arr)
        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;
@@ -476,7 +490,6 @@ void psi_to_object(zval *return_value, set_value *set, impl_val *r_val)
 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;
 
@@ -544,10 +557,9 @@ static inline ZEND_RESULT_CODE psi_parse_args(zend_execute_data *execute_data, i
 
        /* 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;
@@ -1174,7 +1186,7 @@ PHP_MINIT_FUNCTION(psi)
                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")) {