diff options
author | Zeev Suraski <zeev@php.net> | 1999-07-03 18:03:02 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 1999-07-03 18:03:02 +0000 |
commit | baa75917c8c992d5d176464a2e96e998dad92a33 (patch) | |
tree | 6db015c60f025ebe863ce8fa5be350cda6a522a9 /Zend | |
parent | a010baa18d9ec0aecce789b90da00f7b57f77428 (diff) | |
download | php-git-baa75917c8c992d5d176464a2e96e998dad92a33.tar.gz |
Support isset()/empty() for string offsets
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_execute.c | 25 |
1 files 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.offset<Ts[opline->op1.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; |