ret_val = deref_impl_val(ret_val, var);
if (ret_val && ret_val->ptr) {
if (set->num) {
- RETVAL_STRINGL(ret_val->ptr, psi_long_num_exp(set->num, NULL));
+ RETVAL_STRINGL(ret_val->ptr, psi_long_num_exp(set->num, set->outer.val));
} else {
RETVAL_STRING(ret_val->ptr);
}
if (i < EX_NUM_ARGS()) {
iarg->_zv = ++zarg;
ZVAL_DEREF(iarg->_zv);
- if (iarg->var->reference) {
- zval_dtor(iarg->_zv);
- ZVAL_NULL(iarg->_zv);
- }
+// if (iarg->var->reference) {
+// zval_dtor(iarg->_zv);
+// ZVAL_NULL(iarg->_zv);
+// }
}
if (iarg->def) {
static inline void *psi_do_let(let_stmt *let)
{
decl_arg *darg = let->var->arg;
- impl_arg *iarg = darg->let->arg;
impl_val *arg_val = darg->ptr;
- if (!iarg) {
- /* let foo = calloc(1, long);
- * let foo = NULL;
- * let foo;
- */
- if (darg->let->val->func && darg->let->val->func->type == PSI_T_CALLOC) {
- arg_val->ptr = psi_do_calloc(darg->let->val->func->alloc);
- darg->mem = arg_val->ptr;
- } else if (darg->var->array_size) {
+ if (!let->val) {
+ if (darg->var->array_size) {
arg_val->ptr = ecalloc(darg->var->array_size, sizeof(*arg_val));
darg->mem = arg_val->ptr;
} else {
memset(arg_val, 0, sizeof(*arg_val));
}
+ } else if (let->val->num) {
+ arg_val->zend.lval = psi_long_num_exp(darg->let->val->num, NULL);
} else {
+ impl_arg *iarg = darg->let->arg;
- switch (darg->let->val->func->type) {
+ switch (let->val->func->type) {
+ case PSI_T_CALLOC:
+ arg_val->ptr = psi_do_calloc(let->val->func->alloc);
+ darg->mem = arg_val->ptr;
+ break;
case PSI_T_BOOLVAL:
if (iarg->type->type == PSI_T_BOOL) {
arg_val->cval = iarg->val.zend.bval;
static inline void psi_do_set(zval *return_value, set_value *set)
{
+ zval_dtor(return_value);
set->func->handler(return_value, set, set->vars->vars[0]->arg->ptr);
}
ret->set->func->handler(return_value, ret->set, ret->set->vars->vars[0]->arg->ptr);
}
-static inline void psi_do_return2(zval *return_value, return_stmt *ret, impl_val *ret_val)
-{
- ret->set->func->handler(return_value, ret->set, ret_val);
-}
-
static inline void psi_do_free(free_stmt *fre)
{
size_t i, j;
}
}
-static inline int psi_calc_num_exp_value(num_exp *exp, impl_val *ref, impl_val *res) {
- impl_val *tmp = NULL;
+static inline int psi_calc_num_exp_value(num_exp *exp, impl_val *strct, impl_val *res) {
+ impl_val *ref, *tmp = NULL;
switch (exp->t) {
case PSI_T_NUMBER:
break;
case PSI_T_NAME:
- if (1) {
- ref = exp->u.dvar->arg->ptr;
+ if (strct) {
+ ref = struct_member_ref(exp->u.dvar->arg, strct, &tmp);
} else {
- ref = struct_member_ref(exp->u.dvar->arg, ref, &tmp);
+ ref = exp->u.dvar->arg->ptr;
}
switch (real_decl_type(exp->u.dvar->arg->type)->type) {
case PSI_T_INT8:
return 0;
}
-int psi_calc_num_exp(num_exp *exp, impl_val *ref, impl_val *res) {
+int psi_calc_num_exp(num_exp *exp, impl_val *strct, impl_val *res) {
impl_val num = {0};
- int num_type = psi_calc_num_exp_value(exp, ref, &num);
+ int num_type = psi_calc_num_exp_value(exp, strct, &num);
if (exp->operand) {
impl_val tmp = {0};
- int tmp_type = psi_calc_num_exp(exp->operand, ref, &tmp);
+ int tmp_type = psi_calc_num_exp(exp->operand, strct, &tmp);
return exp->calculator(num_type, &num, tmp_type, &tmp, res);
}