Fixed support for <any>

This commit is contained in:
Dmitry Stogov 2014-05-16 12:41:45 +04:00
parent c062b889f8
commit 9389ce8034

View File

@ -1252,13 +1252,14 @@ static void unset_zval_property(zval* object, char* name TSRMLS_DC)
static void model_to_zval_any(zval *ret, xmlNodePtr node TSRMLS_DC) static void model_to_zval_any(zval *ret, xmlNodePtr node TSRMLS_DC)
{ {
zval rv, arr; zval rv, arr, val;
zval* any = NULL; zval* any = NULL;
char* name = NULL; char* name = NULL;
while (node != NULL) { while (node != NULL) {
if (get_zval_property(ret, (char*)node->name, &rv TSRMLS_CC) == NULL) { if (get_zval_property(ret, (char*)node->name, &rv TSRMLS_CC) == NULL) {
zval* val = master_to_zval(ret, get_conversion(XSD_ANYXML), node TSRMLS_CC);
master_to_zval(&val, get_conversion(XSD_ANYXML), node TSRMLS_CC);
if (any && Z_TYPE_P(any) != IS_ARRAY) { if (any && Z_TYPE_P(any) != IS_ARRAY) {
/* Convert into array */ /* Convert into array */
@ -1271,16 +1272,16 @@ static void model_to_zval_any(zval *ret, xmlNodePtr node TSRMLS_DC)
any = &arr; any = &arr;
} }
if (Z_TYPE_P(val) == IS_STRING && *Z_STRVAL_P(val) == '<') { if (Z_TYPE(val) == IS_STRING && *Z_STRVAL(val) == '<') {
name = NULL; name = NULL;
while (node->next != NULL) { while (node->next != NULL) {
zval val2; zval val2;
master_to_zval(&val2, get_conversion(XSD_ANYXML), node->next TSRMLS_CC); master_to_zval(&val2, get_conversion(XSD_ANYXML), node->next TSRMLS_CC);
if (Z_TYPE(val2) != IS_STRING || *Z_STRVAL_P(val) != '<') { if (Z_TYPE(val2) != IS_STRING || *Z_STRVAL(val) != '<') {
break; break;
} }
add_string_to_string(val, val, &val2); add_string_to_string(&val, &val, &val2);
zval_ptr_dtor(&val2); zval_ptr_dtor(&val2);
node = node->next; node = node->next;
} }
@ -1292,11 +1293,11 @@ static void model_to_zval_any(zval *ret, xmlNodePtr node TSRMLS_DC)
if (name) { if (name) {
/* Convert into array */ /* Convert into array */
array_init(&arr); array_init(&arr);
add_assoc_zval(&arr, name, val); add_assoc_zval(&arr, name, &val);
any = &arr; any = &arr;
name = NULL; name = NULL;
} else { } else {
any = val; any = &val;
} }
} else { } else {
/* Add array element */ /* Add array element */
@ -1309,12 +1310,12 @@ static void model_to_zval_any(zval *ret, xmlNodePtr node TSRMLS_DC)
add_next_index_zval(&arr, el); add_next_index_zval(&arr, el);
el = &arr; el = &arr;
} }
add_next_index_zval(el, val); add_next_index_zval(el, &val);
} else { } else {
add_assoc_zval(any, name, val); add_assoc_zval(any, name, &val);
} }
} else { } else {
add_next_index_zval(any, val); add_next_index_zval(any, &val);
} }
name = NULL; name = NULL;
} }