From 8833e606aba603f17cee3e7537bc3f2ab1e5ac02 Mon Sep 17 00:00:00 2001 From: lyon Date: Thu, 13 Jan 2022 19:39:05 +0800 Subject: [PATCH] free obj auto when arg is updated --- port/linux/test/pikaMain-test.cpp | 20 ++++++++++++++++++++ src/dataArgs.c | 11 ++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/port/linux/test/pikaMain-test.cpp b/port/linux/test/pikaMain-test.cpp index cec4eb29e..d3b494d6e 100644 --- a/port/linux/test/pikaMain-test.cpp +++ b/port/linux/test/pikaMain-test.cpp @@ -697,4 +697,24 @@ TEST(pikaMain, for_in_string) { /* deinit */ obj_deinit(pikaMain); EXPECT_EQ(pikaMemNow(), 0); +} + +TEST(pikaMain, obj_no_free) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain); + /* run */ + __platform_printf((char*)"BEGIN\n"); + obj_run(pikaMain, (char*) + "s = PikaStdData.String()\n" + "s.set('test')\n" + "s = PikaStdData.String()\n" + "s.set('test')\n" + "\n" + ); + /* collect */ + /* assert */ + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); } \ No newline at end of file diff --git a/src/dataArgs.c b/src/dataArgs.c index 57b576f12..32113f334 100644 --- a/src/dataArgs.c +++ b/src/dataArgs.c @@ -26,6 +26,7 @@ */ #include "dataArgs.h" +#include "PikaObj.h" #include "PikaPlatform.h" #include "dataLink.h" #include "dataMemory.h" @@ -194,7 +195,7 @@ int32_t args_isArgExist(Args* self, char* name) { return 0; } -int32_t updateArg(Args* self, Arg* argNew) { +int32_t __updateArg(Args* self, Arg* argNew) { LinkNode* nodeToUpdate = NULL; LinkNode* nodeNow = self->firstNode; LinkNode* priorNode = NULL; @@ -211,7 +212,11 @@ int32_t updateArg(Args* self, Arg* argNew) { priorNode = nodeNow; nodeNow = content_getNext(nodeNow); } - + /* free the object */ + if (TYPE_OBJECT == arg_getType(nodeToUpdate)) { + PikaObj* obj = arg_getPtr(nodeToUpdate); + obj_deinit(obj); + } nodeToUpdate = arg_setContent(nodeToUpdate, arg_getContent(argNew), arg_getContentSize(argNew)); @@ -235,7 +240,7 @@ int32_t args_setArg(Args* self, Arg* arg) { args_pushArg(self, arg); return 0; } - updateArg(self, arg); + __updateArg(self, arg); return 0; }