From 97f7782968c5e3dcf448dde4f3343b4b169ad33e Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 8 Sep 2025 16:22:06 +0100 Subject: [PATCH] lang: codegen: expr: implement generating true/false/null constants --- lang/codegen/expr.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lang/codegen/expr.c b/lang/codegen/expr.c index 76d4ded..53a2ec9 100644 --- a/lang/codegen/expr.c +++ b/lang/codegen/expr.c @@ -105,6 +105,39 @@ static struct code_generator_result gen_int( return CODEGEN_RESULT_OK(0); } +static struct code_generator_result gen_keyword_const( + struct ivy_codegen *gen, struct code_generator_state *state, + struct ivy_ast_node *node, size_t depth) +{ + struct expr_codegen_state *expr = (struct expr_codegen_state *)state; + + debug_printf("codegen: got keyword const\n"); + + struct mie_value *value = NULL; + + switch (node->n_type) { + case IVY_AST_C_TRUE: + value = mie_ctx_get_int(gen->c_ctx, 1, 1); + break; + case IVY_AST_C_FALSE: + value = mie_ctx_get_int(gen->c_ctx, 0, 1); + break; + case IVY_AST_C_NULL: + value = mie_ctx_get_null(gen->c_ctx); + break; + default: + return CODEGEN_RESULT_ERR(IVY_ERR_BAD_SYNTAX); + break; + } + + enum ivy_status status = push_operand(expr, node, value, NULL); + if (status != IVY_OK) { + return CODEGEN_RESULT_ERR(status); + } + + return CODEGEN_RESULT_OK(0); +} + static struct code_generator_result gen_string( struct ivy_codegen *gen, struct code_generator_state *state, struct ivy_ast_node *node, size_t depth) @@ -508,6 +541,9 @@ struct code_generator expr_generator = { .g_state_fini = state_fini, .g_value_received = value_received, .g_node_generators = { + NODE_CODEGEN(C_TRUE, gen_keyword_const), + NODE_CODEGEN(C_FALSE, gen_keyword_const), + NODE_CODEGEN(C_NULL, gen_keyword_const), NODE_CODEGEN(INT, gen_int), NODE_CODEGEN(OP, gen_op), NODE_CODEGEN(MSG, gen_msg),