X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fengine.c;fp=src%2Fengine.c;h=51f3b2879e85783053010282c9b2bf1d080cfc2b;hp=3a14e6d7e88571c0ff54bad5aa1c22a98eaaad2e;hb=8b652242a4ef920f2ab82bfb822596de25bc5a63;hpb=8d2ff6a3b85203ea5f8398f846a7764fd0e1d126 diff --git a/src/engine.c b/src/engine.c index 3a14e6d..51f3b28 100644 --- a/src/engine.c +++ b/src/engine.c @@ -7,6 +7,7 @@ #include "zend_exceptions.h" +#include "parser.h" #include "engine.h" #include "calc.h" #include "marshal.h" @@ -261,60 +262,18 @@ static inline impl_val *psi_let_val(token_t let_func, impl_arg *iarg, impl_val * { switch (let_func) { case PSI_T_BOOLVAL: - if (iarg->type->type == PSI_T_BOOL) { - arg_val->cval = iarg->val.zend.bval; - } else { - arg_val->cval = zend_is_true(iarg->_zv); - } break; case PSI_T_INTVAL: - if (iarg->type->type == PSI_T_INT) { - arg_val->lval = iarg->val.zend.lval; - } else { - arg_val->lval = zval_get_long(iarg->_zv); - } break; case PSI_T_FLOATVAL: - if (iarg->type->type == PSI_T_FLOAT || iarg->type->type == PSI_T_DOUBLE) { - arg_val->dval = iarg->val.dval; - } else { - arg_val->dval = zval_get_double(iarg->_zv); - } break; case PSI_T_PATHVAL: case PSI_T_STRVAL: - if (iarg->type->type == PSI_T_STRING) { - if (iarg->val.zend.str) { - arg_val->ptr = estrndup(iarg->val.zend.str->val, iarg->val.zend.str->len); - *to_free = arg_val->ptr; - } else { - arg_val->ptr = ""; - } - } else { - zend_string *zs = zval_get_string(iarg->_zv); - arg_val->ptr = estrdup(zs->val); - *to_free = arg_val->ptr; - zend_string_release(zs); - } if (PSI_T_PATHVAL == let_func) { - if (SUCCESS != php_check_open_basedir(arg_val->ptr)) { - efree(arg_val->ptr); - return NULL; - } + } break; case PSI_T_STRLEN: - if (iarg->type->type == PSI_T_STRING) { - if (iarg->val.zend.str) { - arg_val->lval = iarg->val.zend.str->len; - } else { - arg_val->lval = 0; - } - } else { - zend_string *zs = zval_get_string(iarg->_zv); - arg_val->lval = zs->len; - zend_string_release(zs); - } break; case PSI_T_ARRVAL: if (iarg->type->type == PSI_T_ARRAY) { @@ -344,6 +303,10 @@ static inline impl_val *psi_let_val(token_t let_func, impl_arg *iarg, impl_val * return arg_val; } +static inline impl_val *psi_let_func(let_func *func, decl_arg *darg) { + return darg->ptr = func->handler(darg->ptr, darg->type, func->arg, &darg->mem); +} + static inline void *psi_do_let(let_stmt *let) { decl_arg *darg = let->var->arg; @@ -378,6 +341,10 @@ static inline void *psi_do_let(let_stmt *let) arg_val->zend.lval = psi_long_num_exp(let->val->data.num, NULL); break; case PSI_LET_FUNC: + if (!psi_let_func(let->val->data.func, darg)) { + return NULL; + } + iarg = let->val->data.func->arg; if (!(darg->ptr = psi_let_val(let->val->data.func->type, iarg, darg->ptr, real_decl_type(darg->type)->strct, &darg->mem))) {