summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-07-03 18:03:02 +0000
committerZeev Suraski <zeev@php.net>1999-07-03 18:03:02 +0000
commitbaa75917c8c992d5d176464a2e96e998dad92a33 (patch)
tree6db015c60f025ebe863ce8fa5be350cda6a522a9 /Zend
parenta010baa18d9ec0aecce789b90da00f7b57f77428 (diff)
downloadphp-git-baa75917c8c992d5d176464a2e96e998dad92a33.tar.gz
Support isset()/empty() for string offsets
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_execute.c25
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;