From a5d147e2772ac4ef4b3d36f43745690c7bd8659c Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sat, 20 Oct 2018 21:42:38 +0100 Subject: [PATCH] Avoid a few gratuitous conversions during `skeleton-modify!`. --- syndicate/skeleton.rkt | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/syndicate/skeleton.rkt b/syndicate/skeleton.rkt index bf88099..95c81e9 100644 --- a/syndicate/skeleton.rkt +++ b/syndicate/skeleton.rkt @@ -259,22 +259,21 @@ (for [(edge (in-list edges))] (match-define (cons (skeleton-selector pop-count index) table) edge) (define popped-stack (drop term-stack pop-count)) - (define pieces (car popped-stack)) - (define term (vector-ref pieces (+ index 1))) ;; adjust for struct identifier at beginning + (define old-top (car popped-stack)) + (define new-top + (cond [(non-object-struct? old-top) (vector-ref (struct->vector old-top) (+ index 1))] + ;; ^ TODO: evaluate unsafe-struct-ref + [(list? old-top) (list-ref old-top index)] + [(vector? old-top) (vector-ref old-top index)])) (define entry (hash-ref table - (cond [(non-object-struct? term) (struct->struct-type term)] - [(list? term) (list-type (length term))] - [(vector? term) (vector-type (vector-length term))] + (cond [(non-object-struct? new-top) (struct->struct-type new-top)] + [(list? new-top) (list-type (length new-top))] + [(vector? new-top) (vector-type (vector-length new-top))] [else #f]) #f)) - (when entry - (define new-pieces - (cond [(non-object-struct? term) (struct->vector term)] - [(list? term) (list->vector (cons 'list term))] - [(vector? term) (list->vector (cons 'list (vector->list term)))])) - (walk-node! entry (cons new-pieces popped-stack))))) + (when entry (walk-node! entry (cons new-top popped-stack))))) - (walk-node! sk (list (vector 'list term0-term)))) + (walk-node! sk (list (list term0-term)))) (define (add-term-to-skcont! skcont term) (hash-set! (skeleton-continuation-cache skcont) term #t))