From b44d010f71962624b69b917e3509258c997ebca2 Mon Sep 17 00:00:00 2001 From: Ryan Walklin Date: Tue, 30 Sep 2025 20:42:47 +1300 Subject: [PATCH] Add support for void pointers in Opir JSON output Fixes KeyError crash when Opir outputs pointer types without "base" key. Problem: Futhark unconditionally accessed json["base"] without checking existence, causing crashes on bare pointer types from certain C headers. Fix: Add hasKey("base") guards where required before accessing json["base"]. Generate opaque `pointer` type when base is missing. --- src/futhark.nim | 52 +++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/futhark.nim b/src/futhark.nim index 78870dd..dfe5f60 100644 --- a/src/futhark.nim +++ b/src/futhark.nim @@ -265,7 +265,11 @@ proc findAlias(kind: JsonNode): string = case kind["kind"].str: of "alias": kind["value"].str of "base", "special", "vector": "" - of "pointer", "atomic": findAlias(kind["base"]) + of "pointer", "atomic": + if kind.hasKey("base"): + findAlias(kind["base"]) + else: + "" of "array": (if kind["value"].kind == JNull: "" else: findAlias(kind["value"])) of "struct", "union", "enum": (if kind.hasKey("name"): kind["name"].str else: "") of "proc": (if kind.hasKey("name"): kind["name"].str else: "") @@ -302,11 +306,12 @@ proc addUsings(used: var OrderedSet[string], node: JsonNode) = used.incl alias used.addUsings(node["type"]) of "pointer", "atomic": - let alias = node["base"].findAlias - if alias.len != 0: - used.incl alias - elif node["base"]["kind"].str == "proc": - used.addUsings(node["base"]) + if node.hasKey("base"): + let alias = node["base"].findAlias + if alias.len != 0: + used.incl alias + elif node["base"]["kind"].str == "proc": + used.addUsings(node["base"]) of "alias": used.incl node.findAlias of "enum", "base", "special", "vector": discard @@ -336,15 +341,19 @@ proc toNimType(json: JsonNode, state: var State): NimNode = of "base": json["value"].str.ident of "pointer": var node = - case json["base"]["kind"].str: - of "alias", "proc", "base": - var node = json["base"].toNimType(state) - if node.strCmp "void": - node = "pointer".ident - node + if json.hasKey("base"): + case json["base"]["kind"].str: + of "alias", "proc", "base": + var node = json["base"].toNimType(state) + if node.strCmp "void": + node = "pointer".ident + node + else: + "pointer".ident else: "pointer".ident - for i in 0..