X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fassert_stmt.c;h=ee9e50eab2acb2babe8ef4250e84278d946c58cf;hb=698841dfdd4d70d24e0b7af25ac7100bc2cb26a4;hp=9ded0ee9910d3669bf45e05232c7f85f8658c7ef;hpb=2fa436074ca9a5e87f39b696de832fa2188fcfc6;p=m6w6%2Fext-psi diff --git a/src/types/assert_stmt.c b/src/types/assert_stmt.c index 9ded0ee..ee9e50e 100644 --- a/src/types/assert_stmt.c +++ b/src/types/assert_stmt.c @@ -23,14 +23,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif #include "data.h" #include "calc.h" +#include "zend_smart_str.h" +#include "zend_exceptions.h" +#include "ext/spl/spl_exceptions.h" + struct psi_assert_stmt *psi_assert_stmt_init(enum psi_assert_kind kind, struct psi_num_exp *exp) { - struct psi_assert_stmt *stmt = calloc(1, sizeof(*stmt)); + struct psi_assert_stmt *stmt = pecalloc(1, sizeof(*stmt), 1); stmt->kind = kind; stmt->exp = exp; @@ -50,11 +58,11 @@ void psi_assert_stmt_free(struct psi_assert_stmt **stmt_ptr) } } -void psi_assert_stmt_dump(int fd, struct psi_assert_stmt *stmt) +void psi_assert_stmt_dump(struct psi_dump *dump, struct psi_assert_stmt *stmt) { - dprintf(fd, "\t%s_assert ", stmt->kind == PSI_ASSERT_PRE ? "pre" : "post"); - psi_num_exp_dump(fd, stmt->exp); - dprintf(fd, ";\n"); + PSI_DUMP(dump, "\t%s_assert ", stmt->kind == PSI_ASSERT_PRE ? "pre" : "post"); + psi_num_exp_dump(dump, stmt->exp); + PSI_DUMP(dump, ";\n"); } bool psi_assert_stmt_exec(struct psi_assert_stmt *stmt, struct psi_call_frame *frame) @@ -81,20 +89,19 @@ bool psi_assert_stmts_validate(struct psi_data *data, struct psi_validate_scope return true; } -char *psi_assert_stmt_message(struct psi_assert_stmt *stmt) +void psi_assert_stmt_throw(struct psi_assert_stmt *stmt) { - /* FIXME */ - struct stat sb; - char *message, template[] = "psi.assert.XXXXXX"; - int fd = mkstemp(template); - - dprintf(fd, "Failed asserting that "); - psi_num_exp_dump(fd, stmt->exp); - fstat(fd, &sb); - message = malloc(sb.st_size + 1); - lseek(fd, 0, SEEK_SET); - read(fd, message, sb.st_size); - close(fd); - message[sb.st_size] = '\0'; - return message; + struct psi_dump dump; + smart_str str = {0}; + + dump.ctx.hn = &str; + dump.fun = (psi_dump_cb) smart_str_append_printf; + + PSI_DUMP(&dump, "Failed asserting that "); + psi_num_exp_dump(&dump, stmt->exp); + smart_str_0(&str); + zend_throw_exception(stmt->kind == PSI_ASSERT_PRE + ? spl_ce_InvalidArgumentException + : spl_ce_UnexpectedValueException, str.s->val, 0); + smart_str_free(&str); }