From baa75917c8c992d5d176464a2e96e998dad92a33 Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Sat, 3 Jul 1999 18:03:02 +0000 Subject: [PATCH] Support isset()/empty() for string offsets --- Zend/zend_execute.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c087255035..1254206539 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -595,8 +595,7 @@ static inline void zend_fetch_dimension_address(znode *result, znode *op1, znode zval *offset; offset = get_zval_ptr(op2, Ts, &free_op2, BP_VAR_R); - if (container->value.str.val == undefined_variable_string - || type==BP_VAR_IS) { + if (container->value.str.val == undefined_variable_string) { /* for read-mode only */ *retval = &EG(uninitialized_zval_ptr); FREE_OP(op2, free_op2); @@ -1843,7 +1842,18 @@ send_by_ref: zval **var = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_IS); int isset; - if (var==&EG(uninitialized_zval_ptr) + if (!var) { + if (Ts[opline->op1.u.var].EA.type==IS_STRING_OFFSET) { + if (Ts[opline->op1.u.var].EA.offset>=0 + && Ts[opline->op1.u.var].EA.offsetop1.u.var].EA.str->value.str.len) { + isset = 1; + } else { + isset = 0; + } + } else { + isset = 1; + } + } else if (var==&EG(uninitialized_zval_ptr) || ((*var)->type == IS_STRING && (*var)->value.str.val == undefined_variable_string)) { isset = 0; } else { @@ -1855,7 +1865,14 @@ send_by_ref: Ts[opline->result.u.var].tmp_var.value.lval = isset; break; case ZEND_ISEMPTY: - if (!isset || !zend_is_true(*var)) { + if (!var) { + if (!isset + || Ts[opline->op1.u.var].EA.str->value.str.val[Ts[opline->op1.u.var].EA.offset]=='0') { + Ts[opline->result.u.var].tmp_var.value.lval = 1; + } else { + Ts[opline->result.u.var].tmp_var.value.lval = 0; + } + } else if (!isset || !zend_is_true(*var)) { Ts[opline->result.u.var].tmp_var.value.lval = 1; } else { Ts[opline->result.u.var].tmp_var.value.lval = 0; -- 2.40.0