Skip to content

Commit

Permalink
freeze with mutable keys should be determinsic help address #1535
Browse files Browse the repository at this point in the history
  • Loading branch information
bakpakin committed Dec 20, 2024
1 parent 611b2a6 commit 682f0f5
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
20 changes: 12 additions & 8 deletions src/boot/boot.janet
Original file line number Diff line number Diff line change
Expand Up @@ -2224,14 +2224,18 @@
child values also immutable. Closures, fibers, and abstract types
will not be recursively frozen, but all other types will.`
[x]
(case (type x)
:array (tuple/slice (map freeze x))
:tuple (tuple/slice (map freeze x))
:table (if-let [p (table/getproto x)]
(freeze (merge (table/clone p) x))
(struct ;(map freeze (kvs x))))
:struct (struct ;(map freeze (kvs x)))
:buffer (string x)
(def tx (type x))
(cond
(or (= tx :array) (= tx :tuple))
(tuple/slice (map freeze x))

(or (= tx :table) (= tx :struct))
(let [sorted-kvs (array/join @[] ;(sort (map freeze (pairs x))))]
(struct/with-proto (freeze (getproto x)) ;sorted-kvs))

(= tx :buffer)
(string x)

x))

(defn thaw
Expand Down
11 changes: 9 additions & 2 deletions test/suite-boot.janet
Original file line number Diff line number Diff line change
Expand Up @@ -896,11 +896,18 @@
(struct/with-proto {:a [1 2 3]} :c 22 :b [1 2 3 4] :d "test" :e "test2"))
(table/setproto table-to-freeze @{:a @[1 2 3]})

(assert (deep= {:a [1 2 3] :b [1 2 3 4] :c 22 :d "test" :e "test2"}
(freeze table-to-freeze)))
(assert (deep= struct-to-thaw (freeze table-to-freeze)))
(assert (deep= table-to-freeze-with-inline-proto (thaw table-to-freeze)))
(assert (deep= table-to-freeze-with-inline-proto (thaw struct-to-thaw)))

# Check that freezing mutable keys is deterministic
# for issue #1535
(def hashes @{})
(repeat 200
(def x (freeze {@"" 1 @"" 2 @"" 3 @"" 4 @"" 5}))
(put hashes (hash x) true))
(assert (= 1 (length hashes)) "freeze mutable keys is deterministic")

# Make sure Carriage Returns don't end up in doc strings
# e528b86
(assert (not (string/find "\r"
Expand Down

0 comments on commit 682f0f5

Please sign in to comment.