ww: add Hare-style is/as postfix ops on tagged unions
`e is T` returns bool (variant tag == T's index); `e as T` unwraps to T or exit(1) on mismatch. Postfix, same precedence as `:` cast. TK_IS / N_TYPETEST / N_TYPEASSERT appended at the tail of their enums so every prior numeric value stays unchanged — the 990_selfhost wwdump-diff stays byte-clean. Cgen mirrors the match-case slot-based load (tag at +0, value at +8/+16), so an N_IDENT tagged-union local works just like a match scrutinee. Selfhost cgen inlines the slot resolution because the wwstage cgen drops sign bits on `*i32` output parameters in this position. Renames `errors.is` -> `errors.equal` (the only naming collision; the existing comment already noted it shared shape with strings.equal/bytes.equal).
This commit is contained in:
13
cmd/wcc/ww.h
13
cmd/wcc/ww.h
@@ -111,7 +111,7 @@ typedef enum {
|
||||
TK_NIL,
|
||||
TK_TRUE,
|
||||
TK_FALSE,
|
||||
TK_AS, /* reserved for future cast spelling, not active */
|
||||
TK_AS, /* Hare-style type assertion: e as T */
|
||||
TK_STATIC, /* Hare-style storage-class qualifier */
|
||||
TK_MATCH, /* match expression head */
|
||||
TK_CONST, /* const binding */
|
||||
@@ -172,6 +172,11 @@ typedef enum {
|
||||
TK_ARROW, /* -> (reserved) */
|
||||
TK_FATARROW, /* => (match arms) */
|
||||
|
||||
/* Appended after TK_FATARROW (not grouped with the keyword block)
|
||||
* to keep the numeric value of every existing kind unchanged —
|
||||
* the selfhost wwdump-diff test (990) is byte-sensitive. */
|
||||
TK_IS, /* Hare-style type test: e is T */
|
||||
|
||||
TK_LAST /* sentinel for tables */
|
||||
} Tkind;
|
||||
|
||||
@@ -284,6 +289,12 @@ typedef enum {
|
||||
N_MLET, /* let a, b = expr; list = N_LET stubs (str, lhs=type), rhs = expr */
|
||||
N_MASSIGN, /* a, b = expr; list = lvalue exprs, rhs = expr */
|
||||
|
||||
/* Appended after N_MASSIGN — keeps the numeric value of every
|
||||
* existing kind unchanged, so the selfhost AST dump still diffs
|
||||
* byte-for-byte. lhs=value, rhs=variant type expr. */
|
||||
N_TYPETEST, /* lhs is T → bool */
|
||||
N_TYPEASSERT, /* lhs as T → T (abort if tag mismatch) */
|
||||
|
||||
N_LAST
|
||||
} Nkind;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user