}
/* }}} */
+static zend_always_inline void zend_unwrap_reference(zval *op) /* {{{ */
+{
+ if (Z_REFCOUNT_P(op) == 1) {
+ ZVAL_UNREF(op);
+ } else {
+ Z_DELREF_P(op);
+ ZVAL_COPY(op, Z_REFVAL_P(op));
+ }
+}
+/* }}} */
+
ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
case IS_REFERENCE:
- if (Z_REFCOUNT_P(op) == 1) {
- ZVAL_UNREF(op);
- } else {
- Z_DELREF_P(op);
- ZVAL_COPY(op, Z_REFVAL_P(op));
- }
+ zend_unwrap_reference(op);
goto try_again;
case IS_STRING:
{
{
zend_long tmp;
+try_again:
switch (Z_TYPE_P(op)) {
case IS_NULL:
case IS_FALSE:
}
return;
}
+ case IS_REFERENCE:
+ zend_unwrap_reference(op);
+ goto try_again;
EMPTY_SWITCH_DEFAULT_CASE()
}
}
{
double tmp;
+try_again:
switch (Z_TYPE_P(op)) {
case IS_NULL:
case IS_FALSE:
}
break;
}
+ case IS_REFERENCE:
+ zend_unwrap_reference(op);
+ goto try_again;
EMPTY_SWITCH_DEFAULT_CASE()
}
}
{
int tmp;
+try_again:
switch (Z_TYPE_P(op)) {
case IS_FALSE:
case IS_TRUE:
}
break;
}
+ case IS_REFERENCE:
+ zend_unwrap_reference(op);
+ goto try_again;
EMPTY_SWITCH_DEFAULT_CASE()
}
}
ZEND_API void ZEND_FASTCALL _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */
{
+try_again:
switch (Z_TYPE_P(op)) {
case IS_UNDEF:
case IS_NULL:
}
break;
}
+ case IS_REFERENCE:
+ zend_unwrap_reference(op);
+ goto try_again;
EMPTY_SWITCH_DEFAULT_CASE()
}
}
ZEND_API void ZEND_FASTCALL convert_to_array(zval *op) /* {{{ */
{
-
+try_again:
switch (Z_TYPE_P(op)) {
case IS_ARRAY:
break;
ZVAL_NEW_ARR(op);
zend_hash_init(Z_ARRVAL_P(op), 8, NULL, ZVAL_PTR_DTOR, 0);
break;
+ case IS_REFERENCE:
+ zend_unwrap_reference(op);
+ goto try_again;
default:
convert_scalar_to_array(op);
break;
ZEND_API void ZEND_FASTCALL convert_to_object(zval *op) /* {{{ */
{
-
+try_again:
switch (Z_TYPE_P(op)) {
case IS_ARRAY:
{
case IS_NULL:
object_init(op);
break;
+ case IS_REFERENCE:
+ zend_unwrap_reference(op);
+ goto try_again;
default: {
zval tmp;
ZVAL_COPY_VALUE(&tmp, op);
return FAILURE;
}
- convert_to_long(&zresult);
- *result = Z_LVAL(zresult);
-
+ *result = zval_get_long(&zresult);
zval_ptr_dtor(&zresult);
return SUCCESS;
* without __toString is converted to string is converted into an exception. */
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling);
if (data) {
- RETVAL_ZVAL(data, 1, 0);
- if (Z_TYPE_P(return_value) == IS_ARRAY) {
- zval_ptr_dtor(return_value);
+ ZVAL_DEREF(data);
+ if (Z_TYPE_P(data) == IS_ARRAY) {
ZVAL_STRINGL(return_value, "Array", sizeof("Array")-1);
} else {
- convert_to_string_ex(return_value);
+ ZVAL_COPY(return_value, data);
+ convert_to_string(return_value);
}
}
zend_restore_error_handling(&error_handling);
--- /dev/null
+--TEST--
+RegexIterator with $replacement being a reference
+--FILE--
+<?php
+$a = new ArrayIterator(array('test1', 'test2', 'test3'));
+$i = new RegexIterator($a, '/^(test)(\d+)/', RegexIterator::REPLACE);
+$r = '$2:$1';
+$i->replacement =& $r;
+var_dump(iterator_to_array($i));
+?>
+--EXPECT--
+array(3) {
+ [0]=>
+ string(6) "1:test"
+ [1]=>
+ string(6) "2:test"
+ [2]=>
+ string(6) "3:test"
+}
--- /dev/null
+--TEST--
+SplHeap using a compare function returning by-reference
+--FILE--
+<?php
+class Heap extends SplMinHeap {
+ public function &compare($a, $b) {
+ return $a;
+ }
+}
+$h = new Heap;
+$h->insert(0);
+$h->insert(0);
+?>
+===DONE===
+--EXPECT--
+===DONE===
zkeyval = zend_hash_index_find(ht, Z_LVAL_P(zkey));
}
- if (Z_REFCOUNTED_P(zcolval)) {
- Z_ADDREF_P(zcolval);
- }
+ Z_TRY_ADDREF_P(zcolval);
if (zkeyval && Z_TYPE_P(zkeyval) == IS_STRING) {
zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR_P(zkeyval), zcolval);
} else if (zkeyval && Z_TYPE_P(zkeyval) == IS_LONG) {
add_index_zval(return_value, Z_LVAL_P(zkeyval), zcolval);
} else if (zkeyval && Z_TYPE_P(zkeyval) == IS_OBJECT) {
- SEPARATE_ZVAL(zkeyval);
- convert_to_string(zkeyval);
- zend_symtable_update(Z_ARRVAL_P(return_value), Z_STR_P(zkeyval), zcolval);
+ zend_string *key = zval_get_string(zkeyval);
+ zend_symtable_update(Z_ARRVAL_P(return_value), key, zcolval);
+ zend_string_release(key);
} else {
add_next_index_zval(return_value, zcolval);
}