From 38f45f72bcd2c5541a73f9eff995579ed3a1586b Mon Sep 17 00:00:00 2001 From: cs01 Date: Sun, 26 Apr 2026 11:56:56 -0700 Subject: [PATCH 1/3] re-trigger ci From c9ad9efbca7bec50638e0ebf60e49fd5c95a6bb4 Mon Sep 17 00:00:00 2001 From: cs01 Date: Sun, 26 Apr 2026 11:56:56 -0700 Subject: [PATCH 2/3] re-trigger ci From 73ebc43887953b762600784bcacb016e45515bc8 Mon Sep 17 00:00:00 2001 From: cs01 Date: Sun, 26 Apr 2026 17:15:03 -0700 Subject: [PATCH 3/3] [type-system] add explicit dispatch to fieldToLlvmType, fail-loud on empty interface types --- .../types/interface-struct-generator.ts | 4 ++-- src/codegen/types/objects/class.ts | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/codegen/types/interface-struct-generator.ts b/src/codegen/types/interface-struct-generator.ts index d7b6949f0..f1f83c67f 100644 --- a/src/codegen/types/interface-struct-generator.ts +++ b/src/codegen/types/interface-struct-generator.ts @@ -159,7 +159,7 @@ export class InterfaceStructGenerator { private tsTypeToLlvmForField(fieldName: string, tsType: string): string { if (tsType === null || tsType === undefined || tsType === "") { - return "i8*"; + throw new Error(`tsTypeToLlvmForField: empty type for field '${fieldName}'`); } if (this.interfaceStructs.has(tsType)) { return "i8*"; @@ -171,7 +171,7 @@ export class InterfaceStructGenerator { private tsTypeToLlvm(tsType: string): string { if (tsType === null || tsType === undefined || tsType === "") { - return "i8*"; + throw new Error("tsTypeToLlvm: empty type"); } if (this.interfaceStructs.has(tsType)) { return "i8*"; diff --git a/src/codegen/types/objects/class.ts b/src/codegen/types/objects/class.ts index 66c5bf106..9477c0112 100644 --- a/src/codegen/types/objects/class.ts +++ b/src/codegen/types/objects/class.ts @@ -128,6 +128,15 @@ export class ClassGenerator { if (this.isEnumType(ts)) { return "double"; } + if (ts === "string" || ts === "void" || ts === "any" || ts === "unknown" || ts === "object") + return "i8*"; + if (ts === "null" || ts === "undefined" || ts === "never") return "i8*"; + if (ts.indexOf(" | ") !== -1) return "i8*"; + if (ts.startsWith("{")) return "i8*"; + if (ts.startsWith('"')) return "i8*"; + if (ts.indexOf("=>") !== -1 || ts.startsWith("(")) return "i8*"; + if (ts === "i8*" || ts === "i1") return ts; + if (ts.startsWith("%")) return ts; return "i8*"; } if (ft === "double") return "double"; @@ -170,6 +179,15 @@ export class ClassGenerator { if (this.isEnumType(ts)) { return "double"; } + if (ts === "string" || ts === "void" || ts === "any" || ts === "unknown" || ts === "object") + return "i8*"; + if (ts === "null" || ts === "undefined" || ts === "never") return "i8*"; + if (ts.indexOf(" | ") !== -1) return "i8*"; + if (ts.startsWith("{")) return "i8*"; + if (ts.startsWith('"')) return "i8*"; + if (ts.indexOf("=>") !== -1 || ts.startsWith("(")) return "i8*"; + if (ts === "i8*" || ts === "i1") return ts; + if (ts.startsWith("%")) return ts; return "i8*"; } }