Adding a correction that changes the strongly connected components calculation
svn: r6785
This commit is contained in:
parent
9b96dbd211
commit
4bcf7111fb
|
@ -1323,7 +1323,8 @@
|
||||||
(append (map (lambda (iface-spec) (send type-recs get-class-record iface-spec)) ifaces)
|
(append (map (lambda (iface-spec) (send type-recs get-class-record iface-spec)) ifaces)
|
||||||
iface-records))
|
iface-records))
|
||||||
(append (map (lambda (iface) (make-name (make-id (car iface) #f) (cdr iface) #f)) ifaces)
|
(append (map (lambda (iface) (make-name (make-id (car iface) #f) (cdr iface) #f)) ifaces)
|
||||||
(map (lambda (iface) (make-name iface null #f)) iface-names)))))
|
(map (lambda (iface)
|
||||||
|
(if (name? iface) iface (make-name iface null #f))) iface-names)))))
|
||||||
|
|
||||||
;get-methods-need-implementing: (list method-record) -> (list method-record)
|
;get-methods-need-implementing: (list method-record) -> (list method-record)
|
||||||
(define (get-methods-need-implementing methods)
|
(define (get-methods-need-implementing methods)
|
||||||
|
|
|
@ -338,7 +338,7 @@
|
||||||
|
|
||||||
(define (new-class expr)
|
(define (new-class expr)
|
||||||
(choose ((sequence (new name O_PAREN C_PAREN) id "class instantiation")
|
(choose ((sequence (new name O_PAREN C_PAREN) id "class instantiation")
|
||||||
(sequence (new name O_PAREN (comma-sep expr "arguments") C_PAREN) id "class instantiation"))
|
(sequence (new name O_PAREN (comma-sep expression "arguments") C_PAREN) id "class instantiation"))
|
||||||
"class instantiation"))
|
"class instantiation"))
|
||||||
|
|
||||||
(define (new-array type-name expr)
|
(define (new-array type-name expr)
|
||||||
|
@ -838,7 +838,7 @@
|
||||||
(assignment
|
(assignment
|
||||||
(choose (identifier
|
(choose (identifier
|
||||||
(sequence (expression field-access-end) id)
|
(sequence (expression field-access-end) id)
|
||||||
(sequence (expression array-access-end) id))
|
(sequence (expression (array-access-end expression)) id))
|
||||||
"asignee")
|
"asignee")
|
||||||
assignment-ops expression)
|
assignment-ops expression)
|
||||||
(sequence (expression ++) id "unary mutation")
|
(sequence (expression ++) id "unary mutation")
|
||||||
|
|
|
@ -165,7 +165,8 @@
|
||||||
(unless (null? (check-list))
|
(unless (null? (check-list))
|
||||||
(check-defs (car (check-list)) level type-recs))
|
(check-defs (car (check-list)) level type-recs))
|
||||||
(remove-from-packages ast type-recs)
|
(remove-from-packages ast type-recs)
|
||||||
(order-cus (translate-program ast type-recs)
|
(reverse (translate-program ast type-recs))
|
||||||
|
#;(order-cus (translate-program ast type-recs)
|
||||||
type-recs))
|
type-recs))
|
||||||
|
|
||||||
(define (compile-to-ast port location type-recs file? level)
|
(define (compile-to-ast port location type-recs file? level)
|
||||||
|
@ -194,7 +195,8 @@
|
||||||
(unless (null? (check-list))
|
(unless (null? (check-list))
|
||||||
(check-defs (car (check-list)) level type-recs))
|
(check-defs (car (check-list)) level type-recs))
|
||||||
(remove-from-packages ast type-recs)
|
(remove-from-packages ast type-recs)
|
||||||
(order-cus (translate-program ast type-recs) type-recs)))
|
(reverse (translate-program ast type-recs))
|
||||||
|
#;(order-cus (translate-program ast type-recs) type-recs)))
|
||||||
|
|
||||||
;compile-interactions: port location type-records level -> syntax
|
;compile-interactions: port location type-records level -> syntax
|
||||||
(define (compile-interactions port location type-recs level)
|
(define (compile-interactions port location type-recs level)
|
||||||
|
|
103
collects/profj/graph-scc.ss
Normal file
103
collects/profj/graph-scc.ss
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
(module graph-scc mzscheme
|
||||||
|
|
||||||
|
#;(require "ast.ss")
|
||||||
|
|
||||||
|
(provide get-scc)
|
||||||
|
|
||||||
|
(define (get-scc nodes get-successors for-each-node)
|
||||||
|
(letrec ([in-component (make-hash-table)]
|
||||||
|
[dpth-nums (make-hash-table)]
|
||||||
|
[root-of-node (make-hash-table)]
|
||||||
|
[counter 0]
|
||||||
|
[stack null]
|
||||||
|
[sccs null]
|
||||||
|
|
||||||
|
;node -> boolean
|
||||||
|
[visited?
|
||||||
|
(lambda (node)
|
||||||
|
(symbol? (hash-table-get in-component node #f)))]
|
||||||
|
;node -> boolean
|
||||||
|
[in-component?
|
||||||
|
(lambda (node)
|
||||||
|
(eq? 'true (hash-table-get in-component node #f)))]
|
||||||
|
|
||||||
|
;node node -> node
|
||||||
|
[min-root
|
||||||
|
(lambda (old-min new-node)
|
||||||
|
#;(printf "~a <= ~a, ~a" (hash-table-get dpth-nums old-min)
|
||||||
|
(hash-table-get dpth-nums
|
||||||
|
(hash-table-get root-of-node new-node)
|
||||||
|
(lambda () (add1 counter))) counter)
|
||||||
|
(if (<= (hash-table-get dpth-nums old-min)
|
||||||
|
(hash-table-get dpth-nums
|
||||||
|
(hash-table-get root-of-node new-node)
|
||||||
|
(add1 counter)))
|
||||||
|
old-min
|
||||||
|
new-node))]
|
||||||
|
;node -> void
|
||||||
|
[assign-depth-num
|
||||||
|
(lambda (node)
|
||||||
|
(unless (hash-table-get dpth-nums node #f)
|
||||||
|
(hash-table-put! dpth-nums node counter)
|
||||||
|
(set! counter (add1 counter))))]
|
||||||
|
|
||||||
|
[push! (lambda (v) (set! stack (cons v stack)))]
|
||||||
|
[pop! (lambda () (begin0 (car stack) (set! stack (cdr stack))))]
|
||||||
|
|
||||||
|
;visit: node -> void
|
||||||
|
[visit
|
||||||
|
(lambda (node)
|
||||||
|
#;(printf "visit of ~a~n" (def-name node))
|
||||||
|
(let ([root-v node])
|
||||||
|
(hash-table-put! root-of-node node root-v)
|
||||||
|
(hash-table-put! in-component node 'false)
|
||||||
|
(assign-depth-num node)
|
||||||
|
(push! node)
|
||||||
|
(for-each-node
|
||||||
|
(lambda (successor)
|
||||||
|
(unless (visited? successor) (visit successor))
|
||||||
|
#;(printf "finished visiting successor ~a on visit of ~a~n"
|
||||||
|
(def-name successor) (def-name node))
|
||||||
|
(unless (in-component? successor)
|
||||||
|
#;(printf "old-root-v ~a~n" (def-name root-v))
|
||||||
|
(set! root-v (min-root root-v successor))
|
||||||
|
#;(printf "new-root-v ~a~n" (def-name root-v))))
|
||||||
|
(get-successors node))
|
||||||
|
#;(printf "root-v ~a for visit of ~a~n" (def-name root-v)
|
||||||
|
(def-name node))
|
||||||
|
(hash-table-put! root-of-node node root-v)
|
||||||
|
(if (eq? root-v node)
|
||||||
|
(let loop ([w (pop!)] [scc null])
|
||||||
|
#;(printf "~a ~a ~n" w scc)
|
||||||
|
(hash-table-put! in-component w 'true)
|
||||||
|
(if (eq? w node)
|
||||||
|
(set! sccs (cons (cons w scc) sccs))
|
||||||
|
(loop (pop!) (cons w scc)))))))])
|
||||||
|
|
||||||
|
(for-each-node (lambda (node)
|
||||||
|
(set! counter 0)
|
||||||
|
(set! dpth-nums (make-hash-table))
|
||||||
|
(unless (visited? node) (visit node)))
|
||||||
|
nodes)
|
||||||
|
|
||||||
|
#;(printf "sccs: ~a~n" (map (lambda (scc)
|
||||||
|
(map def-name scc)) sccs))
|
||||||
|
sccs))
|
||||||
|
|
||||||
|
#;(define-struct node (name points-to)(make-inspector))
|
||||||
|
#;(define node-list
|
||||||
|
(list (make-node 'a '(b e))
|
||||||
|
(make-node 'b '(c))
|
||||||
|
(make-node 'c '(a d))
|
||||||
|
(make-node 'd '(b))
|
||||||
|
(make-node 'e '(f))
|
||||||
|
(make-node 'f '(e))))
|
||||||
|
#;(define (get-successors node)
|
||||||
|
(map (lambda (n)
|
||||||
|
(let loop ([nl node-list])
|
||||||
|
(if (eq? n (node-name (car nl)))
|
||||||
|
(car nl)
|
||||||
|
(loop (cdr nl)))))
|
||||||
|
(node-points-to node)))
|
||||||
|
|
||||||
|
)
|
|
@ -5,6 +5,7 @@
|
||||||
(define (getter match-pattern replace-pattern)
|
(define (getter match-pattern replace-pattern)
|
||||||
(lambda (name)
|
(lambda (name)
|
||||||
(cond
|
(cond
|
||||||
|
[(symbol? name) name]
|
||||||
[(regexp-match match-pattern name) (regexp-replace replace-pattern name "")]
|
[(regexp-match match-pattern name) (regexp-replace replace-pattern name "")]
|
||||||
[else name])))
|
[else name])))
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
(require "ast.ss"
|
(require "ast.ss"
|
||||||
"types.ss"
|
"types.ss"
|
||||||
"name-utils.scm"
|
"name-utils.scm"
|
||||||
|
"graph-scc.ss"
|
||||||
"parameters.ss"
|
"parameters.ss"
|
||||||
(lib "class.ss")
|
(lib "class.ss")
|
||||||
(lib "list.ss")
|
(lib "list.ss")
|
||||||
|
@ -250,7 +251,8 @@
|
||||||
(lambda (def)
|
(lambda (def)
|
||||||
(filter (lambda (x) x) (map find (def-uses def)))))
|
(filter (lambda (x) x) (map find (def-uses def)))))
|
||||||
)
|
)
|
||||||
(get-strongly-connected-components defs for-each-def get-requires)))
|
(get-scc defs get-requires for-each)
|
||||||
|
#;(get-strongly-connected-components defs for-each-def get-requires)))
|
||||||
|
|
||||||
;get-strongly-connected-components: GRAPH (GRAPH (NODE -> void) -> void) (NODE -> (list NODE)) -> (list (list NODE))
|
;get-strongly-connected-components: GRAPH (GRAPH (NODE -> void) -> void) (NODE -> (list NODE)) -> (list (list NODE))
|
||||||
(define (get-strongly-connected-components graph for-each-node get-connected-nodes)
|
(define (get-strongly-connected-components graph for-each-node get-connected-nodes)
|
||||||
|
@ -265,8 +267,7 @@
|
||||||
(in-current-cycle?
|
(in-current-cycle?
|
||||||
(lambda (n) (hash-table-get current-cycle n (lambda () #f))))
|
(lambda (n) (hash-table-get current-cycle n (lambda () #f))))
|
||||||
(current-cycle-memq
|
(current-cycle-memq
|
||||||
(lambda (nodes)
|
(lambda (nodes) (ormap in-current-cycle? nodes)))
|
||||||
(ormap in-current-cycle? nodes)))
|
|
||||||
(add-to-current-cycle
|
(add-to-current-cycle
|
||||||
(lambda (n)
|
(lambda (n)
|
||||||
(set! cur-cycle-length (add1 cur-cycle-length))
|
(set! cur-cycle-length (add1 cur-cycle-length))
|
||||||
|
@ -274,10 +275,15 @@
|
||||||
(retrieve-current-cycle
|
(retrieve-current-cycle
|
||||||
(lambda () (hash-table-map current-cycle (lambda (key v) key))))
|
(lambda () (hash-table-map current-cycle (lambda (key v) key))))
|
||||||
|
|
||||||
|
;; componetize : NODE (list NODE) bool -> void
|
||||||
(componentize
|
(componentize
|
||||||
(lambda (node successors member?)
|
(lambda (node successors member?)
|
||||||
(unless (already-in-cycle? node)
|
(unless (already-in-cycle? node)
|
||||||
;(printf "componentize ~a ~a ~a~n" node successors member?)
|
(printf "componentize ~a ~a ~a~n"
|
||||||
|
(id-string (def-name node))
|
||||||
|
(map id-string (map def-name successors))
|
||||||
|
(map id-string (map def-name (retrieve-current-cycle)))
|
||||||
|
)
|
||||||
(let ((added? #f)
|
(let ((added? #f)
|
||||||
(cur-length cur-cycle-length)
|
(cur-length cur-cycle-length)
|
||||||
(old-mark (hash-table-get marks node)))
|
(old-mark (hash-table-get marks node)))
|
||||||
|
@ -291,7 +297,10 @@
|
||||||
(eq? 'in-progress (hash-table-get marks successor)))
|
(eq? 'in-progress (hash-table-get marks successor)))
|
||||||
(componentize successor (get-connected-nodes successor) #f)))
|
(componentize successor (get-connected-nodes successor) #f)))
|
||||||
successors)
|
successors)
|
||||||
;(printf "finished successors for ~a~n" node)
|
(printf "finished successors for ~a~n" (id-string (def-name node)))
|
||||||
|
(when (not (= cur-length cur-cycle-length))
|
||||||
|
(add-to-current-cycle node))
|
||||||
|
|
||||||
(if (or added? (= cur-length cur-cycle-length))
|
(if (or added? (= cur-length cur-cycle-length))
|
||||||
(hash-table-put! marks node old-mark)
|
(hash-table-put! marks node old-mark)
|
||||||
(componentize node successors #f)))))))
|
(componentize node successors #f)))))))
|
||||||
|
@ -300,14 +309,21 @@
|
||||||
|
|
||||||
(for-each-node graph
|
(for-each-node graph
|
||||||
(lambda (node)
|
(lambda (node)
|
||||||
;(hash-table-for-each marks (lambda (key val) (printf "~a -> ~a~n" (eq-hash-code key) val)))
|
#;(hash-table-for-each
|
||||||
;(printf "Working on ~a~n~n" (eq-hash-code node))
|
marks
|
||||||
|
(lambda (key val) (printf "~a -> ~a~n" (eq-hash-code key) val)))
|
||||||
|
#;(printf "Working on ~a~n~n" (eq-hash-code node))
|
||||||
|
#;(printf "node: ~a successors: ~a" (def-name node) (map def-name (get-connected-nodes node)))
|
||||||
(when (eq? (hash-table-get marks node) 'no-info)
|
(when (eq? (hash-table-get marks node) 'no-info)
|
||||||
(set! current-cycle (make-hash-table))
|
(set! current-cycle (make-hash-table))
|
||||||
(add-to-current-cycle node)
|
(add-to-current-cycle node)
|
||||||
|
(set! cur-cycle-length 0)
|
||||||
|
(printf "calling componetice ~a~n" (id-string (def-name node)))
|
||||||
(for-each (lambda (node) (componentize node (get-connected-nodes node) #f))
|
(for-each (lambda (node) (componentize node (get-connected-nodes node) #f))
|
||||||
(get-connected-nodes node))
|
(get-connected-nodes node))
|
||||||
(set! strongly-connecteds (cons (retrieve-current-cycle) strongly-connecteds))
|
(set! strongly-connecteds
|
||||||
|
(cons (retrieve-current-cycle) strongly-connecteds))
|
||||||
|
(printf "~a~n~n" (map id-string (map def-name (car strongly-connecteds))))
|
||||||
(hash-table-for-each
|
(hash-table-for-each
|
||||||
current-cycle
|
current-cycle
|
||||||
(lambda (n v) (hash-table-put! marks n 'in-a-cycle))))))
|
(lambda (n v) (hash-table-put! marks n 'in-a-cycle))))))
|
||||||
|
|
|
@ -635,6 +635,7 @@
|
||||||
(examples (if (testcase-ext?)
|
(examples (if (testcase-ext?)
|
||||||
(list (send execute-types get-test-classes) null)
|
(list (send execute-types get-test-classes) null)
|
||||||
(find-examples compilation-units))))
|
(find-examples compilation-units))))
|
||||||
|
(printf "ProfJ compilation complete~n")
|
||||||
(let ((name-to-require #f)
|
(let ((name-to-require #f)
|
||||||
(tests-run? #f))
|
(tests-run? #f))
|
||||||
(let loop ((mods (order compilation-units))
|
(let loop ((mods (order compilation-units))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user