From 01c2ac3369b6e403e5f7a24b91a01b7bb792eed7 Mon Sep 17 00:00:00 2001 From: Scott Wolchok Date: Tue, 25 Oct 2016 17:10:24 -0700 Subject: [PATCH] Don't preallocate child lists Summary: There is no reason to malloc a list of 4 child pointers for every CSS node eagerly. Instead, we malloc the list (preserving the default size of 4) when we try to put stuff in it. Reviewed By: emilsjolander Differential Revision: D4078012 fbshipit-source-id: 7cdcab03ec4067550a5fee5e1baea14344f3a8f9 --- CSSLayout/CSSLayout.c | 4 ++-- CSSLayout/CSSNodeList.c | 25 +++++++++++++++++++------ CSSLayout/CSSNodeList.h | 4 ++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c index 0eb7de4b..1cacc993 100644 --- a/CSSLayout/CSSLayout.c +++ b/CSSLayout/CSSLayout.c @@ -195,7 +195,7 @@ int32_t CSSNodeGetInstanceCount(void) { void CSSNodeInit(const CSSNodeRef node) { node->parent = NULL; - node->children = CSSNodeListNew(4); + node->children = NULL; node->hasNewLayout = true; node->isDirty = false; @@ -257,7 +257,7 @@ static void _CSSNodeMarkDirty(const CSSNodeRef node) { void CSSNodeInsertChild(const CSSNodeRef node, const CSSNodeRef child, const uint32_t index) { CSS_ASSERT(child->parent == NULL, "Child already has a parent, it must be removed first."); - CSSNodeListInsert(node->children, child, index); + CSSNodeListInsert(&node->children, child, index); child->parent = node; _CSSNodeMarkDirty(node); } diff --git a/CSSLayout/CSSNodeList.c b/CSSLayout/CSSNodeList.c index e10131f4..f9c27c18 100644 --- a/CSSLayout/CSSNodeList.c +++ b/CSSLayout/CSSNodeList.c @@ -28,19 +28,32 @@ CSSNodeListRef CSSNodeListNew(const uint32_t initialCapacity) { } void CSSNodeListFree(const CSSNodeListRef list) { - free(list->items); - free(list); + if (list) { + free(list->items); + free(list); + } } uint32_t CSSNodeListCount(const CSSNodeListRef list) { - return list->count; + if (list) { + return list->count; + } + return 0; } -void CSSNodeListAdd(const CSSNodeListRef list, const CSSNodeRef node) { - CSSNodeListInsert(list, node, list->count); +void CSSNodeListAdd(CSSNodeListRef *listp, const CSSNodeRef node) { + if (!*listp) { + *listp = CSSNodeListNew(4); + } + CSSNodeListInsert(listp, node, (*listp)->count); } -void CSSNodeListInsert(const CSSNodeListRef list, const CSSNodeRef node, const uint32_t index) { +void CSSNodeListInsert(CSSNodeListRef *listp, const CSSNodeRef node, const uint32_t index) { + if (!*listp) { + *listp = CSSNodeListNew(4); + } + CSSNodeListRef list = *listp; + if (list->count == list->capacity) { list->capacity *= 2; list->items = realloc(list->items, sizeof(void *) * list->capacity); diff --git a/CSSLayout/CSSNodeList.h b/CSSLayout/CSSNodeList.h index 6d2ca6ce..155fcf6e 100644 --- a/CSSLayout/CSSNodeList.h +++ b/CSSLayout/CSSNodeList.h @@ -24,8 +24,8 @@ typedef struct CSSNodeList *CSSNodeListRef; CSSNodeListRef CSSNodeListNew(const uint32_t initialCapacity); void CSSNodeListFree(const CSSNodeListRef list); uint32_t CSSNodeListCount(const CSSNodeListRef list); -void CSSNodeListAdd(const CSSNodeListRef list, const CSSNodeRef node); -void CSSNodeListInsert(const CSSNodeListRef list, const CSSNodeRef node, const uint32_t index); +void CSSNodeListAdd(CSSNodeListRef *listp, const CSSNodeRef node); +void CSSNodeListInsert(CSSNodeListRef *listp, const CSSNodeRef node, const uint32_t index); CSSNodeRef CSSNodeListRemove(const CSSNodeListRef list, const uint32_t index); CSSNodeRef CSSNodeListDelete(const CSSNodeListRef list, const CSSNodeRef node); CSSNodeRef CSSNodeListGet(const CSSNodeListRef list, const uint32_t index);