diff --git a/bootstrapped-primitives.rkt b/bootstrapped-primitives.rkt index 60f9883..83e77df 100644 --- a/bootstrapped-primitives.rkt +++ b/bootstrapped-primitives.rkt @@ -3,6 +3,7 @@ "lexical-structs.rkt" "il-structs.rkt" "compiler.rkt" + "compiler-structs.rkt" "typed-parse.rkt" "parameters.rkt") diff --git a/compiler-structs.rkt b/compiler-structs.rkt new file mode 100644 index 0000000..fe4aac0 --- /dev/null +++ b/compiler-structs.rkt @@ -0,0 +1,40 @@ +#lang typed/racket/base + + +(provide (all-defined-out)) + + +;; A ValuesContext describes if a context either +;; * accepts any number multiple values by dropping them from the stack. +;; * accepts any number of multiple values by maintaining them on the stack. +;; * accepts exactly n values, erroring out +(define-type ValuesContext (U 'tail + 'drop-multiple + 'keep-multiple + Natural)) + + +;; Linkage +(define-struct: NextLinkage ([context : ValuesContext])) +(define next-linkage/drop-multiple (make-NextLinkage 'drop-multiple)) +(define next-linkage/expects-single (make-NextLinkage 1)) +(define next-linkage/keep-multiple-on-stack (make-NextLinkage 'keep-multiple)) + + + +;; LabelLinkage is a labeled GOTO. +(define-struct: LabelLinkage ([label : Symbol] + [context : ValuesContext])) + + + +;; Both ReturnLinkage and ReturnLinkage/NonTail deal with multiple +;; values indirectly, through the alternative multiple-value-return +;; address in the LinkedLabel of their call frame. +(define-struct: ReturnLinkage ([tail? : Boolean])) +(define return-linkage (make-ReturnLinkage #t)) +(define return-linkage/nontail (make-ReturnLinkage #f)) + +(define-type Linkage (U NextLinkage + LabelLinkage + ReturnLinkage)) diff --git a/compiler.rkt b/compiler.rkt index 8cef5ca..42bc185 100644 --- a/compiler.rkt +++ b/compiler.rkt @@ -3,6 +3,7 @@ (require "expression-structs.rkt" "lexical-structs.rkt" "il-structs.rkt" + "compiler-structs.rkt" "kernel-primitives.rkt" "optimize-il.rkt" racket/bool diff --git a/il-structs.rkt b/il-structs.rkt index 75718be..68fb545 100644 --- a/il-structs.rkt +++ b/il-structs.rkt @@ -34,7 +34,7 @@ CompiledProcedureClosureReference)) -;; Targets: these are the allowable lhs's for an assignment. +;; Targets: these are the allowable lhs's for a targetted assignment. (define-type Target (U AtomicRegisterSymbol EnvLexicalReference EnvPrefixReference @@ -415,40 +415,6 @@ -;; A ValuesContext describes if a context either -;; * accepts any number multiple values by dropping them from the stack. -;; * accepts any number of multiple values by maintaining them on the stack. -;; * accepts exactly n values, erroring out -(define-type ValuesContext (U 'tail - 'drop-multiple - 'keep-multiple - Natural)) - - -;; Linkage -(define-struct: NextLinkage ([context : ValuesContext])) -(define next-linkage/drop-multiple (make-NextLinkage 'drop-multiple)) -(define next-linkage/expects-single (make-NextLinkage 1)) -(define next-linkage/keep-multiple-on-stack (make-NextLinkage 'keep-multiple)) - - - -;; LabelLinkage is a labeled GOTO. -(define-struct: LabelLinkage ([label : Symbol] - [context : ValuesContext])) - - - -;; Both ReturnLinkage and ReturnLinkage/NonTail deal with multiple -;; values indirectly, through the alternative multiple-value-return -;; address in the LinkedLabel of their call frame. -(define-struct: ReturnLinkage ([tail? : Boolean])) -(define return-linkage (make-ReturnLinkage #t)) -(define return-linkage/nontail (make-ReturnLinkage #f)) - -(define-type Linkage (U NextLinkage - LabelLinkage - ReturnLinkage)) diff --git a/package.rkt b/package.rkt index 19e1c54..50cdb25 100644 --- a/package.rkt +++ b/package.rkt @@ -1,6 +1,7 @@ #lang racket/base (require "compiler.rkt" + "compiler-structs.rkt" "assemble.rkt" "typed-parse.rkt" "il-structs.rkt" diff --git a/test-all.rkt b/test-all.rkt index 8ef4255..cb85390 100644 --- a/test-all.rkt +++ b/test-all.rkt @@ -9,4 +9,7 @@ "test-package.rkt" "test-conform-browser.rkt" "test-earley-browser.rkt") + + +;; This test takes a bit too much time. #;"test-conform.rkt" diff --git a/test-compiler-2.rkt b/test-compiler-2.rkt index 0f78653..faa569a 100644 --- a/test-compiler-2.rkt +++ b/test-compiler-2.rkt @@ -4,6 +4,7 @@ "simulator-structs.rkt" "simulator-helpers.rkt" "compiler.rkt" + "compiler-structs.rkt" "parse.rkt" "il-structs.rkt") diff --git a/test-compiler.rkt b/test-compiler.rkt index 02921b4..53dc3d7 100644 --- a/test-compiler.rkt +++ b/test-compiler.rkt @@ -4,6 +4,7 @@ "simulator-structs.rkt" "simulator-helpers.rkt" "compiler.rkt" + "compiler-structs.rkt" "parse.rkt" "il-structs.rkt") diff --git a/test-conform.rkt b/test-conform.rkt index 2fbec7b..ba55ee8 100644 --- a/test-conform.rkt +++ b/test-conform.rkt @@ -2,6 +2,7 @@ (require "simulator.rkt" "simulator-structs.rkt" + "compiler-structs.rkt" "compiler.rkt" "parse.rkt" "il-structs.rkt") diff --git a/test-earley.rkt b/test-earley.rkt index 64cb267..b9055c6 100644 --- a/test-earley.rkt +++ b/test-earley.rkt @@ -2,13 +2,14 @@ (require "simulator.rkt" "simulator-structs.rkt" + "compiler-structs.rkt" "compiler.rkt" "parse.rkt" "il-structs.rkt") (define (run-compiler code) - (compile (parse code) 'val next-linkage)) + (compile (parse code) 'val next-linkage/drop-multiple)) ;; run: machine -> (machine number) ;; Run the machine to completion.