fix coupling of impl + call_info + decl
[m6w6/ext-psi] / src / call.c
index 3b477943d4fa06b8380bed164da8c82a75e318d1..6c924c8fa8872e1f475239d1ff74256b1e302287 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) {
@@ -233,6 +234,22 @@ void **psi_call_frame_get_arg_pointers(struct psi_call_frame *frame) {
        return frame->pointers;
 }
 
+void *psi_call_frame_get_rpointer(struct psi_call_frame *frame) {
+       return frame->rpointer;
+}
+
+struct psi_decl *psi_call_frame_get_decl(struct psi_call_frame *frame) {
+       return frame->decl;
+}
+
+struct psi_impl *psi_call_frame_get_impl(struct psi_call_frame *frame) {
+       return frame->impl;
+}
+
+struct psi_context *psi_call_frame_get_context(struct psi_call_frame *frame) {
+       return frame->context;
+}
+
 ZEND_RESULT_CODE psi_call_frame_parse_args(struct psi_call_frame *frame,
                zend_execute_data *execute_data) {
        size_t i, argc = psi_plist_count(frame->impl->func->args);
@@ -397,37 +414,28 @@ ZEND_RESULT_CODE psi_call_frame_do_let(struct psi_call_frame *frame) {
        return SUCCESS;
 }
 
-void psi_call_frame_do_call(struct psi_call_frame *frame) {
-       size_t va_count = psi_call_frame_num_var_args(frame);
-
-       if (va_count) {
-               void **va_types = ecalloc(va_count, sizeof(void *));
-               size_t i;
-
-               for (i = 0; i < va_count; ++i) {
-                       struct psi_call_frame_argument *frame_arg;
-
-                       frame_arg = psi_call_frame_get_var_argument(frame, i);
-                       va_types[i] = frame->context->ops->query(frame->context,
-                                       PSI_CONTEXT_QUERY_TYPE, &frame_arg->va_type);
+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;
+                       }
                }
+       }
 
-               frame->context->ops->call_va(frame->context,
-                               frame,
-                               frame->decl,
-                               frame->rpointer,
-                               frame->pointers,
-                               va_count,
-                               va_types);
+       return SUCCESS;
+}
 
-               efree(va_types);
-       } else {
-               frame->context->ops->call(frame->context,
-                               frame,
-                               frame->decl,
-                               frame->rpointer,
-                               frame->pointers);
-       }
+void psi_call_frame_do_call(struct psi_call_frame *frame) {
+       frame->context->ops->call(frame);
 }
 
 void psi_call_frame_do_callback(struct psi_call_frame *frame, struct psi_call_frame_callback *cbdata)