summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-01-30 11:41:02 +0100
committerAndy Wingo <wingo@pobox.com>2009-01-30 11:41:02 +0100
commit5d6fb8bbeb5a6ab423062da3744ca215b0310dc2 (patch)
tree128189158c6fab48f2e2595129b0c4fc67484496
parent4b3184828416acfa5c099a54954ca00ce3cc0d0d (diff)
downloadguile-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.scm3
-rw-r--r--module/language/bytecode/spec.scm3
-rw-r--r--module/language/ghil/spec.scm3
-rw-r--r--module/language/glil/spec.scm3
-rw-r--r--module/language/objcode/spec.scm3
-rw-r--r--module/language/scheme/spec.scm3
-rw-r--r--module/system/base/compile.scm12
-rw-r--r--module/system/base/language.scm47
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))))