From 8c2c9f6e2183c0617bc4a29de88f59077f6ac9c2 Mon Sep 17 00:00:00 2001 From: Engin Kayraklioglu Date: Tue, 4 Feb 2025 16:31:20 -0800 Subject: [PATCH] Workaround an issue preventing users to catch errors from Signed-off-by: Engin Kayraklioglu --- modules/standard/JSON.chpl | 7 ++++++- .../jsonHelpers/fromJsonThrows.chpl | 20 +++++++++++++++++++ .../jsonHelpers/fromJsonThrows.cleanfiles | 1 + .../jsonHelpers/fromJsonThrows.good | 1 + .../jsonHelpers/fromJsonThrows.preexec | 3 +++ 5 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test/io/serializers/jsonHelpers/fromJsonThrows.chpl create mode 100644 test/io/serializers/jsonHelpers/fromJsonThrows.cleanfiles create mode 100644 test/io/serializers/jsonHelpers/fromJsonThrows.good create mode 100755 test/io/serializers/jsonHelpers/fromJsonThrows.preexec diff --git a/modules/standard/JSON.chpl b/modules/standard/JSON.chpl index 9e2a1d1c3ea3..7d2705939308 100644 --- a/modules/standard/JSON.chpl +++ b/modules/standard/JSON.chpl @@ -1185,7 +1185,12 @@ module JSON { proc fromJson(jsonString: string, type loadAs): loadAs throws { var fileReader = openStringReader(jsonString, deserializer=new jsonDeserializer()); - return fileReader.read(loadAs); + // we want `return fileReader.read(loadAs)`. But that ends up using a + // non-throwing compiler-generated initializer. That prevents the user to + // catch errors that are due to malformed jsonString. + var ret: loadAs; + fileReader.read(ret); + return ret; } /* Given a Chapel value, serialize it into a JSON string using the diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.chpl b/test/io/serializers/jsonHelpers/fromJsonThrows.chpl new file mode 100644 index 000000000000..d4c9551c7c17 --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.chpl @@ -0,0 +1,20 @@ +import IO, JSON; + +record myRec { + var field: int; +} + +var inFile = IO.open("fromJsonThrows.in", IO.ioMode.r); +var inReader = inFile.reader(); + +var rec: myRec; + +proc main() throws { + try { + rec = JSON.fromJson(inReader.readAll(string), myRec); + writeln(rec); + } + catch err: IllegalArgumentError { + writeln("Caught the error correctly"); + } +} diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.cleanfiles b/test/io/serializers/jsonHelpers/fromJsonThrows.cleanfiles new file mode 100644 index 000000000000..6fe0a2a75c1e --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.cleanfiles @@ -0,0 +1 @@ +fromJsonThrows.in diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.good b/test/io/serializers/jsonHelpers/fromJsonThrows.good new file mode 100644 index 000000000000..c32344df3cbb --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.good @@ -0,0 +1 @@ +Caught the error correctly diff --git a/test/io/serializers/jsonHelpers/fromJsonThrows.preexec b/test/io/serializers/jsonHelpers/fromJsonThrows.preexec new file mode 100755 index 000000000000..54898d467cc3 --- /dev/null +++ b/test/io/serializers/jsonHelpers/fromJsonThrows.preexec @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "{\"fiel\":10}" > fromJsonThrows.in