diff --git a/racket/src/cs/expander.sls b/racket/src/cs/expander.sls index f4e773856e..45777f5f5f 100644 --- a/racket/src/cs/expander.sls +++ b/racket/src/cs/expander.sls @@ -114,18 +114,18 @@ (eval `(define primitive-table ',primitive-table)) ;; For interpretation of the outer shell of a linklet: - (install-linklet-primitive-tables! kernel-table - unsafe-table - flfxnum-table - paramz-table - extfl-table - network-table - futures-table - place-table - foreign-table - linklet-table - internal-table - schemify-table) + (install-linklet-primitive-tables! (cons '|#%kernel| kernel-table) + (cons '|#%unsafe| unsafe-table) + (cons '|#%flfxnum| flfxnum-table) + (cons '|#%paramz| paramz-table) + (cons '|#%extfl| extfl-table) + (cons '|#%network| network-table) + (cons '|#%futures| futures-table) + (cons '|#%place| place-table) + (cons '|#%foreign| foreign-table) + (cons '|#%linklet| linklet-table) + (cons 'internal internal-table) + (cons 'schemify schemify-table)) ;; ---------------------------------------- diff --git a/racket/src/cs/linklet.sls b/racket/src/cs/linklet.sls index 0711d9e6d9..99ba3ca6a4 100644 --- a/racket/src/cs/linklet.sls +++ b/racket/src/cs/linklet.sls @@ -219,11 +219,15 @@ mode (compile* e))) - (define primitives (make-hasheq)) + (define primitives (make-hasheq)) ; hash of sym -> known + (define primitive-tables '()) ; list of (cons sym hash) + + ;; Arguments are `(cons )` (define (install-linklet-primitive-tables! . tables) + (set! primitive-tables tables) (for-each (lambda (table) - (hash-for-each table (lambda (k v) (hash-set! primitives k v)))) + (hash-for-each (cdr table) (lambda (k v) (hash-set! primitives k v)))) tables) ;; prropagate table to the rumble layer (install-primitives-table! primitives)) @@ -999,7 +1003,7 @@ ;; -------------------------------------------------- (define-record variable-reference (instance ; the use-site instance - var-or-info)) ; the referenced variable, 'constant, 'mutable, #f, or 'primitive + var-or-info)) ; the referenced variable, 'constant, 'mutable, #f, or primitive name (define variable-reference->instance (case-lambda @@ -1017,13 +1021,16 @@ (if (eq? i #!bwp) (variable-reference->instance vr #t) i))] - [(eq? v 'primitive) - ;; FIXME: We don't have the right primitive instance name - ;; ... but '#%kernel is usually right. - '|#%kernel|] - [else + [(or (eq? v 'constant) (eq? v 'mutable)) ;; Local variable, so same as use-site - (variable-reference->instance vr #t)]))])) + (variable-reference->instance vr #t)] + [else + (or (#%ormap (lambda (table) + (and (hash-ref (cdr table) v #f) + (car table))) + primitive-tables) + ;; Fallback, just in case + '|#%kernel|)]))])) (define (variable-reference-constant? vr) (let ([v (variable-reference-var-or-info vr)]) diff --git a/racket/src/schemify/schemify.rkt b/racket/src/schemify/schemify.rkt index 309a74f09e..79ab819382 100644 --- a/racket/src/schemify/schemify.rkt +++ b/racket/src/schemify/schemify.rkt @@ -595,7 +595,7 @@ instance-variable-reference ',(cond [(hash-ref mutated u #f) 'mutable] - [(hash-ref prim-knowns u #f) 'primitive] + [(hash-ref prim-knowns u #f) u] ; assuming that `mutable` and `constant` are not primitives [else 'constant])))] [`(equal? ,exp1 ,exp2) (let ([exp1 (schemify exp1)]