From 72e2b8e384fc2731708ac272b2891f40d19d22e4 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 24 Sep 2025 14:51:27 +0900 Subject: [PATCH] mruby-compiler: update codegen to use variable node headers for debug info Updates codegen() function to retrieve filename and line number information directly from variable-sized node headers instead of assuming traditional head nodes. Removes dead code for traditional cons-list nodes since all nodes are now variable-sized. Co-authored-by: Claude --- mrbgems/mruby-compiler/core/codegen.c | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 030ad8ff0..1539f4587 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -5613,7 +5613,6 @@ codegen(codegen_scope *s, node *tree, int val) { int nt; int rlev = s->rlev; - struct mrb_ast_head_node *head; if (!tree) { if (val) { @@ -5623,30 +5622,31 @@ codegen(codegen_scope *s, node *tree, int val) return; } - head = (struct mrb_ast_head_node*)tree; + nt = node_to_int(tree->car); s->rlev++; if (s->rlev > MRB_CODEGEN_LEVEL_MAX) { codegen_error(s, "too complex expression"); } - if (s->irep && s->filename_index != head->filename_index) { - mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index); - const char *filename = mrb_sym_name_len(s->mrb, fname, NULL); - - if (filename) { - mrb_debug_info_append_file(s->mrb, s->irep->debug_info, - filename, s->lines, s->debug_start_pos, s->pc); - } - s->debug_start_pos = s->pc; - s->filename_index = head->filename_index; - s->filename_sym = mrb_parser_get_filename(s->parser, head->filename_index); - } - - nt = node_to_int(tree->car); - s->lineno = head->lineno; - tree = tree->cdr; if (nt == NODE_VARIABLE) { + /* For variable-sized nodes, get filename/lineno from the variable node header */ + struct mrb_ast_var_header *var_head = (struct mrb_ast_var_header*)tree->cdr; + + if (s->irep && s->filename_index != var_head->filename_index) { + mrb_sym fname = mrb_parser_get_filename(s->parser, s->filename_index); + const char *filename = mrb_sym_name_len(s->mrb, fname, NULL); + + if (filename) { + mrb_debug_info_append_file(s->mrb, s->irep->debug_info, + filename, s->lines, s->debug_start_pos, s->pc); + } + s->debug_start_pos = s->pc; + s->filename_index = var_head->filename_index; + s->filename_sym = mrb_parser_get_filename(s->parser, var_head->filename_index); + } + s->lineno = var_head->lineno; + tree = tree->cdr; /* Inlined codegen_variable_node() logic */ enum node_type var_type = VAR_NODE_TYPE(tree);