summaryrefslogtreecommitdiff
path: root/src/gas_assembly_generator.c
diff options
context:
space:
mode:
authorCarlos Maniero <carlos@maniero.me>2023-05-10 16:07:39 -0300
committerCarlos Maniero <carlos@maniero.me>2023-05-10 17:35:03 -0300
commit75639fbf01bd6ae1212521b6cf822025eb8b598d (patch)
tree49709154c437cfbc01568f1e0c9abc8574fd3a54 /src/gas_assembly_generator.c
parent2cf0bcb409f3a1fd298b664103d57c945c6349f5 (diff)
namespaces: Add a namespace structure that represents a file
We have been always parsing a single function. Since we want to have multiple functions in a near future, this patch introduces an namespace that represents an entire file. To ensure a function is defined inside a namespace, a helper function was created. Today our ast_node structure is highly exposed, and this is something that Johnny and I have been discussed. So then, this is a first step to try to protected the code generation from our ast tree. Signed-off-by: Carlos Maniero <carlos@maniero.me>
Diffstat (limited to 'src/gas_assembly_generator.c')
-rw-r--r--src/gas_assembly_generator.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/gas_assembly_generator.c b/src/gas_assembly_generator.c
index 413fbb0..4326b27 100644
--- a/src/gas_assembly_generator.c
+++ b/src/gas_assembly_generator.c
@@ -147,6 +147,9 @@ gas_assembly_generator_compile(gas_assembly_generator_t *gen, ast_node_t *ast)
gen->latest_evaluation.kind = EVALUATION_RESULT_VOID;
switch (ast->kind) {
+ case AST_NAMESPACE:
+ gas_assembly_generator_compile_ns(gen, &ast->data.ns);
+ break;
case AST_BINARY_OPERATION:
gas_assembly_generator_binary_operation(gen, &ast->data.binary_operation);
break;
@@ -179,6 +182,14 @@ gas_assembly_generator_compile(gas_assembly_generator_t *gen, ast_node_t *ast)
}
}
+void
+gas_assembly_generator_compile_ns(gas_assembly_generator_t *gen, ast_namespace_t *ns)
+{
+ for (size_t i = 0; i < ns->nodes->size; i++) {
+ gas_assembly_generator_compile(gen, vector_at(ns->nodes, i));
+ }
+}
+
static void
gas_assembly_generator_compile_function(gas_assembly_generator_t *gen, ast_function_declaration_t *func)
{
@@ -201,12 +212,9 @@ gas_assembly_generator_compile_function(gas_assembly_generator_t *gen, ast_funct
}
void
-gas_assembly_generator_compile_linux_main(gas_assembly_generator_t *gen, ast_node_t *func)
+gas_assembly_generator_compile_linux_main(gas_assembly_generator_t *gen, ast_node_t *ns)
{
- assert(func);
- assert(func->kind == AST_FUNCTION_DECLARATION);
-
- if (!string_view_eq(func->data.function.identifier.name, string_view_from_str("main"))) {
+ if (ast_node_ns_get_function_node_by_name(ns, "main") == NULL) {
fprintf(stderr, "[ERROR]: no main function has been defined!\n");
exit(EXIT_FAILURE);
}
@@ -214,7 +222,7 @@ gas_assembly_generator_compile_linux_main(gas_assembly_generator_t *gen, ast_nod
fprintf(gen->stream, ".global _start\n");
fprintf(gen->stream, ".text\n");
- gas_assembly_generator_compile(gen, func);
+ gas_assembly_generator_compile(gen, ns);
fprintf(gen->stream, "_start:\n");
fprintf(gen->stream, " call main\n");