]> granicus.if.org Git - php/commitdiff
Use new zend_hash API
authorDmitry Stogov <dmitry@zend.com>
Wed, 28 May 2014 08:15:16 +0000 (12:15 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 28 May 2014 08:15:16 +0000 (12:15 +0400)
ext/soap/php_encoding.c

index 4d339173bc00d5d02ee1a8ff8c8e1b912eeb20b3..c35cae2d335252558f8fed695321b64431105ab6 100644 (file)
@@ -369,7 +369,7 @@ static zend_bool soap_check_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC)
        return 0;
 }
 
-static zend_bool soap_add_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC)
+static void soap_add_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC)
 {
        if (SOAP_GLOBAL(ref_map)) {
                zend_hash_index_update(SOAP_GLOBAL(ref_map), (ulong)node, data);
@@ -1820,7 +1820,6 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
 {
        xmlNodePtr xmlParam;
        HashTable *prop = NULL;
-       int i;
        sdlTypePtr sdlType = type->sdl_type;
 
        if (!data || Z_TYPE_P(data) == IS_NULL) {
@@ -1973,29 +1972,15 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
                        return xmlParam;
                }
                if (prop != NULL) {
-                       i = zend_hash_num_elements(prop);
-                       zend_hash_internal_pointer_reset(prop);
-
-                       for (;i > 0;i--) {
-                               xmlNodePtr property;
-                               zval *zprop;
-                               zend_string *str_key;
-                               ulong index;
-                               int key_type;
-
-                               key_type = zend_hash_get_current_key_ex(prop, &str_key, &index, FALSE, &prop->nInternalPointer);
-                               zprop = zend_hash_get_current_data(prop);
-                               if (Z_TYPE_P(zprop) == IS_INDIRECT) {
-                                       zprop = Z_INDIRECT_P(zprop);
-                                       if (Z_TYPE_P(zprop) == IS_UNDEF) {
-                                               zend_hash_move_forward(prop);
-                                               continue;
-                                       }
-                               }
+                       zval *zprop;
+                       zend_string *str_key;
+                       xmlNodePtr property;
 
-                               property = master_to_xml(get_conversion(Z_TYPE_P(zprop)), zprop, style, xmlParam TSRMLS_CC);
+                       ZEND_HASH_FOREACH_STR_KEY_VAL_IND(prop, str_key, zprop) {
 
-                               if (key_type == HASH_KEY_IS_STRING) {
+                               property = master_to_xml(get_conversion(Z_TYPE_P(zprop)), zprop, style, xmlParam TSRMLS_CC);
+                               
+                               if (str_key) {
                                        const char *prop_name;
 
                                        if (Z_TYPE_P(data) == IS_OBJECT) {
@@ -2009,8 +1994,7 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo
                                                xmlNodeSetName(property, BAD_CAST(prop_name));
                                        }
                                }
-                               zend_hash_move_forward(prop);
-                       }
+                       } ZEND_HASH_FOREACH_END();
                }
                if (style == SOAP_ENCODED) {
                        set_ns_and_type(xmlParam, type);
@@ -2141,29 +2125,40 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
                                    int style
                                    TSRMLS_DC)
 {
-       int j;
+       int j = 0;
+       zval *zdata;
+       xmlNodePtr xparam;
 
        if (data && Z_TYPE_P(data) == IS_ARRAY) {
-               zend_hash_internal_pointer_reset(Z_ARRVAL_P(data));
-               for (j=0; j<dims[0]; j++) {
-                       zval *zdata;
+               ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(data), zdata) {
+                       if (j >= dims[0]) {
+                               break;
+                       }
+                       if (dimension == 1) {
+                               if (enc == NULL) {
+                                       xparam = master_to_xml(get_conversion(Z_TYPE_P(zdata)), zdata, style, xmlParam TSRMLS_CC);
+                               } else {
+                                       xparam = master_to_xml(enc, zdata, style, xmlParam TSRMLS_CC);
+                               }
 
-                       if ((zdata = zend_hash_get_current_data(Z_ARRVAL_P(data))) == NULL) {
-                               zdata = NULL;
+                               if (type) {
+                                       xmlNodeSetName(xparam, BAD_CAST(type->name));
+                               } else if (style == SOAP_LITERAL && enc && enc->details.type_str) {
+                                       xmlNodeSetName(xparam, BAD_CAST(enc->details.type_str));
+                                       xmlSetNs(xparam, ns);
+                               } else {
+                                       xmlNodeSetName(xparam, BAD_CAST("item"));
+                               }
+                       } else {
+                               add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, zdata, style TSRMLS_CC);
                        }
-                       if (dimension == 1) {
-                               xmlNodePtr xparam;
+                       j++;
+               } ZEND_HASH_FOREACH_END();
 
-                               if (zdata) {
-                                       if (enc == NULL) {
-                                               xparam = master_to_xml(get_conversion(Z_TYPE_P(zdata)), zdata, style, xmlParam TSRMLS_CC);
-                                       } else {
-                                               xparam = master_to_xml(enc, zdata, style, xmlParam TSRMLS_CC);
-                                       }
-                               } else {
-                                       xparam = xmlNewNode(NULL, BAD_CAST("BOGUS"));
-                                       xmlAddChild(xmlParam, xparam);
-                               }
+               if (dimension == 1) {
+                       while (j < dims[0]) {
+                               xparam = xmlNewNode(NULL, BAD_CAST("BOGUS"));
+                               xmlAddChild(xmlParam, xparam);
 
                                if (type) {
                                        xmlNodeSetName(xparam, BAD_CAST(type->name));
@@ -2173,15 +2168,15 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
                                } else {
                                        xmlNodeSetName(xparam, BAD_CAST("item"));
                                }
-                       } else {
-                               if (zdata) {
-                                 add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, zdata, style TSRMLS_CC);
-                               } else {
-                                 add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style TSRMLS_CC);
-                               }
+
+                               j++;
                        }
-                       zend_hash_move_forward(Z_ARRVAL_P(data));
-               }
+               } else {
+                       while (j < dims[0]) {
+                               add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style TSRMLS_CC);
+                               j++;
+                       }
+               }
        } else {
                for (j=0; j<dims[0]; j++) {
                        if (dimension == 1) {
@@ -2342,8 +2337,9 @@ iterator_done:
                        for (i = 1; i < dimension; i++) {
                                if (el != NULL && Z_TYPE_P(el) == IS_ARRAY &&
                                    zend_hash_num_elements(Z_ARRVAL_P(el)) > 0) {
-                                       zend_hash_internal_pointer_reset(Z_ARRVAL_P(el));
-                                       el = zend_hash_get_current_data(Z_ARRVAL_P(el));
+                                   ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(el), el) {
+                                       break;
+                                   } ZEND_HASH_FOREACH_END();
                                        if (Z_TYPE_P(el) == IS_ARRAY) {
                                                dims[i] = zend_hash_num_elements(Z_ARRVAL_P(el));
                                        } else {
@@ -2692,29 +2688,25 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data TSRMLS
 /* Map encode/decode */
 static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodePtr parent TSRMLS_DC)
 {
+       zval *temp_data;
+       zend_string *key_val;
+       ulong int_val;
        xmlNodePtr xmlParam;
-       int i;
+       xmlNodePtr xparam, item;
+       xmlNodePtr key;
 
        xmlParam = xmlNewNode(NULL, BAD_CAST("BOGUS"));
        xmlAddChild(parent, xmlParam);
        FIND_ZVAL_NULL(data, xmlParam, style);
 
        if (Z_TYPE_P(data) == IS_ARRAY) {
-               i = zend_hash_num_elements(Z_ARRVAL_P(data));
-               zend_hash_internal_pointer_reset(Z_ARRVAL_P(data));
-               for (;i > 0;i--) {
-                       xmlNodePtr xparam, item;
-                       xmlNodePtr key;
-                       zval *temp_data;
-                       zend_string *key_val;
-                       ulong int_val;
-
-                       temp_data = zend_hash_get_current_data(Z_ARRVAL_P(data));
+               ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(data), int_val, key_val, temp_data) {
+
                        item = xmlNewNode(NULL, BAD_CAST("item"));
                        xmlAddChild(xmlParam, item);
                        key = xmlNewNode(NULL, BAD_CAST("key"));
                        xmlAddChild(item,key);
-                       if (zend_hash_get_current_key(Z_ARRVAL_P(data), &key_val, &int_val, FALSE) == HASH_KEY_IS_STRING) {
+                       if (key_val) {
                                if (style == SOAP_ENCODED) {
                                        set_xsi_type(key, "xsd:string");
                                }
@@ -2734,9 +2726,7 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
 
                        xparam = master_to_xml(get_conversion(Z_TYPE_P(temp_data)), temp_data, style, item TSRMLS_CC);
                        xmlNodeSetName(xparam, BAD_CAST("value"));
-
-                       zend_hash_move_forward(Z_ARRVAL_P(data));
-               }
+               } ZEND_HASH_FOREACH_END();
        }
        if (style == SOAP_ENCODED) {
                set_ns_and_type(xmlParam, type);
@@ -3509,26 +3499,23 @@ encodePtr get_conversion(int encode)
 
 static int is_map(zval *array)
 {
-       int i, count = zend_hash_num_elements(Z_ARRVAL_P(array));
-
-       zend_hash_internal_pointer_reset(Z_ARRVAL_P(array));
-       for (i = 0; i < count; i++) {
-               zend_string *_str_index;
-               ulong num_index;
+       ulong index;
+       zend_string *key;
+       int i = 0;
 
-               if (zend_hash_get_current_key(Z_ARRVAL_P(array), &_str_index, &num_index, 0) == HASH_KEY_IS_STRING ||
-                   num_index != i) {
+       ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(array), index, key) {
+               if (key || index != i) {
                        return TRUE;
                }
-               zend_hash_move_forward(Z_ARRVAL_P(array));
-       }
+               i++;
+       } ZEND_HASH_FOREACH_END();
        return FALSE;
 }
 
 static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TSRMLS_DC)
 {
        HashTable *ht;
-       int i, count, cur_type, prev_type, different;
+       int i, cur_type, prev_type, different;
        zval *tmp;
        char *prev_stype = NULL, *cur_stype = NULL, *prev_ns = NULL, *cur_ns = NULL;
 
@@ -3537,15 +3524,12 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS
                return get_conversion(XSD_ANYTYPE);
        }
 
+       i = 0;
        different = FALSE;
        cur_type = prev_type = 0;
        ht = HASH_OF(array);
-       count = zend_hash_num_elements(ht);
-
-       zend_hash_internal_pointer_reset(ht);
-       for (i = 0;i < count;i++) {
-               tmp = zend_hash_get_current_data(ht);
 
+       ZEND_HASH_FOREACH_VAL_IND(ht, tmp) {
                if (Z_TYPE_P(tmp) == IS_OBJECT &&
                    Z_OBJCE_P(tmp) == soap_var_class_entry) {
                        zval *ztype;
@@ -3591,10 +3575,10 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS
                prev_type = cur_type;
                prev_stype = cur_stype;
                prev_ns = cur_ns;
-               zend_hash_move_forward(ht);
-       }
+               i++;
+       } ZEND_HASH_FOREACH_END();
 
-       if (different || count == 0) {
+       if (different || i == 0) {
                smart_str_appendl(type, "xsd:anyType", sizeof("xsd:anyType")-1);
                return get_conversion(XSD_ANYTYPE);
        } else {
@@ -3625,6 +3609,7 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS
                        return enc;
                }
        }
+       return NULL;
 }
 
 static void get_type_str(xmlNodePtr node, const char* ns, const char* type, smart_str* ret)