diff --git a/example/program.nub b/example/program.nub index 4d02d13..11c8189 100644 --- a/example/program.nub +++ b/example/program.nub @@ -1,5 +1,16 @@ import c; +struct Human { + age: i64; + name: string; +} + global func main() { - printf("something %s\n", "your mom"); + me = new Human + { + age = 21; + name = "Oliver"; + }; + + printf("My name is %s and i am %d years old\n", me.name, me.age); } \ No newline at end of file diff --git a/src/compiler/Nub.Lang/Backend/Generator.cs b/src/compiler/Nub.Lang/Backend/Generator.cs index 517b9fc..9a7fd4d 100644 --- a/src/compiler/Nub.Lang/Backend/Generator.cs +++ b/src/compiler/Nub.Lang/Backend/Generator.cs @@ -42,66 +42,84 @@ public class Generator return _builder.ToString(); } - private string QbeTypeName(NubType type) + private static string QbeTypeName(NubType type) { - if (type is NubPrimitiveType primitiveType) + switch (type) { - switch (primitiveType.Kind) + case NubPrimitiveType primitiveType: { - case PrimitiveTypeKind.I64: - case PrimitiveTypeKind.U64: - case PrimitiveTypeKind.String: - case PrimitiveTypeKind.Any: - return "l"; - case PrimitiveTypeKind.I32: - case PrimitiveTypeKind.U32: - case PrimitiveTypeKind.I16: - case PrimitiveTypeKind.U16: - case PrimitiveTypeKind.I8: - case PrimitiveTypeKind.U8: - case PrimitiveTypeKind.Bool: - return "w"; - case PrimitiveTypeKind.F64: - return "d"; - case PrimitiveTypeKind.F32: - return "s"; - default: - throw new ArgumentOutOfRangeException(); + switch (primitiveType.Kind) + { + case PrimitiveTypeKind.I64: + case PrimitiveTypeKind.U64: + case PrimitiveTypeKind.String: + case PrimitiveTypeKind.Any: + return "l"; + case PrimitiveTypeKind.I32: + case PrimitiveTypeKind.U32: + case PrimitiveTypeKind.I16: + case PrimitiveTypeKind.U16: + case PrimitiveTypeKind.I8: + case PrimitiveTypeKind.U8: + case PrimitiveTypeKind.Bool: + return "w"; + case PrimitiveTypeKind.F64: + return "d"; + case PrimitiveTypeKind.F32: + return "s"; + default: + throw new ArgumentOutOfRangeException(); + } + } + case NubCustomType nubCustomType: + { + return "l"; + } + default: + { + throw new NotImplementedException(); } } - - throw new NotImplementedException(); } - private int QbeTypeSize(NubType type) + private static int QbeTypeSize(NubType type) { - if (type is NubPrimitiveType primitiveType) + switch (type) { - switch (primitiveType.Kind) + case NubPrimitiveType primitiveType: { - case PrimitiveTypeKind.I64: - case PrimitiveTypeKind.U64: - case PrimitiveTypeKind.String: - case PrimitiveTypeKind.Any: - return 8; - case PrimitiveTypeKind.I32: - case PrimitiveTypeKind.U32: - case PrimitiveTypeKind.I16: - case PrimitiveTypeKind.U16: - case PrimitiveTypeKind.I8: - case PrimitiveTypeKind.U8: - case PrimitiveTypeKind.Bool: - return 4; - case PrimitiveTypeKind.F64: - return 8; - case PrimitiveTypeKind.F32: - return 4; - default: - throw new ArgumentOutOfRangeException(); + switch (primitiveType.Kind) + { + case PrimitiveTypeKind.I64: + case PrimitiveTypeKind.U64: + case PrimitiveTypeKind.String: + case PrimitiveTypeKind.Any: + return 8; + case PrimitiveTypeKind.I32: + case PrimitiveTypeKind.U32: + case PrimitiveTypeKind.I16: + case PrimitiveTypeKind.U16: + case PrimitiveTypeKind.I8: + case PrimitiveTypeKind.U8: + case PrimitiveTypeKind.Bool: + return 4; + case PrimitiveTypeKind.F64: + return 8; + case PrimitiveTypeKind.F32: + return 4; + default: + throw new ArgumentOutOfRangeException(); + } + } + case NubCustomType nubCustomType: + { + return 8; + } + default: + { + throw new NotImplementedException(); } } - - throw new NotImplementedException(); } private void GenerateFuncDefinition(LocalFuncDefinitionNode node)