From c30073c3f9db2a50d543b1450342ad4ed8bfcdf2 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 29 Oct 2023 19:27:29 +0100 Subject: [PATCH] Repair errors surfaced by the new tests --- implementations/python/preserves/text.py | 10 +++++++++- implementations/python/preserves/values.py | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/implementations/python/preserves/text.py b/implementations/python/preserves/text.py index 3e423dd..6caf9a4 100644 --- a/implementations/python/preserves/text.py +++ b/implementations/python/preserves/text.py @@ -282,6 +282,14 @@ class Parser(TextCodec): return tuple(vs) vs.append(self.next()) + def read_set(self): + items = self.upto('}') + s = set() + for i in items: + if i in s: raise DecodeError('Duplicate value in set: ' + repr(i)) + s.add(i) + return frozenset(s) + def read_dictionary(self): acc = [] while True: @@ -344,7 +352,7 @@ class Parser(TextCodec): c = self.nextchar() if c == 'f': return self.wrap(False) if c == 't': return self.wrap(True) - if c == '{': return self.wrap(frozenset(self.upto('}'))) + if c == '{': return self.wrap(self.read_set()) if c == '"': return self.wrap(self.read_literal_binary()) if c == 'x': c = self.nextchar() diff --git a/implementations/python/preserves/values.py b/implementations/python/preserves/values.py index 97c6bf1..4d8911d 100644 --- a/implementations/python/preserves/values.py +++ b/implementations/python/preserves/values.py @@ -509,6 +509,8 @@ class ImmutableDict(dict): v = next(i) except StopIteration: raise DecodeError("Missing dictionary value") + if k in result: + raise DecodeError("Duplicate key: " + repr(k)) result_proxy.__setitem__(k, v) except StopIteration: pass