From 3752b69fe3424b949bcb61c222265ee6a435c994 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 7 Feb 2026 19:08:21 +0900 Subject: feat: workaround to compile Lua 5.5 --- src/codegen.c | 6 ++++++ src/parse.c | 15 +++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 91baef8..bc1e3d3 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -832,6 +832,12 @@ static void codegen_func(CodeGen* g, AstNode* ast) { } static void codegen_global_var(CodeGen* g, AstNode* var) { + if (var->ty->storage_class == StorageClass_extern) { + return; + } + if (var->ty->storage_class != StorageClass_static) { + fprintf(g->out, ".globl %s\n", var->as.gvar_decl->name); + } fprintf(g->out, " %s:\n", var->as.gvar_decl->name); if (!var->as.gvar_decl->expr) { fprintf(g->out, " .zero %d\n", type_sizeof(var->ty)); diff --git a/src/parse.c b/src/parse.c index 51a85ff..aeafabd 100644 --- a/src/parse.c +++ b/src/parse.c @@ -604,7 +604,8 @@ static bool is_type_token(Parser* p, Token* tok) { tok->kind == TokenKind_keyword_typeof_unqual || tok->kind == TokenKind_keyword_const || tok->kind == TokenKind_keyword_restrict || tok->kind == TokenKind_keyword_volatile || tok->kind == TokenKind_keyword__Atomic || tok->kind == TokenKind_keyword_alignas || - tok->kind == TokenKind_keyword_inline || tok->kind == TokenKind_keyword__Noreturn) { + tok->kind == TokenKind_keyword_inline || tok->kind == TokenKind_keyword__Noreturn || + tok->kind == TokenKind_keyword_static) { return true; } if (tok->kind != TokenKind_ident) { @@ -1303,6 +1304,9 @@ static AstNode* parse_init_declarator_list(Parser* p, Type* ty) { // declaration: // declaration-specifiers init-declarator-list ';' static AstNode* parse_var_decl(Parser* p) { + // TODO + consume_token_if(p, TokenKind_keyword_static); + Type* base_ty = parse_type_name(p); AstNode* decls = parse_init_declarator_list(p, base_ty); expect(p, TokenKind_semicolon); @@ -1379,15 +1383,18 @@ static void declare_func_or_var(Parser* p, AstNode* decl) { } } else { if (find_gvar(p, name) != -1) { - fatal_error("declare_func_or_var: %s redeclared", name); + // TODO + // fatal_error("declare_func_or_var: %s redeclared", name); } // TODO: refactor Type* base_ty = decl->ty; while (base_ty->base) { base_ty = base_ty->base; } - decl->ty->storage_class = base_ty->storage_class; - base_ty->storage_class = StorageClass_unspecified; + if (base_ty != decl->ty) { + decl->ty->storage_class = base_ty->storage_class; + base_ty->storage_class = StorageClass_unspecified; + } // TODO: refactor if (decl->ty->kind == TypeKind_array && decl->ty->array_size == -1 && decl->as.declarator && -- cgit v1.3-1-g0d28