Rework this param

This commit is contained in:
nub31
2025-08-13 21:43:00 +02:00
parent e89e7b2ba7
commit c2a6afdbbd
6 changed files with 202 additions and 91 deletions

View File

@@ -53,17 +53,13 @@ public partial class QBEGenerator
foreach (var structDef in _syntaxTree.Definitions.OfType<StructNode>())
{
foreach (var func in structDef.Functions)
{
var funcName = StructFuncName(structDef.Name, func.Name);
EmitFuncDefinition(funcName, func.Signature.Parameters, func.Signature.ReturnType, func.Body);
_writer.NewLine();
}
EmitStructDefinition(structDef);
_writer.NewLine();
}
foreach (var funcDef in _syntaxTree.Definitions.OfType<LocalFuncNode>())
{
EmitFuncDefinition(LocalFuncName(funcDef), funcDef.Signature.Parameters, funcDef.Signature.ReturnType, funcDef.Body);
EmitLocalFuncDefinition(funcDef);
_writer.NewLine();
}
@@ -343,37 +339,40 @@ public partial class QBEGenerator
return "l";
}
private void EmitFuncDefinition(string name, IReadOnlyList<FuncParameterNode> parameters, TypeNode returnType, BlockNode body)
private void EmitLocalFuncDefinition(LocalFuncNode funcDef)
{
_labelIndex = 0;
_tmpIndex = 0;
_writer.Write("export function ");
if (returnType is not VoidTypeNode)
if (funcDef.Signature.ReturnType is not VoidTypeNode)
{
_writer.Write(FuncQBETypeName(returnType) + ' ');
_writer.Write(FuncQBETypeName(funcDef.Signature.ReturnType) + ' ');
}
_writer.Write(name);
_writer.Write(LocalFuncName(funcDef));
var parameterStrings = parameters.Select(x => FuncQBETypeName(x.Type) + $" %{x.Name}");
_writer.Write("(");
foreach (var parameter in funcDef.Signature.Parameters)
{
_writer.Write(FuncQBETypeName(parameter.Type) + $" %{parameter.Name}");
}
_writer.Write($"({string.Join(", ", parameterStrings)})");
_writer.WriteLine(" {");
_writer.WriteLine(") {");
_writer.WriteLine("@start");
var scope = new Scope();
foreach (var parameter in parameters)
foreach (var parameter in funcDef.Signature.Parameters)
{
scope.Declare(parameter.Name, new Val("%" + parameter.Name, parameter.Type, ValKind.Direct));
}
EmitBlock(body, scope);
EmitBlock(funcDef.Body, scope);
// Implicit return for void functions if no explicit return has been set
if (returnType is VoidTypeNode && body.Statements is [.., not ReturnNode])
if (funcDef.Signature.ReturnType is VoidTypeNode && funcDef.Body.Statements is [.., not ReturnNode])
{
_writer.Indented("ret");
}
@@ -381,6 +380,57 @@ public partial class QBEGenerator
_writer.WriteLine("}");
}
private void EmitStructDefinition(StructNode structDef)
{
for (var i = 0; i < structDef.Functions.Count; i++)
{
var function = structDef.Functions[i];
_labelIndex = 0;
_tmpIndex = 0;
_writer.Write("export function ");
if (function.Signature.ReturnType is not VoidTypeNode)
{
_writer.Write(FuncQBETypeName(function.Signature.ReturnType) + ' ');
}
_writer.Write(StructFuncName(structDef.Name, function.Name));
_writer.Write("(l %this, ");
foreach (var parameter in function.Signature.Parameters)
{
_writer.Write(FuncQBETypeName(parameter.Type) + $" %{parameter.Name}, ");
}
_writer.WriteLine(") {");
_writer.WriteLine("@start");
var scope = new Scope();
scope.Declare("this", new Val("%this", structDef.Type, ValKind.Direct));
foreach (var parameter in function.Signature.Parameters)
{
scope.Declare(parameter.Name, new Val("%" + parameter.Name, parameter.Type, ValKind.Direct));
}
EmitBlock(function.Body, scope);
// Implicit return for void functions if no explicit return has been set
if (function.Signature.ReturnType is VoidTypeNode && function.Body.Statements is [.., not ReturnNode])
{
_writer.Indented("ret");
}
_writer.WriteLine("}");
if (i != structDef.Functions.Count - 1)
{
_writer.NewLine();
}
}
}
private void EmitStructTypeDefinition(StructNode structDef)
{
_writer.WriteLine($"type {StructTypeName(structDef.Name)} = {{ ");