Skip to content

Commit 4545fd2

Browse files
committed
speed up resolve-scopes lowering pass
Use a table to avoid each symbol lookup being O(n) in the scope nesting depth.
1 parent 6202475 commit 4545fd2

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

src/julia-syntax.scm

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2851,9 +2851,27 @@
28512851
(or (valid-name? e)
28522852
(error (string "invalid identifier name \"" e "\""))))
28532853

2854+
(define (push-var! tab var val) (put! tab var (cons val (get tab var #f))))
2855+
(define (pop-var! tab var) (put! tab var (cdr (get tab var))))
2856+
28542857
(define (make-scope (lam #f) (args '()) (locals '()) (globals '()) (sp '()) (renames '()) (prev #f)
28552858
(soft? #f) (hard? #f) (implicit-globals '()) (warn-vars #f))
2856-
(vector lam args locals globals sp renames prev soft? hard? implicit-globals warn-vars))
2859+
(let ((tab (if prev (scope:table prev) (table))))
2860+
(for-each (lambda (v) (push-var! tab v v)) sp)
2861+
(for-each (lambda (v) (push-var! tab v v)) locals)
2862+
(for-each (lambda (pair) (push-var! tab (car pair) (cdr pair))) renames)
2863+
(for-each (lambda (v) (push-var! tab v `(outerref ,v))) globals)
2864+
(for-each (lambda (v) (push-var! tab v v)) args)
2865+
(vector lam args locals globals sp renames prev soft? hard? implicit-globals warn-vars tab)))
2866+
2867+
(define (pop-scope! scope)
2868+
(let ((tab (scope:table scope)))
2869+
(for-each (lambda (v) (pop-var! tab v)) (scope:sp scope))
2870+
(for-each (lambda (v) (pop-var! tab v)) (scope:locals scope))
2871+
(for-each (lambda (pair) (pop-var! tab (car pair))) (scope:renames scope))
2872+
(for-each (lambda (v) (pop-var! tab v)) (scope:globals scope))
2873+
(for-each (lambda (v) (pop-var! tab v)) (scope:args scope))))
2874+
28572875
(define (scope:lam s) (aref s 0))
28582876
(define (scope:args s) (aref s 1))
28592877
(define (scope:locals s) (aref s 2))
@@ -2865,6 +2883,7 @@
28652883
(define (scope:hard? s) (aref s 8))
28662884
(define (scope:implicit-globals s) (aref s 9))
28672885
(define (scope:warn-vars s) (aref s 10))
2886+
(define (scope:table s) (aref s 11))
28682887

28692888
(define (var-kind var scope (exclude-top-level-globals #f))
28702889
(if scope
@@ -2902,20 +2921,10 @@
29022921
;; returns lambdas in the form (lambda (args...) (locals...) body)
29032922
(define (resolve-scopes- e scope (sp '()) (loc #f))
29042923
(cond ((symbol? e)
2905-
(let lookup ((scope scope))
2906-
(if scope
2907-
(cond ((memq e (scope:args scope)) e)
2908-
((memq e (scope:globals scope)) `(outerref ,e))
2909-
(else
2910-
(let ((r (assq e (scope:renames scope))))
2911-
(cond (r (cdr r))
2912-
((memq e (scope:locals scope)) e)
2913-
((memq e (scope:sp scope)) e)
2914-
(else
2915-
(lookup (scope:prev scope)))))))
2916-
(if (underscore-symbol? e)
2917-
e
2918-
`(outerref ,e)))))
2924+
(let ((val (and scope (get (scope:table scope) e #f))))
2925+
(cond (val (car val))
2926+
((underscore-symbol? e) e)
2927+
(else `(outerref ,e)))))
29192928
((or (not (pair? e)) (quoted? e) (memq (car e) '(toplevel symbolicgoto symboliclabel toplevel-only)))
29202929
e)
29212930
((eq? (car e) 'global)
@@ -2953,7 +2962,9 @@
29532962
'(true)))
29542963
((eq? (car e) 'lambda)
29552964
(let* ((args (lam:argnames e))
2956-
(body (resolve-scopes- (lam:body e) (make-scope e args '() '() sp '() scope))))
2965+
(new-scope (make-scope e args '() '() sp '() scope))
2966+
(body (resolve-scopes- (lam:body e) new-scope)))
2967+
(pop-scope! new-scope)
29572968
`(lambda ,(cadr e) ,(caddr e) ,body)))
29582969
((eq? (car e) 'scope-block)
29592970
(let* ((blok (cadr e)) ;; body of scope-block expression
@@ -3034,8 +3045,7 @@
30343045
(append (caddr lam) newnames newnames-def)))
30353046
(insert-after-meta ;; return the new, expanded scope-block
30363047
(blockify
3037-
(resolve-scopes- blok
3038-
(make-scope lam
3048+
(let ((new-scope (make-scope lam
30393049
'()
30403050
(append locals-nondef locals-def)
30413051
globals
@@ -3048,9 +3058,10 @@
30483058
(if toplevel?
30493059
implicit-globals
30503060
(scope:implicit-globals scope))
3051-
warn-vars)
3052-
'()
3053-
loc))
3061+
warn-vars)))
3062+
(begin0
3063+
(resolve-scopes- blok new-scope '() loc)
3064+
(pop-scope! new-scope))))
30543065
(append! (map (lambda (v) `(local ,v)) newnames)
30553066
(map (lambda (v) `(local-def ,v)) newnames-def)))
30563067
))

0 commit comments

Comments
 (0)