wcc/cgen: handle def-str field access (.ptr/.len) on Sdef ident
This commit is contained in:
@@ -553,6 +553,7 @@ fn fnretlookup(c: *cgen, name: str) *node = {
|
||||
|
||||
type defent = struct {
|
||||
dname: str,
|
||||
drhs: *node,
|
||||
dnext: *defent,
|
||||
};
|
||||
|
||||
@@ -563,6 +564,7 @@ fn collectdefs(c: *cgen, file: *node) void = {
|
||||
if (d.kind == N_DEF) {
|
||||
let e: *defent = amalloc(c.a, 32u64): *defent;
|
||||
e.dname = d.str;
|
||||
e.drhs = d.rhs;
|
||||
e.dnext = c.defs;
|
||||
c.defs = e;
|
||||
};
|
||||
@@ -580,6 +582,19 @@ fn deflookup(c: *cgen, name: str) bool = {
|
||||
return false;
|
||||
};
|
||||
|
||||
// Returns the rhs init node for a top-level `def`, or nil if `name`
|
||||
// doesn't name a def. Used by cgdot to inline `.ptr`/`.len` on
|
||||
// `def NAME: str = "..."` — those aren't laid out in memory.
|
||||
fn deflookuprhs(c: *cgen, name: str) *node = {
|
||||
let e: *defent = c.defs;
|
||||
for (e != nil) {
|
||||
let dn: str = e.dname;
|
||||
if (streq(dn, name)) { return e.drhs; };
|
||||
e = e.dnext;
|
||||
};
|
||||
return nil;
|
||||
};
|
||||
|
||||
// ---- module-private symbol map --------------------------------------
|
||||
//
|
||||
// Non-exported top-level decls live in their originating module's
|
||||
|
||||
Reference in New Issue
Block a user