Rework this param
This commit is contained in:
@@ -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)} = {{ ");
|
||||
|
||||
Reference in New Issue
Block a user