浏览代码

Revert "use prev pointer when array do adding (#430)"

This reverts commit e8077d01500279a7b45b8cd7a0ae94ea7ad5748a.
Alan Wang 5 年之前
父节点
当前提交
9034a9cd0b
共有 2 个文件被更改,包括 10 次插入29 次删除
  1. 9 28
      cJSON.c
  2. 1 1
      tests/misc_tests.c

+ 9 - 28
cJSON.c

@@ -1871,34 +1871,22 @@ static cJSON_bool add_item_to_array(cJSON *array, cJSON *item)
     }
 
     child = array->child;
-    /*
-     * To find the last item int array quickly, we use prev in array
-     */
+
     if (child == NULL)
     {
         /* list is empty, start new one */
         array->child = item;
-        item->prev = item;
-        item->next = NULL;
     }
     else
     {
         /* append to the end */
-        if (child->prev)
+        while (child->next)
         {
-            suffix_object(child->prev, item);
-            array->child->prev = item;
-        }
-        else
-        {
-            while (child->next)
-            {
-                child = child->next;
-            }
-            suffix_object(child, item);
-            array->child->prev = item;
+            child = child->next;
         }
+        suffix_object(child, item);
     }
+
     return true;
 }
 
@@ -2218,21 +2206,14 @@ CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON
     {
         replacement->next->prev = replacement;
     }
-
+    if (replacement->prev != NULL)
+    {
+        replacement->prev->next = replacement;
+    }
     if (parent->child == item)
     {
         parent->child = replacement;
     }
-    else
-    {   /*
-         * To find the last item int array quickly, we use prev in array.
-         * We can't modify the last item's next pointer where this item was the parent's child
-         */
-        if (replacement->prev != NULL)
-        {
-            replacement->prev->next = replacement;
-        }
-    }
 
     item->next = NULL;
     item->prev = NULL;

+ 1 - 1
tests/misc_tests.c

@@ -306,7 +306,7 @@ static void cjson_replace_item_via_pointer_should_replace_items(void)
 
     /* replace beginning */
     TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, beginning, &(replacements[0])));
-    TEST_ASSERT_TRUE(replacements[0].prev == end);
+    TEST_ASSERT_NULL(replacements[0].prev);
     TEST_ASSERT_TRUE(replacements[0].next == middle);
     TEST_ASSERT_TRUE(middle->prev == &(replacements[0]));
     TEST_ASSERT_TRUE(array->child == &(replacements[0]));