From 7effe36988e5cdbaf31aa6cfc4cf556d02120fc2 Mon Sep 17 00:00:00 2001 From: nub31 Date: Wed, 11 Jun 2025 10:46:41 +0200 Subject: [PATCH] small fixes --- build.sh | 4 +++- src/lang/Nub.Lang/Frontend/Generation/QBEGenerator.cs | 7 +++---- src/lang/Nub.Lang/Frontend/Generation/SymbolTable.cs | 8 +++++++- src/lang/Nub.Lang/Frontend/Typing/TypeChecker.cs | 11 ++++++----- src/runtime/baseline/entry.s | 2 +- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/build.sh b/build.sh index f70f97c..1b5d5c6 100755 --- a/build.sh +++ b/build.sh @@ -6,7 +6,9 @@ dotnet build src/lang/Nub.Lang.CLI mkdir -p bin-int bin rm -rf bin-int/* bin/* -nub example | qbe | as -o bin-int/out.o +nub example > bin-int/out.ssa +qbe bin-int/out.ssa > bin-int/out.s +as -o bin-int/out.o bin-int/out.s find src/runtime -name '*.s' | while read -r file; do as "$file" -o "bin-int/$(basename "${file}" .s).o" diff --git a/src/lang/Nub.Lang/Frontend/Generation/QBEGenerator.cs b/src/lang/Nub.Lang/Frontend/Generation/QBEGenerator.cs index fcbbd2b..d2a9206 100644 --- a/src/lang/Nub.Lang/Frontend/Generation/QBEGenerator.cs +++ b/src/lang/Nub.Lang/Frontend/Generation/QBEGenerator.cs @@ -241,16 +241,15 @@ public class QBEGenerator { var definition = LookupStructDefinition(nubStructType.Namespace, nubStructType.Name); - int size = 0; - int maxAlignment = 1; + var size = 0; + var maxAlignment = 1; foreach (var field in definition.Fields) { - int fieldAlignment = AlignmentOf(field.Type); + var fieldAlignment = AlignmentOf(field.Type); maxAlignment = Math.Max(maxAlignment, fieldAlignment); size = AlignTo(size, fieldAlignment); - size += SizeOf(field.Type); } diff --git a/src/lang/Nub.Lang/Frontend/Generation/SymbolTable.cs b/src/lang/Nub.Lang/Frontend/Generation/SymbolTable.cs index ea284ba..7889008 100644 --- a/src/lang/Nub.Lang/Frontend/Generation/SymbolTable.cs +++ b/src/lang/Nub.Lang/Frontend/Generation/SymbolTable.cs @@ -72,7 +72,7 @@ public class SymbolTable public Func LookupFunc(string @namespace, string name) { - return _functions.Single(x => x.Name == name); + return _functions.Single(x => x.Name == name && x.Namespace == @namespace); } public Variable LookupVariable(string name) @@ -100,4 +100,10 @@ public class SymbolTable public string Namespace { get; } = @namespace; public string GeneratedName { get; } = generatedName; } + + public class Struct(string @namespace, string name) : Symbol(name) + { + public string Namespace { get; } = @namespace; + public string GeneratedName => $"{Namespace}_{Name}"; + } } \ No newline at end of file diff --git a/src/lang/Nub.Lang/Frontend/Typing/TypeChecker.cs b/src/lang/Nub.Lang/Frontend/Typing/TypeChecker.cs index f370490..b30f8a4 100644 --- a/src/lang/Nub.Lang/Frontend/Typing/TypeChecker.cs +++ b/src/lang/Nub.Lang/Frontend/Typing/TypeChecker.cs @@ -14,7 +14,7 @@ public class TypeChecker private List _sourceFiles = []; private List _diagnostics = []; private NubType? _currentFunctionReturnType; - private List _anonymousFunctions = []; + private Queue _anonymousFunctions = []; public DiagnosticsResult TypeCheck(List sourceFiles) { @@ -54,10 +54,11 @@ public class TypeChecker { TypeCheckFuncDef(funcDef.Parameters, funcDef.Body, funcDef.ReturnType); } - - foreach (var anonymousFuncNode in _anonymousFunctions) + + while (_anonymousFunctions.TryDequeue(out var func)) { - TypeCheckFuncDef(anonymousFuncNode.Parameters, anonymousFuncNode.Body, anonymousFuncNode.ReturnType); + TypeCheckFuncDef(func.Parameters, func.Body, func.ReturnType); + } return new DiagnosticsResult(_diagnostics); @@ -375,7 +376,7 @@ public class TypeChecker private NubType TypeCheckAnonymousFunc(AnonymousFuncNode anonymousFunc) { - _anonymousFunctions.Add(anonymousFunc); + _anonymousFunctions.Enqueue(anonymousFunc); return new NubFuncType(anonymousFunc.ReturnType, anonymousFunc.Parameters.Select(p => p.Type).ToList()); } diff --git a/src/runtime/baseline/entry.s b/src/runtime/baseline/entry.s index d471b53..ffbc28d 100644 --- a/src/runtime/baseline/entry.s +++ b/src/runtime/baseline/entry.s @@ -5,7 +5,7 @@ .global _start _start: mov rdi, rsp - # main([]^string): i64 + # func main(args: []^string): i64 call main mov rdi, rax mov rax, 60