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

View File

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