sxe = Z_SXEOBJ_P(object);
- if (!member || Z_TYPE_P(member) == IS_LONG) {
- if (sxe->iter.type != SXE_ITER_ATTRLIST) {
- attribs = 0;
- elements = 1;
- } else if (!member) {
+ if (!member) {
+ if (sxe->iter.type == SXE_ITER_ATTRLIST) {
/* This happens when the user did: $sxe[]->foo = $value */
php_error_docref(NULL, E_ERROR, "Cannot create unnamed attribute");
return NULL;
}
- name = NULL;
+ goto long_dim;
} else {
- if (Z_TYPE_P(member) != IS_STRING) {
- ZVAL_STR(&tmp_zv, zval_get_string(member));
- member = &tmp_zv;
+ ZVAL_DEREF(member);
+ if (Z_TYPE_P(member) == IS_LONG) {
+ if (sxe->iter.type != SXE_ITER_ATTRLIST) {
+long_dim:
+ attribs = 0;
+ elements = 1;
+ }
+ name = NULL;
+ } else {
+ if (Z_TYPE_P(member) != IS_STRING) {
+ ZVAL_STR(&tmp_zv, zval_get_string(member));
+ member = &tmp_zv;
+ }
+ name = Z_STRVAL_P(member);
}
- name = Z_STRVAL_P(member);
}
GET_NODE(sxe, node);
sxe = Z_SXEOBJ_P(object);
- if (!member || Z_TYPE_P(member) == IS_LONG) {
- if (sxe->iter.type != SXE_ITER_ATTRLIST) {
- attribs = 0;
- elements = 1;
- } else if (!member) {
+ if (!member) {
+ if (sxe->iter.type == SXE_ITER_ATTRLIST) {
/* This happens when the user did: $sxe[] = $value
* and could also be E_PARSE, but we use this only during parsing
* and this is during runtime.
php_error_docref(NULL, E_ERROR, "Cannot create unnamed attribute");
return FAILURE;
}
+ goto long_dim;
} else {
- if (Z_TYPE_P(member) != IS_STRING) {
- trim_str = zval_get_string(member);
- ZVAL_STR(&tmp_zv, php_trim(trim_str, NULL, 0, 3));
- zend_string_release(trim_str);
- member = &tmp_zv;
- }
+ ZVAL_DEREF(member);
+ if (Z_TYPE_P(member) == IS_LONG) {
+ if (sxe->iter.type != SXE_ITER_ATTRLIST) {
+long_dim:
+ attribs = 0;
+ elements = 1;
+ }
+ } else {
+ if (Z_TYPE_P(member) != IS_STRING) {
+ trim_str = zval_get_string(member);
+ ZVAL_STR(&tmp_zv, php_trim(trim_str, NULL, 0, 3));
+ zend_string_release(trim_str);
+ member = &tmp_zv;
+ }
- if (!Z_STRLEN_P(member)) {
- php_error_docref(NULL, E_WARNING, "Cannot write or create unnamed %s", attribs ? "attribute" : "element");
- if (member == &tmp_zv) {
- zval_dtor(&tmp_zv);
+ if (!Z_STRLEN_P(member)) {
+ php_error_docref(NULL, E_WARNING, "Cannot write or create unnamed %s", attribs ? "attribute" : "element");
+ if (member == &tmp_zv) {
+ zval_dtor(&tmp_zv);
+ }
+ return FAILURE;
}
- return FAILURE;
}
}
--- /dev/null
+--TEST--
+Bug #72588 (Using global var doesn't work while accessing SimpleXML element)
+--SKIPIF--
+<?php
+if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
+?>
+--FILE--
+<?php
+
+$tpnb = 5;
+$dummy = &$tpnb;
+
+$xmlStruct = <<<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<templates>
+ <object type="obj_1" label="Label for object 1"></object>
+ <object type="obj_2" label="Label for object 2"></object>
+ <object type="obj_3" label="Label for object 3"></object>
+ <object type="obj_4" label="Label for object 4"></object>
+ <object type="obj_5" label="Label for object 5"></object>
+ <object type="obj_6" label="Label for object 6"></object>
+ <object type="obj_7" label="Label for object 7"></object>
+ <object type="obj_8" label="Label for object 8"></object>
+ <object type="obj_9" label="Label for object 9"></object>
+ <object type="obj_10" label="Label for object 10"></object>
+</templates>
+EOF;
+$tplxml = simplexml_load_string($xmlStruct);
+
+var_dump($tplxml->object[$tpnb]);
+?>
+--EXPECTF--
+object(SimpleXMLElement)#%d (1) {
+ ["@attributes"]=>
+ array(2) {
+ ["type"]=>
+ string(5) "obj_6"
+ ["label"]=>
+ string(18) "Label for object 6"
+ }
+}