diff options
author | Nikita Popov <nikic@php.net> | 2014-10-06 18:56:23 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2014-10-06 18:56:23 +0200 |
commit | 390900cbcb5c81080f4b58d15209c276075e078c (patch) | |
tree | bdc39da8347ff46fac4a232e497cbae4a28fcce7 | |
parent | 03c726d7281feb0c08c4ea37e48f69ded71a410a (diff) | |
download | php-git-390900cbcb5c81080f4b58d15209c276075e078c.tar.gz |
Fix isset/unset on by-ref names as well
-rw-r--r-- | Zend/tests/varvars_by_ref.phpt | 17 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 6 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 72 |
3 files changed, 43 insertions, 52 deletions
diff --git a/Zend/tests/varvars_by_ref.phpt b/Zend/tests/varvars_by_ref.phpt new file mode 100644 index 0000000000..3ee4776aba --- /dev/null +++ b/Zend/tests/varvars_by_ref.phpt @@ -0,0 +1,17 @@ +--TEST-- +Accessing variable variables using referenced names +--FILE-- +<?php + +$name = 'var'; +$ref =& $name; + +$$name = 42; +var_dump(isset($$name)); +unset($$name); +var_dump(isset($$name)); + +?> +--EXPECT-- +bool(true) +bool(false) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fd0e11d57e..e330a58d5e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4244,8 +4244,7 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) ZVAL_UNDEF(&tmp); if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -4861,8 +4860,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS); if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d93270140d..ded78a5484 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4528,8 +4528,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA ZVAL_UNDEF(&tmp); if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -4592,8 +4591,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O zval tmp, *varname = opline->op1.zv; if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -6954,8 +6952,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND ZVAL_UNDEF(&tmp); if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -7018,8 +7015,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC zval tmp, *varname = opline->op1.zv; if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -7832,8 +7828,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H ZVAL_UNDEF(&tmp); if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -7896,8 +7891,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_ zval tmp, *varname = opline->op1.zv; if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -11252,8 +11246,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND ZVAL_UNDEF(&tmp); if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -11316,8 +11309,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -13589,8 +13581,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE ZVAL_UNDEF(&tmp); if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -13653,8 +13644,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -14342,8 +14332,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN ZVAL_UNDEF(&tmp); if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -14406,8 +14395,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -19184,8 +19172,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND ZVAL_UNDEF(&tmp); if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -19366,8 +19353,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -23575,8 +23561,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE ZVAL_UNDEF(&tmp); if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -23757,8 +23742,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -25035,8 +25019,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN ZVAL_UNDEF(&tmp); if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -25099,8 +25082,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -36359,8 +36341,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL ZVAL_UNDEF(&tmp); if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -36541,8 +36522,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -40548,8 +40528,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER ZVAL_UNDEF(&tmp); if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -40730,8 +40709,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -41881,8 +41859,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND ZVAL_UNDEF(&tmp); if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } @@ -41945,8 +41922,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) { - ZVAL_DUP(&tmp, varname); - convert_to_string(&tmp); + ZVAL_STR(&tmp, zval_get_string(varname)); varname = &tmp; } |