@@ -244,22 +244,29 @@ static zval *sxe_prop_dim_read(zval *object, zval *member, zend_bool elements, z
244244
245245 sxe = Z_SXEOBJ_P (object );
246246
247- if (!member || Z_TYPE_P (member ) == IS_LONG ) {
248- if (sxe -> iter .type != SXE_ITER_ATTRLIST ) {
249- attribs = 0 ;
250- elements = 1 ;
251- } else if (!member ) {
247+ if (!member ) {
248+ if (sxe -> iter .type == SXE_ITER_ATTRLIST ) {
252249 /* This happens when the user did: $sxe[]->foo = $value */
253250 zend_throw_error (NULL , "Cannot create unnamed attribute" );
254251 return & EG (uninitialized_zval );
255252 }
256- name = NULL ;
253+ goto long_dim ;
257254 } else {
258- if (Z_TYPE_P (member ) != IS_STRING ) {
259- ZVAL_STR (& tmp_zv , zval_get_string (member ));
260- member = & tmp_zv ;
255+ ZVAL_DEREF (member );
256+ if (Z_TYPE_P (member ) == IS_LONG ) {
257+ if (sxe -> iter .type != SXE_ITER_ATTRLIST ) {
258+ long_dim :
259+ attribs = 0 ;
260+ elements = 1 ;
261+ }
262+ name = NULL ;
263+ } else {
264+ if (Z_TYPE_P (member ) != IS_STRING ) {
265+ ZVAL_STR (& tmp_zv , zval_get_string (member ));
266+ member = & tmp_zv ;
267+ }
268+ name = Z_STRVAL_P (member );
261269 }
262- name = Z_STRVAL_P (member );
263270 }
264271
265272 GET_NODE (sxe , node );
@@ -450,32 +457,39 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool
450457
451458 sxe = Z_SXEOBJ_P (object );
452459
453- if (!member || Z_TYPE_P (member ) == IS_LONG ) {
454- if (sxe -> iter .type != SXE_ITER_ATTRLIST ) {
455- attribs = 0 ;
456- elements = 1 ;
457- } else if (!member ) {
460+ if (!member ) {
461+ if (sxe -> iter .type == SXE_ITER_ATTRLIST ) {
458462 /* This happens when the user did: $sxe[] = $value
459463 * and could also be E_PARSE, but we use this only during parsing
460464 * and this is during runtime.
461465 */
462466 zend_throw_error (NULL , "Cannot create unnamed attribute" );
463467 return FAILURE ;
464468 }
469+ goto long_dim ;
465470 } else {
466- if (Z_TYPE_P (member ) != IS_STRING ) {
467- trim_str = zval_get_string (member );
468- ZVAL_STR (& tmp_zv , php_trim (trim_str , NULL , 0 , 3 ));
469- zend_string_release (trim_str );
470- member = & tmp_zv ;
471- }
471+ ZVAL_DEREF (member );
472+ if (Z_TYPE_P (member ) == IS_LONG ) {
473+ if (sxe -> iter .type != SXE_ITER_ATTRLIST ) {
474+ long_dim :
475+ attribs = 0 ;
476+ elements = 1 ;
477+ }
478+ } else {
479+ if (Z_TYPE_P (member ) != IS_STRING ) {
480+ trim_str = zval_get_string (member );
481+ ZVAL_STR (& tmp_zv , php_trim (trim_str , NULL , 0 , 3 ));
482+ zend_string_release (trim_str );
483+ member = & tmp_zv ;
484+ }
472485
473- if (!Z_STRLEN_P (member )) {
474- php_error_docref (NULL , E_WARNING , "Cannot write or create unnamed %s" , attribs ? "attribute" : "element" );
475- if (member == & tmp_zv ) {
476- zval_dtor (& tmp_zv );
486+ if (!Z_STRLEN_P (member )) {
487+ php_error_docref (NULL , E_WARNING , "Cannot write or create unnamed %s" , attribs ? "attribute" : "element" );
488+ if (member == & tmp_zv ) {
489+ zval_dtor (& tmp_zv );
490+ }
491+ return FAILURE ;
477492 }
478- return FAILURE ;
479493 }
480494 }
481495
0 commit comments