]>
Commit | Line | Data |
---|---|---|
fb98beff ER |
1 | --- PHP_5_3/ext/soap/php_encoding.c 2011/08/10 13:30:20 314736 |
2 | +++ PHP_5_3/ext/soap/php_encoding.c 2011/08/10 13:44:48 314737 | |
3 | @@ -114,6 +114,26 @@ | |
4 | } \ | |
5 | } | |
6 | ||
7 | +#define CHECK_XML_NULL(xml) \ | |
8 | + { \ | |
9 | + xmlAttrPtr null; \ | |
10 | + if (!xml) { \ | |
11 | + zval *ret; \ | |
12 | + ALLOC_INIT_ZVAL(ret); \ | |
13 | + ZVAL_NULL(ret); \ | |
14 | + return ret; \ | |
15 | + } \ | |
16 | + if (xml->properties) { \ | |
17 | + null = get_attribute(xml->properties, "nil"); \ | |
18 | + if (null) { \ | |
19 | + zval *ret; \ | |
20 | + ALLOC_INIT_ZVAL(ret); \ | |
21 | + ZVAL_NULL(ret); \ | |
22 | + return ret; \ | |
23 | + } \ | |
24 | + } \ | |
25 | + } | |
26 | + | |
27 | #define FIND_ZVAL_NULL(zval, xml, style) \ | |
28 | { \ | |
29 | if (!zval || Z_TYPE_P(zval) == IS_NULL) { \ | |
30 | @@ -338,6 +358,19 @@ | |
31 | return 0; | |
32 | } | |
33 | ||
34 | +static zval* soap_find_xml_ref(xmlNodePtr node TSRMLS_DC) | |
35 | +{ | |
36 | + zval **data_ptr; | |
37 | + | |
38 | + if (SOAP_GLOBAL(ref_map) && | |
39 | + zend_hash_index_find(SOAP_GLOBAL(ref_map), (ulong)node, (void**)&data_ptr) == SUCCESS) { | |
40 | + Z_SET_ISREF_PP(data_ptr); | |
41 | + Z_ADDREF_PP(data_ptr); | |
42 | + return *data_ptr; | |
43 | + } | |
44 | + return NULL; | |
45 | +} | |
46 | + | |
47 | static zend_bool soap_check_xml_ref(zval **data, xmlNodePtr node TSRMLS_DC) | |
48 | { | |
49 | zval **data_ptr; | |
50 | @@ -1513,6 +1546,11 @@ | |
51 | sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_LIST && | |
52 | sdlType->encode->details.sdl_type->kind != XSD_TYPEKIND_UNION) { | |
53 | ||
54 | + CHECK_XML_NULL(data); | |
55 | + if ((ret = soap_find_xml_ref(data TSRMLS_CC)) != NULL) { | |
56 | + return ret; | |
57 | + } | |
58 | + | |
59 | if (ce != ZEND_STANDARD_CLASS_DEF_PTR && | |
60 | sdlType->encode->to_zval == sdl_guess_convert_zval && | |
61 | sdlType->encode->details.sdl_type != NULL && | |
62 | @@ -1526,7 +1564,6 @@ | |
63 | } else { | |
64 | ret = master_to_zval_int(sdlType->encode, data); | |
65 | } | |
66 | - FIND_XML_NULL(data, ret); | |
67 | if (soap_check_xml_ref(&ret, data TSRMLS_CC)) { | |
68 | return ret; | |
69 | } |