Rework dot func call
This commit is contained in:
@@ -634,7 +634,6 @@ public class QBEGenerator
|
||||
DereferenceNode dereference => EmitDereference(dereference),
|
||||
BinaryExpressionNode binaryExpression => EmitBinaryExpression(binaryExpression),
|
||||
FuncCallNode funcCallExpression => EmitFuncCall(funcCallExpression),
|
||||
InterfaceFuncAccessNode interfaceFuncAccess => EmitInterfaceFuncAccess(interfaceFuncAccess),
|
||||
InterfaceFuncCallNode interfaceFuncCall => EmitInterfaceFuncCall(interfaceFuncCall),
|
||||
InterfaceInitializerNode interfaceInitializer => EmitInterfaceInitializer(interfaceInitializer),
|
||||
ExternFuncIdentNode externFuncIdent => EmitExternFuncIdent(externFuncIdent),
|
||||
@@ -643,7 +642,6 @@ public class QBEGenerator
|
||||
LiteralNode literal => EmitLiteral(literal),
|
||||
UnaryExpressionNode unaryExpression => EmitUnaryExpression(unaryExpression),
|
||||
StructFieldAccessNode structFieldAccess => EmitStructFieldAccess(structFieldAccess),
|
||||
StructFuncAccessNode structFuncAccess => EmitStructFuncAccess(structFuncAccess),
|
||||
StructFuncCallNode structFuncCall => EmitStructFuncCall(structFuncCall),
|
||||
ArrayIndexAccessNode arrayIndex => EmitArrayIndexAccess(arrayIndex),
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(expression))
|
||||
@@ -1030,17 +1028,11 @@ public class QBEGenerator
|
||||
return new Val(output, structFieldAccess.Type, ValKind.Pointer);
|
||||
}
|
||||
|
||||
private Val EmitStructFuncAccess(StructFuncAccessNode structFuncAccess)
|
||||
{
|
||||
var structDef = _definitionTable.LookupStruct(structFuncAccess.StructType.Name);
|
||||
var func = StructFuncName(structDef.Name, structFuncAccess.Func);
|
||||
|
||||
return new Val(func, structFuncAccess.Type, ValKind.Direct);
|
||||
}
|
||||
|
||||
private Val EmitStructFuncCall(StructFuncCallNode structFuncCall)
|
||||
{
|
||||
var expression = EmitExpression(structFuncCall.Expression);
|
||||
var structDef = _definitionTable.LookupStruct(structFuncCall.StructType.Name);
|
||||
var func = StructFuncName(structDef.Name, structFuncCall.Name);
|
||||
|
||||
var thisParameter = EmitUnwrap(EmitExpression(structFuncCall.StructExpression));
|
||||
|
||||
List<string> parameterStrings = [$"l {thisParameter}"];
|
||||
@@ -1051,26 +1043,25 @@ public class QBEGenerator
|
||||
parameterStrings.Add($"{FuncQBETypeName(parameter.Type)} {copy}");
|
||||
}
|
||||
|
||||
var funcPointer = EmitUnwrap(expression);
|
||||
if (structFuncCall.Type is VoidTypeNode)
|
||||
{
|
||||
_writer.Indented($"call {funcPointer}({string.Join(", ", parameterStrings)})");
|
||||
_writer.Indented($"call {func}({string.Join(", ", parameterStrings)})");
|
||||
return new Val(string.Empty, structFuncCall.Type, ValKind.Direct);
|
||||
}
|
||||
else
|
||||
{
|
||||
var outputName = TmpName();
|
||||
_writer.Indented($"{outputName} {QBEAssign(structFuncCall.Type)} call {funcPointer}({string.Join(", ", parameterStrings)})");
|
||||
_writer.Indented($"{outputName} {QBEAssign(structFuncCall.Type)} call {func}({string.Join(", ", parameterStrings)})");
|
||||
return new Val(outputName, structFuncCall.Type, ValKind.Direct);
|
||||
}
|
||||
}
|
||||
|
||||
private Val EmitInterfaceFuncAccess(InterfaceFuncAccessNode interfaceFuncAccess)
|
||||
private Val EmitInterfaceFuncCall(InterfaceFuncCallNode interfaceFuncCall)
|
||||
{
|
||||
var target = EmitUnwrap(EmitExpression(interfaceFuncAccess.Target));
|
||||
var target = EmitUnwrap(EmitExpression(interfaceFuncCall.InterfaceExpression));
|
||||
|
||||
var interfaceDef = _definitionTable.LookupInterface(interfaceFuncAccess.InterfaceType.Name);
|
||||
var functionIndex = interfaceDef.Functions.ToList().FindIndex(x => x.Name == interfaceFuncAccess.FuncName);
|
||||
var interfaceDef = _definitionTable.LookupInterface(interfaceFuncCall.InterfaceType.Name);
|
||||
var functionIndex = interfaceDef.Functions.ToList().FindIndex(x => x.Name == interfaceFuncCall.Name);
|
||||
var offset = functionIndex * 8;
|
||||
|
||||
var vtable = TmpName();
|
||||
@@ -1082,18 +1073,10 @@ public class QBEGenerator
|
||||
var func = TmpName();
|
||||
_writer.Indented($"{func} =l loadl {funcOffset}");
|
||||
|
||||
return new Val(func, interfaceFuncAccess.Type, ValKind.Direct);
|
||||
}
|
||||
_writer.Indented($"{target} =l add {target}, 8");
|
||||
_writer.Indented($"{target} =l loadl {target}");
|
||||
|
||||
private Val EmitInterfaceFuncCall(InterfaceFuncCallNode interfaceFuncCall)
|
||||
{
|
||||
var expression = EmitExpression(interfaceFuncCall.Expression);
|
||||
|
||||
var thisParameter = EmitUnwrap(EmitExpression(interfaceFuncCall.InterfaceExpression));
|
||||
_writer.Indented($"{thisParameter} =l add {thisParameter}, 8");
|
||||
_writer.Indented($"{thisParameter} =l loadl {thisParameter}");
|
||||
|
||||
List<string> parameterStrings = [$"l {thisParameter}"];
|
||||
List<string> parameterStrings = [$"l {target}"];
|
||||
|
||||
foreach (var parameter in interfaceFuncCall.Parameters)
|
||||
{
|
||||
@@ -1101,16 +1084,15 @@ public class QBEGenerator
|
||||
parameterStrings.Add($"{FuncQBETypeName(parameter.Type)} {copy}");
|
||||
}
|
||||
|
||||
var funcPointer = EmitUnwrap(expression);
|
||||
if (interfaceFuncCall.Type is VoidTypeNode)
|
||||
{
|
||||
_writer.Indented($"call {funcPointer}({string.Join(", ", parameterStrings)})");
|
||||
_writer.Indented($"call {func}({string.Join(", ", parameterStrings)})");
|
||||
return new Val(string.Empty, interfaceFuncCall.Type, ValKind.Direct);
|
||||
}
|
||||
else
|
||||
{
|
||||
var outputName = TmpName();
|
||||
_writer.Indented($"{outputName} {QBEAssign(interfaceFuncCall.Type)} call {funcPointer}({string.Join(", ", parameterStrings)})");
|
||||
_writer.Indented($"{outputName} {QBEAssign(interfaceFuncCall.Type)} call {func}({string.Join(", ", parameterStrings)})");
|
||||
return new Val(outputName, interfaceFuncCall.Type, ValKind.Direct);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user