From 6e06c4d502b60027da8542ee84b219df768e5108 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sat, 20 Oct 2018 19:09:25 +0100 Subject: [PATCH] Fix bug exposed by previous commit --- syndicate/HOWITWORKS.md | 2 +- syndicate/skeleton.rkt | 2 +- syndicate/test/core/complex-pattern.rkt | 26 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 syndicate/test/core/complex-pattern.rkt diff --git a/syndicate/HOWITWORKS.md b/syndicate/HOWITWORKS.md index ca2e788..4618ed5 100644 --- a/syndicate/HOWITWORKS.md +++ b/syndicate/HOWITWORKS.md @@ -295,7 +295,7 @@ cases where handlers are dynamically installed. classof (project v h) = class } edges[selector][class] := ((innercache, {}), {}) let node' = edges[selector][class] - let h' = update-path h n_pop 0 + let h' = update-path h 0 0 walk-edge h' node' 0 0 [s_0, ..., s_i] update-path :: H -> ๐ -> ๐ -> H diff --git a/syndicate/skeleton.rkt b/syndicate/skeleton.rkt index 19a5e14..9a0f535 100644 --- a/syndicate/skeleton.rkt +++ b/syndicate/skeleton.rkt @@ -212,7 +212,7 @@ (hash-set! filtered a #t)))) (make-empty-skeleton/cache filtered)) (define next (hash-ref! table class make-skeleton-node-with-cache)) - (walk-edge! (update-path path pop-count 0) next 0 0 pieces)] + (walk-edge! (update-path path 0 0) next 0 0 pieces)] [_ (values pop-count sk)])) (define (walk-edge! path sk pop-count index pieces) diff --git a/syndicate/test/core/complex-pattern.rkt b/syndicate/test/core/complex-pattern.rkt new file mode 100644 index 0000000..0f0edba --- /dev/null +++ b/syndicate/test/core/complex-pattern.rkt @@ -0,0 +1,26 @@ +#lang imperative-syndicate/test-implementation + +(test-case + [(message-struct b (v)) + (message-struct c (v)) + (spawn #:name 'respondent + (on (asserted ($ val (list _ (vector _) (b (c _)) (vector _) _))) + ;; ^ exercises a corner-case in `extend-skeleton!` + ;; that exposed why `(update-path path pop-count 0)` + ;; was wrong, and `(update-path path 0 0)` was right. + (send! 'ok)))] + no-crashes) + +;; +;; Trie steps: +;; +;; ยท +;; - () must be list/5 +;; pop 0, get 1 +;; - (1) must be vector/1 +;; pop 1, get 2 +;; - (2) must be b/1 +;; pop 0, get 0 +;; - (2 0) must be c/1 +;; pop 2, get 3 +;; - (3) must be vector/1