Fix another leak
All checks were successful
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=OFF (push) Successful in 14s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=OFF (push) Successful in 14s
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 12s
CMake / ubuntu-latest - shared=OFF, pthread=ON, posix=ON (push) Successful in 10s
CMake / ubuntu-latest - shared=ON, pthread=ON, posix=ON (push) Successful in 10s
All checks were successful
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=OFF (push) Successful in 14s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=OFF (push) Successful in 14s
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 12s
CMake / ubuntu-latest - shared=OFF, pthread=ON, posix=ON (push) Successful in 10s
CMake / ubuntu-latest - shared=ON, pthread=ON, posix=ON (push) Successful in 10s
Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
test = 123;
|
test = 123
|
||||||
test.field = 456; # This should be invalid. `test` is an int, not an object.
|
test.field = 456 # This should be invalid. `test` is an int, not an object.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
49
src/dcfg.c
49
src/dcfg.c
@@ -429,11 +429,35 @@ static void skip_ws_and_comments(Lexer *lx)
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
while (is_space(lx->ch))
|
while (is_space(lx->ch))
|
||||||
lex_advance(lx);
|
lex_advance(lx);
|
||||||
|
|
||||||
if (lx->ch == '#') {
|
if (lx->ch == '#') {
|
||||||
while (lx->ch != -1 && lx->ch != '\n')
|
while (lx->ch != -1 && lx->ch != '\n')
|
||||||
lex_advance(lx);
|
lex_advance(lx);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lx->ch == '/' && lx->next == '/') {
|
||||||
|
lex_advance(lx);
|
||||||
|
lex_advance(lx);
|
||||||
|
while (lx->ch != -1 && lx->ch != '\n')
|
||||||
|
lex_advance(lx);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lx->ch == '/' && lx->next == '*') {
|
||||||
|
lex_advance(lx);
|
||||||
|
lex_advance(lx);
|
||||||
|
while (lx->ch != -1) {
|
||||||
|
if (lx->ch == '*' && lx->next == '/') {
|
||||||
|
lex_advance(lx);
|
||||||
|
lex_advance(lx); /* / */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lex_advance(lx);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1082,7 +1106,11 @@ Value *ast_to_value(dcfg_Instance *instance, AST *root)
|
|||||||
ASTBlock_Entry *e = &root->v.bl.entryv[i];
|
ASTBlock_Entry *e = &root->v.bl.entryv[i];
|
||||||
Value *rhs = ast_to_value(instance, e->v);
|
Value *rhs = ast_to_value(instance, e->v);
|
||||||
if (!rhs) {
|
if (!rhs) {
|
||||||
// FIXME: Free
|
for (size_t j = 0; j < vector_size(value->v.o.entryv); j++) {
|
||||||
|
dcfg_destroy(value->v.o.entryv[j].v);
|
||||||
|
}
|
||||||
|
vector_free(value->v.o.entryv);
|
||||||
|
FREE(value);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1098,6 +1126,17 @@ Value *ast_to_value(dcfg_Instance *instance, AST *root)
|
|||||||
field = ma->accessv[vector_size(ma->accessv) - 1];
|
field = ma->accessv[vector_size(ma->accessv) - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (target->type != dcfg_ValueType_Object) {
|
||||||
|
strcpy(instance->last_error,
|
||||||
|
"Previous declaration is not an object");
|
||||||
|
dcfg_destroy(rhs);
|
||||||
|
for (size_t j = 0; j < vector_size(value->v.o.entryv); j++)
|
||||||
|
dcfg_destroy(value->v.o.entryv[j].v);
|
||||||
|
vector_free(value->v.o.entryv);
|
||||||
|
FREE(value);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ValueObject *obj = &target->v.o;
|
ValueObject *obj = &target->v.o;
|
||||||
bool replaced = false;
|
bool replaced = false;
|
||||||
for (size_t j = 0; j < vector_size(obj->entryv); ++j) {
|
for (size_t j = 0; j < vector_size(obj->entryv); ++j) {
|
||||||
@@ -1160,11 +1199,10 @@ Value *ast_to_value(dcfg_Instance *instance, AST *root)
|
|||||||
for (size_t i = 0; i < vector_size(root->v.fc.argv); i++) {
|
for (size_t i = 0; i < vector_size(root->v.fc.argv); i++) {
|
||||||
Value *arg = ast_to_value(instance, root->v.fc.argv[i]);
|
Value *arg = ast_to_value(instance, root->v.fc.argv[i]);
|
||||||
if (!arg) {
|
if (!arg) {
|
||||||
// TODO: Free argv values
|
for (size_t i = 0; i < vector_size(value->v.c.argv); i++)
|
||||||
for (size_t i = 0; i < vector_size(value->v.c.argv); i++) {
|
|
||||||
dcfg_destroy(value->v.c.argv[i]);
|
dcfg_destroy(value->v.c.argv[i]);
|
||||||
}
|
|
||||||
vector_free(value->v.c.argv);
|
vector_free(value->v.c.argv);
|
||||||
|
dcfg_destroy(value->v.c.function);
|
||||||
FREE(value);
|
FREE(value);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -1262,6 +1300,7 @@ dcfg_Value *dcfg_parse(dcfg_Instance *instance, dcfg_StringView const file_path)
|
|||||||
instance->last_error[0] = '\0';
|
instance->last_error[0] = '\0';
|
||||||
|
|
||||||
Value *v = ast_to_value(instance, ast);
|
Value *v = ast_to_value(instance, ast);
|
||||||
|
AST_free_parser(ast, &parser);
|
||||||
if (!v) {
|
if (!v) {
|
||||||
if (!*instance->last_error) {
|
if (!*instance->last_error) {
|
||||||
strcpy(instance->last_error, "Could not get Value tree from AST");
|
strcpy(instance->last_error, "Could not get Value tree from AST");
|
||||||
@@ -1274,8 +1313,6 @@ 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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user