From 8716d251f188a0b984768e7029b655070b018c5b Mon Sep 17 00:00:00 2001 From: nub31 Date: Sat, 21 Jun 2025 18:16:25 +0200 Subject: [PATCH] It works --- example/main.nub | 8 ++++++++ src/Generation/QBE/QBEGenerator.cs | 26 ++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/example/main.nub b/example/main.nub index 8c1e401..c1ded04 100644 --- a/example/main.nub +++ b/example/main.nub @@ -27,5 +27,13 @@ export func main(args: []cstring): i64 { y("proxy") + func(){ c::puts("anon") }() + + let z: func() + + z = func() { c::puts("anon variable") } + + z() + return 0 } diff --git a/src/Generation/QBE/QBEGenerator.cs b/src/Generation/QBE/QBEGenerator.cs index 0c603b6..87c75ad 100644 --- a/src/Generation/QBE/QBEGenerator.cs +++ b/src/Generation/QBE/QBEGenerator.cs @@ -17,7 +17,7 @@ public static class QBEGenerator private static DefinitionTable _definitionTable = null!; private static StringBuilder _builder = new(); - private static List _strings = []; + private static List _cStringLiterals = []; private static Stack _breakLabels = []; private static Stack _continueLabels = []; private static Queue<(AnonymousFuncNode Func, string Name)> _anonymousFunctions = []; @@ -26,6 +26,7 @@ public static class QBEGenerator private static int _variableIndex; private static int _labelIndex; private static int _anonymousFuncIndex; + private static int _cStringLiteralIndex; private static bool _codeIsReachable = true; public static string Emit(CompilationUnit compilationUnit, DefinitionTable definitionTable) @@ -34,7 +35,7 @@ public static class QBEGenerator _definitionTable = definitionTable; _builder = new StringBuilder(); - _strings = []; + _cStringLiterals = []; _breakLabels = []; _continueLabels = []; _anonymousFunctions = []; @@ -43,6 +44,7 @@ public static class QBEGenerator _variableIndex = 0; _labelIndex = 0; _anonymousFuncIndex = 0; + _cStringLiteralIndex = 0; _codeIsReachable = true; foreach (var structDef in _definitionTable.GetStructs()) @@ -63,9 +65,9 @@ public static class QBEGenerator _builder.AppendLine(); } - for (var i = 0; i < _strings.Count; i++) + foreach (var cStringLiteral in _cStringLiterals) { - _builder.AppendLine($"data $string{i + 1} = {{ b \"{_strings[i]}\", b 0 }}"); + _builder.AppendLine($"data {cStringLiteral.Name} = {{ b \"{cStringLiteral.Value}\", b 0 }}"); } return _builder.ToString(); @@ -81,6 +83,11 @@ public static class QBEGenerator return $"@l{++_labelIndex}"; } + private static string CStringName() + { + return $"$cstring{++_cStringLiteralIndex}"; + } + private static string FuncName(IFuncSignature funcDef) { return funcDef switch @@ -1077,8 +1084,9 @@ public static class QBEGenerator switch (literal.Kind) { case LiteralKind.String: - _strings.Add(literal.Literal); - return new Ident($"$string{_strings.Count}", literal.Type, IdentKind.Literal); + var cStringLiteral = new CStringLiteral(literal.Literal, CStringName()); + _cStringLiterals.Add(cStringLiteral); + return new Ident(cStringLiteral.Name, literal.Type, IdentKind.Literal); case LiteralKind.Bool: return new Ident(bool.Parse(literal.Literal) ? "1" : "0", literal.Type, IdentKind.Literal); default: @@ -1319,6 +1327,12 @@ public static class QBEGenerator } } +internal class CStringLiteral(string value, string name) +{ + public string Value { get; } = value; + public string Name { get; } = name; +} + internal class Variable(string name, Ident ident) { public string Name { get; } = name;