diff options
-rw-r--r-- | Zend/tests/bug68162.phpt | 14 | ||||
-rw-r--r-- | Zend/tests/bug68163.phpt | 13 | ||||
-rw-r--r-- | Zend/tests/exception_with_by_ref_message.phpt | 21 | ||||
-rw-r--r-- | Zend/tests/varvars_by_ref.phpt | 17 | ||||
-rw-r--r-- | Zend/zend_exceptions.c | 105 | ||||
-rw-r--r-- | Zend/zend_object_handlers.c | 15 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 12 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 144 |
8 files changed, 183 insertions, 158 deletions
diff --git a/Zend/tests/bug68162.phpt b/Zend/tests/bug68162.phpt new file mode 100644 index 0000000000..24e412f18d --- /dev/null +++ b/Zend/tests/bug68162.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #68162: isset($$varname) always true +--FILE-- +<?php + +$name = 'var'; +var_dump(isset($$name)); +$var = 42; +var_dump(isset($$name)); + +?> +--EXPECT-- +bool(false) +bool(true) diff --git a/Zend/tests/bug68163.phpt b/Zend/tests/bug68163.phpt new file mode 100644 index 0000000000..2ea0da33d6 --- /dev/null +++ b/Zend/tests/bug68163.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #68163: Using reference as object property name +--FILE-- +<?php + +$obj = (object) ['foo' => 'bar']; +$foo = 'foo'; +$ref =& $foo; +var_dump($obj->$foo); + +?> +--EXPECT-- +string(3) "bar" diff --git a/Zend/tests/exception_with_by_ref_message.phpt b/Zend/tests/exception_with_by_ref_message.phpt new file mode 100644 index 0000000000..f15c3e2719 --- /dev/null +++ b/Zend/tests/exception_with_by_ref_message.phpt @@ -0,0 +1,21 @@ +--TEST-- +Exception with by-ref message +--FILE-- +<?php + +class MyException extends Exception +{ + public function __construct(&$msg) { + $this->message =& $msg; + } +} + +$msg = 'Message'; +throw new MyException($msg); + +?> +--EXPECTF-- +Fatal error: Uncaught exception 'MyException' with message 'Message' in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d 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_exceptions.c b/Zend/zend_exceptions.c index b3770526db..6e4ee2fd30 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -266,14 +266,10 @@ ZEND_METHOD(error_exception, __construct) return; \ } -static void _default_exception_get_entry(zval *object, char *name, int name_len, zval *return_value TSRMLS_DC) /* {{{ */ -{ - zval *value; - - value = zend_read_property(default_exception_ce, object, name, name_len, 0 TSRMLS_CC); - ZVAL_COPY(return_value, value); -} -/* }}} */ +#define GET_PROPERTY(object, name) \ + zend_read_property(default_exception_ce, (object), name, sizeof(name) - 1, 0 TSRMLS_CC) +#define GET_PROPERTY_SILENT(object, name) \ + zend_read_property(default_exception_ce, (object), name, sizeof(name) - 1, 1 TSRMLS_CC) /* {{{ proto string Exception::getFile() Get the file in which the exception occurred */ @@ -281,7 +277,7 @@ ZEND_METHOD(exception, getFile) { DEFAULT_0_PARAMS; - _default_exception_get_entry(getThis(), "file", sizeof("file")-1, return_value TSRMLS_CC); + ZVAL_COPY(return_value, GET_PROPERTY(getThis(), "file")); } /* }}} */ @@ -291,7 +287,7 @@ ZEND_METHOD(exception, getLine) { DEFAULT_0_PARAMS; - _default_exception_get_entry(getThis(), "line", sizeof("line")-1, return_value TSRMLS_CC); + ZVAL_COPY(return_value, GET_PROPERTY(getThis(), "line")); } /* }}} */ @@ -301,7 +297,7 @@ ZEND_METHOD(exception, getMessage) { DEFAULT_0_PARAMS; - _default_exception_get_entry(getThis(), "message", sizeof("message")-1, return_value TSRMLS_CC); + ZVAL_COPY(return_value, GET_PROPERTY(getThis(), "message")); } /* }}} */ @@ -311,7 +307,7 @@ ZEND_METHOD(exception, getCode) { DEFAULT_0_PARAMS; - _default_exception_get_entry(getThis(), "code", sizeof("code")-1, return_value TSRMLS_CC); + ZVAL_COPY(return_value, GET_PROPERTY(getThis(), "code")); } /* }}} */ @@ -321,7 +317,7 @@ ZEND_METHOD(exception, getTrace) { DEFAULT_0_PARAMS; - _default_exception_get_entry(getThis(), "trace", sizeof("trace")-1, return_value TSRMLS_CC); + ZVAL_COPY(return_value, GET_PROPERTY(getThis(), "trace")); } /* }}} */ @@ -331,7 +327,7 @@ ZEND_METHOD(error_exception, getSeverity) { DEFAULT_0_PARAMS; - _default_exception_get_entry(getThis(), "severity", sizeof("severity")-1, return_value TSRMLS_CC); + ZVAL_COPY(return_value, GET_PROPERTY(getThis(), "severity")); } /* }}} */ @@ -407,7 +403,7 @@ static void smart_str_append_escaped(smart_str *str, const char *s, size_t l) { static void _build_trace_args(zval *arg, smart_str *str TSRMLS_DC) /* {{{ */ { - /* the trivial way would be to do: + /* the trivial way would be to do * convert_to_string_ex(arg); * append it and kill the now tmp arg. * but that could cause some E_NOTICE and also damn long lines. @@ -556,12 +552,9 @@ ZEND_METHOD(exception, getTraceAsString) Return previous Exception or NULL. */ ZEND_METHOD(exception, getPrevious) { - zval *previous; - DEFAULT_0_PARAMS; - previous = zend_read_property(default_exception_ce, getThis(), "previous", sizeof("previous")-1, 1 TSRMLS_CC); - RETURN_ZVAL(previous, 1, 0); + ZVAL_COPY(return_value, GET_PROPERTY_SILENT(getThis(), "previous")); } /* }}} */ size_t zend_spprintf(char **message, size_t max_len, const char *format, ...) /* {{{ */ @@ -592,8 +585,8 @@ zend_string *zend_strpprintf(size_t max_len, const char *format, ...) /* {{{ */ Obtain the string representation of the Exception object */ ZEND_METHOD(exception, __toString) { - zval message, file, line, trace, *exception; - zend_string *str, *prev_str; + zval trace, *exception; + zend_string *str; zend_fcall_info fci; zval fname; @@ -605,14 +598,10 @@ ZEND_METHOD(exception, __toString) ZVAL_STRINGL(&fname, "gettraceasstring", sizeof("gettraceasstring")-1); while (exception && Z_TYPE_P(exception) == IS_OBJECT) { - prev_str = str; - _default_exception_get_entry(exception, "message", sizeof("message")-1, &message TSRMLS_CC); - _default_exception_get_entry(exception, "file", sizeof("file")-1, &file TSRMLS_CC); - _default_exception_get_entry(exception, "line", sizeof("line")-1, &line TSRMLS_CC); - - convert_to_string_ex(&message); - convert_to_string_ex(&file); - convert_to_long_ex(&line); + zend_string *prev_str = str; + zend_string *message = zval_get_string(GET_PROPERTY(exception, "message")); + zend_string *file = zval_get_string(GET_PROPERTY(exception, "file")); + zend_long line = zval_get_long(GET_PROPERTY(exception, "line")); fci.size = sizeof(fci); fci.function_table = &Z_OBJCE_P(exception)->function_table; @@ -631,26 +620,26 @@ ZEND_METHOD(exception, __toString) ZVAL_UNDEF(&trace); } - if (Z_STRLEN(message) > 0) { - str = zend_strpprintf(0, "exception '%s' with message '%s' in %s:%ld\nStack trace:\n%s%s%s", - Z_OBJCE_P(exception)->name->val, Z_STRVAL(message), Z_STRVAL(file), Z_LVAL(line), + if (message->len > 0) { + str = zend_strpprintf(0, "exception '%s' with message '%s' in %s:" ZEND_LONG_FMT + "\nStack trace:\n%s%s%s", + Z_OBJCE_P(exception)->name->val, message->val, file->val, line, (Z_TYPE(trace) == IS_STRING && Z_STRLEN(trace)) ? Z_STRVAL(trace) : "#0 {main}\n", prev_str->len ? "\n\nNext " : "", prev_str->val); } else { - str = zend_strpprintf(0, "exception '%s' in %s:%ld\nStack trace:\n%s%s%s", - Z_OBJCE_P(exception)->name->val, Z_STRVAL(file), Z_LVAL(line), + str = zend_strpprintf(0, "exception '%s' in %s:" ZEND_LONG_FMT + "\nStack trace:\n%s%s%s", + Z_OBJCE_P(exception)->name->val, file->val, line, (Z_TYPE(trace) == IS_STRING && Z_STRLEN(trace)) ? Z_STRVAL(trace) : "#0 {main}\n", prev_str->len ? "\n\nNext " : "", prev_str->val); } - zend_string_release(prev_str); - zval_dtor(&message); - zval_dtor(&file); - zval_dtor(&line); - - exception = zend_read_property(default_exception_ce, exception, "previous", sizeof("previous")-1, 0 TSRMLS_CC); + zend_string_release(prev_str); + zend_string_release(message); + zend_string_release(file); zval_ptr_dtor(&trace); + exception = GET_PROPERTY(exception, "previous"); } zval_dtor(&fname); @@ -816,7 +805,9 @@ ZEND_API void zend_exception_error(zend_object *ex, int severity TSRMLS_DC) /* { ZVAL_OBJ(&exception, ex); ce_exception = Z_OBJCE(exception); if (instanceof_function(ce_exception, default_exception_ce TSRMLS_CC)) { - zval tmp, *str, *file, *line; + zval tmp; + zend_string *str, *file = NULL; + zend_long line = 0; EG(exception) = NULL; @@ -836,28 +827,28 @@ ZEND_API void zend_exception_error(zend_object *ex, int severity TSRMLS_DC) /* { ZVAL_OBJ(&zv, EG(exception)); /* do the best we can to inform about the inner exception */ if (instanceof_function(ce_exception, default_exception_ce TSRMLS_CC)) { - file = zend_read_property(default_exception_ce, &zv, "file", sizeof("file")-1, 1 TSRMLS_CC); - line = zend_read_property(default_exception_ce, &zv, "line", sizeof("line")-1, 1 TSRMLS_CC); + file = zval_get_string(GET_PROPERTY_SILENT(&zv, "file")); + line = zval_get_long(GET_PROPERTY_SILENT(&zv, "line")); + } - convert_to_string_ex(file); - file = (Z_STRLEN_P(file) > 0) ? file : NULL; - line = (Z_TYPE_P(line) == IS_LONG) ? line : NULL; - } else { - file = NULL; - line = NULL; + zend_error_va(E_WARNING, (file && file->len > 0) ? file->val : NULL, line, + "Uncaught %s in exception handling during call to %s::__tostring()", + Z_OBJCE(zv)->name->val, ce_exception->name->val); + + if (file) { + zend_string_release(file); } - zend_error_va(E_WARNING, file ? Z_STRVAL_P(file) : NULL, line ? Z_LVAL_P(line) : 0, "Uncaught %s in exception handling during call to %s::__tostring()", Z_OBJCE(zv)->name->val, ce_exception->name->val); } - str = zend_read_property(default_exception_ce, &exception, "string", sizeof("string")-1, 1 TSRMLS_CC); - file = zend_read_property(default_exception_ce, &exception, "file", sizeof("file")-1, 1 TSRMLS_CC); - line = zend_read_property(default_exception_ce, &exception, "line", sizeof("line")-1, 1 TSRMLS_CC); + str = zval_get_string(GET_PROPERTY_SILENT(&exception, "string")); + file = zval_get_string(GET_PROPERTY_SILENT(&exception, "file")); + line = zval_get_long(GET_PROPERTY_SILENT(&exception, "line")); - convert_to_string_ex(str); - convert_to_string_ex(file); - convert_to_long_ex(line); + zend_error_va(severity, (file && file->len > 0) ? file->val : NULL, line, + "Uncaught %s\n thrown", str->val); - zend_error_va(severity, (Z_STRLEN_P(file) > 0) ? Z_STRVAL_P(file) : NULL, Z_LVAL_P(line), "Uncaught %s\n thrown", Z_STRVAL_P(str)); + zend_string_release(str); + zend_string_release(file); } else { zend_error(severity, "Uncaught exception '%s'", ce_exception->name->val); } diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 5ee9847b6c..02c2b10268 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -475,8 +475,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ ZVAL_UNDEF(&tmp_member); if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) { - ZVAL_DUP(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string(member)); member = &tmp_member; cache_slot = NULL; } @@ -567,8 +566,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v ZVAL_UNDEF(&tmp_member); if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) { - ZVAL_DUP(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string(member)); member = &tmp_member; cache_slot = NULL; } @@ -786,8 +784,7 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, ZVAL_UNDEF(&tmp_member); if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) { - ZVAL_DUP(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string(member)); member = &tmp_member; cache_slot = NULL; } @@ -855,8 +852,7 @@ static void zend_std_unset_property(zval *object, zval *member, void **cache_slo ZVAL_UNDEF(&tmp_member); if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) { - ZVAL_DUP(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string(member)); member = &tmp_member; cache_slot = NULL; } @@ -1453,8 +1449,7 @@ static int zend_std_has_property(zval *object, zval *member, int has_set_exists, ZVAL_UNDEF(&tmp_member); if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) { - ZVAL_DUP(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string(member)); member = &tmp_member; cache_slot = NULL; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fd0e11d57e..4f9f520e5a 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; } @@ -4856,13 +4855,11 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) isset = 0; } } else { - HashTable *target_symbol_table; zend_free_op free_op1; 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; } @@ -4888,8 +4885,9 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d93270140d..7d16db6011 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; } @@ -4587,13 +4586,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O isset = 0; } } else { - HashTable *target_symbol_table; 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; } @@ -4619,8 +4616,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -7013,13 +7010,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC isset = 0; } } else { - HashTable *target_symbol_table; 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; } @@ -7045,8 +7040,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -7891,13 +7886,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_ isset = 0; } } else { - HashTable *target_symbol_table; 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; } @@ -7923,8 +7916,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_ isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -11311,13 +11304,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC isset = 0; } } else { - HashTable *target_symbol_table; zend_free_op free_op1; 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; } @@ -11343,8 +11334,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -13648,13 +13639,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD isset = 0; } } else { - HashTable *target_symbol_table; zend_free_op free_op1; 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; } @@ -13680,8 +13669,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -14401,13 +14390,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP isset = 0; } } else { - HashTable *target_symbol_table; zend_free_op free_op1; 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; } @@ -14433,8 +14420,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -19361,13 +19348,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC isset = 0; } } else { - HashTable *target_symbol_table; zend_free_op free_op1; 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; } @@ -19393,8 +19378,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -23752,13 +23737,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD isset = 0; } } else { - HashTable *target_symbol_table; zend_free_op free_op1; 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; } @@ -23784,8 +23767,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -25094,13 +25077,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP isset = 0; } } else { - HashTable *target_symbol_table; zend_free_op free_op1; 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; } @@ -25126,8 +25107,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -36536,13 +36517,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO isset = 0; } } else { - HashTable *target_symbol_table; 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; } @@ -36568,8 +36547,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -40725,13 +40704,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE isset = 0; } } else { - HashTable *target_symbol_table; 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; } @@ -40757,8 +40734,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } @@ -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; } @@ -41940,13 +41917,11 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC isset = 0; } } else { - HashTable *target_symbol_table; 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; } @@ -41972,8 +41947,9 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC isset = 0; } } else { - target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); - if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { + HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); + value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname)); + if (!value || Z_ISUNDEF_P(value)) { isset = 0; } } |