ww: cgen trap batch (def-str field, chained-ptr write, scalar+str tuple ABI)
This commit is contained in:
@@ -599,6 +599,23 @@ fn structlookup(c: *cgen, name: str) *structinfo = {
|
||||
|
||||
// primsize — size in bytes of a primitive type name (or 0 if not
|
||||
// recognised as a primitive — the caller falls back to other paths).
|
||||
// fldnumidx — parse a tuple field name like "0" / "1" / "12" into an
|
||||
// index, or -1 if not all-digits. Used by cgdot to dispatch
|
||||
// `t.0` / `t.1` against an N_TTUPLE local without pulling in strconv.
|
||||
fn fldnumidx(s: str) i32 = {
|
||||
if (s.len == 0) { return -1; };
|
||||
let r: i32 = 0;
|
||||
let i: i32 = 0;
|
||||
for (i < s.len) {
|
||||
let b: u8 = s[i];
|
||||
if (b < 48u8) { return -1; };
|
||||
if (b > 57u8) { return -1; };
|
||||
r = r * 10 + ((b - 48u8): i32);
|
||||
i += 1;
|
||||
};
|
||||
return r;
|
||||
};
|
||||
|
||||
fn primsize(name: str) i32 = {
|
||||
if (streq(name, "u8")) { return 1; };
|
||||
if (streq(name, "i8")) { return 1; };
|
||||
@@ -672,7 +689,19 @@ fn slotsize(c: *cgen, typn: *node) i32 = {
|
||||
if (k == N_TFN) { return 8; };
|
||||
if (k == N_TCHAN) { return 8; };
|
||||
if (k == N_TSLICE) { return 24; };
|
||||
if (k == N_TTUPLE) { return 16; };
|
||||
if (k == N_TTUPLE) {
|
||||
// Sum element sizes. Mirrors C cgen which uses raw type
|
||||
// sizes; padding to 8 happens inside slotsize for primitives,
|
||||
// so a `(i64, str)` resolves to 8 + 16 = 24 (matches the C
|
||||
// cgen 24B init / positional-access layout).
|
||||
let total: i32 = 0;
|
||||
let p: *node = typn.list;
|
||||
for (p != nil) {
|
||||
total += slotsize(c, p);
|
||||
p = p.next;
|
||||
};
|
||||
return total;
|
||||
};
|
||||
if (k == N_TTAGGED){ return 24; };
|
||||
if (k == N_TNAME) {
|
||||
let nm: str = typn.str;
|
||||
|
||||
Reference in New Issue
Block a user