diff options
author | Andy Wingo <wingo@pobox.com> | 2009-01-30 11:41:02 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-01-30 11:41:02 +0100 |
commit | 5d6fb8bbeb5a6ab423062da3744ca215b0310dc2 (patch) | |
tree | 128189158c6fab48f2e2595129b0c4fc67484496 | |
parent | 4b3184828416acfa5c099a54954ca00ce3cc0d0d (diff) | |
download | guile-5d6fb8bbeb5a6ab423062da3744ca215b0310dc2.tar.gz |
allow specification of languages by name; add decompilers to languages
* module/system/base/language.scm (lookup-decompilation-order): New
function, like its compiling cousin, but backwards.
(compute-translation-order): Rework so that languages can be specified
either by name or by identity. Return a list of language - procedure
pairs, without the "to" language in the list, instead of a list of
languages.
(invalidate-compilation-cache!): Invalidate the decompilation cache
too.
(<language>): Add a decompiler field.
* module/system/base/compile.scm (compile-passes): Much simpler now that
lookup-compilation-order gives us the procedures directly.
* module/language/*/spec.scm: Specify compilers by name, so that we can
avoid unnecessary module loads, and so that when we specify
decompilers, we can avoid cycles.
-rw-r--r-- | module/language/assembly/spec.scm | 3 | ||||
-rw-r--r-- | module/language/bytecode/spec.scm | 3 | ||||
-rw-r--r-- | module/language/ghil/spec.scm | 3 | ||||
-rw-r--r-- | module/language/glil/spec.scm | 3 | ||||
-rw-r--r-- | module/language/objcode/spec.scm | 3 | ||||
-rw-r--r-- | module/language/scheme/spec.scm | 3 | ||||
-rw-r--r-- | module/system/base/compile.scm | 12 | ||||
-rw-r--r-- | module/system/base/language.scm | 47 |
8 files changed, 43 insertions, 34 deletions
diff --git a/module/language/assembly/spec.scm b/module/language/assembly/spec.scm index c7f1a14bd..dbfea17b1 100644 --- a/module/language/assembly/spec.scm +++ b/module/language/assembly/spec.scm @@ -21,7 +21,6 @@ (define-module (language assembly spec) #:use-module (system base language) - #:use-module (language bytecode spec) #:use-module (language assembly compile-bytecode) #:export (assembly)) @@ -31,5 +30,5 @@ #:reader read #:printer write #:parser read ;; fixme: make a verifier? - #:compilers `((,bytecode . ,compile-bytecode)) + #:compilers `((bytecode . ,compile-bytecode)) ) diff --git a/module/language/bytecode/spec.scm b/module/language/bytecode/spec.scm index 0fc38965b..8c35f7285 100644 --- a/module/language/bytecode/spec.scm +++ b/module/language/bytecode/spec.scm @@ -21,7 +21,6 @@ (define-module (language bytecode spec) #:use-module (system base language) - #:use-module (language objcode spec) #:use-module (system vm objcode) #:export (bytecode)) @@ -33,5 +32,5 @@ #:version "0.3" #:reader read #:printer write - #:compilers `((,objcode . ,compile-objcode)) + #:compilers `((objcode . ,compile-objcode)) ) diff --git a/module/language/ghil/spec.scm b/module/language/ghil/spec.scm index bac138733..ee574b50b 100644 --- a/module/language/ghil/spec.scm +++ b/module/language/ghil/spec.scm @@ -21,7 +21,6 @@ (define-module (language ghil spec) #:use-module (system base language) - #:use-module (language glil spec) #:use-module (language glil) #:use-module (language ghil) #:use-module (language ghil compile-glil) @@ -41,5 +40,5 @@ #:reader read #:printer write-ghil #:parser parse - #:compilers `((,glil . ,compile-glil)) + #:compilers `((glil . ,compile-glil)) ) diff --git a/module/language/glil/spec.scm b/module/language/glil/spec.scm index 5cd81b712..6f9ea175b 100644 --- a/module/language/glil/spec.scm +++ b/module/language/glil/spec.scm @@ -21,7 +21,6 @@ (define-module (language glil spec) #:use-module (system base language) - #:use-module (language assembly spec) #:use-module (language glil) #:use-module (language glil compile-assembly) #:export (glil)) @@ -38,5 +37,5 @@ #:reader read #:printer write-glil #:parser parse-glil - #:compilers `((,assembly . ,compile-asm)) + #:compilers `((assembly . ,compile-asm)) ) diff --git a/module/language/objcode/spec.scm b/module/language/objcode/spec.scm index 89d2793d4..c3836dafd 100644 --- a/module/language/objcode/spec.scm +++ b/module/language/objcode/spec.scm @@ -21,7 +21,6 @@ (define-module (language objcode spec) #:use-module (system base language) - #:use-module (language value spec) #:use-module (system vm objcode) #:use-module (system vm program) #:export (objcode make-objcode-env)) @@ -49,5 +48,5 @@ #:version "0.3" #:reader #f #:printer write-objcode - #:compilers `((,value . ,objcode->value)) + #:compilers `((value . ,objcode->value)) ) diff --git a/module/language/scheme/spec.scm b/module/language/scheme/spec.scm index ddcd69f12..8f958eb63 100644 --- a/module/language/scheme/spec.scm +++ b/module/language/scheme/spec.scm @@ -22,7 +22,6 @@ (define-module (language scheme spec) #:use-module (system base language) #:use-module (language scheme compile-ghil) - #:use-module (language ghil spec) #:export (scheme)) ;;; @@ -46,7 +45,7 @@ #:version "0.5" #:reader read #:read-file read-file - #:compilers `((,ghil . ,compile-ghil)) + #:compilers `((ghil . ,compile-ghil)) #:evaluator (lambda (x module) (primitive-eval x)) #:printer write ) diff --git a/module/system/base/compile.scm b/module/system/base/compile.scm index 4f1546025..4cc04cd03 100644 --- a/module/system/base/compile.scm +++ b/module/system/base/compile.scm @@ -140,15 +140,9 @@ (error "language has no #:read-file" lang)))) (define (compile-passes from to opts) - (let lp ((langs (or (lookup-compilation-order from to) - (error "no way to compile" (language-name from) - "to" (language-name to)))) - (out '())) - (if (null? (cdr langs)) - (reverse! out) - (lp (cdr langs) - (cons (assq-ref (language-compilers (car langs)) (cadr langs)) - out))))) + (map cdr + (or (lookup-compilation-order from to) + (error "no way to compile" from "to" to)))) (define (compile-fold passes exp env opts) (if (null? passes) diff --git a/module/system/base/language.scm b/module/system/base/language.scm index 208e0e128..23ae88ea3 100644 --- a/module/system/base/language.scm +++ b/module/system/base/language.scm @@ -24,9 +24,10 @@ #:export (define-language lookup-language make-language language-name language-title language-version language-reader language-printer language-parser language-read-file - language-compilers language-evaluator + language-compilers language-decompilers language-evaluator - lookup-compilation-order invalidate-compilation-cache!)) + lookup-compilation-order lookup-decompilation-order + invalidate-compilation-cache!)) ;;; @@ -42,6 +43,7 @@ (parser #f) (read-file #f) (compilers '()) + (decompilers '()) (evaluator #f)) (define-macro (define-language name . spec) @@ -56,20 +58,39 @@ (error "no such language" name)))) (define *compilation-cache* '()) +(define *decompilation-cache* '()) (define (invalidate-compilation-cache!) + (set! *decompilation-cache* '()) (set! *compilation-cache* '())) -(define (compute-compilation-order from to) - (let lp ((from from) (seen '())) - (cond ((eq? from to) (reverse! (cons from seen))) - ((memq from seen) #f) - (else (or-map (lambda (lang) (lp lang (cons from seen))) - (map car (language-compilers from))))))) +(define (compute-translation-order from to language-translators) + (cond + ((not (language? to)) + (compute-translation-order from (lookup-language to) language-translators)) + (else + (let lp ((from from) (seen '())) + (cond + ((not (language? from)) + (lp (lookup-language from) seen)) + ((eq? from to) (reverse! seen)) + ((memq from seen) #f) + (else (or-map (lambda (pair) + (lp (car pair) (acons from (cdr pair) seen))) + (language-translators from)))))))) (define (lookup-compilation-order from to) - (or (assoc-ref *compilation-cache* (cons from to)) - (let ((order (compute-compilation-order from to))) - (set! *compilation-cache* - (acons (cons from to) order *compilation-cache*)) - order))) + (let ((key (cons from to))) + (or (assoc-ref *compilation-cache* key) + (let ((order (compute-translation-order from to language-compilers))) + (set! *compilation-cache* + (acons key order *compilation-cache*)) + order)))) + +(define (lookup-decompilation-order from to) + (let ((key (cons from to))) + (or (assoc-ref *decompilation-cache* key) + (let ((order (compute-translation-order from to language-decompilers))) + (set! *decompilation-cache* + (acons key order *decompilation-cache*)) + order)))) |