From cbda0181b9f5480cfce2c08e17fd998babb77d4d Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 5 Aug 2025 22:51:26 +0200 Subject: Add runtime library for catskill transpiled artifacts, wrapping main function with correct types Signed-off-by: Mel --- boot/transpile.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'boot/transpile.c') diff --git a/boot/transpile.c b/boot/transpile.c index 25a3d79..7ab13e9 100644 --- a/boot/transpile.c +++ b/boot/transpile.c @@ -11,14 +11,14 @@ #pragma once #include "catboot.h" -#include "visit.c" -#include struct Transpile_Context { bool in_function; struct String function_name; struct String function_return_type; + bool main_function_found; + bool main_function_takes_args; }; #define CONTEXT_START(name) \ @@ -47,6 +47,8 @@ transpiler_new(struct Transpiler* transpiler, FILE* output) .in_function = false, .function_name = string_empty(), .function_return_type = string_empty(), + .main_function_found = false, + .main_function_takes_args = false, }, }; } @@ -293,7 +295,21 @@ transpiler_visit_expression_binary_operation(struct Visit* visit, struct Express VISIT(visit_type_node, header->return_type); fprintf(transpiler->output, " "); - VISIT(visit_expression, name_expr); + + // check if this is a main function assignment + if (name_expr && name_expr->kind == EXPRESSION_NAME) { + struct Expression_Name* name = &name_expr->value.name; + if (string_equals_c_str(name->name, "main")) { + transpiler->context.main_function_found = true; + transpiler->context.main_function_takes_args = + header->parameters_type_and_name != nil; + fprintf(transpiler->output, "catskill_main"); + } else { + VISIT(visit_expression, name_expr); + } + } else { + VISIT(visit_expression, name_expr); + } VISIT(visit_function_header_node, header); fprintf(transpiler->output, " "); @@ -380,13 +396,25 @@ transpiler_visit_tree(struct Visit* visit, struct Tree* tree) // for transpiled catskill programs. // other headers can be included by the user // with the pragma `| c-header "header.h"`. - fprintf(transpiler->output, "#include \n"); - fprintf(transpiler->output, "#include \n"); - fprintf(transpiler->output, "#include \n\n"); + // TODO: for now we just reference the path to it in this repo + // exactly, when we actually just want to fully include the string + // of the entire file into the transpiled output, for development it's + // okay for now. + fprintf(transpiler->output, "#include \"boot/runtime/core.c\"\n"); FOR_EACH (struct Statement*, statement, tree->top_level_statements) { VISIT(visit_statement, statement); } + + // check if we found a main function and define the appropriate macro for the runtime + // TODO: create a nice lookup table of all the functions and types we found through + // the catskill source. + if (transpiler->context.main_function_found) { + if (transpiler->context.main_function_takes_args) { + fprintf(transpiler->output, "\n#define CATSKILL_MAIN_TAKES_ARGS\n"); + } + fprintf(transpiler->output, "#include \"boot/runtime/runtime.c\"\n"); + } } struct Visit_Table transpiler_visit_functions = { -- cgit 1.4.1