cs: fix procedure names in startup code
Commit 7d725ab48b
interferred with the way that procedure names are
recorded for the code that is built into the Racket executable.
This commit is contained in:
parent
0c4fbda8ba
commit
e72f954e85
|
@ -13,6 +13,8 @@
|
|||
(test #f object-name 'hello)
|
||||
(test #f object-name "hi")
|
||||
|
||||
(test 'eval object-name eval)
|
||||
|
||||
(define (src-name? s)
|
||||
(and (symbol? s)
|
||||
(regexp-match ":[0-9]+.[0-9]+$" (symbol->string s))
|
||||
|
|
|
@ -99,6 +99,45 @@
|
|||
(unless for-cify?
|
||||
(lift l))
|
||||
|
||||
;; Startup code as an S-expression uses the pattern
|
||||
;; (lambda <formals> (begin '<id> <expr>))
|
||||
;; or
|
||||
;; (case-lambda [<formals> (begin '<id> <expr>)] <clause> ...)
|
||||
;; to record a name for a function. Detect that pattern and
|
||||
;; convert back to an 'inferred-name property. We rely on the fact
|
||||
;; that the names `lambda`, `case-lambda`, and `quote` are
|
||||
;; never shadowed, so we don't have to parse expression forms
|
||||
;; in general.
|
||||
(define (recognize-inferred-names e)
|
||||
(cond
|
||||
[(not (pair? e)) e]
|
||||
[else
|
||||
(define (begin-name e)
|
||||
(and (pair? e)
|
||||
(eq? (car e) 'begin)
|
||||
(pair? (cdr e))
|
||||
(pair? (cddr e))
|
||||
(pair? (cadr e))
|
||||
(eq? 'quote (caadr e))
|
||||
(cadadr e)))
|
||||
(case (car e)
|
||||
[(quote) e]
|
||||
[(lambda)
|
||||
(define new-e (map recognize-inferred-names e))
|
||||
(define name (begin-name (caddr e)))
|
||||
(if name
|
||||
(wrap-property-set new-e 'inferred-name name)
|
||||
new-e)]
|
||||
[(case-lambda)
|
||||
(define new-e (map recognize-inferred-names e))
|
||||
(define name (and (pair? (cdr e))
|
||||
(begin-name (cadadr e))))
|
||||
(if name
|
||||
(wrap-property-set new-e 'inferred-name name)
|
||||
new-e)]
|
||||
[else (cons (recognize-inferred-names (car e))
|
||||
(recognize-inferred-names (cdr e)))])]))
|
||||
|
||||
(define prim-knowns
|
||||
(let ([knowns (hasheq)])
|
||||
(define-syntax-rule (define-primitive-table id [prim known] ...)
|
||||
|
@ -142,7 +181,7 @@
|
|||
(begin
|
||||
(printf "Serializable...\n")
|
||||
(time (convert-for-serialize l for-cify?)))
|
||||
(values l null)))
|
||||
(values (recognize-inferred-names l) null)))
|
||||
(printf "Schemify...\n")
|
||||
(define body
|
||||
(time
|
||||
|
@ -219,15 +258,7 @@
|
|||
|
||||
;; ----------------------------------------
|
||||
|
||||
;; Startup code as an S-expression uses the pattern
|
||||
;; (lambda <formals> (begin '<id> <expr>))
|
||||
;; or
|
||||
;; (case-lambda [<formals> (begin '<id> <expr>)] <clause> ...)
|
||||
;; to record a name for a function. Detect that pattern and
|
||||
;; create a `#%name` form. We rely on the fact
|
||||
;; that the names `lambda`, `case-lambda`, and `quote` are
|
||||
;; never shadowed, so we don't have to parse expression forms
|
||||
;; in general.
|
||||
;; Convert 'inferred-name properties to `#%name` forms
|
||||
(define (rename-functions e)
|
||||
(cond
|
||||
[(wrap? e)
|
||||
|
@ -238,32 +269,8 @@
|
|||
[else
|
||||
(rename-functions (unwrap e))])]
|
||||
[(not (pair? e)) e]
|
||||
[else
|
||||
(define (begin-name e)
|
||||
(and (pair? e)
|
||||
(eq? (car e) 'begin)
|
||||
(pair? (cdr e))
|
||||
(pair? (cddr e))
|
||||
(pair? (cadr e))
|
||||
(eq? 'quote (caadr e))
|
||||
(cadadr e)))
|
||||
(case (car e)
|
||||
[(quote) e]
|
||||
[(lambda)
|
||||
(define new-e (map rename-functions e))
|
||||
(define name (begin-name (caddr e)))
|
||||
(if name
|
||||
`(#%name ,name ,new-e)
|
||||
new-e)]
|
||||
[(case-lambda)
|
||||
(define new-e (map rename-functions e))
|
||||
(define name (and (pair? (cdr e))
|
||||
(begin-name (cadadr e))))
|
||||
(if name
|
||||
`(#%name ,name ,new-e)
|
||||
new-e)]
|
||||
[else (cons (rename-functions (car e))
|
||||
(rename-functions (cdr e)))])]))
|
||||
[else (cons (rename-functions (car e))
|
||||
(rename-functions (cdr e)))]))
|
||||
|
||||
;; ----------------------------------------
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user