X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcall.c;h=9b6f79f32c3af14382df03cac252fb86077c7552;hp=3b477943d4fa06b8380bed164da8c82a75e318d1;hb=b09850fb2c28c23547fed5ac83faf0fa2d3e6b8b;hpb=280c9384edec13b46ac67016208fc9d50a0b7347 diff --git a/src/call.c b/src/call.c index 3b47794..9b6f79f 100644 --- a/src/call.c +++ b/src/call.c @@ -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) { @@ -397,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);