...
This commit is contained in:
@@ -18,23 +18,21 @@ public partial class QBEGenerator
|
||||
private readonly Stack<string> _breakLabels = [];
|
||||
private readonly Stack<string> _continueLabels = [];
|
||||
private readonly Queue<(BoundArrowFunc Func, string Name)> _arrowFunctions = [];
|
||||
private readonly Dictionary<BoundTraitFuncImpl, string> _implFunctions = [];
|
||||
private readonly Stack<Scope> _scopes = [];
|
||||
private int _tmpIndex;
|
||||
private int _labelIndex;
|
||||
private int _arrowFuncIndex;
|
||||
private int _cStringLiteralIndex;
|
||||
private int _stringLiteralIndex;
|
||||
private int _implFuncNameIndex;
|
||||
private bool _codeIsReachable = true;
|
||||
|
||||
private Scope Scope => _scopes.Peek();
|
||||
|
||||
public QBEGenerator(BoundSyntaxTree syntaxTree, BoundDefinitionTable definitionTable, string file)
|
||||
public QBEGenerator(BoundSyntaxTree syntaxTree, BoundDefinitionTable definitionTable)
|
||||
{
|
||||
_syntaxTree = syntaxTree;
|
||||
_definitionTable = definitionTable;
|
||||
_writer = new QBEWriter(file);
|
||||
_writer = new QBEWriter();
|
||||
}
|
||||
|
||||
public string Emit()
|
||||
@@ -44,14 +42,12 @@ public partial class QBEGenerator
|
||||
_breakLabels.Clear();
|
||||
_continueLabels.Clear();
|
||||
_arrowFunctions.Clear();
|
||||
_implFunctions.Clear();
|
||||
_scopes.Clear();
|
||||
_tmpIndex = 0;
|
||||
_labelIndex = 0;
|
||||
_arrowFuncIndex = 0;
|
||||
_cStringLiteralIndex = 0;
|
||||
_stringLiteralIndex = 0;
|
||||
_implFuncNameIndex = 0;
|
||||
_codeIsReachable = true;
|
||||
|
||||
foreach (var structDef in _definitionTable.GetStructs())
|
||||
@@ -78,12 +74,6 @@ public partial class QBEGenerator
|
||||
_writer.NewLine();
|
||||
}
|
||||
|
||||
foreach (var (impl, name) in _implFunctions)
|
||||
{
|
||||
EmitFuncDefinition(name, impl.Signature.Parameters, impl.Signature.ReturnType, impl.Body);
|
||||
_writer.NewLine();
|
||||
}
|
||||
|
||||
foreach (var cStringLiteral in _cStringLiterals)
|
||||
{
|
||||
_writer.WriteLine($"data {cStringLiteral.Name} = {{ b \"{cStringLiteral.Value}\", b 0 }}");
|
||||
@@ -207,19 +197,16 @@ public partial class QBEGenerator
|
||||
{
|
||||
case BoundArrayInitializer arrayInitializer:
|
||||
{
|
||||
_writer.WriteDebugLocation(arrayInitializer);
|
||||
EmitStore(source.Type, EmitUnwrap(EmitArrayInitializer(arrayInitializer)), destinationPointer);
|
||||
return true;
|
||||
}
|
||||
case BoundStructInitializer structInitializer:
|
||||
{
|
||||
_writer.WriteDebugLocation(structInitializer);
|
||||
EmitStructInitializer(structInitializer, destinationPointer);
|
||||
return true;
|
||||
}
|
||||
case BoundLiteral { Kind: LiteralKind.String } literal:
|
||||
{
|
||||
_writer.WriteDebugLocation(literal);
|
||||
EmitStore(source.Type, EmitUnwrap(EmitLiteral(literal)), destinationPointer);
|
||||
return true;
|
||||
}
|
||||
@@ -521,11 +508,6 @@ public partial class QBEGenerator
|
||||
return $"${funcDef.CallName}";
|
||||
}
|
||||
|
||||
private string ImplFuncName()
|
||||
{
|
||||
return $"$impl{++_implFuncNameIndex}";
|
||||
}
|
||||
|
||||
private string CustomTypeName(NubCustomType customType)
|
||||
{
|
||||
return CustomTypeName(customType.Namespace, customType.Name);
|
||||
@@ -551,7 +533,7 @@ public class CStringLiteral(string value, string name)
|
||||
public string Name { get; } = name;
|
||||
}
|
||||
|
||||
public record Val(string Name, NubType Type, ValKind Kind, MethodCallContext? FuncCallContext = null);
|
||||
public record Val(string Name, NubType Type, ValKind Kind);
|
||||
|
||||
public class Scope(Scope? parent = null)
|
||||
{
|
||||
@@ -579,8 +561,6 @@ public class Scope(Scope? parent = null)
|
||||
}
|
||||
}
|
||||
|
||||
public record MethodCallContext(Val ThisArg);
|
||||
|
||||
public enum ValKind
|
||||
{
|
||||
Pointer,
|
||||
|
||||
Reference in New Issue
Block a user