fix leak
[m6w6/ext-psi] / src / call.c
index 46a1dde419cf32876cb591e3aeb03dcdf8f49dff..9b6f79f32c3af14382df03cac252fb86077c7552 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "php.h"
 #include "zend_exceptions.h"
+#include "ext/spl/spl_exceptions.h"
 
 struct psi_call_frame_argument *psi_call_frame_argument_init(struct psi_impl_arg *spec,
                impl_val *ival, zval *zptr, int is_vararg) {
@@ -187,6 +188,7 @@ zval *psi_call_frame_sub_argument(struct psi_call_frame *frame,
        if (!inner_zval) {
                zval empty_zval;
 
+               SEPARATE_ZVAL(outer_zval);
                ZVAL_NULL(&empty_zval);
                inner_zval = zend_symtable_str_update(Z_ARRVAL_P(outer_zval),
                                &inner_var->name[1], strlen(&inner_var->name[1]),
@@ -282,9 +284,9 @@ ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame,
                        Z_PARAM_ARRAY_EX(tmp, _optional || iarg->var->reference,
                                        iarg->var->reference);
                } else if (PSI_T_OBJECT == iarg->type->type) {
-                       Z_PARAM_PROLOGUE(0);
+                       Z_PARAM_PROLOGUE(iarg->var->reference);
                } else if (PSI_T_MIXED == iarg->type->type) {
-                       Z_PARAM_PROLOGUE(0);
+                       Z_PARAM_PROLOGUE(iarg->var->reference);
                } else if (PSI_T_CALLABLE == iarg->type->type) {
                        zend_fcall_info fci;
                        zend_fcall_info_cache fcc;
@@ -396,6 +398,26 @@ ZEND_RESULT_CODE psi_call_frame_do_let(struct psi_call_frame *frame) {
        return SUCCESS;
 }
 
+ZEND_RESULT_CODE psi_call_frame_do_assert(struct psi_call_frame *frame, enum psi_assert_kind kind) {
+       size_t i = 0;
+       struct psi_assert_stmt *ass;
+
+       while (psi_plist_get(frame->impl->stmts.ass, i++, &ass)) {
+               if (ass->kind == kind) {
+                       if (!psi_assert_stmt_exec(ass, frame)) {
+                               char *message = psi_assert_stmt_message(ass);
+                               zend_throw_exception(kind == PSI_ASSERT_PRE
+                                               ? spl_ce_InvalidArgumentException
+                                               : spl_ce_UnexpectedValueException, message, 0);
+                               free(message);
+                               return FAILURE;
+                       }
+               }
+       }
+
+       return SUCCESS;
+}
+
 void psi_call_frame_do_call(struct psi_call_frame *frame) {
        size_t va_count = psi_call_frame_num_var_args(frame);