From 302e24671942051d70707586cf8c605a5815edac Mon Sep 17 00:00:00 2001 From: lemon Date: Mon, 15 Dec 2025 22:39:52 +0100 Subject: create distinct interned string type Interned strings are used pervasively, so it's a good idea to add a layer of type safety to differentiate them from general cstrs and avoid potential bugs from comparing non-interned and interned strings. Not that that's happened so far that I can remember, but it could. I'm 90% sure it's legal to alias `struct {char c;}` pointers with `char` pointers. This specific typedef gives type safety but with a simple one-way `internstr -> const char *` typecast (with `&istr->c`). Converting the other way around is more intentional: a straight up cast `(internstr)cstr` which sticks out as unchecked and probably wrong, or calling the intern(cstr) function, which is the right way. --- obj/obj.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'obj/obj.h') diff --git a/obj/obj.h b/obj/obj.h index 59769ff..77da99a 100644 --- a/obj/obj.h +++ b/obj/obj.h @@ -22,10 +22,10 @@ enum relockind { enum section { Snone, Stext, Srodata, Sdata, Sbss }; void objini(const char *infile, const char *outfile); -void objdeffunc(const char *nam, bool globl, uint off, uint siz); -enum section objhassym(const char *name, uint *off); -uint objnewdat(const char *name, enum section, bool globl, uint siz, uint align); -void objreloc(const char *sym, enum relockind, enum section, uint off, vlong addend); +void objdeffunc(internstr nam, bool globl, uint off, uint siz); +enum section objhassym(internstr name, uint *off); +uint objnewdat(internstr name, enum section, bool globl, uint siz, uint align); +void objreloc(internstr sym, enum relockind, enum section, uint off, vlong addend); void objfini(void); /* vim:set ts=3 sw=3 expandtab: */ -- cgit v1.2.3