diff --git a/example/main.nub b/example/main.nub index 14f2d64..9f61221 100644 --- a/example/main.nub +++ b/example/main.nub @@ -1,12 +1,5 @@ namespace main -struct Human { - name: string - // print_age: func() = func() { - // c::puts("test3") - // } -} - export func main(args: [][]u8): i64 { let x: []u8 diff --git a/src/Generation/QBE/QBEGenerator.cs b/src/Generation/QBE/QBEGenerator.cs index 997d806..c08d363 100644 --- a/src/Generation/QBE/QBEGenerator.cs +++ b/src/Generation/QBE/QBEGenerator.cs @@ -694,7 +694,7 @@ public static class QBEGenerator { AddressOfNode addressOf => GenerateAddressOf(addressOf), AnonymousFuncNode anonymousFunc => GenerateAnonymousFunc(anonymousFunc), - ArrayIndexAccessNode arrayIndex => GenerateArrayIndexAccessNode(arrayIndex), + ArrayIndexAccessNode arrayIndex => GenerateArrayIndexAccess(arrayIndex), ArrayInitializerNode arrayInitializer => GenerateArrayInitializer(arrayInitializer), BinaryExpressionNode binaryExpression => GenerateBinaryExpression(binaryExpression), DereferenceNode dereference => GenerateDereference(dereference), @@ -738,11 +738,18 @@ public static class QBEGenerator return resultPointerName; } - private static string GenerateArrayIndexAccessNode(ArrayIndexAccessNode arrayIndexAccess) + private static string GenerateArrayIndexAccess(ArrayIndexAccessNode arrayIndexAccess) { var pointerName = GenerateArrayIndexPointer(arrayIndexAccess); - if (IsPointerType(arrayIndexAccess.Type)) + var elementType = arrayIndexAccess.Array.Type switch + { + NubArrayType arrayType => arrayType.ElementType, + NubFixedArrayType fixedArrayType => fixedArrayType.ElementType, + _ => throw new ArgumentOutOfRangeException() + }; + + if (SizeOf(elementType) > 8) { return pointerName; } @@ -1222,7 +1229,7 @@ public static class QBEGenerator { var pointer = GenerateMemberAccessPointer(memberAccess); - if (IsPointerType(memberAccess.Type)) + if (SizeOf(memberAccess.Type) > 8) { return pointer; } @@ -1306,7 +1313,7 @@ public static class QBEGenerator private static void GenerateCopy(NubType type, string value, string destinationPointer) { - if (IsPointerType(type)) + if (SizeOf(type) > 8) { _builder.AppendLine($" blit {value}, {destinationPointer}, {SizeOf(type)}"); }