summaryrefslogtreecommitdiff
path: root/lib9p/idl
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-03 12:25:46 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-03 15:01:30 -0700
commitff451382aa77966565822918967f77dc9b7ea68d (patch)
tree9248547f2b626fedbf1b098dafbf01cb46b6e143 /lib9p/idl
parentcb22bee6679c593e08278a19627ed459e2d3aac5 (diff)
lib9p: idl.gen: Check for duplicate names and msg type ids
Diffstat (limited to 'lib9p/idl')
-rw-r--r--lib9p/idl/2010-9P2000.L.9p2
-rw-r--r--lib9p/idl/__init__.py18
2 files changed, 19 insertions, 1 deletions
diff --git a/lib9p/idl/2010-9P2000.L.9p b/lib9p/idl/2010-9P2000.L.9p
index 3e5db69..5a7d09c 100644
--- a/lib9p/idl/2010-9P2000.L.9p
+++ b/lib9p/idl/2010-9P2000.L.9p
@@ -101,7 +101,7 @@ msg Rgetlock = "size[4,val=end-&size] typ[1,val=55] tag[tag] type[1] start[8
msg Tlink = "size[4,val=end-&size] typ[1,val=70] tag[tag] dfid[fid] fid[fid] name[s]"
msg Rlink = "size[4,val=end-&size] typ[1,val=71] tag[tag]"
msg Tmkdir = "size[4,val=end-&size] typ[1,val=72] tag[tag] dfid[fid] name[s] mode[4] gid[nuid]"
-msg Tmkdir = "size[4,val=end-&size] typ[1,val=73] tag[tag] qid[qid]"
+msg Rmkdir = "size[4,val=end-&size] typ[1,val=73] tag[tag] qid[qid]"
msg Trenameat = "size[4,val=end-&size] typ[1,val=74] tag[tag] olddirfid[fid] oldname[s] newdirfid[fid] newname[s]"
msg Rrenameat = "size[4,val=end-&size] typ[1,val=75] tag[tag]"
msg Tunlinkat = "size[4,val=end-&size] typ[1,val=76] tag[tag] dirfd[fid] name[s] flags[4]"
diff --git a/lib9p/idl/__init__.py b/lib9p/idl/__init__.py
index 41664f1..82fa69c 100644
--- a/lib9p/idl/__init__.py
+++ b/lib9p/idl/__init__.py
@@ -468,6 +468,10 @@ def parse_file(
for member in typ.members:
if other_version in member.in_versions:
member.in_versions.add(version)
+ if typ.name in env and env[typ.name] != typ:
+ raise ValueError(
+ f"duplicate type name {repr(typ.name)}"
+ )
env[typ.name] = typ
if symname != "*" and not found:
raise ValueError(
@@ -482,6 +486,8 @@ def parse_file(
assert isinstance(prim, Primitive)
num.prim = prim
+ if num.name in env:
+ raise ValueError(f"duplicate type name {repr(num.name)}")
env[num.name] = num
prev = num
elif m := re.fullmatch(re_line_bitfield, line):
@@ -495,6 +501,8 @@ def parse_file(
bf.bits = (prim.static_size * 8) * [""]
+ if bf.name in env:
+ raise ValueError(f"duplicate type name {repr(bf.name)}")
env[bf.name] = bf
prev = bf
elif m := re.fullmatch(re_line_bitfield_, line):
@@ -511,6 +519,8 @@ def parse_file(
struct.members = []
parse_members(version, env, struct, m.group("members"))
+ if struct.name in env:
+ raise ValueError(f"duplicate type name {repr(struct.name)}")
env[struct.name] = struct
prev = struct
case "+=":
@@ -527,6 +537,8 @@ def parse_file(
msg.members = []
parse_members(version, env, msg, m.group("members"))
+ if msg.name in env:
+ raise ValueError(f"duplicate type name {repr(msg.name)}")
env[msg.name] = msg
prev = msg
case "+=":
@@ -601,4 +613,10 @@ class Parser:
raise ValueError(f"duplicate type name {repr(typ.name)}")
else:
ret_typs[typ.name] = typ
+ msgids: set[int] = set()
+ for typ in ret_typs.values():
+ if isinstance(typ, Message):
+ if typ.msgid in msgids:
+ raise ValueError(f"duplicate msgid {repr(typ.msgid)}")
+ msgids.add(typ.msgid)
return ret_versions, list(ret_typs.values())