Simplify variables

This commit is contained in:
nub31
2025-09-08 20:46:50 +02:00
parent 343d515f37
commit c4c533ffbd
2 changed files with 23 additions and 12 deletions

View File

@@ -4,6 +4,7 @@ extern func puts(text: cstring)
interface Printable
{
func print()
func test()
}
struct Human : Printable
@@ -15,6 +16,11 @@ struct Human : Printable
{
puts(this.name)
}
func test()
{
puts("test")
}
}
func main(args: []cstring): i64
@@ -25,6 +31,7 @@ func main(args: []cstring): i64
}
x.print()
x.test()
return 0
}

View File

@@ -559,12 +559,11 @@ public class QBEGenerator
private void EmitVariableDeclaration(VariableDeclarationNode variableDeclaration)
{
var name = $"%{variableDeclaration.Name}";
_writer.Indented($"{name} =l alloc8 8");
_writer.Indented($"{name} =l alloc8 {SizeOf(variableDeclaration.Type)}");
if (variableDeclaration.Assignment.HasValue)
{
var value = EmitCreateCopyOrInitialize(variableDeclaration.Assignment.Value);
EmitStore(variableDeclaration.Assignment.Value.Type, value, name);
EmitCopyIntoOrInitialize(variableDeclaration.Assignment.Value, name);
}
}
@@ -697,11 +696,11 @@ public class QBEGenerator
var elementType = ((ArrayTypeNode)arrayIndexAccess.Target.Type).ElementType;
var address = TmpName();
_writer.Indented($"{address} =l mul {index}, {SizeOf(elementType)}");
_writer.Indented($"{address} =l add {address}, 8");
_writer.Indented($"{address} =l add {array}, {address}");
return address;
var offset = TmpName();
_writer.Indented($"{offset} =l mul {index}, {SizeOf(elementType)}");
_writer.Indented($"{offset} =l add {offset}, 8");
_writer.Indented($"{offset} =l add {array}, {offset}");
return offset;
}
private string EmitAddressOfStructFieldAccess(StructFieldAccessNode structFieldAccess)
@@ -840,7 +839,11 @@ public class QBEGenerator
private string EmitVariableIdent(VariableIdentNode variableIdent)
{
return EmitLoad(variableIdent.Type, EmitAddressOfVariableIdent(variableIdent));
var address = EmitAddressOfVariableIdent(variableIdent);
return variableIdent.Type.IsSimpleType(out _, out _)
? EmitLoad(variableIdent.Type, address)
: address;
}
private string EmitFuncParameterIdent(FuncParameterIdentNode funcParameterIdent)
@@ -1058,10 +1061,11 @@ public class QBEGenerator
var func = TmpName();
_writer.Indented($"{func} =l loadl {funcOffset}");
_writer.Indented($"{target} =l add {target}, 8");
_writer.Indented($"{target} =l loadl {target}");
var data = TmpName();
_writer.Indented($"{data} =l add {target}, 8");
_writer.Indented($"{data} =l loadl {data}");
List<string> parameterStrings = [$"l {target}"];
List<string> parameterStrings = [$"l {data}"];
foreach (var parameter in interfaceFuncCall.Parameters)
{