Fix some memory leaks
All checks were successful
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=OFF (push) Successful in 12s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=OFF (push) Successful in 16s
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=ON (push) Successful in 15s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=ON (push) Successful in 14s
CMake / ubuntu-latest - shared=OFF, pthread=ON, posix=ON (push) Successful in 14s
CMake / ubuntu-latest - shared=ON, pthread=ON, posix=ON (push) Successful in 14s
All checks were successful
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=OFF (push) Successful in 12s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=OFF (push) Successful in 16s
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=ON (push) Successful in 15s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=ON (push) Successful in 14s
CMake / ubuntu-latest - shared=OFF, pthread=ON, posix=ON (push) Successful in 14s
CMake / ubuntu-latest - shared=ON, pthread=ON, posix=ON (push) Successful in 14s
Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
lldb
|
lldb
|
||||||
pkg-config
|
pkg-config
|
||||||
tokei
|
tokei
|
||||||
|
valgrind
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
59
src/dcfg.c
59
src/dcfg.c
@@ -263,7 +263,14 @@ void dcfg_destroy_instance(dcfg_Instance *instance)
|
|||||||
{
|
{
|
||||||
assert(instance);
|
assert(instance);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < vector_size(instance->source_pathv); i++) {
|
||||||
|
free((void *)instance->source_pathv[i].data);
|
||||||
|
}
|
||||||
vector_free(instance->source_pathv);
|
vector_free(instance->source_pathv);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < vector_size(instance->sourcev); i++) {
|
||||||
|
free((void *)instance->sourcev[i].data);
|
||||||
|
}
|
||||||
vector_free(instance->sourcev);
|
vector_free(instance->sourcev);
|
||||||
|
|
||||||
pthread_mutex_lock(&instance->mtx);
|
pthread_mutex_lock(&instance->mtx);
|
||||||
@@ -1202,8 +1209,15 @@ dcfg_Value *dcfg_parse(dcfg_Instance *instance, dcfg_StringView const file_path)
|
|||||||
|
|
||||||
StringView str = {
|
StringView str = {
|
||||||
.size = size,
|
.size = size,
|
||||||
.data = ALLOC(size),
|
.data = ALLOC(size + 1),
|
||||||
};
|
};
|
||||||
|
if (!str.data) {
|
||||||
|
FREE(abs);
|
||||||
|
fclose(fp);
|
||||||
|
snprintf(instance->last_error, sizeof(instance->last_error) - 1,
|
||||||
|
"Failed to allocate source buffer: %s", strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
if (!fread((void *)str.data, str.size, 1, fp)) {
|
if (!fread((void *)str.data, str.size, 1, fp)) {
|
||||||
FREE(abs);
|
FREE(abs);
|
||||||
FREE((void *)str.data);
|
FREE((void *)str.data);
|
||||||
@@ -1212,6 +1226,7 @@ dcfg_Value *dcfg_parse(dcfg_Instance *instance, dcfg_StringView const file_path)
|
|||||||
"fread: %s", strerror(errno));
|
"fread: %s", strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
((char *)str.data)[str.size] = '\0';
|
||||||
|
|
||||||
Lexer lexer;
|
Lexer lexer;
|
||||||
if (!Lexer_init(&lexer, str, abs_sv)) {
|
if (!Lexer_init(&lexer, str, abs_sv)) {
|
||||||
@@ -1251,6 +1266,8 @@ dcfg_Value *dcfg_parse(dcfg_Instance *instance, dcfg_StringView const file_path)
|
|||||||
}
|
}
|
||||||
instance->last_error[0] = '\0';
|
instance->last_error[0] = '\0';
|
||||||
|
|
||||||
|
AST_free_parser(ast, &parser);
|
||||||
|
|
||||||
vector_add(&instance->sourcev, str);
|
vector_add(&instance->sourcev, str);
|
||||||
v->i_sourcev_idx = vector_size(instance->sourcev) - 1;
|
v->i_sourcev_idx = vector_size(instance->sourcev) - 1;
|
||||||
|
|
||||||
@@ -1262,8 +1279,44 @@ dcfg_Value *dcfg_parse(dcfg_Instance *instance, dcfg_StringView const file_path)
|
|||||||
|
|
||||||
void dcfg_destroy(dcfg_Value *value)
|
void dcfg_destroy(dcfg_Value *value)
|
||||||
{
|
{
|
||||||
(void)value;
|
if (!value)
|
||||||
// FIXME: Implement
|
return;
|
||||||
|
|
||||||
|
switch (value->type) {
|
||||||
|
case dcfg_ValueType_Object:
|
||||||
|
for (size_t i = 0; i < vector_size(value->v.o.entryv); i++) {
|
||||||
|
dcfg_destroy(value->v.o.entryv[i].v);
|
||||||
|
}
|
||||||
|
vector_free(value->v.o.entryv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dcfg_ValueType_Array:
|
||||||
|
for (size_t i = 0; i < vector_size(value->v.a.valuev); i++) {
|
||||||
|
dcfg_destroy(value->v.a.valuev[i]);
|
||||||
|
}
|
||||||
|
vector_free(value->v.a.valuev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dcfg_ValueType_Function:
|
||||||
|
if (!value->v.f.is_builtin) {
|
||||||
|
dcfg_destroy(value->v.f.v.f.body);
|
||||||
|
vector_free(value->v.f.v.f.argv);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dcfg_ValueType_FunctionCall:
|
||||||
|
dcfg_destroy(value->v.c.function);
|
||||||
|
for (size_t i = 0; i < vector_size(value->v.c.argv); i++) {
|
||||||
|
dcfg_destroy(value->v.c.argv[i]);
|
||||||
|
}
|
||||||
|
vector_free(value->v.c.argv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
value->instance->free(value); // https://youtu.be/RgFaK6ZQifE
|
||||||
}
|
}
|
||||||
|
|
||||||
dcfg_ValueType dcfg_Value_type_ex(dcfg_Value *value, bool evaluate)
|
dcfg_ValueType dcfg_Value_type_ex(dcfg_Value *value, bool evaluate)
|
||||||
|
Reference in New Issue
Block a user