selfhost: graduate TY_* defs to tykind enum
This commit is contained in:
224
lib/ww/typ.ww
224
lib/ww/typ.ww
@@ -14,45 +14,49 @@ use mem;
|
||||
// next diff signal (typed-AST printer / cgen) can compare across the
|
||||
// two implementations.
|
||||
|
||||
def TY_NONE: i32 = 0;
|
||||
def TY_VOID: i32 = 1;
|
||||
def TY_BOOL: i32 = 2;
|
||||
def TY_RUNE: i32 = 3;
|
||||
def TY_I8: i32 = 4;
|
||||
def TY_I16: i32 = 5;
|
||||
def TY_I32: i32 = 6;
|
||||
def TY_I64: i32 = 7;
|
||||
def TY_U8: i32 = 8;
|
||||
def TY_U16: i32 = 9;
|
||||
def TY_U32: i32 = 10;
|
||||
def TY_U64: i32 = 11;
|
||||
def TY_UINT: i32 = 12;
|
||||
def TY_INT: i32 = 13;
|
||||
def TY_UINTPTR: i32 = 14;
|
||||
def TY_F32: i32 = 15;
|
||||
def TY_F64: i32 = 16;
|
||||
def TY_STR: i32 = 17;
|
||||
def TY_PTR: i32 = 18;
|
||||
def TY_SLICE: i32 = 19;
|
||||
def TY_ARRAY: i32 = 20;
|
||||
def TY_STRUCT: i32 = 21;
|
||||
def TY_FN: i32 = 22;
|
||||
def TY_CHAN: i32 = 23;
|
||||
def TY_NAMED: i32 = 24;
|
||||
def TY_TUPLE: i32 = 25;
|
||||
def TY_TAGGED: i32 = 26;
|
||||
def TY_ERR: i32 = 27;
|
||||
def TY_NEVER: i32 = 28;
|
||||
def TY_UNTYPED_INT: i32 = 29;
|
||||
def TY_UNTYPED_FLOAT: i32 = 30;
|
||||
def TY_UNTYPED_STR: i32 = 31;
|
||||
def TY_UNTYPED_RUNE: i32 = 32;
|
||||
def TY_UNTYPED_BOOL: i32 = 33;
|
||||
def TY_UNTYPED_NIL: i32 = 34;
|
||||
// Appended at the tail to keep prior TY_* values stable — they're
|
||||
// mirrored in cmd/wcc/ww.h and the selfhost selfcheck depends on
|
||||
// matching numeric layout.
|
||||
def TY_ENUM: i32 = 35;
|
||||
// Mirror of the C `TypeKind` enum in cmd/wcc/ww.h. Numeric values
|
||||
// are explicit and must stay in sync — the selfhost selfcheck and
|
||||
// typed-AST printers depend on matching numeric layout.
|
||||
type tykind = enum i32 {
|
||||
TY_NONE = 0,
|
||||
TY_VOID = 1,
|
||||
TY_BOOL = 2,
|
||||
TY_RUNE = 3,
|
||||
TY_I8 = 4,
|
||||
TY_I16 = 5,
|
||||
TY_I32 = 6,
|
||||
TY_I64 = 7,
|
||||
TY_U8 = 8,
|
||||
TY_U16 = 9,
|
||||
TY_U32 = 10,
|
||||
TY_U64 = 11,
|
||||
TY_UINT = 12,
|
||||
TY_INT = 13,
|
||||
TY_UINTPTR = 14,
|
||||
TY_F32 = 15,
|
||||
TY_F64 = 16,
|
||||
TY_STR = 17,
|
||||
TY_PTR = 18,
|
||||
TY_SLICE = 19,
|
||||
TY_ARRAY = 20,
|
||||
TY_STRUCT = 21,
|
||||
TY_FN = 22,
|
||||
TY_CHAN = 23,
|
||||
TY_NAMED = 24,
|
||||
TY_TUPLE = 25,
|
||||
TY_TAGGED = 26,
|
||||
TY_ERR = 27,
|
||||
TY_NEVER = 28,
|
||||
TY_UNTYPED_INT = 29,
|
||||
TY_UNTYPED_FLOAT = 30,
|
||||
TY_UNTYPED_STR = 31,
|
||||
TY_UNTYPED_RUNE = 32,
|
||||
TY_UNTYPED_BOOL = 33,
|
||||
TY_UNTYPED_NIL = 34,
|
||||
// Tail-appended values keep prior TY_* stable for the byte-diff
|
||||
// against cmd/wcc/ww.h.
|
||||
TY_ENUM = 35,
|
||||
};
|
||||
|
||||
// ---- tinfo / tfield / tparam -----------------------------------------
|
||||
|
||||
@@ -132,36 +136,36 @@ fn prim(a: *arena, k: i32, nm: str, sz: u64, al: u64) *tinfo = {
|
||||
|
||||
export fn typesinit(c: *tctx, a: *arena) void = {
|
||||
c.a = a;
|
||||
c.tyvoid = prim(a, TY_VOID, "void", 0u64, 1u64);
|
||||
c.tybool = prim(a, TY_BOOL, "bool", 1u64, 1u64);
|
||||
c.tyrune = prim(a, TY_RUNE, "rune", 4u64, 4u64);
|
||||
c.tyi8 = prim(a, TY_I8, "i8", 1u64, 1u64);
|
||||
c.tyi16 = prim(a, TY_I16, "i16", 2u64, 2u64);
|
||||
c.tyi32 = prim(a, TY_I32, "i32", 4u64, 4u64);
|
||||
c.tyi64 = prim(a, TY_I64, "i64", 8u64, 8u64);
|
||||
c.tyu8 = prim(a, TY_U8, "u8", 1u64, 1u64);
|
||||
c.tyu16 = prim(a, TY_U16, "u16", 2u64, 2u64);
|
||||
c.tyu32 = prim(a, TY_U32, "u32", 4u64, 4u64);
|
||||
c.tyu64 = prim(a, TY_U64, "u64", 8u64, 8u64);
|
||||
c.tyint = prim(a, TY_INT, "int", 8u64, 8u64);
|
||||
c.tyuint = prim(a, TY_UINT, "uint", 8u64, 8u64);
|
||||
c.tyuintptr= prim(a, TY_UINTPTR, "uintptr", 8u64, 8u64);
|
||||
c.tyf32 = prim(a, TY_F32, "f32", 4u64, 4u64);
|
||||
c.tyf64 = prim(a, TY_F64, "f64", 8u64, 8u64);
|
||||
c.tystr = prim(a, TY_STR, "str", 16u64, 8u64);
|
||||
c.tyerr = prim(a, TY_ERR, "<err>", 0u64, 1u64);
|
||||
c.tynever = prim(a, TY_NEVER, "never", 0u64, 1u64);
|
||||
c.tyvoid = prim(a, tykind.TY_VOID, "void", 0u64, 1u64);
|
||||
c.tybool = prim(a, tykind.TY_BOOL, "bool", 1u64, 1u64);
|
||||
c.tyrune = prim(a, tykind.TY_RUNE, "rune", 4u64, 4u64);
|
||||
c.tyi8 = prim(a, tykind.TY_I8, "i8", 1u64, 1u64);
|
||||
c.tyi16 = prim(a, tykind.TY_I16, "i16", 2u64, 2u64);
|
||||
c.tyi32 = prim(a, tykind.TY_I32, "i32", 4u64, 4u64);
|
||||
c.tyi64 = prim(a, tykind.TY_I64, "i64", 8u64, 8u64);
|
||||
c.tyu8 = prim(a, tykind.TY_U8, "u8", 1u64, 1u64);
|
||||
c.tyu16 = prim(a, tykind.TY_U16, "u16", 2u64, 2u64);
|
||||
c.tyu32 = prim(a, tykind.TY_U32, "u32", 4u64, 4u64);
|
||||
c.tyu64 = prim(a, tykind.TY_U64, "u64", 8u64, 8u64);
|
||||
c.tyint = prim(a, tykind.TY_INT, "int", 8u64, 8u64);
|
||||
c.tyuint = prim(a, tykind.TY_UINT, "uint", 8u64, 8u64);
|
||||
c.tyuintptr= prim(a, tykind.TY_UINTPTR, "uintptr", 8u64, 8u64);
|
||||
c.tyf32 = prim(a, tykind.TY_F32, "f32", 4u64, 4u64);
|
||||
c.tyf64 = prim(a, tykind.TY_F64, "f64", 8u64, 8u64);
|
||||
c.tystr = prim(a, tykind.TY_STR, "str", 16u64, 8u64);
|
||||
c.tyerr = prim(a, tykind.TY_ERR, "<err>", 0u64, 1u64);
|
||||
c.tynever = prim(a, tykind.TY_NEVER, "never", 0u64, 1u64);
|
||||
|
||||
c.tyuntypedint = prim(a, TY_UNTYPED_INT, "untyped_int", 0u64, 1u64);
|
||||
c.tyuntypedfloat = prim(a, TY_UNTYPED_FLOAT, "untyped_float", 0u64, 1u64);
|
||||
c.tyuntypedstr = prim(a, TY_UNTYPED_STR, "untyped_str", 0u64, 1u64);
|
||||
c.tyuntypedrune = prim(a, TY_UNTYPED_RUNE, "untyped_rune", 0u64, 1u64);
|
||||
c.tyuntypedbool = prim(a, TY_UNTYPED_BOOL, "untyped_bool", 0u64, 1u64);
|
||||
c.tyuntypednil = prim(a, TY_UNTYPED_NIL, "untyped_nil", 0u64, 1u64);
|
||||
c.tyuntypedint = prim(a, tykind.TY_UNTYPED_INT, "untyped_int", 0u64, 1u64);
|
||||
c.tyuntypedfloat = prim(a, tykind.TY_UNTYPED_FLOAT, "untyped_float", 0u64, 1u64);
|
||||
c.tyuntypedstr = prim(a, tykind.TY_UNTYPED_STR, "untyped_str", 0u64, 1u64);
|
||||
c.tyuntypedrune = prim(a, tykind.TY_UNTYPED_RUNE, "untyped_rune", 0u64, 1u64);
|
||||
c.tyuntypedbool = prim(a, tykind.TY_UNTYPED_BOOL, "untyped_bool", 0u64, 1u64);
|
||||
c.tyuntypednil = prim(a, tykind.TY_UNTYPED_NIL, "untyped_nil", 0u64, 1u64);
|
||||
};
|
||||
|
||||
export fn typeptr(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_PTR);
|
||||
let t: *tinfo = newtype(a, tykind.TY_PTR);
|
||||
t.sub = sub;
|
||||
t.size = 8u64;
|
||||
t.align = 8u64;
|
||||
@@ -169,7 +173,7 @@ export fn typeptr(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typeslice(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_SLICE);
|
||||
let t: *tinfo = newtype(a, tykind.TY_SLICE);
|
||||
t.sub = sub;
|
||||
t.size = 24u64;
|
||||
t.align = 8u64;
|
||||
@@ -177,7 +181,7 @@ export fn typeslice(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typearray(a: *arena, sub: *tinfo, n: u64) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_ARRAY);
|
||||
let t: *tinfo = newtype(a, tykind.TY_ARRAY);
|
||||
t.sub = sub;
|
||||
t.alen = n;
|
||||
if (sub != nil) {
|
||||
@@ -190,7 +194,7 @@ export fn typearray(a: *arena, sub: *tinfo, n: u64) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typechan(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_CHAN);
|
||||
let t: *tinfo = newtype(a, tykind.TY_CHAN);
|
||||
t.sub = sub;
|
||||
t.size = 8u64;
|
||||
t.align = 8u64;
|
||||
@@ -198,7 +202,7 @@ export fn typechan(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typenamed(a: *arena, name: str, under: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_NAMED);
|
||||
let t: *tinfo = newtype(a, tykind.TY_NAMED);
|
||||
t.name = name;
|
||||
t.under = under;
|
||||
if (under != nil) {
|
||||
@@ -213,32 +217,32 @@ export fn typenamed(a: *arena, name: str, under: *tinfo) *tinfo = {
|
||||
export fn typeisint(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_I8) { return true; };
|
||||
if (k == TY_I16) { return true; };
|
||||
if (k == TY_I32) { return true; };
|
||||
if (k == TY_I64) { return true; };
|
||||
if (k == TY_U8) { return true; };
|
||||
if (k == TY_U16) { return true; };
|
||||
if (k == TY_U32) { return true; };
|
||||
if (k == TY_U64) { return true; };
|
||||
if (k == TY_INT) { return true; };
|
||||
if (k == TY_UINT){ return true; };
|
||||
if (k == TY_UINTPTR) { return true; };
|
||||
if (k == TY_RUNE){ return true; };
|
||||
if (k == TY_UNTYPED_INT) { return true; };
|
||||
if (k == TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == TY_ENUM) { return typeisint(t.sub); };
|
||||
if (k == TY_NAMED) { return typeisint(t.under); };
|
||||
if (k == tykind.TY_I8) { return true; };
|
||||
if (k == tykind.TY_I16) { return true; };
|
||||
if (k == tykind.TY_I32) { return true; };
|
||||
if (k == tykind.TY_I64) { return true; };
|
||||
if (k == tykind.TY_U8) { return true; };
|
||||
if (k == tykind.TY_U16) { return true; };
|
||||
if (k == tykind.TY_U32) { return true; };
|
||||
if (k == tykind.TY_U64) { return true; };
|
||||
if (k == tykind.TY_INT) { return true; };
|
||||
if (k == tykind.TY_UINT){ return true; };
|
||||
if (k == tykind.TY_UINTPTR) { return true; };
|
||||
if (k == tykind.TY_RUNE){ return true; };
|
||||
if (k == tykind.TY_UNTYPED_INT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == tykind.TY_ENUM) { return typeisint(t.sub); };
|
||||
if (k == tykind.TY_NAMED) { return typeisint(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
export fn typeisfloat(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_F32) { return true; };
|
||||
if (k == TY_F64) { return true; };
|
||||
if (k == TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == TY_NAMED) { return typeisfloat(t.under); };
|
||||
if (k == tykind.TY_F32) { return true; };
|
||||
if (k == tykind.TY_F64) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == tykind.TY_NAMED) { return typeisfloat(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -250,25 +254,25 @@ export fn typeisnum(t: *tinfo) bool = {
|
||||
export fn typeisunsigned(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_U8) { return true; };
|
||||
if (k == TY_U16) { return true; };
|
||||
if (k == TY_U32) { return true; };
|
||||
if (k == TY_U64) { return true; };
|
||||
if (k == TY_UINT){ return true; };
|
||||
if (k == TY_UINTPTR) { return true; };
|
||||
if (k == TY_NAMED) { return typeisunsigned(t.under); };
|
||||
if (k == tykind.TY_U8) { return true; };
|
||||
if (k == tykind.TY_U16) { return true; };
|
||||
if (k == tykind.TY_U32) { return true; };
|
||||
if (k == tykind.TY_U64) { return true; };
|
||||
if (k == tykind.TY_UINT){ return true; };
|
||||
if (k == tykind.TY_UINTPTR) { return true; };
|
||||
if (k == tykind.TY_NAMED) { return typeisunsigned(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
export fn typeisuntyped(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_UNTYPED_INT) { return true; };
|
||||
if (k == TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == TY_UNTYPED_STR) { return true; };
|
||||
if (k == TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == TY_UNTYPED_BOOL) { return true; };
|
||||
if (k == TY_UNTYPED_NIL) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_INT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_STR) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_BOOL) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_NIL) { return true; };
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -279,14 +283,14 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
if (b == nil) { return false; };
|
||||
if (a.kind != b.kind) { return false; };
|
||||
let k: i32 = a.kind;
|
||||
if (k == TY_PTR) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_SLICE) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_CHAN) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_ARRAY) {
|
||||
if (k == tykind.TY_PTR) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_SLICE) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_CHAN) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_ARRAY) {
|
||||
if (a.alen != b.alen) { return false; };
|
||||
return typeeq(a.sub, b.sub);
|
||||
};
|
||||
if (k == TY_FN) {
|
||||
if (k == tykind.TY_FN) {
|
||||
if (a.variadic != b.variadic) { return false; };
|
||||
if (!typeeq(a.ret, b.ret)) { return false; };
|
||||
let pa: *tparam = a.params;
|
||||
@@ -300,7 +304,7 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
};
|
||||
return true;
|
||||
};
|
||||
if (k == TY_STRUCT) {
|
||||
if (k == tykind.TY_STRUCT) {
|
||||
let fa: *tfield = a.fields;
|
||||
let fb: *tfield = b.fields;
|
||||
for (true) {
|
||||
@@ -320,8 +324,8 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
};
|
||||
return true;
|
||||
};
|
||||
if (k == TY_NAMED) { return false; }; // nominal: only same ptr
|
||||
if (k == TY_TUPLE) {
|
||||
if (k == tykind.TY_NAMED) { return false; }; // nominal: only same ptr
|
||||
if (k == tykind.TY_TUPLE) {
|
||||
let pa: *tparam = a.params;
|
||||
let pb: *tparam = b.params;
|
||||
for (true) {
|
||||
|
||||
@@ -3338,45 +3338,49 @@ use mem;
|
||||
// next diff signal (typed-AST printer / cgen) can compare across the
|
||||
// two implementations.
|
||||
|
||||
def TY_NONE: i32 = 0;
|
||||
def TY_VOID: i32 = 1;
|
||||
def TY_BOOL: i32 = 2;
|
||||
def TY_RUNE: i32 = 3;
|
||||
def TY_I8: i32 = 4;
|
||||
def TY_I16: i32 = 5;
|
||||
def TY_I32: i32 = 6;
|
||||
def TY_I64: i32 = 7;
|
||||
def TY_U8: i32 = 8;
|
||||
def TY_U16: i32 = 9;
|
||||
def TY_U32: i32 = 10;
|
||||
def TY_U64: i32 = 11;
|
||||
def TY_UINT: i32 = 12;
|
||||
def TY_INT: i32 = 13;
|
||||
def TY_UINTPTR: i32 = 14;
|
||||
def TY_F32: i32 = 15;
|
||||
def TY_F64: i32 = 16;
|
||||
def TY_STR: i32 = 17;
|
||||
def TY_PTR: i32 = 18;
|
||||
def TY_SLICE: i32 = 19;
|
||||
def TY_ARRAY: i32 = 20;
|
||||
def TY_STRUCT: i32 = 21;
|
||||
def TY_FN: i32 = 22;
|
||||
def TY_CHAN: i32 = 23;
|
||||
def TY_NAMED: i32 = 24;
|
||||
def TY_TUPLE: i32 = 25;
|
||||
def TY_TAGGED: i32 = 26;
|
||||
def TY_ERR: i32 = 27;
|
||||
def TY_NEVER: i32 = 28;
|
||||
def TY_UNTYPED_INT: i32 = 29;
|
||||
def TY_UNTYPED_FLOAT: i32 = 30;
|
||||
def TY_UNTYPED_STR: i32 = 31;
|
||||
def TY_UNTYPED_RUNE: i32 = 32;
|
||||
def TY_UNTYPED_BOOL: i32 = 33;
|
||||
def TY_UNTYPED_NIL: i32 = 34;
|
||||
// Appended at the tail to keep prior TY_* values stable — they're
|
||||
// mirrored in cmd/wcc/ww.h and the selfhost selfcheck depends on
|
||||
// matching numeric layout.
|
||||
def TY_ENUM: i32 = 35;
|
||||
// Mirror of the C `TypeKind` enum in cmd/wcc/ww.h. Numeric values
|
||||
// are explicit and must stay in sync — the selfhost selfcheck and
|
||||
// typed-AST printers depend on matching numeric layout.
|
||||
type tykind = enum i32 {
|
||||
TY_NONE = 0,
|
||||
TY_VOID = 1,
|
||||
TY_BOOL = 2,
|
||||
TY_RUNE = 3,
|
||||
TY_I8 = 4,
|
||||
TY_I16 = 5,
|
||||
TY_I32 = 6,
|
||||
TY_I64 = 7,
|
||||
TY_U8 = 8,
|
||||
TY_U16 = 9,
|
||||
TY_U32 = 10,
|
||||
TY_U64 = 11,
|
||||
TY_UINT = 12,
|
||||
TY_INT = 13,
|
||||
TY_UINTPTR = 14,
|
||||
TY_F32 = 15,
|
||||
TY_F64 = 16,
|
||||
TY_STR = 17,
|
||||
TY_PTR = 18,
|
||||
TY_SLICE = 19,
|
||||
TY_ARRAY = 20,
|
||||
TY_STRUCT = 21,
|
||||
TY_FN = 22,
|
||||
TY_CHAN = 23,
|
||||
TY_NAMED = 24,
|
||||
TY_TUPLE = 25,
|
||||
TY_TAGGED = 26,
|
||||
TY_ERR = 27,
|
||||
TY_NEVER = 28,
|
||||
TY_UNTYPED_INT = 29,
|
||||
TY_UNTYPED_FLOAT = 30,
|
||||
TY_UNTYPED_STR = 31,
|
||||
TY_UNTYPED_RUNE = 32,
|
||||
TY_UNTYPED_BOOL = 33,
|
||||
TY_UNTYPED_NIL = 34,
|
||||
// Tail-appended values keep prior TY_* stable for the byte-diff
|
||||
// against cmd/wcc/ww.h.
|
||||
TY_ENUM = 35,
|
||||
};
|
||||
|
||||
// ---- tinfo / tfield / tparam -----------------------------------------
|
||||
|
||||
@@ -3456,36 +3460,36 @@ fn prim(a: *arena, k: i32, nm: str, sz: u64, al: u64) *tinfo = {
|
||||
|
||||
export fn typesinit(c: *tctx, a: *arena) void = {
|
||||
c.a = a;
|
||||
c.tyvoid = prim(a, TY_VOID, "void", 0u64, 1u64);
|
||||
c.tybool = prim(a, TY_BOOL, "bool", 1u64, 1u64);
|
||||
c.tyrune = prim(a, TY_RUNE, "rune", 4u64, 4u64);
|
||||
c.tyi8 = prim(a, TY_I8, "i8", 1u64, 1u64);
|
||||
c.tyi16 = prim(a, TY_I16, "i16", 2u64, 2u64);
|
||||
c.tyi32 = prim(a, TY_I32, "i32", 4u64, 4u64);
|
||||
c.tyi64 = prim(a, TY_I64, "i64", 8u64, 8u64);
|
||||
c.tyu8 = prim(a, TY_U8, "u8", 1u64, 1u64);
|
||||
c.tyu16 = prim(a, TY_U16, "u16", 2u64, 2u64);
|
||||
c.tyu32 = prim(a, TY_U32, "u32", 4u64, 4u64);
|
||||
c.tyu64 = prim(a, TY_U64, "u64", 8u64, 8u64);
|
||||
c.tyint = prim(a, TY_INT, "int", 8u64, 8u64);
|
||||
c.tyuint = prim(a, TY_UINT, "uint", 8u64, 8u64);
|
||||
c.tyuintptr= prim(a, TY_UINTPTR, "uintptr", 8u64, 8u64);
|
||||
c.tyf32 = prim(a, TY_F32, "f32", 4u64, 4u64);
|
||||
c.tyf64 = prim(a, TY_F64, "f64", 8u64, 8u64);
|
||||
c.tystr = prim(a, TY_STR, "str", 16u64, 8u64);
|
||||
c.tyerr = prim(a, TY_ERR, "<err>", 0u64, 1u64);
|
||||
c.tynever = prim(a, TY_NEVER, "never", 0u64, 1u64);
|
||||
c.tyvoid = prim(a, tykind.TY_VOID, "void", 0u64, 1u64);
|
||||
c.tybool = prim(a, tykind.TY_BOOL, "bool", 1u64, 1u64);
|
||||
c.tyrune = prim(a, tykind.TY_RUNE, "rune", 4u64, 4u64);
|
||||
c.tyi8 = prim(a, tykind.TY_I8, "i8", 1u64, 1u64);
|
||||
c.tyi16 = prim(a, tykind.TY_I16, "i16", 2u64, 2u64);
|
||||
c.tyi32 = prim(a, tykind.TY_I32, "i32", 4u64, 4u64);
|
||||
c.tyi64 = prim(a, tykind.TY_I64, "i64", 8u64, 8u64);
|
||||
c.tyu8 = prim(a, tykind.TY_U8, "u8", 1u64, 1u64);
|
||||
c.tyu16 = prim(a, tykind.TY_U16, "u16", 2u64, 2u64);
|
||||
c.tyu32 = prim(a, tykind.TY_U32, "u32", 4u64, 4u64);
|
||||
c.tyu64 = prim(a, tykind.TY_U64, "u64", 8u64, 8u64);
|
||||
c.tyint = prim(a, tykind.TY_INT, "int", 8u64, 8u64);
|
||||
c.tyuint = prim(a, tykind.TY_UINT, "uint", 8u64, 8u64);
|
||||
c.tyuintptr= prim(a, tykind.TY_UINTPTR, "uintptr", 8u64, 8u64);
|
||||
c.tyf32 = prim(a, tykind.TY_F32, "f32", 4u64, 4u64);
|
||||
c.tyf64 = prim(a, tykind.TY_F64, "f64", 8u64, 8u64);
|
||||
c.tystr = prim(a, tykind.TY_STR, "str", 16u64, 8u64);
|
||||
c.tyerr = prim(a, tykind.TY_ERR, "<err>", 0u64, 1u64);
|
||||
c.tynever = prim(a, tykind.TY_NEVER, "never", 0u64, 1u64);
|
||||
|
||||
c.tyuntypedint = prim(a, TY_UNTYPED_INT, "untyped_int", 0u64, 1u64);
|
||||
c.tyuntypedfloat = prim(a, TY_UNTYPED_FLOAT, "untyped_float", 0u64, 1u64);
|
||||
c.tyuntypedstr = prim(a, TY_UNTYPED_STR, "untyped_str", 0u64, 1u64);
|
||||
c.tyuntypedrune = prim(a, TY_UNTYPED_RUNE, "untyped_rune", 0u64, 1u64);
|
||||
c.tyuntypedbool = prim(a, TY_UNTYPED_BOOL, "untyped_bool", 0u64, 1u64);
|
||||
c.tyuntypednil = prim(a, TY_UNTYPED_NIL, "untyped_nil", 0u64, 1u64);
|
||||
c.tyuntypedint = prim(a, tykind.TY_UNTYPED_INT, "untyped_int", 0u64, 1u64);
|
||||
c.tyuntypedfloat = prim(a, tykind.TY_UNTYPED_FLOAT, "untyped_float", 0u64, 1u64);
|
||||
c.tyuntypedstr = prim(a, tykind.TY_UNTYPED_STR, "untyped_str", 0u64, 1u64);
|
||||
c.tyuntypedrune = prim(a, tykind.TY_UNTYPED_RUNE, "untyped_rune", 0u64, 1u64);
|
||||
c.tyuntypedbool = prim(a, tykind.TY_UNTYPED_BOOL, "untyped_bool", 0u64, 1u64);
|
||||
c.tyuntypednil = prim(a, tykind.TY_UNTYPED_NIL, "untyped_nil", 0u64, 1u64);
|
||||
};
|
||||
|
||||
export fn typeptr(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_PTR);
|
||||
let t: *tinfo = newtype(a, tykind.TY_PTR);
|
||||
t.sub = sub;
|
||||
t.size = 8u64;
|
||||
t.align = 8u64;
|
||||
@@ -3493,7 +3497,7 @@ export fn typeptr(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typeslice(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_SLICE);
|
||||
let t: *tinfo = newtype(a, tykind.TY_SLICE);
|
||||
t.sub = sub;
|
||||
t.size = 24u64;
|
||||
t.align = 8u64;
|
||||
@@ -3501,7 +3505,7 @@ export fn typeslice(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typearray(a: *arena, sub: *tinfo, n: u64) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_ARRAY);
|
||||
let t: *tinfo = newtype(a, tykind.TY_ARRAY);
|
||||
t.sub = sub;
|
||||
t.alen = n;
|
||||
if (sub != nil) {
|
||||
@@ -3514,7 +3518,7 @@ export fn typearray(a: *arena, sub: *tinfo, n: u64) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typechan(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_CHAN);
|
||||
let t: *tinfo = newtype(a, tykind.TY_CHAN);
|
||||
t.sub = sub;
|
||||
t.size = 8u64;
|
||||
t.align = 8u64;
|
||||
@@ -3522,7 +3526,7 @@ export fn typechan(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typenamed(a: *arena, name: str, under: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_NAMED);
|
||||
let t: *tinfo = newtype(a, tykind.TY_NAMED);
|
||||
t.name = name;
|
||||
t.under = under;
|
||||
if (under != nil) {
|
||||
@@ -3537,32 +3541,32 @@ export fn typenamed(a: *arena, name: str, under: *tinfo) *tinfo = {
|
||||
export fn typeisint(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_I8) { return true; };
|
||||
if (k == TY_I16) { return true; };
|
||||
if (k == TY_I32) { return true; };
|
||||
if (k == TY_I64) { return true; };
|
||||
if (k == TY_U8) { return true; };
|
||||
if (k == TY_U16) { return true; };
|
||||
if (k == TY_U32) { return true; };
|
||||
if (k == TY_U64) { return true; };
|
||||
if (k == TY_INT) { return true; };
|
||||
if (k == TY_UINT){ return true; };
|
||||
if (k == TY_UINTPTR) { return true; };
|
||||
if (k == TY_RUNE){ return true; };
|
||||
if (k == TY_UNTYPED_INT) { return true; };
|
||||
if (k == TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == TY_ENUM) { return typeisint(t.sub); };
|
||||
if (k == TY_NAMED) { return typeisint(t.under); };
|
||||
if (k == tykind.TY_I8) { return true; };
|
||||
if (k == tykind.TY_I16) { return true; };
|
||||
if (k == tykind.TY_I32) { return true; };
|
||||
if (k == tykind.TY_I64) { return true; };
|
||||
if (k == tykind.TY_U8) { return true; };
|
||||
if (k == tykind.TY_U16) { return true; };
|
||||
if (k == tykind.TY_U32) { return true; };
|
||||
if (k == tykind.TY_U64) { return true; };
|
||||
if (k == tykind.TY_INT) { return true; };
|
||||
if (k == tykind.TY_UINT){ return true; };
|
||||
if (k == tykind.TY_UINTPTR) { return true; };
|
||||
if (k == tykind.TY_RUNE){ return true; };
|
||||
if (k == tykind.TY_UNTYPED_INT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == tykind.TY_ENUM) { return typeisint(t.sub); };
|
||||
if (k == tykind.TY_NAMED) { return typeisint(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
export fn typeisfloat(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_F32) { return true; };
|
||||
if (k == TY_F64) { return true; };
|
||||
if (k == TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == TY_NAMED) { return typeisfloat(t.under); };
|
||||
if (k == tykind.TY_F32) { return true; };
|
||||
if (k == tykind.TY_F64) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == tykind.TY_NAMED) { return typeisfloat(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -3574,25 +3578,25 @@ export fn typeisnum(t: *tinfo) bool = {
|
||||
export fn typeisunsigned(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_U8) { return true; };
|
||||
if (k == TY_U16) { return true; };
|
||||
if (k == TY_U32) { return true; };
|
||||
if (k == TY_U64) { return true; };
|
||||
if (k == TY_UINT){ return true; };
|
||||
if (k == TY_UINTPTR) { return true; };
|
||||
if (k == TY_NAMED) { return typeisunsigned(t.under); };
|
||||
if (k == tykind.TY_U8) { return true; };
|
||||
if (k == tykind.TY_U16) { return true; };
|
||||
if (k == tykind.TY_U32) { return true; };
|
||||
if (k == tykind.TY_U64) { return true; };
|
||||
if (k == tykind.TY_UINT){ return true; };
|
||||
if (k == tykind.TY_UINTPTR) { return true; };
|
||||
if (k == tykind.TY_NAMED) { return typeisunsigned(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
export fn typeisuntyped(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_UNTYPED_INT) { return true; };
|
||||
if (k == TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == TY_UNTYPED_STR) { return true; };
|
||||
if (k == TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == TY_UNTYPED_BOOL) { return true; };
|
||||
if (k == TY_UNTYPED_NIL) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_INT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_STR) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_BOOL) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_NIL) { return true; };
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -3603,14 +3607,14 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
if (b == nil) { return false; };
|
||||
if (a.kind != b.kind) { return false; };
|
||||
let k: i32 = a.kind;
|
||||
if (k == TY_PTR) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_SLICE) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_CHAN) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_ARRAY) {
|
||||
if (k == tykind.TY_PTR) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_SLICE) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_CHAN) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_ARRAY) {
|
||||
if (a.alen != b.alen) { return false; };
|
||||
return typeeq(a.sub, b.sub);
|
||||
};
|
||||
if (k == TY_FN) {
|
||||
if (k == tykind.TY_FN) {
|
||||
if (a.variadic != b.variadic) { return false; };
|
||||
if (!typeeq(a.ret, b.ret)) { return false; };
|
||||
let pa: *tparam = a.params;
|
||||
@@ -3624,7 +3628,7 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
};
|
||||
return true;
|
||||
};
|
||||
if (k == TY_STRUCT) {
|
||||
if (k == tykind.TY_STRUCT) {
|
||||
let fa: *tfield = a.fields;
|
||||
let fb: *tfield = b.fields;
|
||||
for (true) {
|
||||
@@ -3644,8 +3648,8 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
};
|
||||
return true;
|
||||
};
|
||||
if (k == TY_NAMED) { return false; }; // nominal: only same ptr
|
||||
if (k == TY_TUPLE) {
|
||||
if (k == tykind.TY_NAMED) { return false; }; // nominal: only same ptr
|
||||
if (k == tykind.TY_TUPLE) {
|
||||
let pa: *tparam = a.params;
|
||||
let pb: *tparam = b.params;
|
||||
for (true) {
|
||||
|
||||
@@ -3338,45 +3338,49 @@ use mem;
|
||||
// next diff signal (typed-AST printer / cgen) can compare across the
|
||||
// two implementations.
|
||||
|
||||
def TY_NONE: i32 = 0;
|
||||
def TY_VOID: i32 = 1;
|
||||
def TY_BOOL: i32 = 2;
|
||||
def TY_RUNE: i32 = 3;
|
||||
def TY_I8: i32 = 4;
|
||||
def TY_I16: i32 = 5;
|
||||
def TY_I32: i32 = 6;
|
||||
def TY_I64: i32 = 7;
|
||||
def TY_U8: i32 = 8;
|
||||
def TY_U16: i32 = 9;
|
||||
def TY_U32: i32 = 10;
|
||||
def TY_U64: i32 = 11;
|
||||
def TY_UINT: i32 = 12;
|
||||
def TY_INT: i32 = 13;
|
||||
def TY_UINTPTR: i32 = 14;
|
||||
def TY_F32: i32 = 15;
|
||||
def TY_F64: i32 = 16;
|
||||
def TY_STR: i32 = 17;
|
||||
def TY_PTR: i32 = 18;
|
||||
def TY_SLICE: i32 = 19;
|
||||
def TY_ARRAY: i32 = 20;
|
||||
def TY_STRUCT: i32 = 21;
|
||||
def TY_FN: i32 = 22;
|
||||
def TY_CHAN: i32 = 23;
|
||||
def TY_NAMED: i32 = 24;
|
||||
def TY_TUPLE: i32 = 25;
|
||||
def TY_TAGGED: i32 = 26;
|
||||
def TY_ERR: i32 = 27;
|
||||
def TY_NEVER: i32 = 28;
|
||||
def TY_UNTYPED_INT: i32 = 29;
|
||||
def TY_UNTYPED_FLOAT: i32 = 30;
|
||||
def TY_UNTYPED_STR: i32 = 31;
|
||||
def TY_UNTYPED_RUNE: i32 = 32;
|
||||
def TY_UNTYPED_BOOL: i32 = 33;
|
||||
def TY_UNTYPED_NIL: i32 = 34;
|
||||
// Appended at the tail to keep prior TY_* values stable — they're
|
||||
// mirrored in cmd/wcc/ww.h and the selfhost selfcheck depends on
|
||||
// matching numeric layout.
|
||||
def TY_ENUM: i32 = 35;
|
||||
// Mirror of the C `TypeKind` enum in cmd/wcc/ww.h. Numeric values
|
||||
// are explicit and must stay in sync — the selfhost selfcheck and
|
||||
// typed-AST printers depend on matching numeric layout.
|
||||
type tykind = enum i32 {
|
||||
TY_NONE = 0,
|
||||
TY_VOID = 1,
|
||||
TY_BOOL = 2,
|
||||
TY_RUNE = 3,
|
||||
TY_I8 = 4,
|
||||
TY_I16 = 5,
|
||||
TY_I32 = 6,
|
||||
TY_I64 = 7,
|
||||
TY_U8 = 8,
|
||||
TY_U16 = 9,
|
||||
TY_U32 = 10,
|
||||
TY_U64 = 11,
|
||||
TY_UINT = 12,
|
||||
TY_INT = 13,
|
||||
TY_UINTPTR = 14,
|
||||
TY_F32 = 15,
|
||||
TY_F64 = 16,
|
||||
TY_STR = 17,
|
||||
TY_PTR = 18,
|
||||
TY_SLICE = 19,
|
||||
TY_ARRAY = 20,
|
||||
TY_STRUCT = 21,
|
||||
TY_FN = 22,
|
||||
TY_CHAN = 23,
|
||||
TY_NAMED = 24,
|
||||
TY_TUPLE = 25,
|
||||
TY_TAGGED = 26,
|
||||
TY_ERR = 27,
|
||||
TY_NEVER = 28,
|
||||
TY_UNTYPED_INT = 29,
|
||||
TY_UNTYPED_FLOAT = 30,
|
||||
TY_UNTYPED_STR = 31,
|
||||
TY_UNTYPED_RUNE = 32,
|
||||
TY_UNTYPED_BOOL = 33,
|
||||
TY_UNTYPED_NIL = 34,
|
||||
// Tail-appended values keep prior TY_* stable for the byte-diff
|
||||
// against cmd/wcc/ww.h.
|
||||
TY_ENUM = 35,
|
||||
};
|
||||
|
||||
// ---- tinfo / tfield / tparam -----------------------------------------
|
||||
|
||||
@@ -3456,36 +3460,36 @@ fn prim(a: *arena, k: i32, nm: str, sz: u64, al: u64) *tinfo = {
|
||||
|
||||
export fn typesinit(c: *tctx, a: *arena) void = {
|
||||
c.a = a;
|
||||
c.tyvoid = prim(a, TY_VOID, "void", 0u64, 1u64);
|
||||
c.tybool = prim(a, TY_BOOL, "bool", 1u64, 1u64);
|
||||
c.tyrune = prim(a, TY_RUNE, "rune", 4u64, 4u64);
|
||||
c.tyi8 = prim(a, TY_I8, "i8", 1u64, 1u64);
|
||||
c.tyi16 = prim(a, TY_I16, "i16", 2u64, 2u64);
|
||||
c.tyi32 = prim(a, TY_I32, "i32", 4u64, 4u64);
|
||||
c.tyi64 = prim(a, TY_I64, "i64", 8u64, 8u64);
|
||||
c.tyu8 = prim(a, TY_U8, "u8", 1u64, 1u64);
|
||||
c.tyu16 = prim(a, TY_U16, "u16", 2u64, 2u64);
|
||||
c.tyu32 = prim(a, TY_U32, "u32", 4u64, 4u64);
|
||||
c.tyu64 = prim(a, TY_U64, "u64", 8u64, 8u64);
|
||||
c.tyint = prim(a, TY_INT, "int", 8u64, 8u64);
|
||||
c.tyuint = prim(a, TY_UINT, "uint", 8u64, 8u64);
|
||||
c.tyuintptr= prim(a, TY_UINTPTR, "uintptr", 8u64, 8u64);
|
||||
c.tyf32 = prim(a, TY_F32, "f32", 4u64, 4u64);
|
||||
c.tyf64 = prim(a, TY_F64, "f64", 8u64, 8u64);
|
||||
c.tystr = prim(a, TY_STR, "str", 16u64, 8u64);
|
||||
c.tyerr = prim(a, TY_ERR, "<err>", 0u64, 1u64);
|
||||
c.tynever = prim(a, TY_NEVER, "never", 0u64, 1u64);
|
||||
c.tyvoid = prim(a, tykind.TY_VOID, "void", 0u64, 1u64);
|
||||
c.tybool = prim(a, tykind.TY_BOOL, "bool", 1u64, 1u64);
|
||||
c.tyrune = prim(a, tykind.TY_RUNE, "rune", 4u64, 4u64);
|
||||
c.tyi8 = prim(a, tykind.TY_I8, "i8", 1u64, 1u64);
|
||||
c.tyi16 = prim(a, tykind.TY_I16, "i16", 2u64, 2u64);
|
||||
c.tyi32 = prim(a, tykind.TY_I32, "i32", 4u64, 4u64);
|
||||
c.tyi64 = prim(a, tykind.TY_I64, "i64", 8u64, 8u64);
|
||||
c.tyu8 = prim(a, tykind.TY_U8, "u8", 1u64, 1u64);
|
||||
c.tyu16 = prim(a, tykind.TY_U16, "u16", 2u64, 2u64);
|
||||
c.tyu32 = prim(a, tykind.TY_U32, "u32", 4u64, 4u64);
|
||||
c.tyu64 = prim(a, tykind.TY_U64, "u64", 8u64, 8u64);
|
||||
c.tyint = prim(a, tykind.TY_INT, "int", 8u64, 8u64);
|
||||
c.tyuint = prim(a, tykind.TY_UINT, "uint", 8u64, 8u64);
|
||||
c.tyuintptr= prim(a, tykind.TY_UINTPTR, "uintptr", 8u64, 8u64);
|
||||
c.tyf32 = prim(a, tykind.TY_F32, "f32", 4u64, 4u64);
|
||||
c.tyf64 = prim(a, tykind.TY_F64, "f64", 8u64, 8u64);
|
||||
c.tystr = prim(a, tykind.TY_STR, "str", 16u64, 8u64);
|
||||
c.tyerr = prim(a, tykind.TY_ERR, "<err>", 0u64, 1u64);
|
||||
c.tynever = prim(a, tykind.TY_NEVER, "never", 0u64, 1u64);
|
||||
|
||||
c.tyuntypedint = prim(a, TY_UNTYPED_INT, "untyped_int", 0u64, 1u64);
|
||||
c.tyuntypedfloat = prim(a, TY_UNTYPED_FLOAT, "untyped_float", 0u64, 1u64);
|
||||
c.tyuntypedstr = prim(a, TY_UNTYPED_STR, "untyped_str", 0u64, 1u64);
|
||||
c.tyuntypedrune = prim(a, TY_UNTYPED_RUNE, "untyped_rune", 0u64, 1u64);
|
||||
c.tyuntypedbool = prim(a, TY_UNTYPED_BOOL, "untyped_bool", 0u64, 1u64);
|
||||
c.tyuntypednil = prim(a, TY_UNTYPED_NIL, "untyped_nil", 0u64, 1u64);
|
||||
c.tyuntypedint = prim(a, tykind.TY_UNTYPED_INT, "untyped_int", 0u64, 1u64);
|
||||
c.tyuntypedfloat = prim(a, tykind.TY_UNTYPED_FLOAT, "untyped_float", 0u64, 1u64);
|
||||
c.tyuntypedstr = prim(a, tykind.TY_UNTYPED_STR, "untyped_str", 0u64, 1u64);
|
||||
c.tyuntypedrune = prim(a, tykind.TY_UNTYPED_RUNE, "untyped_rune", 0u64, 1u64);
|
||||
c.tyuntypedbool = prim(a, tykind.TY_UNTYPED_BOOL, "untyped_bool", 0u64, 1u64);
|
||||
c.tyuntypednil = prim(a, tykind.TY_UNTYPED_NIL, "untyped_nil", 0u64, 1u64);
|
||||
};
|
||||
|
||||
export fn typeptr(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_PTR);
|
||||
let t: *tinfo = newtype(a, tykind.TY_PTR);
|
||||
t.sub = sub;
|
||||
t.size = 8u64;
|
||||
t.align = 8u64;
|
||||
@@ -3493,7 +3497,7 @@ export fn typeptr(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typeslice(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_SLICE);
|
||||
let t: *tinfo = newtype(a, tykind.TY_SLICE);
|
||||
t.sub = sub;
|
||||
t.size = 24u64;
|
||||
t.align = 8u64;
|
||||
@@ -3501,7 +3505,7 @@ export fn typeslice(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typearray(a: *arena, sub: *tinfo, n: u64) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_ARRAY);
|
||||
let t: *tinfo = newtype(a, tykind.TY_ARRAY);
|
||||
t.sub = sub;
|
||||
t.alen = n;
|
||||
if (sub != nil) {
|
||||
@@ -3514,7 +3518,7 @@ export fn typearray(a: *arena, sub: *tinfo, n: u64) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typechan(a: *arena, sub: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_CHAN);
|
||||
let t: *tinfo = newtype(a, tykind.TY_CHAN);
|
||||
t.sub = sub;
|
||||
t.size = 8u64;
|
||||
t.align = 8u64;
|
||||
@@ -3522,7 +3526,7 @@ export fn typechan(a: *arena, sub: *tinfo) *tinfo = {
|
||||
};
|
||||
|
||||
export fn typenamed(a: *arena, name: str, under: *tinfo) *tinfo = {
|
||||
let t: *tinfo = newtype(a, TY_NAMED);
|
||||
let t: *tinfo = newtype(a, tykind.TY_NAMED);
|
||||
t.name = name;
|
||||
t.under = under;
|
||||
if (under != nil) {
|
||||
@@ -3537,32 +3541,32 @@ export fn typenamed(a: *arena, name: str, under: *tinfo) *tinfo = {
|
||||
export fn typeisint(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_I8) { return true; };
|
||||
if (k == TY_I16) { return true; };
|
||||
if (k == TY_I32) { return true; };
|
||||
if (k == TY_I64) { return true; };
|
||||
if (k == TY_U8) { return true; };
|
||||
if (k == TY_U16) { return true; };
|
||||
if (k == TY_U32) { return true; };
|
||||
if (k == TY_U64) { return true; };
|
||||
if (k == TY_INT) { return true; };
|
||||
if (k == TY_UINT){ return true; };
|
||||
if (k == TY_UINTPTR) { return true; };
|
||||
if (k == TY_RUNE){ return true; };
|
||||
if (k == TY_UNTYPED_INT) { return true; };
|
||||
if (k == TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == TY_ENUM) { return typeisint(t.sub); };
|
||||
if (k == TY_NAMED) { return typeisint(t.under); };
|
||||
if (k == tykind.TY_I8) { return true; };
|
||||
if (k == tykind.TY_I16) { return true; };
|
||||
if (k == tykind.TY_I32) { return true; };
|
||||
if (k == tykind.TY_I64) { return true; };
|
||||
if (k == tykind.TY_U8) { return true; };
|
||||
if (k == tykind.TY_U16) { return true; };
|
||||
if (k == tykind.TY_U32) { return true; };
|
||||
if (k == tykind.TY_U64) { return true; };
|
||||
if (k == tykind.TY_INT) { return true; };
|
||||
if (k == tykind.TY_UINT){ return true; };
|
||||
if (k == tykind.TY_UINTPTR) { return true; };
|
||||
if (k == tykind.TY_RUNE){ return true; };
|
||||
if (k == tykind.TY_UNTYPED_INT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == tykind.TY_ENUM) { return typeisint(t.sub); };
|
||||
if (k == tykind.TY_NAMED) { return typeisint(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
export fn typeisfloat(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_F32) { return true; };
|
||||
if (k == TY_F64) { return true; };
|
||||
if (k == TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == TY_NAMED) { return typeisfloat(t.under); };
|
||||
if (k == tykind.TY_F32) { return true; };
|
||||
if (k == tykind.TY_F64) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == tykind.TY_NAMED) { return typeisfloat(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -3574,25 +3578,25 @@ export fn typeisnum(t: *tinfo) bool = {
|
||||
export fn typeisunsigned(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_U8) { return true; };
|
||||
if (k == TY_U16) { return true; };
|
||||
if (k == TY_U32) { return true; };
|
||||
if (k == TY_U64) { return true; };
|
||||
if (k == TY_UINT){ return true; };
|
||||
if (k == TY_UINTPTR) { return true; };
|
||||
if (k == TY_NAMED) { return typeisunsigned(t.under); };
|
||||
if (k == tykind.TY_U8) { return true; };
|
||||
if (k == tykind.TY_U16) { return true; };
|
||||
if (k == tykind.TY_U32) { return true; };
|
||||
if (k == tykind.TY_U64) { return true; };
|
||||
if (k == tykind.TY_UINT){ return true; };
|
||||
if (k == tykind.TY_UINTPTR) { return true; };
|
||||
if (k == tykind.TY_NAMED) { return typeisunsigned(t.under); };
|
||||
return false;
|
||||
};
|
||||
|
||||
export fn typeisuntyped(t: *tinfo) bool = {
|
||||
if (t == nil) { return false; };
|
||||
let k: i32 = t.kind;
|
||||
if (k == TY_UNTYPED_INT) { return true; };
|
||||
if (k == TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == TY_UNTYPED_STR) { return true; };
|
||||
if (k == TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == TY_UNTYPED_BOOL) { return true; };
|
||||
if (k == TY_UNTYPED_NIL) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_INT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_FLOAT) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_STR) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_RUNE) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_BOOL) { return true; };
|
||||
if (k == tykind.TY_UNTYPED_NIL) { return true; };
|
||||
return false;
|
||||
};
|
||||
|
||||
@@ -3603,14 +3607,14 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
if (b == nil) { return false; };
|
||||
if (a.kind != b.kind) { return false; };
|
||||
let k: i32 = a.kind;
|
||||
if (k == TY_PTR) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_SLICE) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_CHAN) { return typeeq(a.sub, b.sub); };
|
||||
if (k == TY_ARRAY) {
|
||||
if (k == tykind.TY_PTR) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_SLICE) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_CHAN) { return typeeq(a.sub, b.sub); };
|
||||
if (k == tykind.TY_ARRAY) {
|
||||
if (a.alen != b.alen) { return false; };
|
||||
return typeeq(a.sub, b.sub);
|
||||
};
|
||||
if (k == TY_FN) {
|
||||
if (k == tykind.TY_FN) {
|
||||
if (a.variadic != b.variadic) { return false; };
|
||||
if (!typeeq(a.ret, b.ret)) { return false; };
|
||||
let pa: *tparam = a.params;
|
||||
@@ -3624,7 +3628,7 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
};
|
||||
return true;
|
||||
};
|
||||
if (k == TY_STRUCT) {
|
||||
if (k == tykind.TY_STRUCT) {
|
||||
let fa: *tfield = a.fields;
|
||||
let fb: *tfield = b.fields;
|
||||
for (true) {
|
||||
@@ -3644,8 +3648,8 @@ export fn typeeq(a: *tinfo, b: *tinfo) bool = {
|
||||
};
|
||||
return true;
|
||||
};
|
||||
if (k == TY_NAMED) { return false; }; // nominal: only same ptr
|
||||
if (k == TY_TUPLE) {
|
||||
if (k == tykind.TY_NAMED) { return false; }; // nominal: only same ptr
|
||||
if (k == tykind.TY_TUPLE) {
|
||||
let pa: *tparam = a.params;
|
||||
let pb: *tparam = b.params;
|
||||
for (true) {
|
||||
|
||||
Reference in New Issue
Block a user