summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/bug68162.phpt14
-rw-r--r--Zend/tests/bug68163.phpt13
-rw-r--r--Zend/tests/exception_with_by_ref_message.phpt21
-rw-r--r--Zend/tests/varvars_by_ref.phpt17
-rw-r--r--Zend/zend_exceptions.c105
-rw-r--r--Zend/zend_object_handlers.c15
-rw-r--r--Zend/zend_vm_def.h12
-rw-r--r--Zend/zend_vm_execute.h144
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;
}
}