fix leak when load kw dict to default

This commit is contained in:
lyon 2022-12-10 16:30:43 +08:00
parent 0f51072065
commit 853d5be3b5
5 changed files with 28 additions and 4 deletions

View File

@ -11,7 +11,7 @@
"program": "${workspaceFolder}/build/test/pikascript_test", "program": "${workspaceFolder}/build/test/pikascript_test",
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain", // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
"args": [ "args": [
"--gtest_filter=requests.post_data" "--gtest_filter=vm.issue_keyword_mem_leak"
], ],
"stopAtEntry": false, "stopAtEntry": false,
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",

View File

@ -1,9 +1,9 @@
sh only_make.sh sh only_make.sh
if [ $# == 0 ] ; then if [ $# == 0 ] ; then
valgrind -s --track-origins=yes --leak-check=full --show-leak-kinds=all --exit-on-first-error=yes --error-exitcode=1 build/test/pikascript_test valgrind -s --track-origins=yes --leak-check=full --show-leak-kinds=all --exit-on-first-error=yes --error-exitcode=1 build/test/pikascript_test --num-callers=50
fi fi
if [ $# == 1 ] ; then if [ $# == 1 ] ; then
filter=$1 filter=$1
valgrind --track-origins=yes --leak-check=full --show-leak-kinds=all build/test/pikascript_test --gtest_filter=$filter valgrind -s --track-origins=yes --leak-check=full --show-leak-kinds=all build/test/pikascript_test --gtest_filter=$filter --num-callers=50
fi fi

View File

@ -861,7 +861,11 @@ static char* _kw_to_default_all(FunctionArgsInfo* f,
if (f->kw != NULL) { if (f->kw != NULL) {
Arg* default_arg = pikaDict_getArg(f->kw, arg_name); Arg* default_arg = pikaDict_getArg(f->kw, arg_name);
if (default_arg != NULL) { if (default_arg != NULL) {
argv[(*argc)++] = arg_copy(default_arg); Arg* arg_new = arg_copy(default_arg);
if (argType_isObject(arg_getType(arg_new))) {
obj_refcntDec(arg_getPtr(arg_new));
}
argv[(*argc)++] = arg_new;
} }
} }
arg_name = strPopLastToken(f->type_list, ','); arg_name = strPopLastToken(f->type_list, ',');

View File

@ -2393,6 +2393,19 @@ TEST(vm, fn_star_star) {
EXPECT_EQ(pikaMemNow(), 0); EXPECT_EQ(pikaMemNow(), 0);
} }
TEST(vm, issue_keyword_mem_leak) {
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
extern unsigned char pikaModules_py_a[];
obj_linkLibrary(pikaMain, pikaModules_py_a);
pikaVM_runSingleFile(pikaMain,
"test/python/issue/issue_keyword_mem_leak.py");
PikaObj* header = (PikaObj*)obj_getPtr(pikaMain, "header");
/* assert */
/* deinit */
obj_deinit(pikaMain);
EXPECT_EQ(pikaMemNow(), 0);
}
#endif #endif
TEST_END TEST_END

View File

@ -0,0 +1,7 @@
def test(headers=None):
print("in test")
header = {"a": "test"}
test(headers=header)