diff options
Diffstat (limited to 'Zend/zend_vm_execute.h')
| -rw-r--r-- | Zend/zend_vm_execute.h | 174 |
1 files changed, 170 insertions, 4 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ec9057b431..80e68c21bc 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3538,6 +3538,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -4060,6 +4064,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -4128,6 +4136,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -5295,6 +5307,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type, } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -5703,6 +5719,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -5771,6 +5791,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -5983,6 +6007,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -6359,6 +6387,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -6427,6 +6459,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_ } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -7064,8 +7100,8 @@ static int ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A ZVAL_OBJ(EX_VAR_NUM(opline->op2.var), EG(exception)); if (EG(active_symbol_table)) { zend_string *cv = CV_DEF_OF(opline->op2.var); - // TODO: indirect??? - zend_hash_update(EG(active_symbol_table), cv, EX_VAR_NUM(opline->op2.var)); + zval *zv = zend_hash_update(EG(active_symbol_table), cv, EX_VAR_NUM(opline->op2.var)); + ZVAL_INDIRECT(EX_VAR_NUM(opline->op2.var), zv); } if (UNEXPECTED(EG(exception) != exception)) { EG(exception)->gc.refcount++; @@ -8590,6 +8626,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type, zval_dtor(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -9018,6 +9058,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -9086,6 +9130,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -10228,6 +10276,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE zval_dtor(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -10644,6 +10696,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -10712,6 +10768,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -10924,6 +10984,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, zval_dtor(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -11189,6 +11253,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -11257,6 +11325,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -14184,6 +14256,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, zval_ptr_dtor_nogc(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -15283,6 +15359,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -15489,6 +15569,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -18532,6 +18616,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE zval_ptr_dtor_nogc(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -19227,6 +19315,11 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) { zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects"); } +//???: instead of FREE_OP2_VAR_PTR + if (IS_VAR == IS_VAR && free_op2.var) { + if (Z_REFCOUNTED_P(free_op2.var)) Z_DELREF_P(free_op2.var); + free_op2.var = NULL; + } zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC); if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { @@ -19238,7 +19331,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL } //??? if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}; - if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; +//??? if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -19595,6 +19688,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -19801,6 +19898,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -20404,6 +20505,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, zval_ptr_dtor_nogc(free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -20938,6 +21043,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -21006,6 +21115,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -22488,6 +22601,11 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) { zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects"); } +//???: instead of FREE_OP2_VAR_PTR + if (IS_CV == IS_VAR && free_op2.var) { + if (Z_REFCOUNTED_P(free_op2.var)) Z_DELREF_P(free_op2.var); + free_op2.var = NULL; + } zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC); if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { @@ -22499,6 +22617,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE } //??? if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);}; +//??? ; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -30728,6 +30847,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -31615,6 +31738,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -31819,6 +31946,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -34731,6 +34862,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -35419,6 +35554,11 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) { zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects"); } +//???: instead of FREE_OP2_VAR_PTR + if (IS_VAR == IS_VAR && free_op2.var) { + if (Z_REFCOUNTED_P(free_op2.var)) Z_DELREF_P(free_op2.var); + free_op2.var = NULL; + } zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC); if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { @@ -35430,7 +35570,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE } //??? ; - if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; +//??? if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -35675,6 +35815,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -35879,6 +36023,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -36477,6 +36625,10 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type, } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } /* if (!target_symbol_table) { CHECK_EXCEPTION(); @@ -36899,6 +37051,10 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND zend_std_unset_static_property(ce, Z_STR_P(varname), ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } zend_delete_variable(execute_data, target_symbol_table, Z_STR_P(varname) TSRMLS_CC); } @@ -36967,6 +37123,10 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC } } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); +//???: STRING may become INDIRECT + if (Z_TYPE_P(varname) == IS_INDIRECT) { + varname = Z_INDIRECT_P(varname); + } if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } @@ -38422,6 +38582,11 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(variable_ptr) == IS_STR_OFFSET))) { zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects"); } +//???: instead of FREE_OP2_VAR_PTR + if (IS_CV == IS_VAR && free_op2.var) { + if (Z_REFCOUNTED_P(free_op2.var)) Z_DELREF_P(free_op2.var); + free_op2.var = NULL; + } zend_assign_to_variable_reference(variable_ptr, value_ptr TSRMLS_CC); if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { @@ -38433,6 +38598,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER } //??? ; +//??? ; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); |
