#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) {
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]),
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;
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);