From 1101ba6edbddad00bc0a9e767b407249d84b341b Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 23 Nov 2006 19:48:14 -0500 Subject: [PATCH] imported compiler5 --- .bzrignore | 1 - src/assembler-tests.ss | 756 --- src/build-date.tmp | 2 +- src/chez-compat.ss | 57 - src/compiler-6.0.ss | 3890 -------------- src/compiler-6.1.ss | 3132 ----------- src/compiler-6.2.ss | 3185 ------------ src/compiler-6.3.ss | 3199 ------------ src/compiler-6.4.ss | 98 - src/compiler-6.5.ss | 96 - src/compiler-6.6.ss | 97 - src/compiler-6.7.ss | 98 - src/compiler-6.8.ss | 98 - src/compiler-8.1.ss | 17 +- src/{compiler-6.9.ss => compiler-9.0.ss} | 108 +- src/{compiler-8.0.ss => compiler-9.1.ss} | 114 +- src/compiler-9.2.ss | 301 ++ src/fact.ss | 6 + src/generate-cxr.ss | 52 - src/geninstr/gen.pl | 6 +- src/geninstr/tmp.dump | 33 +- src/geninstr/tmp.s | 24 +- src/ikarus.fasl | Bin 1764160 -> 1853333 bytes src/libassembler-compat-6.0.ss | 67 - src/libassembler-compat-6.6.ss | 32 - src/libassembler-compat-6.7.ss | 32 - src/libassembler-compat.ss | Bin 9714 -> 0 bytes src/libassembler.ss | Bin 7611 -> 6493 bytes src/libcafe-6.0.ss | 72 - src/libcafe-6.1.ss | 1 + src/libcafe.fasl | Bin 9157 -> 7881 bytes src/libchezio-8.1.ss | 45 +- src/libcollect-6.0.ss | 28 - src/libcollect.fasl | Bin 3514 -> 3514 bytes src/libcompile-6.4.ss | 3035 ----------- src/libcompile-6.5.ss | 3435 ------------ src/libcompile-8.1.ss | 110 +- src/{libcompile-6.7.ss => libcompile-9.0.ss} | 126 +- src/{libcompile-6.6.ss => libcompile-9.1.ss} | 1128 ++-- src/libcontrol-6.0.ss | 97 - src/libcontrol.fasl | Bin 8432 -> 8432 bytes src/libcore-6.0.ss | 1392 ----- src/libcore-6.1.ss | 1596 ------ src/libcore-6.2.ss | 1628 ------ src/libcore-6.9.ss | 4 +- src/libcore.fasl | Bin 142678 -> 129685 bytes src/libcxr.fasl | Bin 14117 -> 14088 bytes src/libexpand-6.0.ss | 1061 ---- src/libexpand-6.1.ss | 1074 ---- src/libexpand-6.2.ss | 1099 ---- src/libfasl-6.0.ss | 261 - src/libfasl-6.6.ss | 217 - src/libhandlers-6.0.ss | 28 - src/libhandlers.fasl | Bin 5547 -> 5547 bytes src/libhash-6.2.ss | 4 +- src/libhash-9.2.ss | 244 + src/libintelasm-6.0.ss | 921 ---- src/libintelasm-6.4.ss | 920 ---- src/libintelasm-6.6.ss | 932 ---- src/libintelasm-6.9.ss | 2 + src/libinterpret-6.0.ss | 277 - src/libinterpret-6.1.ss | 324 -- src/libinterpret.fasl | Bin 31688 -> 28266 bytes src/libio-6.0.ss | 510 -- src/libio-6.1.ss | 497 -- src/libio-6.9.ss | 407 -- src/libio.fasl | Bin 53124 -> 0 bytes src/libnumerics-7.1.ss | 53 - src/libnumerics-9.1.ss | 376 ++ src/librecord-6.0.ss | 228 - src/librecord-6.1.ss | 222 - src/librecord.fasl | Bin 0 -> 15860 bytes src/libtokenizer-6.1.ss | 2 +- ...ibtokenizer-6.0.ss => libtokenizer-9.0.ss} | 374 +- src/libtokenizer-9.1.ss | 630 +++ src/libtokenizer.fasl | Bin 46490 -> 56971 bytes src/libtoplevel-6.0.ss | 8 - src/libtoplevel.fasl | Bin 28177 -> 27546 bytes src/libwriter-6.2.ss | 9 +- src/{libwriter-6.1.ss => libwriter-9.0.ss} | 257 +- src/{libwriter-6.0.ss => libwriter-9.1.ss} | 309 +- src/libwriter.fasl | Bin 36251 -> 41270 bytes src/makepp.ss | 34 - src/psyntax-7.1-6.9.ss | 2 +- ...{psyntax-7.1-6.8.ss => psyntax-7.1-9.0.ss} | 115 +- ...{psyntax-7.1-6.5.ss => psyntax-7.1-9.1.ss} | 122 +- src/psyntax-7.1.ss | 4608 ----------------- src/record-case.chez.ss | 26 - src/runtime/Makefile | 14 +- src/runtime/ikarus | Bin 91026 -> 50491 bytes src/runtime/ikarus-collect.c | 22 + src/runtime/ikarus-data.h | 42 +- src/runtime/ikarus-fasl.c | 38 +- src/runtime/ikarus-main.c | 8 +- src/runtime/ikarus-numerics.c | 1075 ++++ src/runtime/ikarus-runtime.c | 12 +- src/runtime/ikarus-symbol-table.c | 2 +- src/runtime/ikarus.h | 1 + src/runtime/tags.txt | 25 + src/test.ss | 2 - src/tests-driver.ss | 96 - src/time-read.ss | 43 - 102 files changed, 4809 insertions(+), 40922 deletions(-) delete mode 100644 src/assembler-tests.ss delete mode 100644 src/chez-compat.ss delete mode 100644 src/compiler-6.0.ss delete mode 100644 src/compiler-6.1.ss delete mode 100644 src/compiler-6.2.ss delete mode 100644 src/compiler-6.3.ss delete mode 100644 src/compiler-6.4.ss delete mode 100644 src/compiler-6.5.ss delete mode 100644 src/compiler-6.6.ss delete mode 100644 src/compiler-6.7.ss delete mode 100644 src/compiler-6.8.ss rename src/{compiler-6.9.ss => compiler-9.0.ss} (70%) rename src/{compiler-8.0.ss => compiler-9.1.ss} (68%) create mode 100644 src/compiler-9.2.ss create mode 100644 src/fact.ss delete mode 100644 src/generate-cxr.ss delete mode 100644 src/libassembler-compat-6.0.ss delete mode 100644 src/libassembler-compat-6.6.ss delete mode 100644 src/libassembler-compat-6.7.ss delete mode 100644 src/libassembler-compat.ss delete mode 100644 src/libcafe-6.0.ss delete mode 100644 src/libcollect-6.0.ss delete mode 100644 src/libcompile-6.4.ss delete mode 100644 src/libcompile-6.5.ss rename src/{libcompile-6.7.ss => libcompile-9.0.ss} (96%) rename src/{libcompile-6.6.ss => libcompile-9.1.ss} (80%) delete mode 100644 src/libcontrol-6.0.ss delete mode 100644 src/libcore-6.0.ss delete mode 100644 src/libcore-6.1.ss delete mode 100644 src/libcore-6.2.ss delete mode 100644 src/libexpand-6.0.ss delete mode 100644 src/libexpand-6.1.ss delete mode 100644 src/libexpand-6.2.ss delete mode 100644 src/libfasl-6.0.ss delete mode 100644 src/libfasl-6.6.ss delete mode 100644 src/libhandlers-6.0.ss create mode 100644 src/libhash-9.2.ss delete mode 100644 src/libintelasm-6.0.ss delete mode 100644 src/libintelasm-6.4.ss delete mode 100644 src/libintelasm-6.6.ss delete mode 100644 src/libinterpret-6.0.ss delete mode 100644 src/libinterpret-6.1.ss delete mode 100644 src/libio-6.0.ss delete mode 100644 src/libio-6.1.ss delete mode 100644 src/libio-6.9.ss delete mode 100644 src/libio.fasl delete mode 100644 src/libnumerics-7.1.ss create mode 100644 src/libnumerics-9.1.ss delete mode 100644 src/librecord-6.0.ss delete mode 100644 src/librecord-6.1.ss rename src/{libtokenizer-6.0.ss => libtokenizer-9.0.ss} (59%) create mode 100644 src/libtokenizer-9.1.ss delete mode 100644 src/libtoplevel-6.0.ss rename src/{libwriter-6.1.ss => libwriter-9.0.ss} (62%) rename src/{libwriter-6.0.ss => libwriter-9.1.ss} (56%) delete mode 100644 src/makepp.ss rename src/{psyntax-7.1-6.8.ss => psyntax-7.1-9.0.ss} (97%) rename src/{psyntax-7.1-6.5.ss => psyntax-7.1-9.1.ss} (97%) delete mode 100644 src/psyntax-7.1.ss delete mode 100644 src/record-case.chez.ss create mode 100644 src/runtime/ikarus-numerics.c create mode 100644 src/runtime/tags.txt delete mode 100644 src/test.ss delete mode 100644 src/tests-driver.ss delete mode 100644 src/time-read.ss diff --git a/.bzrignore b/.bzrignore index b724a69..3c42d39 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,3 +1,2 @@ -*.s *.tmp *.out diff --git a/src/assembler-tests.ss b/src/assembler-tests.ss deleted file mode 100644 index 157c0c2..0000000 --- a/src/assembler-tests.ss +++ /dev/null @@ -1,756 +0,0 @@ - -(load "chez-compat.ss") - -(load "libintelasm-5.8.ss") -(load "libfasl-6.0.ss") - -(define-record code (code-size reloc-size closure-size code-vec reloc-vec)) -(define make-code - (let ([make-code make-code]) - (lambda (code-size reloc-size closure-size) - (printf "reloc=~s\n" reloc-size) - (let ([code-size (fxsll (fxsra (fx+ code-size 3) 2) 2)]) - (make-code - (fxsra code-size 2) - (fxsra reloc-size 2) - closure-size - (make-vector code-size (cons 'byte 0)) - (make-vector (fxsra reloc-size 2))))))) - -(define set-code-byte! - (lambda (code idx byte) - (vector-set! (code-code-vec code) idx (cons 'byte byte)))) - - -(define set-code-word! - (lambda (code idx x) - (cond - [(fixnum? x) - (set-code-byte! code (fx+ idx 0) (fxsll (fxlogand x #x3F) 2)) - (set-code-byte! code (fx+ idx 1) (fxlogand (fxsra x 6) #xFF)) - (set-code-byte! code (fx+ idx 2) (fxlogand (fxsra x 14) #xFF)) - (set-code-byte! code (fx+ idx 3) (fxlogand (fxsra x 22) #xFF))] - [else (error 'set-code-word! "unhandled ~s" x)]))) - -(define set-code-object! - (lambda (code obj code-idx reloc-idx) - (let ([v (code-reloc-vec code)]) - (vector-set! v reloc-idx (list 'object code-idx obj))))) - -(define set-code-object+offset/rel! - (lambda (code obj code-idx obj-idx reloc-idx) - (let ([v (code-reloc-vec code)]) - (vector-set! v reloc-idx - (list 'object+off/rel code-idx obj obj-idx)) - (vector-set! v (fxadd1 reloc-idx) '(skip))))) - -(define set-code-object+offset! - (lambda (code obj code-idx obj-idx reloc-idx) - (let ([v (code-reloc-vec code)]) - (vector-set! v reloc-idx - (list 'object+off code-idx obj obj-idx)) - (vector-set! v (fxadd1 reloc-idx) '(skip))))) - -(define make-code-executable! - (lambda (x) (void))) - - - -(define eval-code - (lambda (code) - (with-output-to-file "stst.fasl" - (lambda () - (fasl-write code)) - 'replace) - (let ([rv (system "runtime/ikarus stst.fasl > stst.tmp")]) - (unless (zero? rv) - (error 'eval-code "Failed to run: ~s" rv))) - (with-input-from-file "stst.tmp" read))) - - - - -(let () - (define verbose #t) - (define passed-tests 0) - - (define all-tests 0) - - (define test-code - (lambda (code-ls val) - (set! all-tests (fxadd1 all-tests)) - (when verbose (printf "Evaluating\n~s\n" code-ls)) - (let* ([code (car (list*->code* (list code-ls)))] - [v (eval-code code)]) - (when verbose (printf "evaluated\n")) - (cond - [(equal? v val) - (set! passed-tests (fxadd1 passed-tests)) - (when verbose (printf "OK\n"))] - [else - (error 'test-code - "expected ~s, got ~s" val v)])))) - - (printf "testing ... \n") - - (test-code - '([movl (int 0) %eax] - [ret]) - 0) - - - (let ([L1 (gensym)]) - (test-code - `([movl (obj 10) %eax] - [jmp (label ,L1)] - [byte 0] - [byte 1] - [byte 2] - [byte 3] - [byte 4] - [byte 5] - [byte 6] - [byte 7] - [byte 8] - [byte 9] - [label ,L1] - [ret]) - 10)) - - (test-code - '([movl (obj+ (1 2 3) 3) %eax] - [movl (disp (int 0) %eax) %eax] - [ret]) - '(2 3)) - - - - - (test-code - '([movl (int 40) %eax] - [ret]) - 10) - - (test-code - '([movl (obj 40) %eax] - [ret]) - 40) - - (test-code - '([movl (obj 40) %ebx] - [movl %ebx %eax] - [ret]) - 40) - - (test-code - '([movl (obj (1 2 3)) %eax] - [ret]) - '(1 2 3)) - - (test-code - '([movl (obj (1 2 3)) %ebx] - [movl (disp (int -1) %ebx) %eax] - [ret]) - '1) - - (test-code - '([movl (obj (1 2 3)) %ebx] - [movl (disp (int 3) %ebx) %eax] - [ret]) - '(2 3)) - - (test-code - '([movl (obj (1 2 3)) %ebx] - [movl (int 120) %eax] - [movl %eax (disp (int 3) %ebx)] - [movl %ebx %eax] - [ret]) - '(1 . 30)) - - (test-code - '([movl (obj (1 2 3)) %eax] - [movl (int 120) (disp (int -1) %eax)] - [ret]) - '(30 2 3)) - - (test-code - '([movl (obj (1 2 3)) %eax] - [movl (int 120000) (disp (int -1) %eax)] - [ret]) - '(30000 2 3)) - - (test-code - '([movl (int 40) %eax] - [addl (int 80) %eax] - [ret]) - 30) - - (test-code - '([movl (int 40) %eax] - [addl (obj 20) %eax] - [ret]) - 30) - - (test-code - '([movl (int 40) %eax] - [movl (obj 20) %ebx] - [addl %ebx %eax] - [ret]) - 30) - - (test-code - '([movl (obj (1 2 3)) %eax] - [movl (obj 10) %ebx] - [addl (disp (int -1) %eax) %ebx] - [movl %ebx %eax] - [ret]) - '11) - - (test-code - '([movl (obj (1 2 3)) %eax] - [addl (int 1000) %eax] - [movl (obj 10) %ebx] - [addl (disp (int -1001) %eax) %ebx] - [movl %ebx %eax] - [ret]) - '11) - - (test-code - '([movl (obj 10) %eax] - [sall (int 1) %eax] - [ret]) - 20) - - - - (test-code - '([movl (obj 10) %eax] - [sall (int 3) %eax] - [ret]) - 80) - - (test-code - '([movl (obj 10) %eax] - [movl (int 3) %ecx] - [sall %cl %eax] - [ret]) - 80) - - (test-code - '([movl (obj #xF0) %eax] - [sarl (int 1) %eax] - [ret]) - #x78) - - (test-code - '([movl (obj #xF0) %eax] - [sarl (int 4) %eax] - [ret]) - #x0F) - - (test-code - '([movl (obj #xF0) %eax] - [movl (int 4) %ecx] - [sarl %cl %eax] - [ret]) - #x0F) - - - (test-code - '([movl (obj #xFFFF) %eax] - [andl (obj #xF0F0) %eax] - [ret]) - #xF0F0) - - (test-code - '([movl (obj #xFFFF) %eax] - [movl (obj #x7654) %ebx] - [andl %ebx %eax] - [ret]) - #x7654) - - (test-code - '([movl (obj #xFFFF) %eax] - [andl (int #x3F) %eax] - [ret]) - #xF) - - (test-code - '([movl (obj #xFFFF) %eax] - [movl (obj (#xF707F)) %ebx] - [andl (disp (int -1) %ebx) %eax] - [ret]) - #x707F) - - (test-code - '([movl (obj #xFFFF) %eax] - [movl (obj (#xF707F)) %ebx] - [addl (int 1000) %ebx] - [andl (disp (int -1001) %ebx) %eax] - [ret]) - #x707F) - - (test-code - '([movl (int 3) %eax] - [notl %eax] - [ret]) - -1) - - (test-code - '([movl (obj 1942) %eax] - [negl %eax] - [ret]) - -1942) - - (test-code - '([movl (obj 10) %eax] - [jmp (int 10)] - [byte 0] - [byte 1] - [byte 2] - [byte 3] - [byte 4] - [byte 5] - [byte 6] - [byte 7] - [byte 8] - [byte 9] - [ret]) - 10) - - (test-code - '([movl (obj 10) %eax] - [jmp (int 10)] - [byte 0] - [byte 1] - [byte 2] - [byte 3] - [byte 4] - [byte 5] - [ret] - [byte 7] - [byte 8] - [byte 9] - [jmp (int -9)]) - 10) - - - - (let ([L1 (gensym)]) - (test-code - `([movl (obj 10) %eax] - [jmp (label ,L1)] - [byte 0] - [byte 1] - [byte 2] - [byte 3] - [byte 4] - [byte 5] - [byte 6] - [byte 7] - [byte 8] - [byte 9] - [label ,L1] - [ret]) - 10)) - - (let ([L2 (gensym)] - [L3 (gensym)]) - (test-code - `([movl (obj 10) %eax] - [jmp (label ,L2)] - [byte 0] - [byte 1] - [byte 2] - [byte 3] - [byte 4] - [byte 5] - [label ,L3] - [ret] - [byte 7] - [byte 8] - [byte 9] - [label ,L2] - [jmp (label ,L3)]) - 10)) - - - - - (test-code - '([movl (obj 10) (disp (int -4) %esp)] - [movl (obj list) %eax] - [ret]) - 'list) - -;; (test-code -;; '([movl (obj list) %eax] -;; [movl (disp (int 6) %eax) %eax] ; symbol value -;; [ret]) -;; list) - -;; (test-code -;; '([movl (obj 10) (disp (int -4) %esp)] -;; [movl (obj list) %eax] -;; [movl (disp (int 6) %eax) %edi] ; symbol value -;; [movl (obj -1) %eax] ; argc -;; [jmp (disp (int -3) %edi)]) -;; '(10)) - -;; (test-code -;; '([movl (obj 10) (disp (int -4) %esp)] -;; [movl (obj 20) %eax] -;; [movl %eax (disp (int -8) %esp)] -;; [movl (disp (int -8) %esp) %ebx] -;; [movl %ebx (disp (int -12) %esp)] -;; [movl (obj list) %eax] -;; [movl (disp (int 6) %eax) %edi] ; symbol value -;; [movl (obj -3) %eax] ; argc -;; [jmp (disp (int -3) %edi)]) -;; '(10 20 20)) - - (test-code - '([movl (obj 10) %eax] - [imull (int 3) %eax] - [ret]) - 30) - - (test-code - '([movl (obj 10) %eax] - [imull (obj 10) %eax] - [ret]) - 400) - - (test-code - '([movl (obj 10) %eax] - [movl (obj 20) %ebx] - [imull %ebx %eax] - [ret]) - 800) - - (test-code - '([movl (obj 10) %eax] - [movl (obj 20) (disp (int -4) %esp)] - [imull (disp (int -4) %esp) %eax] - [ret]) - 800) - - (test-code - '([movl (obj 10) %eax] - [cltd] - [ret]) - 10) - - (test-code - '([movl (obj 10) %eax] - [movl (obj 100) %edx] - [cltd] - [movl %edx %eax] - [ret]) - 0) - - (test-code - '([movl (obj -10) %eax] - [movl (obj 100) %edx] - [cltd] - [movl %edx %eax] - [sall (int 2) %eax] - [ret]) - -1) - - (let ([L1 (gensym)]) - (test-code - `([movl (int 10) %eax] - [cmpl (int 8) %eax] - [jne (label ,L1)] - [movl (obj 0) %eax] - [ret] - [label ,L1] - [movl (obj 1) %eax] - [ret]) - 1)) - - (let ([L1 (gensym)]) - (test-code - `([movl (int 40) %eax] - [cmpl (obj 10) %eax] - [je (label ,L1)] - [movl (obj 0) %eax] - [ret] - [label ,L1] - [movl (obj 1) %eax] - [ret]) - 1)) - - (let ([L1 (gensym)]) - (test-code - `([movl (int 40) %eax] - [movl (int 30) %ebx] - [cmpl %ebx %eax] - [jge (label ,L1)] - [movl (obj 0) %eax] - [ret] - [label ,L1] - [movl (obj 1) %eax] - [ret]) - 1)) - - (let ([L1 (gensym)]) - (test-code - `([movl (int 40) (disp (int -4) %esp)] - [cmpl (int 70) (disp (int -4) %esp)] - [jle (label ,L1)] - [movl (obj 0) %eax] - [ret] - [label ,L1] - [movl (obj 1) %eax] - [ret]) - 1)) - - (test-code - '([movl (int 40) (disp (int -4) %esp)] - [addl (int 10) %esp] - [movl (disp (int -14) %esp) %eax] - [addl (int -10) %esp] - [ret]) - 10) - - (test-code - '([movl (int 40) (disp (int -4) %esp)] - [addl (int 1000) %esp] - [movl (disp (int -1004) %esp) %eax] - [addl (int -1000) %esp] - [ret]) - 10) - - (let ([L1 (gensym)]) - (test-code - `([movl (int 40) (disp (int -4) %esp)] - [addl (int 1000) %esp] - [cmpl (int 70) (disp (int -1004) %esp)] - [jle (label ,L1)] - [addl (int -1000) %esp] - [movl (obj 0) %eax] - [ret] - [label ,L1] - [addl (int -1000) %esp] - [movl (obj 1) %eax] - [ret]) - 1)) - - (let ([L1 (gensym)]) - (test-code - `([movl (int 4000) (disp (int -4) %esp)] - [addl (int 1000) %esp] - [cmpl (int 7000) (disp (int -1004) %esp)] - [jle (label ,L1)] - [addl (int -1000) %esp] - [movl (obj 0) %eax] - [ret] - [label ,L1] - [addl (int -1000) %esp] - [movl (obj 1) %eax] - [ret]) - 1)) - - (let ([L1 (gensym)]) - (test-code - `([movl (int 40) (disp (int -4) %esp)] - [movl (int 70) %ebx] - [cmpl (disp (int -4) %esp) %ebx] - [jge (label ,L1)] - [movl (obj 0) %eax] - [ret] - [label ,L1] - [movl (obj 1) %eax] - [ret]) - 1)) - - - (let ([L_fact (gensym)] [L1 (gensym)]) - (test-code - `([movl (int 5) %eax] - [call (label ,L_fact)] - [sall (int 2) %eax] - [ret] - [label ,L_fact] - [cmpl (int 0) %eax] - [jne (label ,L1)] - [movl (int 1) %eax] - [ret] - [label ,L1] - [movl %eax (disp (int -4) %esp)] - [addl (int -4) %esp] - [addl (int -1) %eax] - [call (label ,L_fact)] - [addl (int 4) %esp] - [imull (disp (int -4) %esp) %eax] - [ret]) - 120)) - - (test-code - '([movl (int 16) %eax] - [cltd] - [movl (int 4) %ebx] - [idivl %ebx] - [ret]) - 1) - - (test-code - '([movl (int 16) %eax] - [cltd] - [movl (obj (1)) %ebx] - [idivl (disp (int -1) %ebx)] - [ret]) - 1) - - (test-code - '([movl (int 16) %eax] - [cltd] - [movl (int 4) (disp (int -4) %esp)] - [idivl (disp (int -4) %esp)] - [ret]) - 1) - - - (test-code - '([movl (int #x30) %ebx] - [orl (int #x4) %ebx] - [movl %ebx %eax] - [ret]) - (fxsra #x34 2)) - - (test-code - '([movl (int #x30) %eax] - [orl (int #x4) %eax] - [ret]) - (fxsra #x34 2)) - - (test-code - '([movl (int #x30) %eax] - [orl (obj #x1) %eax] - [ret]) - (fxsra #x34 2)) - - (test-code - '([movl (int #x30) %ebx] - [orl (obj #x1) %ebx] - [movl %ebx %eax] - [ret]) - (fxsra #x34 2)) - - (test-code - '([movl (obj (#xC)) %ebx] - [movl (int #x4) %eax] - [orl (disp (int -1) %ebx) %eax] - [ret]) - (fxsra #x34 2)) - - - (test-code - '([movl (int #x30) (disp (int -4) %esp)] - [movl (int #x4) %eax] - [orl (disp (int -4) %esp) %eax] - [ret]) - (fxsra #x34 2)) - - (test-code - '([pushl (int 8)] - [movl (disp (int 0) %esp) %eax] - [addl (int 4) %esp] - [ret]) - 2) - - (test-code - '([pushl (int 8000)] - [movl (disp (int 0) %esp) %eax] - [addl (int 4) %esp] - [ret]) - 2000) - - (test-code - '([movl (int 8000) %ebx] - [pushl %ebx] - [movl (disp (int 0) %esp) %eax] - [addl (int 4) %esp] - [ret]) - 2000) - - (test-code - '([movl (obj (1 2 3)) %eax] - [pushl (disp (int 3) %eax)] - [addl (int 4) %esp] - [movl (disp (int -4) %esp) %eax] - [ret]) - '(2 3)) - - (test-code - '([movl (obj (1 2 3)) %eax] - [addl (int -1000) %eax] - [pushl (disp (int 1003) %eax)] - [addl (int 4) %esp] - [movl (disp (int -4) %esp) %eax] - [ret]) - '(2 3)) - - (test-code - '([pushl (obj 100)] - [popl %eax] - [ret]) - 100) - - (test-code - '([pushl (obj 100)] - [popl (disp (int -32) %esp)] - [movl (disp (int -32) %esp) %eax] - [ret]) - 100) - - (test-code - '([movl (int 4) %eax] - [cmpl (int 5) %eax] - [sete %al] - [andl (int 1) %eax] - [sall (int 2) %eax] - [ret]) - 0) - - (test-code - '([movl (int 4) %eax] - [cmpl (int 5) %eax] - [setle %al] - [andl (int 1) %eax] - [sall (int 2) %eax] - [ret]) - 1) - - (test-code - '([movl (obj+ (1 2 3) 3) %eax] - [movl (disp (int 0) %eax) %eax] - [ret]) - '(2 3)) - - (let ([L_entry (gensym)] [L_no (gensym)]) - (test-code - `([movl (obj 10) %eax] - [ret] - [label ,L_entry] - [cmpl (int 1) %eax] - [jne (label ,L_no)] - [movl (obj foo) %eax] - [ret] - [label ,L_no] - [movl (obj bar) %eax] - [ret]) - 10) - (test-code - `([movl (int 1) %eax] - [jmp (label ,L_entry)]) - 'foo) - (test-code - `([movl (int 0) %eax] - [jmp (label ,L_entry)]) - 'bar)) - - (printf "Passed ~s/~s tests in assembler\n" passed-tests all-tests) -) diff --git a/src/build-date.tmp b/src/build-date.tmp index a33701c..77c2433 100644 --- a/src/build-date.tmp +++ b/src/build-date.tmp @@ -1 +1 @@ -2006-08-22 +2006-08-25 diff --git a/src/chez-compat.ss b/src/chez-compat.ss deleted file mode 100644 index 9ef66bf..0000000 --- a/src/chez-compat.ss +++ /dev/null @@ -1,57 +0,0 @@ -(define-syntax $pcb-set! - (syntax-rules () - [(_ name val) - (set-top-level-value! 'name val)])) - -(define primitive-set! set-top-level-value!) - -(define (immediate? x) - (or (fixnum? x) - (null? x) - (char? x) - (boolean? x) - (eof-object? x) - (eq? x (void)))) - -(define fxadd1 - (lambda (x) - (import scheme) - (unless (fixnum? x) (error 'fxadd1 "~s is not a fixnum" x)) - (let ([v (+ x 1)]) - (unless (fixnum? v) (error 'fxadd1 "overflow")) - v))) - -(define fxsub1 - (lambda (x) - (import scheme) - (unless (fixnum? x) (error 'fxsub1 "~s is not a fixnum" x)) - (let ([v (- x 1)]) - (unless (fixnum? v) (error 'fxsub1 "overflow")) - v))) - -(define char= char=?) - -(set! $base-rtd #%$base-rtd) -(define-syntax |#primitive| - (syntax-rules () - [(_ n prim) prim] - [(_ prim) prim])) - -(define (date-string) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(define ($record rtd . args) - (apply (record-constructor rtd) args)) -(define ($record/rtd? x rtd) - (and (record? x) (eq? (record-type-descriptor x) rtd))) -(define ($record-ref x i) - ((record-field-accessor (record-type-descriptor x) i) x)) -(define ($record-set! x i v) - ((record-field-mutator (record-type-descriptor x) i) x v)) diff --git a/src/compiler-6.0.ss b/src/compiler-6.0.ss deleted file mode 100644 index c3892a5..0000000 --- a/src/compiler-6.0.ss +++ /dev/null @@ -1,3890 +0,0 @@ - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (load "libexpand-6.0.ss") - ;(load "libinterpret-6.0.ss") - (load "record-case.ss") - ;(#%current-eval eval) - ) - -(define primitive-set! set-top-level-value!) - -(load "libassembler-compat-6.0.ss") ; defines make-code etc. -(load "libintelasm-6.0.ss") ; uses make-code, etc. -(load "libfasl-6.0.ss") ; uses code? etc. - - - -(load "tests-driver.ss") -(print-gensym #f) -(gensym-prefix "L_") - - -(define assembler-output (make-parameter #t)) - -(define signal-error-on-undefined-pcb (make-parameter #t)) - -(load "set-operations.ss") -;(load "tests-5.6-req.scm") -;(load "tests-5.3-req.scm") -;(load "tests-5.2-req.scm") -;(load "tests-5.1-req.scm") -;(load "tests-4.3-req.scm") -;(load "tests-4.2-req.scm") - -;(load "tests-4.1-req.scm") -;(load "tests-3.4-req.scm") - -;(load "tests-3.3-req.scm") -;(load "tests-3.2-req.scm") -;(load "tests-3.1-req.scm") -;(load "tests-2.9-req.scm") -;(load "tests-2.8-req.scm") -;(load "tests-2.6-req.scm") -;(load "tests-2.4-req.scm") -;(load "tests-2.3-req.scm") -;(load "tests-2.2-req.scm") -;(load "tests-2.1-req.scm") -;(load "tests-1.9-req.scm") -;(load "tests-1.8-req.scm") -;(load "tests-1.7-req.scm") -;(load "tests-1.6-req.scm") -;(load "tests-1.5-req.scm") -;(load "tests-1.4-req.scm") -;(load "tests-1.3-req.scm") -;(load "tests-1.2-req.scm") -;(load "tests-1.1-req.scm") - - -(define scheme-library-files - '( -; ["libsymboltable-6.0.ss" "libsymboltable.fasl"] - ["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.0.ss" "libcontrol.fasl"] - ["libcollect-6.0.ss" "libcollect.fasl"] - ["librecord-6.0.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.0.ss" "libcore.fasl"] - ["libio-6.0.ss" "libio.fasl"] - ["libwriter-6.0.ss" "libwriter.fasl"] - ["libtokenizer-6.0.ss" "libtokenizer.fasl"] - ["libexpand-6.0.ss" "libexpand.fasl"] - ["libinterpret-6.0.ss" "libinterpret.fasl"] - ;["libintelasm-6.0.ss" "libintelasm.fasl"] - ["libcafe-6.0.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] -; ["libposix-5.7.ss" "libposix-5.3.s" "libposix" ] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - -(define primitive? - (lambda (x) - (or (assq x open-coded-primitives) - (memq x public-primitives)))) - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - ;;; - ;;; hash tables - ;;; - [make-hash-table 0 value] - [hash-table? 1 pred] - ;;; - ;;; asm - ;;; - ;[code? 1 pred] - ;[$code-instr-size 1 value] - ;[$code-reloc-size 1 value] - ;[$code-closure-size 1 value] - ;[$code->closure 1 value] - ;[$set-code-byte! 3 effect] - ;[$set-code-word! 3 effect] - ;[$set-code-object! 4 effect] - ;[$set-code-object+offset! 5 effect] - ;[$set-code-object+offset/rel! 5 effect] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - -;;; pcb table section -(define pcb-table - '(;;; system locations used by the C/Scheme interface - [$system-stack system "system_stack"] - [$stack-top system "stack_top"] ; top of stack - [$stack-size system "stack_size"] ; its size - [$frame-base system "frame_base"] ; base of the frame - [$frame-redline system "frame_redline"] ; top + 2 pages - [$frame-pointer system "frame_pointer"] ; - [$heap-base system "heap_base"] - [$heap-size system "heap_size"] - [$allocation-redline system "allocation_redline"] - [$allocation-pointer system "allocation_pointer"] - [$roots system "roots"] - [$string-base system "string_base"] - [$string-ap system "string_ap"] - [$string-eap system "string_eap"] - [$string-pages system "string_pages"] - [$allocated-megs system "allocated_megs"] - [$allocated-bytes system "allocated_bytes"] - [$reclaimed-megs system "reclaimed_megs"] - [$reclaimed-bytes system "reclaimed_bytes"] - ;;; scheme_objects comes before all scheme objects - [$scheme-objects system "scheme_objects"] - [$next-continuation system "next_continuation"] - ;;; error handling procedures used by the codegen - [$apply-nonprocedure-error-handler library] - [$incorrect-args-error-handler library] - [$multiple-values-error library] - [$intern library] - [do-overflow library] - [do-vararg-overflow library] - [do-stack-overflow library] - ;;; type predicates - [fixnum? public] - [immediate? public] - [boolean? public] - [char? public] - [null? public] - [pair? public] - [symbol? public] - [vector? public] - [string? public] - [procedure? public] - [eof-object? public] - [not public] - [eq? public] - [equal? public] - ;;; fixnum primitives - [fxadd1 public] - [fxsub1 public] - [fx+ public] - [fx- public] - [fx* public] - [fxsll public] - [fxsra public] - [fxlogor public] - [fxlogand public] - [fxlogxor public] - [fxlognot public] - [fxquotient public] - [fxremainder public] - [fxmodulo public] - ;;; fixnum predicates - [fxzero? public] - [fx= public] - [fx< public] - [fx<= public] - [fx> public] - [fx>= public] - ;;; characters - [char= public] - [char< public] - [char<= public] - [char> public] - [char>= public] - [integer->char public] - [char->integer public] - ;;; lists - [cons public] - [car public] - [cdr public] - [caar public] - [cadr public] - [cdar public] - [cddr public] - [caaar public] - [caadr public] - [cadar public] - [caddr public] - [cdaar public] - [cdadr public] - [cddar public] - [cdddr public] - [caaaar public] - [caaadr public] - [caadar public] - [caaddr public] - [cadaar public] - [cadadr public] - [caddar public] - [cadddr public] - [cdaaar public] - [cdaadr public] - [cdadar public] - [cdaddr public] - [cddaar public] - [cddadr public] - [cdddar public] - [cddddr public] - [set-car! public] - [set-cdr! public] - [list public] - [list* ADDME] - [list? public] - [list-ref public] - [length public] - [make-list public] - [reverse public] - [append public] - [list-ref public] - [memq public] - [assq public] - [map public] - [for-each public] - [andmap public] - [ormap public] - ;;; vectors - [make-vector public] - [vector public] - [vector-length public] - [vector-ref public] - [vector-set! public] - [list->vector public] - [vector->list public] - ;;; strings - [make-string public] - [string public] - [string-length public] - [string-ref public] - [string-set! public] - [list->string public] - [string->list public] - [string-append public] - [substring public] - [string=? public] - [fixnum->string public] - ;;; symbols - [gensym public] - [gensym? public] - [symbol->string public] - [gensym->unique-string public] - [gensym-prefix public] - [gensym-count public] - [print-gensym public] - [string->symbol public] - [top-level-value public] - [top-level-bound? public] - [set-top-level-value! public] - [getprop public] - [putprop public] - [remprop public] - [property-list public] - [oblist public] - [uuid public] - ;;; eof - [eof-object public] - [void public] - ;;; control/debugging - [print-error public] - [error public] - [current-error-handler public] - [exit public] - [apply public] - [make-parameter public] - ;;; output - [output-port? public] - [console-output-port public] - [current-output-port public] - [standard-output-port public] - [standard-error-port public] - [open-output-file public] - [open-output-string public] - [with-output-to-file public] - [call-with-output-file public] - [with-input-from-file public] - [call-with-input-file public] - [get-output-string public] - [close-output-port public] - [flush-output-port public] - [write-char public] - [output-port-name public] - [newline public] - ;;; input - [input-port? public] - [standard-input-port public] - [console-input-port public] - [current-input-port public] - [open-input-file public] - [close-input-port public] - [reset-input-port! public] - [read-char public] - [peek-char public] - [unread-char public] - [input-port-name public] - ;;; writing/printing - [write public] - [display public] - [printf public] - [fprintf public] - [format public] - [read-token public] - [read public] - ;;; evaluation - [primitive? public] - [expand public] - [core-expand public] - [current-expand public] - [interpret public] - [eval public] - [current-eval public] - [load public] - [new-cafe public] - [collect public] - [call/cc public] - [call/cf library] - [dynamic-wind public] - [values public] - [call-with-values public] - [make-traced-procedure library] - [trace-symbol! library] - [untrace-symbol! library] - ;;; record - [record? public] - [record-rtd public] - [record-name public] - [record-printer public] - [record-length public] - [record-ref public] - [record-set! public] - ;;; record rtds - [make-record-type public] - [record-constructor public] - [record-predicate public] - [record-field-accessor public] - [record-field-mutator public] - ;;; asm - [make-code public] - [code? public] - [make-code-executable! public] - [code-instr-size public] - [code-reloc-size public] - [code-closure-size public] - [set-code-byte! public] - [set-code-word! public] - [set-code-object! public] - [set-code-foreign-object! public] - [set-code-object+offset! public] - [set-code-object+offset/rel! public] - [set-code-object/reloc/relative! public] - [code->closure public] - [list*->code* library] - ;;; - ;;; POSIX - ;;; - [fork public] - [posix-fork public] - [system public] - - [$debug public] - [$underflow-misaligned-error public] - ;;; - [$scheme-objects-end system "scheme_objects_end"] - )) - -(define (public-primitives) - (let f ([ls pcb-table]) - (cond - [(null? ls) '()] - [(eq? (cadar ls) 'public) - (cons (caar ls) (f (cdr ls)))] - [else (f (cdr ls))]))) - -(define (library-primitives) - (let f ([ls pcb-table]) - (cond - [(null? ls) '()] - [(eq? (cadar ls) 'library) - (cons (caar ls) (f (cdr ls)))] - [else (f (cdr ls))]))) - - - - -(define (pcb-system-loc? x) - (cond - [(assq x pcb-table) => - (lambda (x) (eq? (cadr x) 'system))] - [else (error 'pcb-system-loc? "not in table ~s" x)])) - -(define *pcb-set-marker* (gensym)) - -(define *pcb-ref-marker* (gensym)) - -(define (mark-pcb-set-found x) - (putprop x *pcb-set-marker* #t)) - -(define (mark-pcb-ref-found x) - (putprop x *pcb-ref-marker* #t)) - -(define (pcb-referenced? x) - (getprop x *pcb-ref-marker*)) - -(define (pcb-assigned? x) - (getprop x *pcb-set-marker*)) - -(define (pcb-index x) - (error 'pcb-index "dead on ~s" x) - (mark-pcb-ref-found x) - (let f ([i 0] [ls pcb-table]) - (cond - [(null? ls) - (error 'pcb-index "not in table ~s" x)] - [(eq? x (caar ls)) i] - [else (f (fxadd1 i) (cdr ls))]))) - -(define (pcb-offset x) - (fx* (pcb-index x) wordsize)) - -(define (primitive? x) - (cond - [(assq x pcb-table) #t] - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [(assq x pcb-table) #f] - [else (error 'open-codeable "invalid primitive ~s" x)])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -(define (pcb-cname x) - (define (cname x i) - (cond - [(eq? (cadr x) 'system) (caddr x)] - [else (format "prim_~a" i)])) - (let f ([ls pcb-table] [i 0]) - (cond - [(null? ls) (error 'pcb-cname "invalid name ~s" x)] - [(eq? (caar ls) x) (cname (car ls) i)] - [else (f (cdr ls) (fxadd1 i))]))) - -(define (pcb-cnames) - (define (cname x i) - (cond - [(eq? (cadr x) 'system) (caddr x)] - [else (format "prim_~a" i)])) - (let f ([ls pcb-table] [i 0]) - (cond - [(null? ls) '()] - [else - (cons (cname (car ls) i) (f (cdr ls) (fxadd1 i)))]))) - -;;; end of pcb table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record seq (e0 e1)) -(define-record function (arg* proper body)) -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) -(define-record codes (lhs* rhs* body)) -(define-record assign (lhs rhs)) - -(define unique-var - (let ([counter 0]) - (lambda (x) - (let ([g (gensym (format "~a:~a" x counter))]) - (set! counter (fxadd1 counter)) - (make-var g))))) - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(lambda) - (unless (fx= (length x) 3) - (error 'recordize "invalid ~s" x)) - (let ([fml* (cadr x)] [body (caddr x)]) - (let ([nfml* (gen-fml* fml*)]) - (make-function - (properize nfml*) - (list? fml*) - (E body (extend-env fml* nfml* env)))))] - [($pcb-set!) - (let ([var (quoted-sym (cadr x))] [val (caddr x)]) - (mark-pcb-set-found var) - (make-primcall '$pcb-set! - (list (make-constant (pcb-index var)) - (E val env))))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid top-level var ~s" var)))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(function args proper body) - `(lambda ,(E-args proper args) ,(E body))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes lhs* rhs* body) - `(codes ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - ;;; (define-record new-frame (base-idx size body)) - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline rator rand*) - (record-case rator - [(function fml* proper body) - (cond - [proper - (if (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body) - (begin - (warning 'compile "possible application error in ~s" - (unparse (make-funcall rator rand*))) - (make-funcall rator rand*)))] - [else - (if (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body) - (begin - (warning 'compile "possible application error in ~s" - (unparse (make-funcall rator rand*))) - (make-funcall rator rand*)))])] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (make-function fml* proper (Expr body))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (cond - [(null? x*) '()] - [else (union (Expr (car x*)) (Expr* (cdr x*)))])) - (define (Expr x) - (record-case x - [(constant) '()] - [(var) '()] - [(primref) '()] - [(bind lhs* rhs* body) - (union (Expr body) (Expr* rhs*))] - [(conditional test conseq altern) - (union (Expr test) (union (Expr conseq) (Expr altern)))] - [(seq e0 e1) (union (Expr e0) (Expr e1))] - [(function fml* proper body) (Expr body)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (union (singleton lhs) (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - -(define (rewrite-assignments assigned x) - (define who 'rewrite-assignments) - (define (fix lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix (cdr lhs*))]) - (cond - [(memq x assigned) - (let ([t (make-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(memq x assigned) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-function fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (memq lhs assigned) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - -(define (remove-assignments x) - (let ([assigned (uncover-assigned x)]) - (rewrite-assignments assigned x))) - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(function fml* proper body) - (let-values ([(body body-free) (Expr body)]) - (let ([free (difference body-free fml*)]) - (values (make-closure (make-code-rec fml* proper free body) free) - free)))] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (append a-free d-free)))])) - (define (Expr x) - (record-case x - [(constant) (values x '())] - [(var) (values x '())] - [(primref) (values x '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-codes) (Expr* rhs*)] - [(body body-codes) (Expr body)]) - (values (make-bind lhs* rhs* body) - (append rhs-codes body-codes)))] - [(conditional test conseq altern) - (let-values ([(test test-codes) (Expr test)] - [(conseq conseq-codes) (Expr conseq)] - [(altern altern-codes) (Expr altern)]) - (values (make-conditional test conseq altern) - (append test-codes conseq-codes altern-codes)))] - [(seq e0 e1) - (let-values ([(e0 e0-codes) (Expr e0)] - [(e1 e1-codes) (Expr e1)]) - (values (make-seq e0 e1) (append e0-codes e1-codes)))] - [(closure c free) - (let-values ([(c codes) - (record-case c - [(code-rec arg* proper free* body) - (let-values ([(body body-codes) (Expr body)]) - (let ([g (make-code-loc 'code)]) - (values g - (cons - (cons g (make-code-rec arg* proper free* body)) - body-codes))))] - [else (error #f "invalid code ~s" c)])]) - (values (make-closure c free) codes))] - [(primcall op rand*) - (let-values ([(rand* rand*-codes) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-codes))] - [(forcall op rand*) - (let-values ([(rand* rand*-codes) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-codes))] - [(funcall rator rand*) - (let-values ([(rator rat-codes) (Expr rator)] - [(rand* rand*-codes) (Expr* rand*)]) - (values - (make-funcall rator rand*) - (append rat-codes rand*-codes)))] - [(appcall rator rand*) - (let-values ([(rator rat-codes) (Expr rator)] - [(rand* rand*-codes) (Expr* rand*)]) - (values - (make-appcall rator rand*) - (append rat-codes rand*-codes)))] - [else (error who "invalid expression ~s" (unparse x))])) - (let-values ([(x codes) (Expr x)]) - (make-codes (map car codes) (map cdr codes) x))) - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? code? hash-table? $forward-ptr?) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-instr-size $code-reloc-size $code-closure-size - $set-code-byte! $set-code-word! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $make-record $record? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CodeExpr x) - (record-case x - [(code-rec fml* proper free* body) - (make-code-rec fml* proper free* (Tail body))])) - (define (CodesExpr x) - (record-case x - [(codes lhs* rhs* body) - (make-codes lhs* (map CodeExpr rhs*) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CodeExpr x) - (record-case x - [(code-rec fml* proper free* body) - (make-code-rec fml* proper free* (Tail body))])) - (define (CodesExpr x) - (record-case x - [(codes lhs* rhs* body) - (make-codes lhs* (map CodeExpr rhs*) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CodeExpr x) - (record-case x - [(code-rec fml* proper free* body) - (if (Tail body) - (make-code-rec fml* proper free* - (insert-check body)) - x)])) - (define (CodesExpr x) - (record-case x - [(codes lhs* rhs* body) - (make-codes lhs* (map CodeExpr rhs*) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-funcall (make-primref 'do-overflow) - (list (make-constant n))) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure code free*) - (check-const (fx+ disp-closure-data (fx* (length free*) wordsize)) x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [(make-hash-table) (check-const hash-table-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(vector) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CodeExpr x) - (record-case x - [(code-rec fml* proper free* body) - (make-code-rec fml* proper free* (Tail body))])) - (define (CodesExpr x) - (record-case x - [(codes lhs* rhs* body) - (make-codes lhs* (map CodeExpr rhs*) (Tail body))])) - (CodesExpr x)) - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp #t (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (case op -; [(values) (make-primcall op (simple* arg* r))] - [else (make-return (make-primcall op (simple* arg* r)))])] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'tail live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define (CodeExpr x) - (record-case x - [(code-rec fml* proper free* body) - (let-values ([(fml* si r live) (bind-fml* fml* (bind-free* free*))]) - (make-code-rec fml* proper free* (Tail body si r live)))])) - (define (CodesExpr x) - (record-case x - [(codes lhs* rhs* body) - (make-codes lhs* - (map CodeExpr rhs*) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag bool-f) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define wordsize 4) - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - - - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-closuresize 12) - (define disp-code-data 16) - - (define record-ptag vector-tag) - (define record-pmask vector-mask) - (define disp-record-rtd 0) - (define disp-record-data 4) - - - (define hash-table-tag #x3F) - (define disp-htable-count 4) - (define disp-htable-size 8) - (define disp-htable-mem 12) - (define hash-table-size 16) - - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define pagesize 4096)) - - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - - - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift))) - ) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) -; (mem (fx* (pcb-index op) wordsize) pcr)) -;;; (define (immediate-rep x) -;;; (cond -;;; [(fixnum? x) (fxsll x fx-shift)] -;;; [(boolean? x) (if x bool-t bool-f)] -;;; [(null? x) nil] -;;; [(char? x) (fx+ (fxsll (char->integer x) char-shift) char-tag)] -;;; [else (error 'immediate-rep "invalid immediate ~s" x)])) -;;; (define (bool-bit-to-boolean ac) -;;; (list* -;;; (movzbl al eax) -;;; (shll (int bool-shift) eax) -;;; (orl (int bool-tag) eax) -;;; ac)) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [(code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [(hash-table?) - (indirect-type-pred vector-mask vector-tag #f hash-table-tag - rand* Lt Lf ac)] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx< i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [(make-hash-table) - (list* (movl (int hash-table-tag) (mem 0 apr)) - (movl (int 0) (mem disp-htable-count apr)) - (movl (int 0) (mem disp-htable-size apr)) - (movl (int 0) (mem disp-htable-mem apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int hash-table-size) apr) - ac)] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - ;[($pcb-ref) - ; (let ([loc (car arg*)]) - ; (record-case loc - ; [(constant i) - ; (unless (fixnum? i) (error who "invalid loc ~s" loc)) - ; (list* (movl (mem (fx* i wordsize) pcr) eax) ac)] - ; [else (error who "invalid loc ~s" loc)]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-instr-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) - (cons (sall (int fx-shift) eax) ac))] - [($code-reloc-size) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-closure-size) - (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] - [($pcb-set! $set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $set-code-byte! $set-code-word! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? code? hash-table? - $record?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc (label SL_continuation_code)) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc (label SL_call_with_values)) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc (label SL_values)) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem (fx- disp-vector-data vector-tag) ebx)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] - [($set-constant!) - (NonTail (cadr arg*) - (list* (movl eax (Simple (car arg*))) ac))] -;;; [($pcb-set!) -;;; (let ([loc (car arg*)] [val (cadr arg*)]) -;;; (record-case loc -;;; [(constant i) -;;; (unless (fixnum? i) (error who "invalid loc ~s" loc)) -;;; (list* (movl (Simple val) eax) -;;; (movl eax (mem (fx* i wordsize) pcr)) -;;; ac)] -;;; [else (error who "invalid loc ~s" loc)]))] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ac)] - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem (fx- disp-record-data record-ptag) ebx)) - ac)] - [($exit) - (list* - (movl (Simple (car arg*)) eax) - (movl (pcb-ref 'frame-base) fpr) - (movl (int 0) (pcb-ref 'next-continuation)) - (jmp (label SL_scheme_exit)) - ac)] - [($set-code-byte!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (sarl (int fx-shift) ebx) - (movb bl (mem (fx- disp-code-data vector-tag) eax)) - ac)] - [($set-code-word!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movl ebx (mem (fx- disp-code-data vector-tag) eax)) - ac)] - [($set-code-object!) - (let ([code (car arg*)] [object (cadr arg*)] - [code-offset (caddr arg*)] [reloc-idx (cadddr arg*)]) - (list* - (movl (Simple code) eax) - (movl (Simple object) ebx) - (movl (Simple code-offset) edx) - (movl edx ecx) - (sarl (int fx-shift) edx) - (addl eax edx) - (movl ebx (mem (fx- disp-code-data vector-tag) edx)) - (addl (mem (fx- disp-code-instrsize vector-tag) eax) eax) - (addl (Simple reloc-idx) eax) - (movl ecx (mem (fx- disp-code-data vector-tag) eax)) - ac))] - [($set-code-object+offset!) - (let ([code (car arg*)] [object (cadr arg*)] - [code-offset (caddr arg*)] [object-offset (cadddr arg*)] - [reloc-idx (car (cddddr arg*))]) - (list* - (movl (Simple code) eax) - (movl (Simple object-offset) ebx) ; ebx = fxdisp - (sarl (int fx-shift) ebx) ; ebx = disp in bytes - (movl ebx ecx) ; ecx = disp in bytes - (addl (Simple object) ecx) ; ecx = object + disp - (movl (Simple code-offset) edx) ; edx = fx codeoffset - (sarl (int fx-shift) edx) ; edx = codeoffset in bytes - (addl eax edx) - (movl ecx (mem (fx- disp-code-data vector-tag) edx)) - (subl eax edx) - (addl (mem (fx- disp-code-instrsize vector-tag) eax) eax) - (addl (Simple reloc-idx) eax) - (sall (int fx-shift) edx) - (orl (int 1) edx) - (movl edx (mem (fx- disp-code-data vector-tag) eax)) - (movl ebx (mem (fx- (fx+ disp-code-data wordsize) vector-tag) eax)) - ac))] - [($set-code-object+offset/rel!) - (let ([code (car arg*)] [object (cadr arg*)] - [code-offset (caddr arg*)] [object-offset (cadddr arg*)] - [reloc-idx (car (cddddr arg*))]) - (list* - (movl (Simple code) eax) - (movl (Simple object-offset) ebx) - (sarl (int fx-shift) ebx) - (movl (Simple code-offset) ecx) - (orl (int 2) ecx) - (movl (mem (fx- disp-code-instrsize vector-tag) eax) edx) - (addl (Simple reloc-idx) edx) - (addl eax edx) - (movl ecx (mem (fx- disp-code-data vector-tag) edx)) - (movl ebx (mem (fx- (fx+ wordsize disp-code-data) vector-tag) edx)) - (sarl (int fx-shift) ecx) ; code offset in bytes - (addl eax ecx) - (addl (int (fx- (fx+ wordsize disp-code-data) vector-tag)) ecx) - ; ecx points to next word in stream - (addl (Simple object) ebx) ; ebx is object+objectoffset - (subl ecx ebx) ; ebx is relative offset - (movl ebx (mem (fx- 0 wordsize) ecx)) - ac))] - [($install-underflow-handler) - (list* - (movl (pcb-ref 'frame-base) eax) - (movl (label-address SL_underflow_handler) ebx) - (movl ebx (mem 0 eax)) - (movl ebx (pcb-ref 'underflow-handler)) - ac)] - [(cons void $fxadd1 $fxsub1) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address (label-name label))] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(apply) are-we-ever-here? - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - L_CALL - (call (label SL_apply)) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - L_CALL - (call (label SL_foreign_call)) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else (error who "invalid convention ~s for call-cp" convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let ([Lf (unique-label)] [Ljoin (unique-label)]) - (Pred test #f Lf - (Effect conseq - (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (NonTail body - (cond - [check - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac)] - [else - (list* - (movl eax cpr) - ac)]))] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(new-frame idx size body) - (Tail body ac)] - [(call-cp call-convention rp-convention idx argc mask) - (unless (eq? rp-convention 'tail) - (error who "nontail rp (~s) in tail context" rp-convention)) - (let f ([i 0]) - (cond - [(fx= i argc) - (case call-convention - [(normal) - (list* - (movl (int (argc-convention argc)) eax) - (tail-indirect-cpr-call) - ac)] - [(apply) - (list* - (movl (int (argc-convention argc)) eax) - (jmp (label SL_apply)) - ac)] - [else (error who "invalid conv ~s in tail call-cpr" convention)])] - [else - (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) - (fx- 0 wordsize)) fpr) - eax) - (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) - (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (handle-procedure-entry proper fml-count ac) - (cond - [proper - (list* (cmpl (int (argc-convention fml-count)) eax) - (jne (label SL_invalid_args)) - ac)] - [else (handle-vararg fml-count ac)])) - (define emit-code - (lambda (label x) - (record-case x - [(code-rec fml* proper free* body) - (list* - (fx+ disp-closure-data (fx* wordsize (length free*))) - label - (handle-procedure-entry proper (length fml*) - (Tail body '())))]))) - (define (emit-codes prog) - (record-case prog - [(codes lhs* rhs* body) - (let ([label* (map (lambda (x) (unique-label)) lhs*)] - [main (unique-label)]) - (for-each set-code-loc-label! lhs* label*) - (let ([procs (map emit-code label* rhs*)] - [main-proc (cons 0 (Tail body '()))]) - (cons main-proc procs)))])) - (define label-name cadr) - (emit-codes x)) - -(define SL_nonprocedure (gensym "SL_nonprocedure")) -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(list*->code* - (list - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)] - ) - (list disp-closure-data - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list disp-closure-data - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - -;;; (list 'public-function -;;; "SL_scheme_exit" -;;; 0 -;;; (movl apr (mem (pcb-offset '$allocation-pointer) pcr)) -;;; (cmpl (pcb-ref 'frame-base) fpr) -;;; (jne (label "L_scheme_exit_fp_mismatch")) -;;; (movl (mem (pcb-offset '$system-stack) pcr) esp) -;;; (pop ebp) -;;; (pop edi) -;;; (pop esi) -;;; (pop ebx) -;;; (ret) -;;; (label "L_scheme_exit_fp_mismatch") -;;; (movl (int 0) eax) -;;; (movl (mem 0 eax) eax)) - - - ;;;; (let ([L_umv_last_continuation (gensym)] - ;;;; [L_umv_stack_overflow (gensym)] - ;;;; [L_umv_heap_overflow (gensym)] - ;;;; [L_umv_bad_rp (gensym)] - ;;;; [L_umv_bad_fpr (gensym)] - ;;;; [L_umv_copy_frame_done (gensym)] - ;;;; [L_umv_copy_frame_loop (gensym)] - ;;;; [L_umv_copy_values_done (gensym)] - ;;;; [L_umv_copy_values_loop (gensym)] - ;;;; [L_umv_no_stack_overflow (gensym)] - ;;;; [L_umv_single_frame (gensym)] - ;;;; [L_umv_split_continuation (gensym)] - ;;;; [L_umv_framesz_ok (gensym)] - ;;;; ) - ;;;; (list 0 - ;;;; (label SL_underflow_multiple_values) - ;;;; ;;; So, we are underflowing with multiple values - ;;;; ;;; the index of the last value is in %eax - ;;;; ;;; so, the last value is in 0(%fpr,%eax) - ;;;; ;;; What we need to do is shift the values up by the - ;;;; ;;; size of the next frame, copy the frame over, - ;;;; ;;; adjust the frame pointer, then mv-return to the - ;;;; ;;; next frame. - ;;;; ;;; Caveats: - ;;;; ;;; * may need to split the next-k if it's more than - ;;;; ;;; one frame - ;;;; ;;; * splitting the continuation may heap-overflow - ;;;; ;;; * the required stack size (to hold the values and - ;;;; ;;; the previous frame) may actually cause a stack - ;;;; ;;; overflow! - ;;;; ;;; - ;;;; ; First, do some assertions - ;;;; (cmpl (pcb-ref 'frame-base) fpr) - ;;;; (jne (label L_umv_bad_fpr)) - ;;;; (cmpl (label-address SL_underflow_handler) (mem 0 fpr)) - ;;;; (jne (label L_umv_bad_rp)) - ;;;; (movl (pcb-ref 'next-continuation) ebx) - ;;;; (cmpl (int 0) ebx) - ;;;; (je (label L_umv_last_continuation)) - ;;;; ; all is good, now check that we have one frame - ;;;; (movl (mem (fx- disp-continuation-top vector-tag) ebx) ecx) ; top - ;;;; (movl (mem 0 ecx) edx) ; return-point - ;;;; (movl (mem disp-frame-size edx) edx) ; framesize - ;;;; (cmpl (int 0) edx) - ;;;; (jne (label L_umv_framesz_ok)) - ;;;; (movl (mem wordsize ecx) edx) ; load framesize from top[1] - ;;;; ; argc=%eax, next_k=%ebx, frametop=%ecx, framesize=%edx - ;;;; (label L_umv_framesz_ok) - ;;;; (cmpl (mem (fx- disp-continuation-size vector-tag) ebx) edx) - ;;;; (je (label L_umv_single_frame)) -;;;;;;; - ;;;; (cmpl (pcb-ref 'allocation-redline) apr) - ;;;; (jge (label L_umv_heap_overflow)) - ;;;; (label L_umv_split_continuation) - ;;;; ; ebx=cc, ecx=cont_top, edx=top_frame_size - ;;;; (movl (int continuation-tag) (mem 0 apr)) - ;;;; (addl edx ecx) - ;;;; (movl ecx (mem disp-continuation-top apr)) - ;;;; (movl (mem (fx- disp-continuation-size vector-tag) ebx) ecx) - ;;;; (subl edx ecx) - ;;;; (movl ecx (mem disp-continuation-size apr)) - ;;;; (movl edx (mem (fx- disp-continuation-size vector-tag) ebx)) - ;;;; (movl (mem (fx- disp-continuation-next vector-tag) ebx) ecx) - ;;;; (movl ecx (mem disp-continuation-next apr)) - ;;;; (movl apr ecx) - ;;;; (addl (int vector-tag) ecx) - ;;;; (movl ecx (mem (fx- disp-continuation-next vector-tag) ebx)) - ;;;; (addl (int continuation-size) apr) - ;;;; (movl (mem (fx- disp-continuation-top vector-tag) ebx) ecx) -;;;;;;; - ;;;; (label L_umv_single_frame) - ;;;; ; argc=%eax, next_k=%ebx, frametop=%ecx, framesize=%edx - ;;;; (negl edx) - ;;;; (addl eax edx) ; %edx is the offset to the last req cell - ;;;; (addl fpr edx) ; %edx is the address of the last req cell - ;;;; (cmpl (pcb-ref 'frame-redline) edx) - ;;;; (jle (label L_umv_stack_overflow)) - ;;;; (label L_umv_no_stack_overflow) - ;;;; (movl (mem (fx- disp-continuation-size vector-tag) ebx) edx) - ;;;; (cmpl (int 0) eax) - ;;;; (je (label L_umv_copy_values_done)) - ;;;; ; make ecx point to the last arg, edx is the shift amount - ;;;; (negl edx) - ;;;; (movl fpr ecx) - ;;;; (addl eax ecx) - ;;;; (label L_umv_copy_values_loop) - ;;;; (movl (mem 0 ecx) ebx) - ;;;; (movl ebx (mem edx ecx)) - ;;;; (addl (int wordsize) ecx) - ;;;; (cmpl ecx fpr) - ;;;; (jne (label L_umv_copy_values_loop)) - ;;;; (negl edx) - ;;;; (label L_umv_copy_values_done) - ;;;; ; now all the values were copied to their new locations - ;;;; ; so, now, we copy the next frame - ;;;; (movl (pcb-ref 'next-continuation) ebx) - ;;;; (movl (mem (fx- disp-continuation-top vector-tag) ebx) ecx) - ;;;; ; %ebx=next_k, %ecx=frame_top, %edx=framesize, %eax=argc - ;;;; (label L_umv_copy_frame_loop) - ;;;; (subl (int wordsize) edx) - ;;;; (pushl (mem edx ecx)) - ;;;; (cmpl (int 0) edx) - ;;;; (jne (label L_umv_copy_frame_loop)) - ;;;; (label L_umv_copy_frame_done) - ;;;; ;;; okay, almost done - ;;;; ;;; set next k appropriately - ;;;; (movl (mem (fx- disp-continuation-next vector-tag) ebx) ebx) - ;;;; (movl ebx (pcb-ref 'next-continuation)) - ;;;; (movl (mem 0 fpr) ebx) - ;;;; (jmp (mem disp-multivalue-rp ebx)) ; go - ;;;; ;;; - ;;;; (label L_umv_bad_fpr) - ;;;; (movl (int 0) eax) (movl (mem 0 eax) eax) - ;;;; (label L_umv_bad_rp) - ;;;; (movl (int 0) eax) (movl (mem 0 eax) eax) - ;;;; (label L_umv_heap_overflow) - ;;;; (movl (int 0) eax) (movl (mem 0 eax) eax) - ;;;; (label L_umv_stack_overflow) - ;;;; (movl (int 0) eax) (movl (mem 0 eax) eax) - ;;;; (label L_umv_last_continuation) - ;;;; (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - -;;; (list 0 -;;; (label SL_scheme_exit) -;;; (jmp (pcb-ref 'return-point))) - -;;; (let ([L_underflow_overflow_call (gensym)] -;;; [L_underflow_heap_overflow (gensym)] -;;; [L_underflow_misaligned (gensym)] -;;; [L_underflow_no_rp (gensym)] -;;; [L_underflow_copy_loop (gensym)] -;;; [L_underflow_single_frame (gensym)] -;;; [L_underflow_multiple_frames (gensym)] -;;; [L_underflow_normal_frame (gensym)] -;;; [L_underflow_special_frame (gensym)] -;;; [L_underflow_frame_ok (gensym)]) -;;; (list 0 -;;; ;(gensym) ; L_underflow -;;; (label-address SL_underflow_multiple_values) -;;; (byte-vector -;;; (make-vector (fx- 0 (fx+ wordsize disp-multivalue-rp)) 0)) -;;; (label SL_underflow_handler) -;;; ; since we underflow with a call to (ret), the current fp -;;; ; is below the valid stack, so we advance it up to point -;;; ; to the underflow handler that caused the ret -;;; (subl (int wordsize) fpr) -;;; ; load next continuation into ebx, and if ebx=0, exit -;;; ; since the computation is complete -;;; (movl (pcb-ref 'next-continuation) ebx) -;;; (cmpl (int 0) ebx) -;;; (je (label SL_scheme_exit)) -;;; ; sanity check that fpr *is* where it should be -;;; (cmpl (pcb-ref 'frame-base) fpr) -;;; (jne (label L_underflow_misaligned)) -;;; (label L_underflow_frame_ok) -;;; ; sanity check that 0(fpr) does contain underflow hander -;;; (cmpl (label-address SL_underflow_handler) (mem 0 fpr)) -;;; (jne (label L_underflow_no_rp)) -;;; ; save the value of eax -;;; (pushl eax) -;;; ; now ebx=next_cont -;;; (movl (mem (fx- disp-continuation-top vector-tag) ebx) ecx) -;;; ; ebx=cc, ecx=cont_top -;;; (movl (mem (fx- disp-continuation-size vector-tag) ebx) eax) -;;; ; ebx=cc, ecx=cont_top, eax=cont_size -;;; (movl (mem 0 ecx) edx) ; return point is in edx -;;; ; ebx=cc, ecx=cont_top, eax=cont_size, edx=rp -;;; (movl (mem disp-frame-size edx) edx) ; size -;;; ; ebx=cc, ecx=cont_top, eax=cont_size, edx=top_frame_size -;;; (cmpl (int 0) edx) -;;; (jne (label L_underflow_normal_frame)) -;;; (label L_underflow_special_frame) -;;; -;;; -;;; (movl (primref-loc '$debug) cpr) -;;; (movl (obj "BUG:SPECIAL") eax) -;;; (movl eax (mem (fx- 0 wordsize) fpr)) -;;; (movl (int (fx- 0 wordsize)) eax) -;;; (tail-indirect-cpr-call) -;;; -;;; -;;; -;;; (movl (int 0) eax) -;;; (movl (mem 0 eax) eax) -;;; (label L_underflow_normal_frame) -;;; -;;; -;;; -;;; ; ebx=cc, ecx=cont_top, eax=cont_size, edx=top_frame_size -;;; (cmpl eax edx) -;;; (je (label L_underflow_single_frame)) -;;; (label L_underflow_multiple_frames) -;;; -;;; (cmpl (pcb-ref 'allocation-redline) apr) -;;; (jge (label L_underflow_heap_overflow)) -;;; -;;; ; ebx=cc, ecx=cont_top, eax=cont_size, edx=top_frame_size -;;; (movl (int continuation-tag) (mem 0 apr)) -;;; (subl edx eax) -;;; ; ebx=cc, ecx=cont_top, eax=remaining_size, edx=top_frame_size -;;; (movl eax (mem disp-continuation-size apr)) -;;; (movl edx (mem (fx- disp-continuation-size vector-tag) ebx)) -;;; (addl edx ecx) -;;; ; ebx=cc, ecx=next_cont_top, eax=remaining_size, edx=top_frame_size -;;; (movl ecx (mem disp-continuation-top apr)) -;;; (subl edx ecx) -;;; ; ebx=cc, ecx=cont_top, eax=next_cont, edx=top_frame_size -;;; (movl (mem (fx- disp-continuation-next vector-tag) ebx) eax) -;;; (movl eax (mem disp-continuation-next apr)) -;;; (movl apr eax) -;;; (addl (int vector-tag) eax) -;;; (addl (int continuation-size) apr) -;;; (movl eax (mem (fx- disp-continuation-next vector-tag) ebx)) -;;; ; framesize=edx, top=ecx, cc=ebx -;;; (label L_underflow_single_frame) -;;; -;;; ;;; HERE -;;; -;;; ; advance cc -;;; (movl (mem (fx- disp-continuation-next vector-tag) ebx) eax) -;;; (movl eax (pcb-ref 'next-continuation)) -;;; (popl eax) ; pop the return value -;;; (label L_underflow_copy_loop) -;;; (subl (int wordsize) edx) -;;; (movl (mem ecx edx) ebx) -;;; (pushl ebx) -;;; (cmpl (int 0) edx) -;;; (jg (label L_underflow_copy_loop)) -;;; -;;;;;; (movl (primref-loc '$debug) cpr) -;;;;;; ;;; (movl (obj "SINGLE FRAME LOOP DONE") eax) -;;;;;; (movl eax (mem (fx- 0 wordsize) fpr)) -;;;;;; (movl (int (fx- 0 wordsize)) eax) -;;;;;; (tail-indirect-cpr-call) -;;; -;;; (ret) -;;; (label L_underflow_no_rp) -;;; (movl (int 0) eax) -;;; (movl (mem 0 eax) eax) -;;; (label L_underflow_misaligned) -;;; (movl (pcb-ref 'frame-base) fpr) -;;; (movl (int 0) eax) -;;; (movl (int 0) eax) -;;; (movl (mem 0 eax) eax) -;;; (movl (primref-loc '$underflow-misaligned-error) cpr) -;;; (tail-indirect-cpr-call) -;;; (label L_underflow_heap_overflow) -;;; ; the return value that was in %eax was pushed previously -;;; ; so, we push the frame size next -;;; (pushl (int (fx* 3 wordsize))) -;;; (movl (primref-loc 'do-overflow) cpr) -;;; (movl (int (argc-convention 0)) eax) -;;; (jmp (label L_underflow_overflow_call)) -;;; ; NEW FRAME -;;; (int 0) -;;; '(current-frame-offset) -;;; (int 0) -;;; (byte 0) -;;; (byte 0) -;;; (label L_underflow_overflow_call) -;;; (indirect-cpr-call) -;;; (popl eax) ; pop framesize -;;; (popl eax) ; actual return value and underflow again -;;; (ret))) -;;; - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list - (fx+ disp-closure-data wordsize) - (label SL_continuation_code) - - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - - (label L_cont_mult_args) - -;;; (movl (primref-loc '$debug) cpr) -;;; (movl (obj "CALLCC MULTI") eax) -;;; (movl eax (mem (fx- 0 wordsize) fpr)) -;;; (movl (int (fx- 0 wordsize)) eax) -;;; (tail-indirect-cpr-call))) - - - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - )) - - - -(define (compile-program original-program) - (let* (;;; - [p (expand original-program)] - [p (recordize p)] - [p (optimize-direct-calls p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - ;[p (lift-complex-constants p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - ;[f (pretty-print (unparse p))] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (fasl-write (car code*) (compile-port)))) - - -(define compile-expr - (lambda (expr output-file) - (let ([op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op]) - (compile-program expr)) - (close-output-port op)))) - -(define compile-file - (lambda (input-file output-file) - (let ([ip (open-input-file input-file)] - [op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (compile-program x) - (f))))) - (close-input-port ip) - (close-output-port op)))) - - -(parameterize ([assembler-output #f]) - (for-each - (lambda (x) - (printf "compiling ~a ...\n" x) - (compile-file (car x) (cadr x))) - scheme-library-files) - ) - - - - - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - - -(define replace-safe-prims-with-unsafe - (lambda (x) - (define prims - '([fx+ $fx+] [fx- $fx-] [fx* $fx*] [fxadd1 $fxadd1] [fxsub1 $fxsub1] - [fxlogand $fxlogand] [fxlogor $fxlogor] [fxlognot $fxlognot] - [fx= $fx=] [fx< $fx<] [fx<= $fx<=] [fx> $fx>] [fx>= $fx>=] - [fxzero? $fxzero?] - [fixnum->char $fixnum->char] [char->fixnum $char->fixnum] - [char= $char=] - [char< $char<] [char> $char>] [char<= $char<=] [char>= $char>=] - [car $car] [cdr $cdr] [set-car! $set-car!] [set-cdr! $set-cdr!] - [vector-length $vector-length] [vector-ref $vector-ref] - [vector-set! $vector-set!] [make-vector $make-vector] - [string-length $string-length] [string-ref $string-ref] - [string-set! $string-set!] [make-string $make-string] - )) - (define (E x) - (cond - [(pair? x) (cons (E (car x)) (E (cdr x)))] - [(symbol? x) - (cond - [(assq x prims) => cadr] - [else x])] - [else x])) - (E x))) - -(parameterize ([input-filter - (lambda (x) - `(begin (write (eval ',x)) (newline) (exit 0)))]) - (test-all)) - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char= x #\newline) - '() - (cons x (f)))))))) - -(compile-expr - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)) - "petite-ikarus.fasl") - -#!eof - - -(define (emit-linear-code obj*) - (define who 'emit-linear-code) - (define (arg x) - (cond - [(not (pair? x)) (error who "invalid arg ~s" x)] - [else - (case (car x) - [(register) (cadr x)] - [(label) (cadr x)] - [(label-address) (format "$~a" (cadr x))] - [(integer) (format "$~a" (cadr x))] - [(biginteger) ;;; ARGHHHH - (format "$(~a<<~a)" (cadr x) fx-shift)] - [(mem) - (cond - [(fixnum? (cadr x)) - (format "~a(~a)" (cadr x) (arg (caddr x)))] - [else - (format "(~a,~a)" (arg (cadr x)) (arg (caddr x)))])] - [(indirect) (format "*~a" (arg (cadr x)))] - [else (error who "invalid arg ~s" x)])])) - (define (emit-generic x) - (case (length x) - [(1) (emit " ~a" (car x))] - [(2) (emit " ~a ~a" (car x) (arg (cadr x)))] - [(3) (emit " ~a ~a, ~a" (car x) (arg (cadr x)) (arg (caddr x)))] - [else (error 'emit-generic "invalid format ~s" x)])) - (define (emit-instruction x) - (case (car x) - [(pop movl movb push call ret cltd - cmpl je jne jl jle jg jge jb jbe ja jae - jmp sete setl setle setg setge movzbl pushl popl - addl subl orl xorl andl notl sall shrl sarl imull idivl negl) - (emit-generic x)] - [(nop) (void)] - [(label) (emit "~a:" (cadr x))] - [(comment) (emit "/* ~s */" (cadr x))] - [(integer) - (emit ".long ~s" (cadr x))] - [(byte) - (emit ".byte ~s" (cadr x))] - [(byte-vector) - (let f ([v (cadr x)] [i 0]) - (unless (fx= i (vector-length v)) - (emit ".byte ~s" (vector-ref v i)) - (f v (fxadd1 i))))] - [(label-address) - (emit ".long ~a" (cadr x))] - [(global) - (emit ".globl ~a" (cadr x))] - [(current-frame-offset) - (emit ".long 0 # FRAME OFFSET")] - [else (error 'emit-instruction "unsupported instruction ~s" (car x))])) - (define (emit-function-header x) - (let ([t (car x)] [label (cadr x)] [closure-size (caddr x)]) - (emit ".text") - (when (eq? t 'public-function) - (emit ".globl ~a" label)) - (emit ".type ~a @function" label) - (emit ".align 8") - (emit ".long ~a" code-tag) ; tag - (emit ".long 0") ; instr size - (emit ".long 0") ; reloc size - (emit ".long ~s" closure-size) - (emit "~a:" label))) - (define (emit-function x) - (emit-function-header x) - (for-each emit-instruction (cdddr x))) - (define (emit-data x) - (let ([t (car x)] [label (cadr x)] [value (caddr x)]) - (emit ".data") - (emit ".align 4") - (when (eq? t 'global-data) - (emit ".globl ~a" label)) - (emit ".type ~a, @object" label) - (emit ".size ~a, 4" label) - (emit "~a:" label) - (emit ".long ~s" value))) - (define (emit-object x) - (case (car x) - [(public-function local-function) (emit-function x)] - [(data global-data) (emit-data x)] - [else (error who "invalid object ~s" (car x))])) - (for-each emit-object obj*)) - -(define (compile-program x) - (compile-program-with-entry x "scheme")) - - - -(define (file-content x) - (let ([p (open-input-file x)]) - (let f () - (let ([x (read p)]) - (cond - [(eof-object? x) - (close-input-port p) - '()] - [else - (cons x (f))]))))) - - -(define (generate-library x) - (let ([input-file-name (car x)] - [output-file-name (cadr x)] - [entry-name (caddr x)]) - (printf "compiling ~s\n" input-file-name) - (let ([prog (cons 'begin (file-content input-file-name))]) - (let ([op (open-output-file output-file-name 'replace)]) - (parameterize ([compile-port op] - [signal-error-on-undefined-pcb #f]) - (compile-program-with-entry prog entry-name)) - (close-output-port op))))) - - - - - -(define generate-top-level - (lambda () - `(let ([g (gensym "*scheme*")]) - ($pcb-set! primitive - (lambda (x) - (unless (symbol? x) - (error 'primitive "~s is not a symbol" x)) - (getprop x g))) - ,@(map (lambda (x) - `(begin - ($set-symbol-value! ',x ,x) - (putprop ',x g ,x))) - (public-primitives)) - ,@(map (lambda (x) - `(begin - (putprop ',x g ,x))) - (library-primitives)) - ))) - - -(define (build-autogenerated-prog prog-name prog asm-file libname) - (printf "compiling ~s\n" prog-name) - (let ([op (open-output-file asm-file 'replace)]) - (parameterize ([compile-port op]) - (compile-program-with-entry prog libname)) - (close-output-port op))) - -(define (generate-scheme-h) - (let ([p (open-output-file "scheme.h" 'replace)]) - (define (def name val) - (fprintf p "#define ~a ~a\n" name val)) - (define (defp name val) - (fprintf p "#define ~a ((ptr)~a)\n" name val)) - (fprintf p "/* automatically generated, do not edit */\n") - (fprintf p "#ifndef SCHEME_H\n") - (fprintf p "#define SCHEME_H\n") - (fprintf p "typedef char* ptr;\n") - (def "fx_shift" fx-shift) - (def "fx_mask" fx-mask) - (def "fx_tag" fx-tag) - (defp "bool_f" bool-f) - (defp "bool_t" bool-t) - (def "bool_mask" bool-mask) - (def "bool_tag" bool-tag) - (def "bool_shift" bool-shift) - (defp "empty_list" nil) - (def "wordsize" wordsize) - (def "char_shift" char-shift) - (def "char_tag" char-tag) - (def "char_mask" char-mask) - (def "pair_mask" pair-mask) - (def "pair_tag" pair-tag) - (def "disp_car" disp-car) - (def "disp_cdr" disp-cdr) - (def "pair_size" pair-size) - (def "symbol_mask" symbol-mask) - (def "symbol_tag" symbol-tag) - (def "disp_symbol_string" disp-symbol-string) - (def "disp_symbol_value" disp-symbol-value) - (def "symbol_size" symbol-size) - (def "vector_tag" vector-tag) - (def "vector_mask" vector-mask) - (def "disp_vector_length" disp-vector-length) - (def "disp_vector_data" disp-vector-data) - (def "string_mask" string-mask) - (def "string_tag" string-tag) - (def "disp_string_length" disp-string-length) - (def "disp_string_data" disp-string-data) - (def "closure_mask" closure-mask) - (def "closure_tag" closure-tag) - (def "disp_closure_data" disp-closure-data) - (def "disp_closure_code" disp-closure-code) - (def "record_pmask" record-pmask) - (def "record_ptag" record-ptag) - (def "disp_record_data" disp-record-data) - (def "disp_record_rtd" disp-record-rtd) - - (def "continuation_tag" continuation-tag) - (def "disp_continuation_top" disp-continuation-top) - (def "disp_continuation_size" disp-continuation-size) - (def "disp_continuation_next" disp-continuation-next) - (def "continuation_size" continuation-size) - - (def "code_tag" code-tag) - (def "disp_code_instrsize" disp-code-instrsize) - (def "disp_code_relocsize" disp-code-relocsize) - (def "disp_code_closuresize" disp-code-closuresize) - (def "disp_code_data" disp-code-data) - - (def "disp_frame_offset" disp-frame-offset) - (def "disp_frame_size" disp-frame-size) - (def "object_alignment" object-alignment) - (def "align_shift" align-shift) - - (fprintf p "typedef struct {\n") - (for-each - (lambda (x) (fprintf p " ptr ~a;\n" x)) - (pcb-cnames)) - (fprintf p "} pcb_t;\n") - (fprintf p "ptr scheme_entry(pcb_t* pcb);\n") - (fprintf p "extern ptr scheme_main(pcb_t* pcb);\n") - (fprintf p "#endif /* SCHEME_H */\n") - (close-output-port p))) - -(define (generate-scheme-c) - (let ([p (open-output-file "scheme.c" 'replace)]) - (fprintf p "/* automatically generated, do not edit */\n") - (fprintf p "#include \"scheme.h\"\n") - (fprintf p "#include \n") - (fprintf p "ptr scheme_main(pcb_t* pcb){\n") - (fprintf p "extern void S_add_roots(pcb_t*,int*);\n") - (fprintf p "extern void S_check_roots(pcb_t*,int*);\n") - (fprintf p "extern void SL_values();\n") - (fprintf p "extern void SL_call_with_values();\n") - (for-each (lambda (x) - (let ([name (caddr x)]) - (fprintf p "extern void ~a_entry(pcb_t*);\n" name) - (fprintf p "extern int ~a_constant_count;\n" name))) - scheme-library-files) - (fprintf p "extern void ~a_entry(pcb_t*);\n" "libtoplevel") - (fprintf p "extern void ~a_entry(pcb_t*);\n" "libcxr") - (fprintf p "char** ap = (char**) pcb->allocation_pointer;\n") - (fprintf p "ap[0] = (char*) SL_values;\n") - (fprintf p "ap[1] = 0;\n") - (fprintf p "pcb->~a = ((char*)ap) + closure_tag;\n" - (pcb-cname 'values)) - (fprintf p "ap += 2;\n") - (fprintf p "ap[0] = (char*) SL_call_with_values;\n") - (fprintf p "ap[1] = 0;\n") - (fprintf p "pcb->~a = ((char*)ap) + closure_tag;\n" - (pcb-cname 'call-with-values)) - (fprintf p "ap += 2;\n") - (fprintf p "pcb->allocation_pointer = (char*)ap;\n") - (mark-pcb-set-found 'values) - (mark-pcb-set-found 'call-with-values) - (for-each - (lambda (x) - (let ([name (caddr x)]) - (fprintf p " S_add_roots(pcb, &~a_constant_count);\n" name) - (fprintf p " ~a_entry(pcb);\n" name) - (fprintf p " S_check_roots(pcb, &~a_constant_count);\n" name))) - scheme-library-files) - (fprintf p " libcxr_entry(pcb);\n"); - (fprintf p " libtoplevel_entry(pcb);\n"); - (fprintf p " return scheme_entry(pcb);\n"); - (fprintf p "}\n") - (close-output-port p))) - -(define (generate-scheme-asm) - (let ([p (open-output-file "scheme_asm.s" 'replace)]) - (parameterize ([compile-port p]) - (emit "# AUTOMATICALLY GENERATED, DO NOT EDIT") - (emit-linear-code (asm-helper-code))) - (close-output-port p))) - -(define (generate-scheme-runtime-helpers) - (generate-scheme-h) - (generate-scheme-c) - (generate-scheme-asm)) - - - -(define (string-join sep str*) - (cond - [(null? str*) ""] - [(null? (cdr str*)) (car str*)] - [else (string-append (car str*) sep (string-join sep (cdr str*)))])) - -(printf "Generating C Helpers\n") -(generate-scheme-runtime-helpers) -(printf "Generating libraries\n") -(for-each generate-library scheme-library-files) - -(build-autogenerated-prog - 'top-level (generate-top-level) "libtoplevel.s" "libtoplevel") -(build-autogenerated-prog - 'cxr (generate-cxr-definitions) "libcxr.s" "libcxr") - -;;; ensure that we did not emit a reference to an unset pcb cell. -(printf "Checking PCB\n") - -(let ([undefined '()]) - (for-each - (lambda (x) - (when (and (pcb-referenced? (car x)) - (not (pcb-assigned? (car x))) - (not (pcb-system-loc? (car x)))) - (set! undefined (cons (car x) undefined)))) - pcb-table) - (unless (null? undefined) - ((if (signal-error-on-undefined-pcb) - error - warning) - 'compile "undefined primitives found ~s" undefined))) - - -(runtime-file - (string-join " " - (list* "scheme.c" "scheme_asm.s" "runtime-5.4.c" "collect-5.7.c" - "libtoplevel.s" "libcxr.s" - "-luuid" - (map cadr scheme-library-files)))) - -(with-output-to-file "Makefile" - (lambda () - (printf "stst: stst.s ~a\n" (runtime-file)) - (printf "\tgcc -Wall -o stst stst.s ~a\n" (runtime-file))) - 'replace) - -(printf "Testing ...\n") - -;(test-all) -;(parameterize ([inline-primitives #f]) (test-all)) -;(parameterize ([inline-primitives #t]) (test-all)) -;(parameterize ([input-filter -; (lambda (x) -; `(begin -; (write ,x) -; (newline) -; (exit) -; ))]) -; (test-all)) - -; (parameterize ([inline-primitives #t] -; [input-filter -; (lambda (x) -; `(let ([expr ',x]) -; (let ([p (open-output-file "stst.tmp" 'replace)]) -; (write expr p) -; (close-output-port p)) -; (let ([p (open-input-file "stst.tmp")]) -; (let ([t (read p)]) -; (unless (equal? t expr) -; (error 'test -; "not equal: got ~s, should be ~s" -; t expr))) -; (close-input-port p)) -; (write ,x) ; as usual -; (newline) -; (exit)))]) -; (test-all)) - -;(parameterize ([inline-primitives #t] -; [input-filter -; (lambda (x) -; `(begin -; (write (eval ',x)) -; (newline) -; (exit 0) -; ))]) -; (test-all)) -; -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char= x #\newline) - '() - (cons x (f)))))))) - -(build-program - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe))) - -(system "cp stst petite-ikarus-fresh") - diff --git a/src/compiler-6.1.ss b/src/compiler-6.1.ss deleted file mode 100644 index e3d5847..0000000 --- a/src/compiler-6.1.ss +++ /dev/null @@ -1,3132 +0,0 @@ - -;;; 6.1: added case-lambda, dropped lambda -;;; 6.0: basic compiler -;;; -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (load "libexpand-6.1.ss") - ;(load "libinterpret-6.0.ss") - (load "record-case.ss") - ;(#%current-eval eval) - ) - -(define primitive-set! set-top-level-value!) - -(load "libassembler-compat-6.0.ss") ; defines make-code etc. -(load "libintelasm-6.0.ss") ; uses make-code, etc. -(load "libfasl-6.0.ss") ; uses code? etc. - - - -(load "tests-driver.ss") -(print-gensym #f) -(gensym-prefix "L_") - - -(define assembler-output (make-parameter #t)) - -(load "set-operations.ss") -;(load "tests-5.6-req.scm") -;(load "tests-5.3-req.scm") -;(load "tests-5.2-req.scm") -;(load "tests-5.1-req.scm") -;(load "tests-4.3-req.scm") -;(load "tests-4.2-req.scm") - -;(load "tests-4.1-req.scm") -;(load "tests-3.4-req.scm") - -;(load "tests-3.3-req.scm") -;(load "tests-3.2-req.scm") -;(load "tests-3.1-req.scm") -;(load "tests-2.9-req.scm") -;(load "tests-2.8-req.scm") -;(load "tests-2.6-req.scm") -;(load "tests-2.4-req.scm") -;(load "tests-2.3-req.scm") -;(load "tests-2.2-req.scm") -;(load "tests-2.1-req.scm") -;(load "tests-1.9-req.scm") -;(load "tests-1.8-req.scm") -;(load "tests-1.7-req.scm") -;(load "tests-1.6-req.scm") -;(load "tests-1.5-req.scm") -;(load "tests-1.4-req.scm") -;(load "tests-1.3-req.scm") -;(load "tests-1.2-req.scm") -;(load "tests-1.1-req.scm") - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.1.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.1.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.1.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libexpand-6.1.ss" "libexpand.fasl"] - ["libinterpret-6.1.ss" "libinterpret.fasl"] - ;["libintelasm-6.0.ss" "libintelasm.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - -(define primitive? - (lambda (x) - (or (assq x open-coded-primitives) - (memq x public-primitives)))) - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - ;;; - ;;; hash tables - ;;; - [make-hash-table 0 value] - [hash-table? 1 pred] - ;;; - ;;; asm - ;;; - ;[code? 1 pred] - ;[$code-instr-size 1 value] - ;[$code-reloc-size 1 value] - ;[$code-closure-size 1 value] - ;[$code->closure 1 value] - ;[$set-code-byte! 3 effect] - ;[$set-code-word! 3 effect] - ;[$set-code-object! 4 effect] - ;[$set-code-object+offset! 5 effect] - ;[$set-code-object+offset/rel! 5 effect] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - - -;;; primitives table section -(define primitives-table - '(;;; system locations used by the C/Scheme interface - [$apply-nonprocedure-error-handler library] - [$incorrect-args-error-handler library] - [$multiple-values-error library] - [$intern library] - [do-overflow library] - [do-vararg-overflow library] - [do-stack-overflow library] - ;;; type predicates - [fixnum? public] - [immediate? public] - [boolean? public] - [char? public] - [null? public] - [pair? public] - [symbol? public] - [vector? public] - [string? public] - [procedure? public] - [eof-object? public] - [not public] - [eq? public] - [equal? public] - ;;; fixnum primitives - [fxadd1 public] - [fxsub1 public] - [fx+ public] - [fx- public] - [fx* public] - [fxsll public] - [fxsra public] - [fxlogor public] - [fxlogand public] - [fxlogxor public] - [fxlognot public] - [fxquotient public] - [fxremainder public] - [fxmodulo public] - ;;; fixnum predicates - [fxzero? public] - [fx= public] - [fx< public] - [fx<= public] - [fx> public] - [fx>= public] - ;;; characters - [char=? public] - [char? public] - [char>=? public] - [integer->char public] - [char->integer public] - ;;; lists - [cons public] - [car public] - [cdr public] - [caar public] - [cadr public] - [cdar public] - [cddr public] - [caaar public] - [caadr public] - [cadar public] - [caddr public] - [cdaar public] - [cdadr public] - [cddar public] - [cdddr public] - [caaaar public] - [caaadr public] - [caadar public] - [caaddr public] - [cadaar public] - [cadadr public] - [caddar public] - [cadddr public] - [cdaaar public] - [cdaadr public] - [cdadar public] - [cdaddr public] - [cddaar public] - [cddadr public] - [cdddar public] - [cddddr public] - [set-car! public] - [set-cdr! public] - [list public] - [list* ADDME] - [list? public] - [list-ref public] - [length public] - [make-list public] - [reverse public] - [append public] - [list-ref public] - [memq public] - [assq public] - [map public] - [for-each public] - [andmap public] - [ormap public] - ;;; vectors - [make-vector public] - [vector public] - [vector-length public] - [vector-ref public] - [vector-set! public] - [list->vector public] - [vector->list public] - ;;; strings - [make-string public] - [string public] - [string-length public] - [string-ref public] - [string-set! public] - [list->string public] - [string->list public] - [string-append public] - [substring public] - [string=? public] - [fixnum->string public] - ;;; symbols - [gensym public] - [gensym? public] - [symbol->string public] - [gensym->unique-string public] - [gensym-prefix public] - [gensym-count public] - [print-gensym public] - [string->symbol public] - [top-level-value public] - [top-level-bound? public] - [set-top-level-value! public] - [getprop public] - [putprop public] - [remprop public] - [property-list public] - [oblist public] - [uuid public] - ;;; eof - [eof-object public] - [void public] - ;;; control/debugging - [print-error public] - [error public] - [current-error-handler public] - [exit public] - [apply public] - [make-parameter public] - ;;; output - [output-port? public] - [console-output-port public] - [current-output-port public] - [standard-output-port public] - [standard-error-port public] - [open-output-file public] - [open-output-string public] - [with-output-to-file public] - [call-with-output-file public] - [with-input-from-file public] - [call-with-input-file public] - [get-output-string public] - [close-output-port public] - [flush-output-port public] - [write-char public] - [output-port-name public] - [newline public] - ;;; input - [input-port? public] - [standard-input-port public] - [console-input-port public] - [current-input-port public] - [open-input-file public] - [close-input-port public] - [reset-input-port! public] - [read-char public] - [peek-char public] - [unread-char public] - [input-port-name public] - ;;; writing/printing - [write public] - [display public] - [printf public] - [fprintf public] - [format public] - [read-token public] - [read public] - ;;; evaluation - [primitive? public] - [expand public] - [core-expand public] - [current-expand public] - [interpret public] - [eval public] - [current-eval public] - [load public] - [new-cafe public] - [collect public] - [call/cc public] - [call/cf library] - [dynamic-wind public] - [values public] - [call-with-values public] - [make-traced-procedure library] - [trace-symbol! library] - [untrace-symbol! library] - ;;; record - [$base-rtd library] - [record? public] - [record-rtd public] - [record-name public] - [record-printer public] - [record-length public] - [record-ref public] - [record-set! public] - ;;; record rtds - [make-record-type public] - [record-constructor public] - [record-predicate public] - [record-field-accessor public] - [record-field-mutator public] - ;;; asm - [make-code public] - [code? public] - [make-code-executable! public] - [code-instr-size public] - [code-reloc-size public] - [code-closure-size public] - [set-code-byte! public] - [set-code-word! public] - [set-code-object! public] - [set-code-foreign-object! public] - [set-code-object+offset! public] - [set-code-object+offset/rel! public] - [set-code-object/reloc/relative! public] - [code->closure public] - [list*->code* library] - ;;; - ;;; POSIX - ;;; - [fork public] - [posix-fork public] - [system public] - [$debug public] - [$underflow-misaligned-error public] - )) - -(define (primitive? x) - (cond - [(assq x primitives-table) #t] - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [(assq x primitives-table) #f] - [else (error 'open-codeable "invalid primitive ~s" x)])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -;;; end of primitives table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record seq (e0 e1)) -(define-record function (arg* proper body)) -(define-record clambda-case (arg* proper body)) -(define-record clambda (cases)) -(define-record clambda-code (label cases free)) - -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) - -(define-record codes (list body)) -(define-record assign (lhs rhs)) - -(define unique-var - (let ([counter 0]) - (lambda (x) - (let ([g (gensym (format "~a:~a" x counter))]) - (set! counter (fxadd1 counter)) - (make-var g))))) - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(case-lambda) - (let ([cls* - (map - (lambda (cls) - (let ([fml* (car cls)] [body (cadr cls)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([body (E body (extend-env fml* nfml* env))]) - (make-clambda-case - (properize nfml*) - (list? fml*) - body))))) - (cdr x))]) - (make-clambda cls*))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid top-level var ~s" var)))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(function args proper body) - `(lambda ,(E-args proper args) ,(E body))] - [(clambda-case args proper body) - `(clambda-case ,(E-args proper args) ,(E body))] - [(clambda cls*) - `(case-lambda . ,(map E cls*))] - [(clambda-code label clauses free) - `(code ,label . ,(map E clauses))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes list body) - `(codes ,(map E list) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [(foreign-label x) `(foreign-label ,x)] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline-case cls rand*) - (record-case cls - [(clambda-case fml* proper body) - (if proper - (and (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body)) - (and (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body)))])) - (define (try-inline cls* rand* default) - (cond - [(null? cls*) default] - [(inline-case (car cls*) rand*)] - [else (try-inline (cdr cls*) rand* default)])) - (define (inline rator rand*) - (record-case rator - [(clambda cls*) - (try-inline cls* rand* - (make-funcall rator rand*))] -; [(function fml* proper body) -; (cond -; [proper -; (if (fx= (length fml*) (length rand*)) -; (make-bind fml* rand* body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))] -; [else -; (if (fx<= (length fml*) (length rand*)) -; (make-bind fml* (properize fml* rand*) body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))])] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (make-function fml* proper (Expr body))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (cond - [(null? x*) '()] - [else (union (Expr (car x*)) (Expr* (cdr x*)))])) - (define (Expr x) - (record-case x - [(constant) '()] - [(var) '()] - [(primref) '()] - [(bind lhs* rhs* body) - (union (Expr body) (Expr* rhs*))] - [(conditional test conseq altern) - (union (Expr test) (union (Expr conseq) (Expr altern)))] - [(seq e0 e1) (union (Expr e0) (Expr e1))] - [(clambda cls*) - (Expr* (map clambda-case-body cls*))] - [(function fml* proper body) (Expr body)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (union (singleton lhs) (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - -(define (rewrite-assignments assigned x) - (define who 'rewrite-assignments) - (define (fix lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix (cdr lhs*))]) - (cond - [(memq x assigned) - (let ([t (make-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(memq x assigned) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-function fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(clambda cls*) - (make-clambda - (map (lambda (cls) - (record-case cls - [(clambda-case fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-clambda-case fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))])) - cls*))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (memq lhs assigned) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (remove-assignments x) - (let ([assigned (uncover-assigned x)]) - (rewrite-assignments assigned x))) - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(function fml* proper body) - (let-values ([(body body-free) (Expr body)]) - (let ([free (difference body-free fml*)]) - (values (make-closure (make-code-rec fml* proper free body) free) - free)))] - [(clambda cls*) - (let-values ([(cls* free) - (let f ([cls* cls*]) - (cond - [(null? cls*) (values '() '())] - [else - (record-case (car cls*) - [(clambda-case fml* proper body) - (let-values ([(body body-free) (Expr body)] - [(cls* cls*-free) (f (cdr cls*))]) - (values - (cons (make-clambda-case fml* proper body) - cls*) - (union (difference body-free fml*) - cls*-free)))])]))]) - (values (make-closure (make-clambda-code (gensym) cls* free) free) - free))] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define all-codes '()) - (define (do-code x) - (record-case x - [(clambda-code label cls* free) - (let ([cls* (map - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (E body))])) - cls*)]) - (let ([g (make-code-loc label)]) - (set! all-codes - (cons (make-clambda-code label cls* free) all-codes)) - g))])) - (define (E x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map E rhs*) (E body))] - [(conditional test conseq altern) - (make-conditional (E test) (E conseq) (E altern))] - [(seq e0 e1) (make-seq (E e0) (E e1))] - [(closure c free) (make-closure (do-code c) free)] - [(primcall op rand*) (make-primcall op (map E rand*))] - [(forcall op rand*) (make-forcall op (map E rand*))] - [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] - [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] - [else (error who "invalid expression ~s" (unparse x))])) - (let ([x (E x)]) - (make-codes all-codes x))) - - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? code? hash-table? $forward-ptr?) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-instr-size $code-reloc-size $code-closure-size - $set-code-byte! $set-code-word! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $make-record $record? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L clauses free) - (make-clambda-code L (map CaseExpr clauses) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (if (Tail body) - (make-clambda-case fml* proper (insert-check body)) - x)])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-funcall (make-primref 'do-overflow) - (list (make-constant n))) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure code free*) - (check-const (fx+ disp-closure-data (fx* (length free*) wordsize)) x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [(make-hash-table) (check-const hash-table-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(vector) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp #t (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (case op -; [(values) (make-primcall op (simple* arg* r))] - [else (make-return (make-primcall op (simple* arg* r)))])] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'tail live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define CaseExpr - (lambda (r) - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let-values ([(fml* si r live) (bind-fml* fml* r)]) - (make-clambda-case fml* proper (Tail body si r live)))])))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (let ([r (bind-free* free)]) - (make-clambda-code L (map (CaseExpr r) cases) free))])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag bool-f) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define wordsize 4) - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-closuresize 12) - (define disp-code-data 16) - (define record-ptag vector-tag) - (define record-pmask vector-mask) - (define disp-record-rtd 0) - (define disp-record-data 4) - (define hash-table-tag #x3F) - (define disp-htable-count 4) - (define disp-htable-size 8) - (define disp-htable-mem 12) - (define hash-table-size 16) - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define pagesize 4096)) - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift)))) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [(code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [(hash-table?) - (indirect-type-pred vector-mask vector-tag #f hash-table-tag - rand* Lt Lf ac)] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx< i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [(make-hash-table) - (list* (movl (int hash-table-tag) (mem 0 apr)) - (movl (int 0) (mem disp-htable-count apr)) - (movl (int 0) (mem disp-htable-size apr)) - (movl (int 0) (mem disp-htable-mem apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int hash-table-size) apr) - ac)] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - ;[($pcb-ref) - ; (let ([loc (car arg*)]) - ; (record-case loc - ; [(constant i) - ; (unless (fixnum? i) (error who "invalid loc ~s" loc)) - ; (list* (movl (mem (fx* i wordsize) pcr) eax) ac)] - ; [else (error who "invalid loc ~s" loc)]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-instr-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) - (cons (sall (int fx-shift) eax) ac))] - [($code-reloc-size) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-closure-size) - (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] - [($set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $set-code-byte! $set-code-word! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? code? hash-table? - $record?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc SL_continuation_code) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc SL_call_with_values) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc SL_values) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem (fx- disp-vector-data vector-tag) ebx)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] -; [($set-constant!) -; (NonTail (cadr arg*) -; (list* (movl eax (Simple (car arg*))) ac))] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ac)] - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem (fx- disp-record-data record-ptag) ebx)) - ac)] - [($set-code-byte!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (sarl (int fx-shift) ebx) - (movb bl (mem (fx- disp-code-data vector-tag) eax)) - ac)] - [($set-code-word!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movl ebx (mem (fx- disp-code-data vector-tag) eax)) - ac)] - [($set-code-object!) - (let ([code (car arg*)] [object (cadr arg*)] - [code-offset (caddr arg*)] [reloc-idx (cadddr arg*)]) - (list* - (movl (Simple code) eax) - (movl (Simple object) ebx) - (movl (Simple code-offset) edx) - (movl edx ecx) - (sarl (int fx-shift) edx) - (addl eax edx) - (movl ebx (mem (fx- disp-code-data vector-tag) edx)) - (addl (mem (fx- disp-code-instrsize vector-tag) eax) eax) - (addl (Simple reloc-idx) eax) - (movl ecx (mem (fx- disp-code-data vector-tag) eax)) - ac))] - [($set-code-object+offset!) - (let ([code (car arg*)] [object (cadr arg*)] - [code-offset (caddr arg*)] [object-offset (cadddr arg*)] - [reloc-idx (car (cddddr arg*))]) - (list* - (movl (Simple code) eax) - (movl (Simple object-offset) ebx) ; ebx = fxdisp - (sarl (int fx-shift) ebx) ; ebx = disp in bytes - (movl ebx ecx) ; ecx = disp in bytes - (addl (Simple object) ecx) ; ecx = object + disp - (movl (Simple code-offset) edx) ; edx = fx codeoffset - (sarl (int fx-shift) edx) ; edx = codeoffset in bytes - (addl eax edx) - (movl ecx (mem (fx- disp-code-data vector-tag) edx)) - (subl eax edx) - (addl (mem (fx- disp-code-instrsize vector-tag) eax) eax) - (addl (Simple reloc-idx) eax) - (sall (int fx-shift) edx) - (orl (int 1) edx) - (movl edx (mem (fx- disp-code-data vector-tag) eax)) - (movl ebx (mem (fx- (fx+ disp-code-data wordsize) vector-tag) eax)) - ac))] - [($set-code-object+offset/rel!) - (let ([code (car arg*)] [object (cadr arg*)] - [code-offset (caddr arg*)] [object-offset (cadddr arg*)] - [reloc-idx (car (cddddr arg*))]) - (list* - (movl (Simple code) eax) - (movl (Simple object-offset) ebx) - (sarl (int fx-shift) ebx) - (movl (Simple code-offset) ecx) - (orl (int 2) ecx) - (movl (mem (fx- disp-code-instrsize vector-tag) eax) edx) - (addl (Simple reloc-idx) edx) - (addl eax edx) - (movl ecx (mem (fx- disp-code-data vector-tag) edx)) - (movl ebx (mem (fx- (fx+ wordsize disp-code-data) vector-tag) edx)) - (sarl (int fx-shift) ecx) ; code offset in bytes - (addl eax ecx) - (addl (int (fx- (fx+ wordsize disp-code-data) vector-tag)) ecx) - ; ecx points to next word in stream - (addl (Simple object) ebx) ; ebx is object+objectoffset - (subl ecx ebx) ; ebx is relative offset - (movl ebx (mem (fx- 0 wordsize) ecx)) - ac))] - [(cons void $fxadd1 $fxsub1) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address label)] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(apply) are-we-ever-here? - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - L_CALL - (call (label SL_apply)) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - L_CALL - (call (label SL_foreign_call)) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else (error who "invalid convention ~s for call-cp" convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let ([Lf (unique-label)] [Ljoin (unique-label)]) - (Pred test #f Lf - (Effect conseq - (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (NonTail body - (cond - [check - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac)] - [else - (list* - (movl eax cpr) - ac)]))] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(new-frame idx size body) - (Tail body ac)] - [(call-cp call-convention rp-convention idx argc mask) - (unless (eq? rp-convention 'tail) - (error who "nontail rp (~s) in tail context" rp-convention)) - (let f ([i 0]) - (cond - [(fx= i argc) - (case call-convention - [(normal) - (list* - (movl (int (argc-convention argc)) eax) - (tail-indirect-cpr-call) - ac)] - [(apply) - (list* - (movl (int (argc-convention argc)) eax) - (jmp (label SL_apply)) - ac)] - [else (error who "invalid conv ~s in tail call-cpr" convention)])] - [else - (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) - (fx- 0 wordsize)) fpr) - eax) - (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) - (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (Entry check? x ac) - (record-case x - [(clambda-case fml* proper body) - (let ([ac (Tail body ac)]) - (cond - [(and proper check?) - (list* (cmpl (int (argc-convention (length fml*))) eax) - (jne (label SL_invalid_args)) - ac)] - [proper ac] - [else - (handle-vararg (length fml*) ac)]))])) - (define make-dispatcher - (lambda (j? L L* x x* ac) - (cond - [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] - [else - (record-case x - [(clambda-case fml* proper _) - (cond - [proper - (list* (cmpl (int (argc-convention (length fml*))) eax) - (je (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))] - [else - (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) - (jle (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) - (define (handle-cases x x*) - (let ([L* (map (lambda (_) (gensym)) x*)] - [L (gensym)]) - (make-dispatcher #f L L* x x* - (let f ([x x] [x* x*] [L L] [L* L*]) - (cond - [(null? x*) - (cons (label L) (Entry 'check x '()))] - [else - (cons (label L) - (Entry #f x - (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (list* - (fx+ disp-closure-data (fx* wordsize (length free))) - (label L) - (handle-cases (car cases) (cdr cases)))])) - (record-case x - [(codes list body) - (cons (cons 0 (Tail body '())) - (map CodeExpr list))])) - - -(define SL_nonprocedure (gensym "SL_nonprocedure")) -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(list*->code* - (list - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)] - ) - (list disp-closure-data - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list disp-closure-data - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list - (fx+ disp-closure-data wordsize) - (label SL_continuation_code) - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_cont_mult_args) - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - )) - - - -(define (compile-program original-program) - (let* (;;; - [p (expand original-program)] - [p (recordize p)] - ;[f (pretty-print (unparse p))] - [p (optimize-direct-calls p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - ;[p (lift-complex-constants p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - ;[f (pretty-print (unparse p))] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - ;[f (pretty-print (unparse p))] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (fasl-write (car code*) (compile-port)))) - - -(define compile-expr - (lambda (expr output-file) - (let ([op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op]) - (compile-program expr)) - (close-output-port op)))) - -(define compile-file - (lambda (input-file output-file) - (let ([ip (open-input-file input-file)] - [op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (compile-program x) - (f))))) - (close-input-port ip) - (close-output-port op)))) - - -(parameterize ([assembler-output #f]) - (for-each - (lambda (x) - (printf "compiling ~a ...\n" x) - (compile-file (car x) (cadr x))) - scheme-library-files)) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - - -(define replace-safe-prims-with-unsafe - (lambda (x) - (define prims - '([fx+ $fx+] [fx- $fx-] [fx* $fx*] [fxadd1 $fxadd1] [fxsub1 $fxsub1] - [fxlogand $fxlogand] [fxlogor $fxlogor] [fxlognot $fxlognot] - [fx= $fx=] [fx< $fx<] [fx<= $fx<=] [fx> $fx>] [fx>= $fx>=] - [fxzero? $fxzero?] - [fixnum->char $fixnum->char] [char->fixnum $char->fixnum] - [char= $char=] - [char< $char<] [char> $char>] [char<= $char<=] [char>= $char>=] - [car $car] [cdr $cdr] [set-car! $set-car!] [set-cdr! $set-cdr!] - [vector-length $vector-length] [vector-ref $vector-ref] - [vector-set! $vector-set!] [make-vector $make-vector] - [string-length $string-length] [string-ref $string-ref] - [string-set! $string-set!] [make-string $make-string] - )) - (define (E x) - (cond - [(pair? x) (cons (E (car x)) (E (cdr x)))] - [(symbol? x) - (cond - [(assq x prims) => cadr] - [else x])] - [else x])) - (E x))) - -(parameterize ([input-filter - (lambda (x) - `(begin (write (eval ',x)) (newline) (exit 0)))]) - (test-all)) - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char= x #\newline) - '() - (cons x (f)))))))) - -(compile-expr - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)) - "petite-ikarus.fasl") diff --git a/src/compiler-6.2.ss b/src/compiler-6.2.ss deleted file mode 100644 index 30649cc..0000000 --- a/src/compiler-6.2.ss +++ /dev/null @@ -1,3185 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (load "libexpand-6.2.ss") - ;(load "libinterpret-6.0.ss") - (load "record-case.ss") - ;(#%current-eval eval) - ) - -(define primitive-set! set-top-level-value!) - -(load "libassembler-compat-6.0.ss") ; defines make-code etc. -(load "libintelasm-6.0.ss") ; uses make-code, etc. -(load "libfasl-6.0.ss") ; uses code? etc. - - - -(load "tests-driver.ss") -(print-gensym #f) -(gensym-prefix "L_") - - -(define assembler-output (make-parameter #t)) - -(load "set-operations.ss") -;(load "tests-5.6-req.scm") -;(load "tests-5.3-req.scm") -;(load "tests-5.2-req.scm") -;(load "tests-5.1-req.scm") -;(load "tests-4.3-req.scm") -;(load "tests-4.2-req.scm") - -;(load "tests-4.1-req.scm") -;(load "tests-3.4-req.scm") - -;(load "tests-3.3-req.scm") -;(load "tests-3.2-req.scm") -;(load "tests-3.1-req.scm") -;(load "tests-2.9-req.scm") -;(load "tests-2.8-req.scm") -;(load "tests-2.6-req.scm") -;(load "tests-2.4-req.scm") -;(load "tests-2.3-req.scm") -;(load "tests-2.2-req.scm") -;(load "tests-2.1-req.scm") -;(load "tests-1.9-req.scm") -;(load "tests-1.8-req.scm") -;(load "tests-1.7-req.scm") -;(load "tests-1.6-req.scm") -;(load "tests-1.5-req.scm") -;(load "tests-1.4-req.scm") -;(load "tests-1.3-req.scm") -;(load "tests-1.2-req.scm") -;(load "tests-1.1-req.scm") - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.1.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.2.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libexpand-6.2.ss" "libexpand.fasl"] - ["libinterpret-6.1.ss" "libinterpret.fasl"] - ;["libintelasm-6.0.ss" "libintelasm.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - -(define primitive? - (lambda (x) - (or (assq x open-coded-primitives) - (memq x public-primitives)))) - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [bwp-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [pointer-value 1 value] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - ;;; tcbuckets - [$make-tcbucket 4 value] - [$tcbucket-key 1 value] - [$tcbucket-val 1 value] - [$tcbucket-next 1 value] - [$set-tcbucket-val! 2 effect] - [$set-tcbucket-next! 2 effect] - [$set-tcbucket-tconc! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - ;;; - ;;; asm - ;;; - ;[code? 1 pred] - ;[$code-instr-size 1 value] - ;[$code-reloc-size 1 value] - ;[$code-closure-size 1 value] - ;[$code->closure 1 value] - ;[$set-code-byte! 3 effect] - ;[$set-code-word! 3 effect] - ;[$set-code-object! 4 effect] - ;[$set-code-object+offset! 5 effect] - ;[$set-code-object+offset/rel! 5 effect] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - - -;;; primitives table section -(define primitives-table - '(;;; system locations used by the C/Scheme interface - [$apply-nonprocedure-error-handler library] - [$incorrect-args-error-handler library] - [$multiple-values-error library] - [$intern library] - [do-overflow library] - [do-vararg-overflow library] - [do-stack-overflow library] - ;;; type predicates - [fixnum? public] - [immediate? public] - [boolean? public] - [char? public] - [null? public] - [pair? public] - [symbol? public] - [vector? public] - [string? public] - [procedure? public] - [eof-object? public] - [not public] - [eq? public] - [equal? public] - ;;; fixnum primitives - [fxadd1 public] - [fxsub1 public] - [fx+ public] - [fx- public] - [fx* public] - [fxsll public] - [fxsra public] - [fxlogor public] - [fxlogand public] - [fxlogxor public] - [fxlognot public] - [fxquotient public] - [fxremainder public] - [fxmodulo public] - ;;; fixnum predicates - [fxzero? public] - [fx= public] - [fx< public] - [fx<= public] - [fx> public] - [fx>= public] - ;;; characters - [char=? public] - [char? public] - [char>=? public] - [integer->char public] - [char->integer public] - ;;; lists - [cons public] - [car public] - [cdr public] - [caar public] - [cadr public] - [cdar public] - [cddr public] - [caaar public] - [caadr public] - [cadar public] - [caddr public] - [cdaar public] - [cdadr public] - [cddar public] - [cdddr public] - [caaaar public] - [caaadr public] - [caadar public] - [caaddr public] - [cadaar public] - [cadadr public] - [caddar public] - [cadddr public] - [cdaaar public] - [cdaadr public] - [cdadar public] - [cdaddr public] - [cddaar public] - [cddadr public] - [cdddar public] - [cddddr public] - [set-car! public] - [set-cdr! public] - [list public] - [list* ADDME] - [list? public] - [list-ref public] - [length public] - [make-list public] - [reverse public] - [append public] - [list-ref public] - [memq public] - [assq public] - [map public] - [for-each public] - [andmap public] - [ormap public] - ;;; vectors - [make-vector public] - [vector public] - [vector-length public] - [vector-ref public] - [vector-set! public] - [list->vector public] - [vector->list public] - ;;; strings - [make-string public] - [string public] - [string-length public] - [string-ref public] - [string-set! public] - [list->string public] - [string->list public] - [string-append public] - [substring public] - [string=? public] - [fixnum->string public] - ;;; symbols - [gensym public] - [gensym? public] - [symbol->string public] - [gensym->unique-string public] - [gensym-prefix public] - [gensym-count public] - [print-gensym public] - [string->symbol public] - [top-level-value public] - [top-level-bound? public] - [set-top-level-value! public] - [primitive-set! public] - [getprop public] - [putprop public] - [remprop public] - [property-list public] - [oblist public] - [uuid public] - ;;; eof - [eof-object public] - [void public] - ;;; control/debugging - [print-error public] - [error public] - [current-error-handler public] - [exit public] - [apply public] - [make-parameter public] - ;;; output - [output-port? public] - [console-output-port public] - [current-output-port public] - [standard-output-port public] - [standard-error-port public] - [open-output-file public] - [open-output-string public] - [with-output-to-file public] - [call-with-output-file public] - [with-input-from-file public] - [call-with-input-file public] - [get-output-string public] - [close-output-port public] - [flush-output-port public] - [write-char public] - [output-port-name public] - [newline public] - ;;; input - [input-port? public] - [standard-input-port public] - [console-input-port public] - [current-input-port public] - [open-input-file public] - [close-input-port public] - [reset-input-port! public] - [read-char public] - [peek-char public] - [unread-char public] - [input-port-name public] - ;;; writing/printing - [write public] - [display public] - [printf public] - [fprintf public] - [format public] - [read-token public] - [read public] - ;;; evaluation - [primitive? public] - [expand public] - [syntax-error public] - [core-expand public] - [current-expand public] - - [$sc-put-cte public] - [sc-expand public] - [$make-environment public] - [environment? public] - [interaction-environment public] - [identifier? public] - [syntax->list public] - [syntax-object->datum public] - [datum->syntax-object public] - [generate-temporaries public] - [free-identifier=? public] - [bound-identifier=? public] - [literal-identifier=? public] - [syntax-error public] - [$syntax-dispatch public] - - - - [interpret public] - [eval public] - [current-eval public] - [load public] - [new-cafe public] - [collect public] - [call/cc public] - [call/cf library] - [dynamic-wind public] - [values public] - [call-with-values public] - [make-traced-procedure library] - [trace-symbol! library] - [untrace-symbol! library] - ;;; record - [$base-rtd library] - [record? public] - [record-rtd public] - [record-name public] - [record-printer public] - [record-length public] - [record-ref public] - [record-set! public] - ;;; record rtds - [make-record-type public] - [record-constructor public] - [record-predicate public] - [record-field-accessor public] - [record-field-mutator public] - ;;; hash tables - [make-hash-table public] - [hash-table? public] - [get-hash-table public] - [put-hash-table! public] - ;;; asm - [make-code public] - [code? public] - [make-code-executable! public] - [code-instr-size public] - [code-reloc-size public] - [code-closure-size public] - [set-code-byte! public] - [set-code-word! public] - [set-code-object! public] - [set-code-foreign-object! public] - [set-code-object+offset! public] - [set-code-object+offset/rel! public] - [set-code-object/reloc/relative! public] - [code->closure public] - [list*->code* library] - ;;; - ;;; POSIX - ;;; - [fork public] - [posix-fork public] - [system public] - [$debug public] - [$underflow-misaligned-error public] - )) - -(define (primitive? x) - (cond - [(assq x primitives-table) #t] - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [(assq x primitives-table) #f] - [else (error 'open-codeable "invalid primitive ~s" x)])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -;;; end of primitives table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record seq (e0 e1)) -(define-record function (arg* proper body)) -(define-record clambda-case (arg* proper body)) -(define-record clambda (cases)) -(define-record clambda-code (label cases free)) - -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) - -(define-record codes (list body)) -(define-record assign (lhs rhs)) - -(define unique-var - (let ([counter 0]) - (lambda (x) - (let ([g (gensym (format "~a:~a" x counter))]) - (set! counter (fxadd1 counter)) - (make-var g))))) - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(case-lambda) - (let ([cls* - (map - (lambda (cls) - (let ([fml* (car cls)] [body (cadr cls)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([body (E body (extend-env fml* nfml* env))]) - (make-clambda-case - (properize nfml*) - (list? fml*) - body))))) - (cdr x))]) - (make-clambda cls*))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid top-level var ~s" var)))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(function args proper body) - `(lambda ,(E-args proper args) ,(E body))] - [(clambda-case args proper body) - `(clambda-case ,(E-args proper args) ,(E body))] - [(clambda cls*) - `(case-lambda . ,(map E cls*))] - [(clambda-code label clauses free) - `(code ,label . ,(map E clauses))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes list body) - `(codes ,(map E list) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [(foreign-label x) `(foreign-label ,x)] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline-case cls rand*) - (record-case cls - [(clambda-case fml* proper body) - (if proper - (and (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body)) - (and (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body)))])) - (define (try-inline cls* rand* default) - (cond - [(null? cls*) default] - [(inline-case (car cls*) rand*)] - [else (try-inline (cdr cls*) rand* default)])) - (define (inline rator rand*) - (record-case rator - [(clambda cls*) - (try-inline cls* rand* - (make-funcall rator rand*))] -; [(function fml* proper body) -; (cond -; [proper -; (if (fx= (length fml*) (length rand*)) -; (make-bind fml* rand* body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))] -; [else -; (if (fx<= (length fml*) (length rand*)) -; (make-bind fml* (properize fml* rand*) body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))])] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (make-function fml* proper (Expr body))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (cond - [(null? x*) '()] - [else (union (Expr (car x*)) (Expr* (cdr x*)))])) - (define (Expr x) - (record-case x - [(constant) '()] - [(var) '()] - [(primref) '()] - [(bind lhs* rhs* body) - (union (Expr body) (Expr* rhs*))] - [(conditional test conseq altern) - (union (Expr test) (union (Expr conseq) (Expr altern)))] - [(seq e0 e1) (union (Expr e0) (Expr e1))] - [(clambda cls*) - (Expr* (map clambda-case-body cls*))] - [(function fml* proper body) (Expr body)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (union (singleton lhs) (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - -(define (rewrite-assignments assigned x) - (define who 'rewrite-assignments) - (define (fix lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix (cdr lhs*))]) - (cond - [(memq x assigned) - (let ([t (make-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(memq x assigned) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-function fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(clambda cls*) - (make-clambda - (map (lambda (cls) - (record-case cls - [(clambda-case fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-clambda-case fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))])) - cls*))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (memq lhs assigned) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (remove-assignments x) - (let ([assigned (uncover-assigned x)]) - (rewrite-assignments assigned x))) - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(function fml* proper body) - (let-values ([(body body-free) (Expr body)]) - (let ([free (difference body-free fml*)]) - (values (make-closure (make-code-rec fml* proper free body) free) - free)))] - [(clambda cls*) - (let-values ([(cls* free) - (let f ([cls* cls*]) - (cond - [(null? cls*) (values '() '())] - [else - (record-case (car cls*) - [(clambda-case fml* proper body) - (let-values ([(body body-free) (Expr body)] - [(cls* cls*-free) (f (cdr cls*))]) - (values - (cons (make-clambda-case fml* proper body) - cls*) - (union (difference body-free fml*) - cls*-free)))])]))]) - (values (make-closure (make-clambda-code (gensym) cls* free) free) - free))] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define all-codes '()) - (define (do-code x) - (record-case x - [(clambda-code label cls* free) - (let ([cls* (map - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (E body))])) - cls*)]) - (let ([g (make-code-loc label)]) - (set! all-codes - (cons (make-clambda-code label cls* free) all-codes)) - g))])) - (define (E x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map E rhs*) (E body))] - [(conditional test conseq altern) - (make-conditional (E test) (E conseq) (E altern))] - [(seq e0 e1) (make-seq (E e0) (E e1))] - [(closure c free) (make-closure (do-code c) free)] - [(primcall op rand*) (make-primcall op (map E rand*))] - [(forcall op rand*) (make-forcall op (map E rand*))] - [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] - [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] - [else (error who "invalid expression ~s" (unparse x))])) - (let ([x (E x)]) - (make-codes all-codes x))) - - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? code? $forward-ptr? bwp-object? - pointer-value) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-instr-size $code-reloc-size $code-closure-size - $set-code-byte! $set-code-word! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $make-record $record? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref - $make-tcbucket $tcbucket-key $tcbucket-val $tcbucket-next - $set-tcbucket-val! $set-tcbucket-next! $set-tcbucket-tconc!) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L clauses free) - (make-clambda-code L (map CaseExpr clauses) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (if (Tail body) - (make-clambda-case fml* proper (insert-check body)) - x)])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-funcall (make-primref 'do-overflow) - (list (make-constant n))) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure code free*) - (check-const (fx+ disp-closure-data (fx* (length free*) wordsize)) x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [($make-tcbucket) (check-const tcbucket-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(vector) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp #t (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (case op -; [(values) (make-primcall op (simple* arg* r))] - [else (make-return (make-primcall op (simple* arg* r)))])] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'tail live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define CaseExpr - (lambda (r) - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let-values ([(fml* si r live) (bind-fml* fml* r)]) - (make-clambda-case fml* proper (Tail body si r live)))])))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (let ([r (bind-free* free)]) - (make-clambda-code L (map (CaseExpr r) cases) free))])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag bool-f) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define bwp-object #x8F) ; double check - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - (define pagesize 4096) - (define pageshift 12) - (define wordsize 4) - (define wordshift 2) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-closuresize 12) - (define disp-code-data 16) - (define disp-tcbucket-tconc 0) - (define disp-tcbucket-key 4) - (define disp-tcbucket-val 8) - (define disp-tcbucket-next 12) - (define tcbucket-size 16) - - (define record-ptag vector-tag) - (define record-pmask vector-mask) - (define disp-record-rtd 0) - (define disp-record-data 4) - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define pagesize 4096) - (define dirty-word -1)) - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift)))) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [(dirty-vector) (mem 28 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [(bwp-object?) (type-pred #f bwp-object rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [(code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx< i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($tcbucket-key) - (indirect-ref arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($tcbucket-val) - (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($tcbucket-next) - (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] - [(pointer-value) - (list* - (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (sall (int fx-shift) eax) - ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [($make-tcbucket) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-tcbucket-tconc apr)) - (movl (Simple (cadr arg*)) eax) - (movl eax (mem disp-tcbucket-key apr)) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem disp-tcbucket-val apr)) - (movl (Simple (cadddr arg*)) eax) - (movl eax (mem disp-tcbucket-next apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align tcbucket-size)) apr) - ac)] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-instr-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) - (cons (sall (int fx-shift) eax) ac))] - [($code-reloc-size) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-closure-size) - (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] - [($set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $set-code-byte! $set-code-word! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? code? - $record? bwp-object?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc SL_continuation_code) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc SL_call_with_values) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc SL_values) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (indirect-assignment arg* offset ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem offset eax)) - ;;; record side effect - (addl (int offset) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (addl (int (fx- disp-vector-data vector-tag)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-tcbucket-key!) - (indirect-assignment arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($set-tcbucket-val!) - (indirect-assignment arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($set-tcbucket-next!) - (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($set-tcbucket-tconc!) - (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-system-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-plist symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-unique-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (addl (int (fx- disp-record-data record-ptag)) ebx) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [(cons void $fxadd1 $fxsub1) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address label)] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(apply) are-we-ever-here? - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - L_CALL - (call (label SL_apply)) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (movl '(foreign-label "ik_foreign_call") ebx) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - '(byte 0) - '(byte 0) - '(byte 0) - L_CALL - (call ebx) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else (error who "invalid convention ~s for call-cp" convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let ([Lf (unique-label)] [Ljoin (unique-label)]) - (Pred test #f Lf - (Effect conseq - (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (NonTail body - (cond - [check - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac)] - [else - (list* - (movl eax cpr) - ac)]))] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(new-frame idx size body) - (Tail body ac)] - [(call-cp call-convention rp-convention idx argc mask) - (unless (eq? rp-convention 'tail) - (error who "nontail rp (~s) in tail context" rp-convention)) - (let f ([i 0]) - (cond - [(fx= i argc) - (case call-convention - [(normal) - (list* - (movl (int (argc-convention argc)) eax) - (tail-indirect-cpr-call) - ac)] - [(apply) - (list* - (movl (int (argc-convention argc)) eax) - (jmp (label SL_apply)) - ac)] - [else (error who "invalid conv ~s in tail call-cpr" convention)])] - [else - (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) - (fx- 0 wordsize)) fpr) - eax) - (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) - (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (Entry check? x ac) - (record-case x - [(clambda-case fml* proper body) - (let ([ac (Tail body ac)]) - (cond - [(and proper check?) - (list* (cmpl (int (argc-convention (length fml*))) eax) - (jne (label SL_invalid_args)) - ac)] - [proper ac] - [else - (handle-vararg (length fml*) ac)]))])) - (define make-dispatcher - (lambda (j? L L* x x* ac) - (cond - [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] - [else - (record-case x - [(clambda-case fml* proper _) - (cond - [proper - (list* (cmpl (int (argc-convention (length fml*))) eax) - (je (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))] - [else - (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) - (jle (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) - (define (handle-cases x x*) - (let ([L* (map (lambda (_) (gensym)) x*)] - [L (gensym)]) - (make-dispatcher #f L L* x x* - (let f ([x x] [x* x*] [L L] [L* L*]) - (cond - [(null? x*) - (cons (label L) (Entry 'check x '()))] - [else - (cons (label L) - (Entry #f x - (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (list* - (fx+ disp-closure-data (fx* wordsize (length free))) - (label L) - (handle-cases (car cases) (cdr cases)))])) - (record-case x - [(codes list body) - (cons (cons 0 (Tail body '())) - (map CodeExpr list))])) - - -(define SL_nonprocedure (gensym "SL_nonprocedure")) -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(list*->code* - (list - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)] - ) - (list disp-closure-data - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list disp-closure-data - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list - (fx+ disp-closure-data wordsize) - (label SL_continuation_code) - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_cont_mult_args) - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - )) - - - -(define (compile-program original-program) - (let* (;;; - [p (expand original-program)] - [p (recordize p)] - ;[f (pretty-print (unparse p))] - [p (optimize-direct-calls p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - ;[p (lift-complex-constants p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - ;[f (pretty-print (unparse p))] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - ;[f (pretty-print (unparse p))] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (fasl-write (car code*) (compile-port)))) - - -(define compile-expr - (lambda (expr output-file) - (let ([op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op]) - (compile-program expr)) - (close-output-port op)))) - -(define compile-file - (lambda (input-file output-file) - (let ([ip (open-input-file input-file)] - [op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (compile-program x) - (f))))) - (close-input-port ip) - (close-output-port op)))) - - -(parameterize ([assembler-output #f]) - (for-each - (lambda (x) - (printf "compiling ~a ...\n" x) - (compile-file (car x) (cadr x))) - scheme-library-files)) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - - -(define replace-safe-prims-with-unsafe - (lambda (x) - (define prims - '([fx+ $fx+] [fx- $fx-] [fx* $fx*] [fxadd1 $fxadd1] [fxsub1 $fxsub1] - [fxlogand $fxlogand] [fxlogor $fxlogor] [fxlognot $fxlognot] - [fx= $fx=] [fx< $fx<] [fx<= $fx<=] [fx> $fx>] [fx>= $fx>=] - [fxzero? $fxzero?] - [fixnum->char $fixnum->char] [char->fixnum $char->fixnum] - [char= $char=] - [char< $char<] [char> $char>] [char<= $char<=] [char>= $char>=] - [car $car] [cdr $cdr] [set-car! $set-car!] [set-cdr! $set-cdr!] - [vector-length $vector-length] [vector-ref $vector-ref] - [vector-set! $vector-set!] [make-vector $make-vector] - [string-length $string-length] [string-ref $string-ref] - [string-set! $string-set!] [make-string $make-string] - )) - (define (E x) - (cond - [(pair? x) (cons (E (car x)) (E (cdr x)))] - [(symbol? x) - (cond - [(assq x prims) => cadr] - [else x])] - [else x])) - (E x))) - -(parameterize ([input-filter - (lambda (x) - `(begin (write (eval ',x)) (newline) (exit 0)))]) - (test-all)) - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(compile-expr - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)) - "petite-ikarus.fasl") diff --git a/src/compiler-6.3.ss b/src/compiler-6.3.ss deleted file mode 100644 index 88e1083..0000000 --- a/src/compiler-6.3.ss +++ /dev/null @@ -1,3199 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1.ss") - (current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "ok\n")) - -(define primitive-set! set-top-level-value!) -(load "record-case.ss") - -(load "libassembler-compat-6.0.ss") ; defines make-code etc. -(load "libintelasm-6.0.ss") ; uses make-code, etc. -(load "libfasl-6.0.ss") ; uses code? etc. - - - -(load "tests-driver.ss") -(print-gensym #f) -(gensym-prefix "L_") - - -(define assembler-output (make-parameter #t)) - -(load "set-operations.ss") -;(load "tests-5.6-req.scm") -;(load "tests-5.3-req.scm") -;(load "tests-5.2-req.scm") -;(load "tests-5.1-req.scm") -;(load "tests-4.3-req.scm") -;(load "tests-4.2-req.scm") - -;(load "tests-4.1-req.scm") -;(load "tests-3.4-req.scm") - -;(load "tests-3.3-req.scm") -;(load "tests-3.2-req.scm") -;(load "tests-3.1-req.scm") -;(load "tests-2.9-req.scm") -;(load "tests-2.8-req.scm") -;(load "tests-2.6-req.scm") -;(load "tests-2.4-req.scm") -;(load "tests-2.3-req.scm") -;(load "tests-2.2-req.scm") -;(load "tests-2.1-req.scm") -;(load "tests-1.9-req.scm") -;(load "tests-1.8-req.scm") -;(load "tests-1.7-req.scm") -;(load "tests-1.6-req.scm") -;(load "tests-1.5-req.scm") -;(load "tests-1.4-req.scm") -;(load "tests-1.3-req.scm") -;(load "tests-1.2-req.scm") -;(load "tests-1.1-req.scm") - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.1.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.2.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ;["libexpand-6.2.ss" "libexpand.fasl"] - ;["libcompile-6.4.ss" "libcompile.fasl"] - ["psyntax-7.1.ss" "psyntax.fasl"] - ["libinterpret-6.1.ss" "libinterpret.fasl"] - ;["libintelasm-6.0.ss" "libintelasm.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - -(define primitive? - (lambda (x) - (or (assq x open-coded-primitives) - (memq x public-primitives)))) - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [bwp-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [pointer-value 1 value] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - ;;; tcbuckets - [$make-tcbucket 4 value] - [$tcbucket-key 1 value] - [$tcbucket-val 1 value] - [$tcbucket-next 1 value] - [$set-tcbucket-val! 2 effect] - [$set-tcbucket-next! 2 effect] - [$set-tcbucket-tconc! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - ;;; - ;;; asm - ;;; - ;[code? 1 pred] - ;[$code-instr-size 1 value] - ;[$code-reloc-size 1 value] - ;[$code-closure-size 1 value] - ;[$code->closure 1 value] - ;[$set-code-byte! 3 effect] - ;[$set-code-word! 3 effect] - ;[$set-code-object! 4 effect] - ;[$set-code-object+offset! 5 effect] - ;[$set-code-object+offset/rel! 5 effect] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - - -;;; primitives table section -(define primitives-table - '(;;; system locations used by the C/Scheme interface - [$apply-nonprocedure-error-handler library] - [$incorrect-args-error-handler library] - [$multiple-values-error library] - [$intern library] - [do-overflow library] - [do-vararg-overflow library] - [do-stack-overflow library] - ;;; type predicates - [fixnum? public] - [immediate? public] - [boolean? public] - [char? public] - [null? public] - [pair? public] - [symbol? public] - [vector? public] - [string? public] - [procedure? public] - [eof-object? public] - [not public] - [eq? public] - [equal? public] - ;;; fixnum primitives - [fxadd1 public] - [fxsub1 public] - [fx+ public] - [fx- public] - [fx* public] - [fxsll public] - [fxsra public] - [fxlogor public] - [fxlogand public] - [fxlogxor public] - [fxlognot public] - [fxquotient public] - [fxremainder public] - [fxmodulo public] - ;;; fixnum predicates - [fxzero? public] - [fx= public] - [fx< public] - [fx<= public] - [fx> public] - [fx>= public] - ;;; characters - [char=? public] - [char? public] - [char>=? public] - [integer->char public] - [char->integer public] - ;;; lists - [cons public] - [car public] - [cdr public] - [caar public] - [cadr public] - [cdar public] - [cddr public] - [caaar public] - [caadr public] - [cadar public] - [caddr public] - [cdaar public] - [cdadr public] - [cddar public] - [cdddr public] - [caaaar public] - [caaadr public] - [caadar public] - [caaddr public] - [cadaar public] - [cadadr public] - [caddar public] - [cadddr public] - [cdaaar public] - [cdaadr public] - [cdadar public] - [cdaddr public] - [cddaar public] - [cddadr public] - [cdddar public] - [cddddr public] - [set-car! public] - [set-cdr! public] - [list public] - [list* ADDME] - [list? public] - [list-ref public] - [length public] - [make-list public] - [reverse public] - [append public] - [list-ref public] - [memq public] - [memv public] - [assq public] - [map public] - [for-each public] - [andmap public] - [ormap public] - ;;; vectors - [make-vector public] - [vector public] - [vector-length public] - [vector-ref public] - [vector-set! public] - [list->vector public] - [vector->list public] - ;;; strings - [make-string public] - [string public] - [string-length public] - [string-ref public] - [string-set! public] - [list->string public] - [string->list public] - [string-append public] - [substring public] - [string=? public] - [fixnum->string public] - ;;; symbols - [gensym public] - [gensym? public] - [symbol->string public] - [gensym->unique-string public] - [gensym-prefix public] - [gensym-count public] - [print-gensym public] - [string->symbol public] - [top-level-value public] - [top-level-bound? public] - [set-top-level-value! public] - [primitive-set! public] - [getprop public] - [putprop public] - [remprop public] - [property-list public] - [oblist public] - [uuid public] - ;;; eof - [eof-object public] - [void public] - ;;; control/debugging - [print-error public] - [error public] - [current-error-handler public] - [exit public] - [apply public] - [make-parameter public] - ;;; output - [output-port? public] - [console-output-port public] - [current-output-port public] - [standard-output-port public] - [standard-error-port public] - [open-output-file public] - [open-output-string public] - [with-output-to-file public] - [call-with-output-file public] - [with-input-from-file public] - [call-with-input-file public] - [get-output-string public] - [close-output-port public] - [flush-output-port public] - [write-char public] - [output-port-name public] - [newline public] - ;;; input - [input-port? public] - [standard-input-port public] - [console-input-port public] - [current-input-port public] - [open-input-file public] - [close-input-port public] - [reset-input-port! public] - [read-char public] - [peek-char public] - [unread-char public] - [input-port-name public] - ;;; writing/printing - [write public] - [display public] - [printf public] - [fprintf public] - [format public] - [read-token public] - [read public] - ;;; evaluation - [primitive? public] - [expand public] - [syntax-error public] - [current-expand public] - [expand-mode public] - [compile-file public] - [fasl-write public] - - [$sc-put-cte public] - [sc-expand public] - [$make-environment public] - [environment? public] - [interaction-environment public] - [identifier? public] - [syntax->list public] - [syntax-object->datum public] - [datum->syntax-object public] - [generate-temporaries public] - [free-identifier=? public] - [bound-identifier=? public] - [literal-identifier=? public] - [syntax-error public] - [$syntax-dispatch public] - - - - [interpret public] - [eval public] - [current-eval public] - [load public] - [new-cafe public] - [collect public] - [call/cc public] - [call/cf library] - [dynamic-wind public] - [values public] - [call-with-values public] - [make-traced-procedure library] - [trace-symbol! library] - [untrace-symbol! library] - ;;; record - [$base-rtd library] - [record? public] - [record-rtd public] - [record-name public] - [record-printer public] - [record-length public] - [record-ref public] - [record-set! public] - ;;; record rtds - [make-record-type public] - [record-constructor public] - [record-predicate public] - [record-field-accessor public] - [record-field-mutator public] - ;;; hash tables - [make-hash-table public] - [hash-table? public] - [get-hash-table public] - [put-hash-table! public] - ;;; asm - [make-code public] - [code? public] - [make-code-executable! public] - [code-instr-size public] - [code-reloc-size public] - [code-closure-size public] - [set-code-byte! public] - [set-code-word! public] - [set-code-object! public] - [set-code-foreign-object! public] - [set-code-object+offset! public] - [set-code-object+offset/rel! public] - [set-code-object/reloc/relative! public] - [code->closure public] - [list*->code* library] - ;;; - ;;; POSIX - ;;; - [fork public] - [posix-fork public] - [system public] - [$debug public] - [$underflow-misaligned-error public] - )) - -(define (primitive? x) - (cond - [(assq x primitives-table) #t] - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [(assq x primitives-table) #f] - [else (error 'open-codeable "invalid primitive ~s" x)])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -;;; end of primitives table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record seq (e0 e1)) -(define-record function (arg* proper body)) -(define-record clambda-case (arg* proper body)) -(define-record clambda (cases)) -(define-record clambda-code (label cases free)) - -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) - -(define-record codes (list body)) -(define-record assign (lhs rhs)) - -(define unique-var - (let ([counter 0]) - (lambda (x) - (let ([g (gensym (format "~a:~a" x counter))]) - (set! counter (fxadd1 counter)) - (make-var g))))) - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(case-lambda) - (let ([cls* - (map - (lambda (cls) - (let ([fml* (car cls)] [body (cadr cls)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([body (E body (extend-env fml* nfml* env))]) - (make-clambda-case - (properize nfml*) - (list? fml*) - body))))) - (cdr x))]) - (make-clambda cls*))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (cond - [(primitive? var) (make-primref var)] - [else (error 'recordize "invalid top-level var ~s" var)]))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(function args proper body) - `(lambda ,(E-args proper args) ,(E body))] - [(clambda-case args proper body) - `(clambda-case ,(E-args proper args) ,(E body))] - [(clambda cls*) - `(case-lambda . ,(map E cls*))] - [(clambda-code label clauses free) - `(code ,label . ,(map E clauses))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes list body) - `(codes ,(map E list) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [(foreign-label x) `(foreign-label ,x)] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline-case cls rand*) - (record-case cls - [(clambda-case fml* proper body) - (if proper - (and (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body)) - (and (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body)))])) - (define (try-inline cls* rand* default) - (cond - [(null? cls*) default] - [(inline-case (car cls*) rand*)] - [else (try-inline (cdr cls*) rand* default)])) - (define (inline rator rand*) - (record-case rator - [(clambda cls*) - (try-inline cls* rand* - (make-funcall rator rand*))] -; [(function fml* proper body) -; (cond -; [proper -; (if (fx= (length fml*) (length rand*)) -; (make-bind fml* rand* body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))] -; [else -; (if (fx<= (length fml*) (length rand*)) -; (make-bind fml* (properize fml* rand*) body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))])] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (make-function fml* proper (Expr body))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (cond - [(null? x*) '()] - [else (union (Expr (car x*)) (Expr* (cdr x*)))])) - (define (Expr x) - (record-case x - [(constant) '()] - [(var) '()] - [(primref) '()] - [(bind lhs* rhs* body) - (union (Expr body) (Expr* rhs*))] - [(conditional test conseq altern) - (union (Expr test) (union (Expr conseq) (Expr altern)))] - [(seq e0 e1) (union (Expr e0) (Expr e1))] - [(clambda cls*) - (Expr* (map clambda-case-body cls*))] - [(function fml* proper body) (Expr body)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (union (singleton lhs) (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - -(define (rewrite-assignments assigned x) - (define who 'rewrite-assignments) - (define (fix lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix (cdr lhs*))]) - (cond - [(memq x assigned) - (let ([t (make-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(memq x assigned) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-function fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(clambda cls*) - (make-clambda - (map (lambda (cls) - (record-case cls - [(clambda-case fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-clambda-case fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))])) - cls*))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (memq lhs assigned) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (remove-assignments x) - (let ([assigned (uncover-assigned x)]) - (rewrite-assignments assigned x))) - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(function fml* proper body) - (let-values ([(body body-free) (Expr body)]) - (let ([free (difference body-free fml*)]) - (values (make-closure (make-code-rec fml* proper free body) free) - free)))] - [(clambda cls*) - (let-values ([(cls* free) - (let f ([cls* cls*]) - (cond - [(null? cls*) (values '() '())] - [else - (record-case (car cls*) - [(clambda-case fml* proper body) - (let-values ([(body body-free) (Expr body)] - [(cls* cls*-free) (f (cdr cls*))]) - (values - (cons (make-clambda-case fml* proper body) - cls*) - (union (difference body-free fml*) - cls*-free)))])]))]) - (values (make-closure (make-clambda-code (gensym) cls* free) free) - free))] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define all-codes '()) - (define (do-code x) - (record-case x - [(clambda-code label cls* free) - (let ([cls* (map - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (E body))])) - cls*)]) - (let ([g (make-code-loc label)]) - (set! all-codes - (cons (make-clambda-code label cls* free) all-codes)) - g))])) - (define (E x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map E rhs*) (E body))] - [(conditional test conseq altern) - (make-conditional (E test) (E conseq) (E altern))] - [(seq e0 e1) (make-seq (E e0) (E e1))] - [(closure c free) (make-closure (do-code c) free)] - [(primcall op rand*) (make-primcall op (map E rand*))] - [(forcall op rand*) (make-forcall op (map E rand*))] - [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] - [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] - [else (error who "invalid expression ~s" (unparse x))])) - (let ([x (E x)]) - (make-codes all-codes x))) - - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? code? $forward-ptr? bwp-object? - pointer-value) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-instr-size $code-reloc-size $code-closure-size - $set-code-byte! $set-code-word! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $make-record $record? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref - $make-tcbucket $tcbucket-key $tcbucket-val $tcbucket-next - $set-tcbucket-val! $set-tcbucket-next! $set-tcbucket-tconc!) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L clauses free) - (make-clambda-code L (map CaseExpr clauses) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (if (Tail body) - (make-clambda-case fml* proper (insert-check body)) - x)])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-funcall (make-primref 'do-overflow) - (list (make-constant n))) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure code free*) - (check-const (fx+ disp-closure-data (fx* (length free*) wordsize)) x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [($make-tcbucket) (check-const tcbucket-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(vector) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp #t (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (case op -; [(values) (make-primcall op (simple* arg* r))] - [else (make-return (make-primcall op (simple* arg* r)))])] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'tail live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define CaseExpr - (lambda (r) - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let-values ([(fml* si r live) (bind-fml* fml* r)]) - (make-clambda-case fml* proper (Tail body si r live)))])))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (let ([r (bind-free* free)]) - (make-clambda-code L (map (CaseExpr r) cases) free))])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag bool-f) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define bwp-object #x8F) ; double check - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - (define pagesize 4096) - (define pageshift 12) - (define wordsize 4) - (define wordshift 2) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-closuresize 12) - (define disp-code-data 16) - (define disp-tcbucket-tconc 0) - (define disp-tcbucket-key 4) - (define disp-tcbucket-val 8) - (define disp-tcbucket-next 12) - (define tcbucket-size 16) - - (define record-ptag vector-tag) - (define record-pmask vector-mask) - (define disp-record-rtd 0) - (define disp-record-data 4) - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define pagesize 4096) - (define dirty-word -1)) - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift)))) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [(dirty-vector) (mem 28 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [(bwp-object?) (type-pred #f bwp-object rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [(code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx< i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($tcbucket-key) - (indirect-ref arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($tcbucket-val) - (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($tcbucket-next) - (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] - [(pointer-value) - (list* - (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (sall (int fx-shift) eax) - ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [($make-tcbucket) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-tcbucket-tconc apr)) - (movl (Simple (cadr arg*)) eax) - (movl eax (mem disp-tcbucket-key apr)) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem disp-tcbucket-val apr)) - (movl (Simple (cadddr arg*)) eax) - (movl eax (mem disp-tcbucket-next apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align tcbucket-size)) apr) - ac)] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-instr-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) - (cons (sall (int fx-shift) eax) ac))] - [($code-reloc-size) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-closure-size) - (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] - [($set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $set-code-byte! $set-code-word! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? code? - $record? bwp-object?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc SL_continuation_code) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc SL_call_with_values) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc SL_values) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (indirect-assignment arg* offset ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem offset eax)) - ;;; record side effect - (addl (int offset) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (addl (int (fx- disp-vector-data vector-tag)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-tcbucket-key!) - (indirect-assignment arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($set-tcbucket-val!) - (indirect-assignment arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($set-tcbucket-next!) - (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($set-tcbucket-tconc!) - (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-system-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-plist symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-unique-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (addl (int (fx- disp-record-data record-ptag)) ebx) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [(cons void $fxadd1 $fxsub1) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address label)] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(apply) are-we-ever-here? - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - L_CALL - (call (label SL_apply)) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (movl '(foreign-label "ik_foreign_call") ebx) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - '(byte 0) - '(byte 0) - '(byte 0) - L_CALL - (call ebx) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else (error who "invalid convention ~s for call-cp" convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let ([Lf (unique-label)] [Ljoin (unique-label)]) - (Pred test #f Lf - (Effect conseq - (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (NonTail body - (cond - [check - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac)] - [else - (list* - (movl eax cpr) - ac)]))] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(new-frame idx size body) - (Tail body ac)] - [(call-cp call-convention rp-convention idx argc mask) - (unless (eq? rp-convention 'tail) - (error who "nontail rp (~s) in tail context" rp-convention)) - (let f ([i 0]) - (cond - [(fx= i argc) - (case call-convention - [(normal) - (list* - (movl (int (argc-convention argc)) eax) - (tail-indirect-cpr-call) - ac)] - [(apply) - (list* - (movl (int (argc-convention argc)) eax) - (jmp (label SL_apply)) - ac)] - [else (error who "invalid conv ~s in tail call-cpr" convention)])] - [else - (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) - (fx- 0 wordsize)) fpr) - eax) - (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) - (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (Entry check? x ac) - (record-case x - [(clambda-case fml* proper body) - (let ([ac (Tail body ac)]) - (cond - [(and proper check?) - (list* (cmpl (int (argc-convention (length fml*))) eax) - (jne (label SL_invalid_args)) - ac)] - [proper ac] - [else - (handle-vararg (length fml*) ac)]))])) - (define make-dispatcher - (lambda (j? L L* x x* ac) - (cond - [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] - [else - (record-case x - [(clambda-case fml* proper _) - (cond - [proper - (list* (cmpl (int (argc-convention (length fml*))) eax) - (je (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))] - [else - (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) - (jle (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) - (define (handle-cases x x*) - (let ([L* (map (lambda (_) (gensym)) x*)] - [L (gensym)]) - (make-dispatcher #f L L* x x* - (let f ([x x] [x* x*] [L L] [L* L*]) - (cond - [(null? x*) - (cons (label L) (Entry 'check x '()))] - [else - (cons (label L) - (Entry #f x - (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (list* - (fx+ disp-closure-data (fx* wordsize (length free))) - (label L) - (handle-cases (car cases) (cdr cases)))])) - (record-case x - [(codes list body) - (cons (cons 0 (Tail body '())) - (map CodeExpr list))])) - - -(define SL_nonprocedure (gensym "SL_nonprocedure")) -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(list*->code* - (list - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)]) - (list disp-closure-data - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list disp-closure-data - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list - (fx+ disp-closure-data wordsize) - (label SL_continuation_code) - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_cont_mult_args) - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - )) - - - -(define (compile-program original-program) - (let* (;;; - [p (sc-expand original-program)] - [p (recordize p)] - ;[f (pretty-print (unparse p))] - [p (optimize-direct-calls p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - ;[p (lift-complex-constants p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - ;[f (pretty-print (unparse p))] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - ;[f (pretty-print (unparse p))] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (fasl-write (car code*) (compile-port)))) - - -(define compile-expr - (lambda (expr output-file) - (let ([op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op]) - (compile-program expr)) - (close-output-port op)))) - -(define compile-file - (lambda (input-file output-file) - (let ([ip (open-input-file input-file)] - [op (open-output-file output-file 'replace)]) - (parameterize ([compile-port op] - [expand-mode 'bootstrap]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (compile-program x) - (f))))) - (close-input-port ip) - (close-output-port op)))) - - -(parameterize ([assembler-output #f]) - (for-each - (lambda (x) - (printf "compiling ~a ...\n" x) - (compile-file (car x) (cadr x))) - scheme-library-files)) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - - -(define replace-safe-prims-with-unsafe - (lambda (x) - (define prims - '([fx+ $fx+] [fx- $fx-] [fx* $fx*] [fxadd1 $fxadd1] [fxsub1 $fxsub1] - [fxlogand $fxlogand] [fxlogor $fxlogor] [fxlognot $fxlognot] - [fx= $fx=] [fx< $fx<] [fx<= $fx<=] [fx> $fx>] [fx>= $fx>=] - [fxzero? $fxzero?] - [fixnum->char $fixnum->char] [char->fixnum $char->fixnum] - [char= $char=] - [char< $char<] [char> $char>] [char<= $char<=] [char>= $char>=] - [car $car] [cdr $cdr] [set-car! $set-car!] [set-cdr! $set-cdr!] - [vector-length $vector-length] [vector-ref $vector-ref] - [vector-set! $vector-set!] [make-vector $make-vector] - [string-length $string-length] [string-ref $string-ref] - [string-set! $string-set!] [make-string $make-string] - )) - (define (E x) - (cond - [(pair? x) (cons (E (car x)) (E (cdr x)))] - [(symbol? x) - (cond - [(assq x prims) => cadr] - [else x])] - [else x])) - (E x))) - -(parameterize ([input-filter - (lambda (x) - `(begin (write (eval ',x)) (newline) (exit 0)))]) - (test-all)) - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(compile-expr - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)) - "petite-ikarus.fasl") diff --git a/src/compiler-6.4.ss b/src/compiler-6.4.ss deleted file mode 100644 index da0089c..0000000 --- a/src/compiler-6.4.ss +++ /dev/null @@ -1,98 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (set! $base-rtd (eval '#%$base-rtd)) -; (set! $base-rtd #%$base-rtd) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "ok\n") - (load "libassembler-compat-6.0.ss") ; defines make-code etc. - (load "libintelasm-6.0.ss") ; uses make-code, etc. - (load "libfasl-6.0.ss") ; uses code? etc. - (load "libcompile-6.4.ss") ; uses fasl-write -) - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.4.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.2.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libassembler-compat-6.0.ss" "libassembler-compat.ss"] - ["libintelasm-6.4.ss" "libintelasm.fasl"] - ["libfasl-6.0.ss" "libfasl.fasl"] - ["libcompile-6.4.ss" "libcompile.fasl"] - ["psyntax-7.1.ss" "psyntax.fasl"] - ["libinterpret-6.1.ss" "libinterpret.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] [expand-mode 'bootstrap]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (compile-library (car x) (cadr x))) - scheme-library-files) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(with-output-to-file "petite-ikarus.ss" - (lambda () - (write - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)))) - 'replace) - -(compile-library "petite-ikarus.ss" "petite-ikarus.fasl") diff --git a/src/compiler-6.5.ss b/src/compiler-6.5.ss deleted file mode 100644 index f4dc5e2..0000000 --- a/src/compiler-6.5.ss +++ /dev/null @@ -1,96 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1-6.5.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "ok\n") - (load "libassembler-compat-6.0.ss") ; defines make-code etc. - (load "libintelasm-6.0.ss") ; uses make-code, etc. - (load "libfasl-6.0.ss") ; uses code? etc. - (load "libcompile-6.5.ss") ; uses fasl-write -) - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.4.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.2.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libassembler-compat-6.0.ss" "libassembler-compat.ss"] - ["libintelasm-6.4.ss" "libintelasm.fasl"] - ["libfasl-6.0.ss" "libfasl.fasl"] - ["libcompile-6.5.ss" "libcompile.fasl"] - ["psyntax-7.1-6.5.ss" "psyntax.fasl"] - ["libinterpret-6.5.ss" "libinterpret.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] [expand-mode 'bootstrap]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (compile-library (car x) (cadr x))) - scheme-library-files) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(with-output-to-file "petite-ikarus.ss" - (lambda () - (write - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)))) - 'replace) - -(compile-library "petite-ikarus.ss" "petite-ikarus.fasl") diff --git a/src/compiler-6.6.ss b/src/compiler-6.6.ss deleted file mode 100644 index b83900e..0000000 --- a/src/compiler-6.6.ss +++ /dev/null @@ -1,97 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1-6.5.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "ok\n") - (load "libassembler-compat-6.6.ss") ; defines make-code etc. - (load "libintelasm-6.6.ss") ; uses make-code, etc. - (load "libfasl-6.6.ss") ; uses code? etc. - (load "libcompile-6.6.ss") ; uses fasl-write -) - - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.4.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.2.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libassembler-compat-6.6.ss" "libassembler-compat.ss"] - ["libintelasm-6.6.ss" "libintelasm.fasl"] - ["libfasl-6.6.ss" "libfasl.fasl"] - ["libcompile-6.6.ss" "libcompile.fasl"] - ["psyntax-7.1-6.5.ss" "psyntax.fasl"] - ["libinterpret-6.5.ss" "libinterpret.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] [expand-mode 'bootstrap]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (compile-library (car x) (cadr x))) - scheme-library-files) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(with-output-to-file "petite-ikarus.ss" - (lambda () - (write - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)))) - 'replace) - -(compile-library "petite-ikarus.ss" "petite-ikarus.fasl") diff --git a/src/compiler-6.7.ss b/src/compiler-6.7.ss deleted file mode 100644 index b19d43f..0000000 --- a/src/compiler-6.7.ss +++ /dev/null @@ -1,98 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1-6.5.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "ok\n") - (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.6.ss") ; uses make-code, etc. - (load "libfasl-6.7.ss") ; uses code? etc. - (load "libcompile-6.7.ss") ; uses fasl-write -) - - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.4.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.2.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libassembler-6.7.ss" "libassembler.ss"] - ["libintelasm-6.6.ss" "libintelasm.fasl"] - ["libfasl-6.7.ss" "libfasl.fasl"] - ["libcompile-6.7.ss" "libcompile.fasl"] - ["psyntax-7.1-6.5.ss" "psyntax.fasl"] - ["libinterpret-6.5.ss" "libinterpret.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] - [expand-mode 'bootstrap]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (compile-library (car x) (cadr x))) - scheme-library-files) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(with-output-to-file "petite-ikarus.ss" - (lambda () - (write - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)))) - 'replace) - -(compile-library "petite-ikarus.ss" "petite-ikarus.fasl") diff --git a/src/compiler-6.8.ss b/src/compiler-6.8.ss deleted file mode 100644 index e12cfaa..0000000 --- a/src/compiler-6.8.ss +++ /dev/null @@ -1,98 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(when (eq? "" "") - (load "chez-compat.ss") - (set! primitive-ref top-level-value) - (set! primitive-set! set-top-level-value!) - (set! chez-expand sc-expand) - (set! chez-current-expand current-expand) - (printf "loading psyntax.pp ...\n") - (load "psyntax-7.1.pp") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "loading psyntax.ss ...\n") - (load "psyntax-7.1-6.5.ss") - (chez-current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - (printf "ok\n") - (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.6.ss") ; uses make-code, etc. - (load "libfasl-6.7.ss") ; uses code? etc. - (load "libcompile-6.7.ss") ; uses fasl-write -) - - - -(define scheme-library-files - '(["libhandlers-6.0.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.4.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.2.ss" "libcore.fasl"] - ["libio-6.1.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libassembler-6.7.ss" "libassembler.ss"] - ["libintelasm-6.6.ss" "libintelasm.fasl"] - ["libfasl-6.7.ss" "libfasl.fasl"] - ["libcompile-6.7.ss" "libcompile.fasl"] - ["psyntax-7.1-6.8.ss" "psyntax.fasl"] - ["libinterpret-6.5.ss" "libinterpret.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] -; ["libtrace-5.3.ss" "libtrace-5.3.s" "libtrace" ] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.0.ss" "libtoplevel.fasl"] - )) - - - -(define (compile-library ifile ofile) - (parameterize ([assembler-output #f] - [expand-mode 'bootstrap]) - (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace))) - -(for-each - (lambda (x) - (compile-library (car x) (cadr x))) - scheme-library-files) - -(system "rm -f ikarus.fasl") - -(for-each - (lambda (x) - (system (format "cat ~a >> ikarus.fasl" (cadr x)))) - scheme-library-files) - - -(define (get-date) - (system "date +\"%F\" > build-date.tmp") - (let ([ip (open-input-file "build-date.tmp")]) - (list->string - (let f () - (let ([x (read-char ip)]) - (if (char=? x #\newline) - '() - (cons x (f)))))))) - -(with-output-to-file "petite-ikarus.ss" - (lambda () - (write - `(begin - (display ,(format "Petite Ikarus Scheme (Build ~a)\n" (get-date))) - (display "Copyright (c) 2006 Abdulaziz Ghuloum\n\n") - (new-cafe)))) - 'replace) - -(compile-library "petite-ikarus.ss" "petite-ikarus.fasl") diff --git a/src/compiler-8.1.ss b/src/compiler-8.1.ss index 9480512..1cee6fc 100644 --- a/src/compiler-8.1.ss +++ b/src/compiler-8.1.ss @@ -100,11 +100,11 @@ console-input-port current-input-port standard-output-port standard-error-port console-output-port current-output-port - open-output-file + open-output-file open-input-file open-output-string get-output-string with-output-to-file call-with-output-file with-input-from-file call-with-input-file - + date-string )) @@ -137,11 +137,13 @@ $make-tcbucket $tcbucket-next $tcbucket-key $tcbucket-val $set-tcbucket-next! $set-tcbucket-val! $set-tcbucket-tconc! call/cf trace-symbol! untrace-symbol! make-traced-procedure - fixnum->string date-string + fixnum->string vector-memq vector-memv ;;; must open-code - $make-port + $make-port/input + $make-port/output + $make-port/both $make-input-port $make-output-port $make-input/output-port $port-handler $port-input-buffer $port-input-index $port-input-size @@ -179,7 +181,7 @@ `(begin (define-syntax compile-time-date-string (lambda (x) - #'(quote ,(#%date-string)))) + #'(quote ,(date-string)))) (define-syntax public-primitives (lambda (x) #'(quote ,public-primitives))) @@ -220,7 +222,7 @@ (whack-system-env #t) (printf "ok\n") (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.6.ss") ; uses make-code, etc. + (load "libintelasm-6.9.ss") ; uses make-code, etc. (load "libfasl-6.7.ss") ; uses code? etc. (load "libcompile-8.1.ss") ; uses fasl-write ) @@ -258,8 +260,7 @@ [expand-mode 'bootstrap] [interaction-environment system-env]) (printf "compiling ~a ...\n" ifile) - (compile-file ifile ofile 'replace) - (printf "done\n"))) + (compile-file ifile ofile 'replace))) (for-each (lambda (x) diff --git a/src/compiler-6.9.ss b/src/compiler-9.0.ss similarity index 70% rename from src/compiler-6.9.ss rename to src/compiler-9.0.ss index 2a10256..f3ab9c7 100644 --- a/src/compiler-6.9.ss +++ b/src/compiler-9.0.ss @@ -1,6 +1,6 @@ -;;; +;;; 8.1: * using chez-style io ports ;;; 6.9: * creating a *system* environment ;;; 6.8: * creating a core-primitive form in the expander ;;; 6.2: * side-effects now modify the dirty-vector @@ -63,16 +63,7 @@ gensym->unique-string call-with-values values make-parameter dynamic-wind - output-port? current-output-port standard-output-port console-output-port - open-output-file close-output-port flush-output-port output-port-name - with-output-to-file with-input-from-file - input-port? current-input-port standard-input-port console-input-port - reset-input-port! - open-input-file close-input-port input-port-name - standard-error-port - open-output-string get-output-string - newline write-char peek-char read-char unread-char - display write fasl-write printf format print-error + display write print-graph fasl-write printf format print-error read-token read error exit call/cc current-error-handler @@ -93,6 +84,28 @@ assembler-output $make-environment features + + port? input-port? output-port? + make-input-port make-output-port make-input/output-port + port-handler + port-input-buffer port-input-index port-input-size + port-output-buffer port-output-index port-output-size + set-port-input-index! set-port-input-size! + set-port-output-index! set-port-output-size! + port-name input-port-name output-port-name + write-char read-char unread-char peek-char + newline + reset-input-port! flush-output-port + close-input-port close-output-port + console-input-port current-input-port + standard-output-port standard-error-port + console-output-port current-output-port + open-output-file open-input-file + open-output-string get-output-string + with-output-to-file call-with-output-file + with-input-from-file call-with-input-file + date-string + )) (define system-primitives @@ -124,8 +137,28 @@ $make-tcbucket $tcbucket-next $tcbucket-key $tcbucket-val $set-tcbucket-next! $set-tcbucket-val! $set-tcbucket-tconc! call/cf trace-symbol! untrace-symbol! make-traced-procedure - fixnum->string date-string + fixnum->string vector-memq vector-memv + + ;;; must open-code + $make-port/input + $make-port/output + $make-port/both + $make-input-port $make-output-port $make-input/output-port + $port-handler + $port-input-buffer $port-input-index $port-input-size + $port-output-buffer $port-output-index $port-output-size + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size! + + ;;; better open-code + $write-char $read-char $peek-char $unread-char + + ;;; never open-code + $reset-input-port! $close-input-port + $close-output-port $flush-output-port + *standard-output-port* *standard-error-port* *current-output-port* + *standard-input-port* *current-input-port* )) @@ -148,7 +181,7 @@ `(begin (define-syntax compile-time-date-string (lambda (x) - #'(quote ,(#%date-string)))) + #'(quote ,(date-string)))) (define-syntax public-primitives (lambda (x) #'(quote ,public-primitives))) @@ -189,35 +222,35 @@ (whack-system-env #t) (printf "ok\n") (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.6.ss") ; uses make-code, etc. + (load "libintelasm-6.9.ss") ; uses make-code, etc. (load "libfasl-6.7.ss") ; uses code? etc. - (load "libcompile-6.7.ss") ; uses fasl-write + (load "libcompile-8.1.ss") ; uses fasl-write ) (whack-system-env #t) (define scheme-library-files - '(["libhandlers-6.9.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.4.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.9.ss" "libcore.fasl"] - ["libio-6.9.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libassembler-6.7.ss" "libassembler.ss"] - ["libintelasm-6.9.ss" "libintelasm.fasl"] - ["libfasl-6.7.ss" "libfasl.fasl"] - ["libcompile-6.7.ss" "libcompile.fasl"] - ["psyntax-7.1-6.9.ss" "psyntax.fasl"] - ["libinterpret-6.5.ss" "libinterpret.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] - ["libtrace-6.9.ss" "libtrace.fasl"] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.9.ss" "libtoplevel.fasl"] + '(["libhandlers-6.9.ss" #t "libhandlers.fasl"] + ["libcontrol-6.1.ss" #t "libcontrol.fasl"] + ["libcollect-6.1.ss" #t "libcollect.fasl"] + ["librecord-6.4.ss" #t "librecord.fasl"] + ["libcxr-6.0.ss" #t "libcxr.fasl"] + ["libcore-6.9.ss" #t "libcore.fasl"] + ["libchezio-8.1.ss" #t "libchezio.fasl"] + ["libhash-6.2.ss" #t "libhash.fasl"] + ["libwriter-9.0.ss" #t "libwriter.fasl"] + ["libtokenizer-9.0.ss" #t "libtokenizer.fasl"] + ["libassembler-6.7.ss" #t "libassembler.ss"] + ["libintelasm-6.9.ss" #t "libintelasm.fasl"] + ["libfasl-6.7.ss" #t "libfasl.fasl"] + ["libcompile-9.0.ss" #t "libcompile.fasl"] + ["psyntax-7.1-9.0.ss" #t "psyntax.fasl"] + ["libinterpret-6.5.ss" #t "libinterpret.fasl"] + ["libcafe-6.1.ss" #t "libcafe.fasl"] + ["libtrace-6.9.ss" #t "libtrace.fasl"] + ["libposix-6.0.ss" #t "libposix.fasl"] + ["libtoplevel-6.9.ss" #t "libtoplevel.fasl"] )) @@ -231,7 +264,8 @@ (for-each (lambda (x) - (compile-library (car x) (cadr x))) + (when (cadr x) + (compile-library (car x) (caddr x)))) scheme-library-files) @@ -253,4 +287,4 @@ (system (format "cat ~a > ikarus.fasl" - (join " " (map cadr scheme-library-files)))) + (join " " (map caddr scheme-library-files)))) diff --git a/src/compiler-8.0.ss b/src/compiler-9.1.ss similarity index 68% rename from src/compiler-8.0.ss rename to src/compiler-9.1.ss index bb1a651..160f2e1 100644 --- a/src/compiler-8.0.ss +++ b/src/compiler-9.1.ss @@ -1,6 +1,9 @@ -;;; +;;; 9.1: * starting with libnumerics +;;; 9.0: * graph marks for both reader and writer +;;; * circularity detection during read +;;; 8.1: * using chez-style io ports ;;; 6.9: * creating a *system* environment ;;; 6.8: * creating a core-primitive form in the expander ;;; 6.2: * side-effects now modify the dirty-vector @@ -63,16 +66,7 @@ gensym->unique-string call-with-values values make-parameter dynamic-wind - output-port? current-output-port standard-output-port console-output-port - open-output-file close-output-port flush-output-port output-port-name - with-output-to-file with-input-from-file - input-port? current-input-port standard-input-port console-input-port - reset-input-port! - open-input-file close-input-port input-port-name - standard-error-port - open-output-string get-output-string - newline write-char peek-char read-char unread-char - display write fasl-write printf format print-error + display write print-graph fasl-write printf format print-error read-token read error exit call/cc current-error-handler @@ -93,6 +87,31 @@ assembler-output $make-environment features + + port? input-port? output-port? + make-input-port make-output-port make-input/output-port + port-handler + port-input-buffer port-input-index port-input-size + port-output-buffer port-output-index port-output-size + set-port-input-index! set-port-input-size! + set-port-output-index! set-port-output-size! + port-name input-port-name output-port-name + write-char read-char unread-char peek-char + newline + reset-input-port! flush-output-port + close-input-port close-output-port + console-input-port current-input-port + standard-output-port standard-error-port + console-output-port current-output-port + open-output-file open-input-file + open-output-string get-output-string + with-output-to-file call-with-output-file + with-input-from-file call-with-input-file + date-string + + + - add1 sub1 * expt number? positive? negative? zero? number->string + logand + = < > <= >= )) (define system-primitives @@ -124,13 +143,28 @@ $make-tcbucket $tcbucket-next $tcbucket-key $tcbucket-val $set-tcbucket-next! $set-tcbucket-val! $set-tcbucket-tconc! call/cf trace-symbol! untrace-symbol! make-traced-procedure - fixnum->string date-string + fixnum->string vector-memq vector-memv + ;;; must open-code + $make-port/input + $make-port/output + $make-port/both + $make-input-port $make-output-port $make-input/output-port + $port-handler + $port-input-buffer $port-input-index $port-input-size + $port-output-buffer $port-output-index $port-output-size + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size! + ;;; better open-code + $write-char $read-char $peek-char $unread-char -port? input-port? output-port? $make-input-port make-input-port $make-output-port make-output-port $make-input/output-port make-input/output-port $port-handler port-handler $port-input-buffer port-input-buffer $port-input-index port-input-index $port-input-size port-input-size $port-output-buffer port-output-buffer $port-output-index port-output-index $port-output-size port-output-size $set-port-input-index! set-port-input-index! $set-port-input-size! set-port-input-size! $set-port-output-index! set-port-output-index! $set-port-output-size! set-port-output-size! $write-char write-char newline port-name input-port-name output-port-name $read-char read-char $unread-char unread-char $peek-char peek-char $unread-char $reset-input-port! reset-input-port! $close-input-port close-input-port $close-output-port close-output-port $flush-output-port flush-output-port *standard-input-port* console-input-port *current-input-port* current-input-port *standard-output-port* *current-output-port* *standard-error-port* standard-output-port standard-error-port console-output-port current-output-port *current-output-port* open-output-file open-output-string get-output-string with-output-to-file call-with-output-file with-input-from-file call-with-input-file - + ;;; never open-code + $reset-input-port! $close-input-port + $close-output-port $flush-output-port + *standard-output-port* *standard-error-port* *current-output-port* + *standard-input-port* *current-input-port* )) @@ -153,7 +187,7 @@ port? input-port? output-port? $make-input-port make-input-port $make-output- `(begin (define-syntax compile-time-date-string (lambda (x) - #'(quote ,(#%date-string)))) + #'(quote ,(date-string)))) (define-syntax public-primitives (lambda (x) #'(quote ,public-primitives))) @@ -194,35 +228,36 @@ port? input-port? output-port? $make-input-port make-input-port $make-output- (whack-system-env #t) (printf "ok\n") (load "libassembler-compat-6.7.ss") ; defines make-code etc. - (load "libintelasm-6.6.ss") ; uses make-code, etc. + (load "libintelasm-6.9.ss") ; uses make-code, etc. (load "libfasl-6.7.ss") ; uses code? etc. - (load "libcompile-6.7.ss") ; uses fasl-write + (load "libcompile-8.1.ss") ; uses fasl-write ) (whack-system-env #t) (define scheme-library-files - '(["libhandlers-6.9.ss" "libhandlers.fasl"] - ["libcontrol-6.1.ss" "libcontrol.fasl"] - ["libcollect-6.1.ss" "libcollect.fasl"] - ["librecord-6.4.ss" "librecord.fasl"] - ["libcxr-6.0.ss" "libcxr.fasl"] - ["libcore-6.9.ss" "libcore.fasl"] - ["libio-6.9.ss" "libio.fasl"] - ["libwriter-6.2.ss" "libwriter.fasl"] - ["libtokenizer-6.1.ss" "libtokenizer.fasl"] - ["libassembler-6.7.ss" "libassembler.ss"] - ["libintelasm-6.9.ss" "libintelasm.fasl"] - ["libfasl-6.7.ss" "libfasl.fasl"] - ["libcompile-6.7.ss" "libcompile.fasl"] - ["psyntax-7.1-6.9.ss" "psyntax.fasl"] - ["libinterpret-6.5.ss" "libinterpret.fasl"] - ["libcafe-6.1.ss" "libcafe.fasl"] - ["libtrace-6.9.ss" "libtrace.fasl"] - ["libposix-6.0.ss" "libposix.fasl"] - ["libhash-6.2.ss" "libhash.fasl"] - ["libtoplevel-6.9.ss" "libtoplevel.fasl"] + '(["libhandlers-6.9.ss" #t "libhandlers.fasl"] + ["libcontrol-6.1.ss" #t "libcontrol.fasl"] + ["libcollect-6.1.ss" #t "libcollect.fasl"] + ["librecord-6.4.ss" #t "librecord.fasl"] + ["libcxr-6.0.ss" #t "libcxr.fasl"] + ["libnumerics-9.1.ss" #t "libnumerics.fasl"] + ["libcore-6.9.ss" #t "libcore.fasl"] + ["libchezio-8.1.ss" #t "libchezio.fasl"] + ["libhash-6.2.ss" #t "libhash.fasl"] + ["libwriter-9.1.ss" #t "libwriter.fasl"] + ["libtokenizer-9.1.ss" #t "libtokenizer.fasl"] + ["libassembler-6.7.ss" #t "libassembler.ss"] + ["libintelasm-6.9.ss" #t "libintelasm.fasl"] + ["libfasl-6.7.ss" #t "libfasl.fasl"] + ["libcompile-9.1.ss" #t "libcompile.fasl"] + ["psyntax-7.1-9.1.ss" #t "psyntax.fasl"] + ["libinterpret-6.5.ss" #t "libinterpret.fasl"] + ["libcafe-6.1.ss" #t "libcafe.fasl"] + ["libtrace-6.9.ss" #t "libtrace.fasl"] + ["libposix-6.0.ss" #t "libposix.fasl"] + ["libtoplevel-6.9.ss" #t "libtoplevel.fasl"] )) @@ -236,7 +271,8 @@ port? input-port? output-port? $make-input-port make-input-port $make-output- (for-each (lambda (x) - (compile-library (car x) (cadr x))) + (when (cadr x) + (compile-library (car x) (caddr x)))) scheme-library-files) @@ -258,4 +294,4 @@ port? input-port? output-port? $make-input-port make-input-port $make-output- (system (format "cat ~a > ikarus.fasl" - (join " " (map cadr scheme-library-files)))) + (join " " (map caddr scheme-library-files)))) diff --git a/src/compiler-9.2.ss b/src/compiler-9.2.ss new file mode 100644 index 0000000..086d32e --- /dev/null +++ b/src/compiler-9.2.ss @@ -0,0 +1,301 @@ + + +;;; 9.1: * starting with libnumerics +;;; 9.0: * graph marks for both reader and writer +;;; * circularity detection during read +;;; 8.1: * using chez-style io ports +;;; 6.9: * creating a *system* environment +;;; 6.8: * creating a core-primitive form in the expander +;;; 6.2: * side-effects now modify the dirty-vector +;;; * added bwp-object? +;;; * added pointer-value +;;; * added tcbuckets +;;; 6.1: * added case-lambda, dropped lambda +;;; 6.0: * basic compiler + + + + +(define macros + '(|#primitive| lambda case-lambda set! quote begin define if letrec + foreign-call $apply + quasiquote unquote unquote-splicing + define-syntax identifier-syntax let-syntax letrec-syntax + fluid-let-syntax alias meta eval-when with-implicit with-syntax + type-descriptor + syntax-case syntax-rules module $module import $import import-only + syntax quasisyntax unsyntax unsyntax-splicing datum + let let* let-values cond case define-record or and when unless do + include parameterize trace untrace trace-lambda)) + + + +(define public-primitives + '(null? pair? char? fixnum? symbol? gensym? string? vector? list? + boolean? procedure? + not + eof-object eof-object? bwp-object? + void + fx= fx< fx<= fx> fx>= fxzero? + fx+ fx- fx* fxadd1 fxsub1 fxquotient fxremainder fxmodulo + fxsll fxsra fxlognot fxlogor fxlogand fxlogxor + integer->char char->integer + char=? char? char>=? + cons car cdr set-car! set-cdr! + caar cadr cdar cddr + caaar caadr cadar caddr cdaar cdadr cddar cdddr + caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr + cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr + list list* make-list length list-ref + append + make-vector vector-ref vector-set! vector-length vector + vector->list list->vector + make-string string-ref string-set! string-length string list->string + uuid + string-append substring + string=? string? string>=? + remprop putprop getprop property-list + apply + map for-each andmap ormap + memq memv assq + eq? equal? + reverse + string->symbol symbol->string oblist + top-level-value set-top-level-value! top-level-bound? + gensym gensym-count gensym-prefix print-gensym + gensym->unique-string + call-with-values values + make-parameter dynamic-wind + display write print-graph fasl-write printf format print-error + read-token read + error exit call/cc + current-error-handler + eval current-eval interpret compile compile-file new-cafe load + system + expand sc-expand current-expand expand-mode + environment? interaction-environment + identifier? free-identifier=? bound-identifier=? literal-identifier=? + datum->syntax-object syntax-object->datum syntax-error + syntax->list + generate-temporaries + record? record-set! record-ref record-length + record-type-descriptor make-record-type + record-printer record-name record-field-accessor + record-field-mutator record-predicate record-constructor + record-type-name record-type-symbol record-type-field-names + hash-table? make-hash-table get-hash-table put-hash-table! + assembler-output + $make-environment + features + + port? input-port? output-port? + make-input-port make-output-port make-input/output-port + port-handler + port-input-buffer port-input-index port-input-size + port-output-buffer port-output-index port-output-size + set-port-input-index! set-port-input-size! + set-port-output-index! set-port-output-size! + port-name input-port-name output-port-name + write-char read-char unread-char peek-char + newline + reset-input-port! flush-output-port + close-input-port close-output-port + console-input-port current-input-port + standard-output-port standard-error-port + console-output-port current-output-port + open-output-file open-input-file + open-output-string get-output-string + with-output-to-file call-with-output-file + with-input-from-file call-with-input-file + date-string + + + - add1 sub1 * expt number? positive? negative? zero? number->string + logand + = < > <= >= + )) + +(define system-primitives + '(immediate? $unbound-object? $forward-ptr? + pointer-value + primitive-ref primitive-set! + $fx= $fx< $fx<= $fx> $fx>= $fxzero? + $fx+ $fx- $fx* $fxadd1 $fxsub1 $fxquotient $fxremainder $fxmodulo + $fxsll $fxsra $fxlognot $fxlogor $fxlogand $fxlogxor + $fixnum->char $char->fixnum + $char= $char< $char<= $char> $char>= + $car $cdr $set-car! $set-cdr! + $make-vector $vector-ref $vector-set! $vector-length + $make-string $string-ref $string-set! $string-length $string + $symbol-string $symbol-unique-string $symbol-value + $set-symbol-string! $set-symbol-unique-string! $set-symbol-value! + $make-symbol $set-symbol-plist! $symbol-plist + $sc-put-cte + $record? $record/rtd? $record-set! $record-ref $record-rtd + $make-record $record + $base-rtd + $code? $code-reloc-vector $code-freevars $code-size $code-ref $code-set! + $code->closure list*->code* + make-code code? set-code-reloc-vector! code-reloc-vector code-freevars + code-size code-ref code-set! + $frame->continuation $fp-at-base $current-frame $seal-frame-and-call + $make-call-with-values-procedure $make-values-procedure + do-overflow collect + $make-tcbucket $tcbucket-next $tcbucket-key $tcbucket-val + $set-tcbucket-next! $set-tcbucket-val! $set-tcbucket-tconc! + $tcbucket-dlink-prev + $tcbucket-dlink-next + $set-tcbucket-dlink-prev! + $set-tcbucket-dlink-next! + call/cf trace-symbol! untrace-symbol! make-traced-procedure + fixnum->string + vector-memq vector-memv + + ;;; must open-code + $make-port/input + $make-port/output + $make-port/both + $make-input-port $make-output-port $make-input/output-port + $port-handler + $port-input-buffer $port-input-index $port-input-size + $port-output-buffer $port-output-index $port-output-size + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size! + + ;;; better open-code + $write-char $read-char $peek-char $unread-char + + ;;; never open-code + $reset-input-port! $close-input-port + $close-output-port $flush-output-port + *standard-output-port* *standard-error-port* *current-output-port* + *standard-input-port* *current-input-port* + )) + + + +(define (whack-system-env setenv?) + (define add-prim + (lambda (x) + (let ([g (gensym (symbol->string x))]) + (putprop x '|#system| g) + (putprop g '*sc-expander* (cons 'core-primitive x))))) + (define add-macro + (lambda (x) + (let ([g (gensym (symbol->string x))] + [e (getprop x '*sc-expander*)]) + (when e + (putprop x '|#system| g) + (putprop g '*sc-expander* e))))) + (define (foo) + (eval + `(begin + (define-syntax compile-time-date-string + (lambda (x) + #'(quote ,(date-string)))) + (define-syntax public-primitives + (lambda (x) + #'(quote ,public-primitives))) + (define-syntax system-primitives + (lambda (x) + #'(quote ,system-primitives))) + (define-syntax macros + (lambda (x) + #'(quote ,macros)))))) + (set! system-env ($make-environment '|#system| #t)) + (for-each add-macro macros) + (for-each add-prim public-primitives) + (for-each add-prim system-primitives) + (if setenv? + (parameterize ([interaction-environment system-env]) + (foo)) + (foo))) + + + +(when (eq? "" "") + (load "chez-compat.ss") + (set! primitive-ref top-level-value) + (set! primitive-set! set-top-level-value!) + (set! chez-expand sc-expand) + (set! chez-current-expand current-expand) + (printf "loading psyntax.pp ...\n") + (load "psyntax-7.1.pp") + (chez-current-expand + (lambda (x . args) + (apply chez-expand (sc-expand x) args))) + (whack-system-env #f) + (printf "loading psyntax.ss ...\n") + (load "psyntax-7.1-6.9.ss") + (chez-current-expand + (lambda (x . args) + (apply chez-expand (sc-expand x) args))) + (whack-system-env #t) + (printf "ok\n") + (load "libassembler-compat-6.7.ss") ; defines make-code etc. + (load "libintelasm-6.9.ss") ; uses make-code, etc. + (load "libfasl-6.7.ss") ; uses code? etc. + (load "libcompile-8.1.ss") ; uses fasl-write +) + + +(whack-system-env #t) + +(define scheme-library-files + '(["libhandlers-6.9.ss" #t "libhandlers.fasl"] + ["libcontrol-6.1.ss" #t "libcontrol.fasl"] + ["libcollect-6.1.ss" #t "libcollect.fasl"] + ["librecord-6.4.ss" #t "librecord.fasl"] + ["libcxr-6.0.ss" #t "libcxr.fasl"] + ["libnumerics-9.1.ss" #t "libnumerics.fasl"] + ["libcore-6.9.ss" #t "libcore.fasl"] + ["libchezio-8.1.ss" #t "libchezio.fasl"] + ["libhash-9.2.ss" #t "libhash.fasl"] + ["libwriter-9.1.ss" #t "libwriter.fasl"] + ["libtokenizer-9.1.ss" #t "libtokenizer.fasl"] + ["libassembler-6.7.ss" #t "libassembler.ss"] + ["libintelasm-6.9.ss" #t "libintelasm.fasl"] + ["libfasl-6.7.ss" #t "libfasl.fasl"] + ["libcompile-9.1.ss" #t "libcompile.fasl"] + ["psyntax-7.1-9.1.ss" #t "psyntax.fasl"] + ["libinterpret-6.5.ss" #t "libinterpret.fasl"] + ["libcafe-6.1.ss" #t "libcafe.fasl"] + ["libtrace-6.9.ss" #t "libtrace.fasl"] + ["libposix-6.0.ss" #t "libposix.fasl"] + ["libtoplevel-6.9.ss" #t "libtoplevel.fasl"] + )) + + + +(define (compile-library ifile ofile) + (parameterize ([assembler-output #f] + [expand-mode 'bootstrap] + [interaction-environment system-env]) + (printf "compiling ~a ...\n" ifile) + (compile-file ifile ofile 'replace))) + +(for-each + (lambda (x) + (when (cadr x) + (compile-library (car x) (caddr x)))) + scheme-library-files) + + +(define (join s ls) + (cond + [(null? ls) ""] + [else + (let ([str (open-output-string)]) + (let f ([a (car ls)] [d (cdr ls)]) + (cond + [(null? d) + (display a str) + (get-output-string str)] + [else + (display a str) + (display s str) + (f (car d) (cdr d))])))])) + + +(system + (format "cat ~a > ikarus.fasl" + (join " " (map caddr scheme-library-files)))) diff --git a/src/fact.ss b/src/fact.ss new file mode 100644 index 0000000..9ddb8df --- /dev/null +++ b/src/fact.ss @@ -0,0 +1,6 @@ + +(define (fact n ac) + (if (zero? n) + ac + (fact (- n 1) (* n ac)))) +(begin (fact 10000 1) #f) diff --git a/src/generate-cxr.ss b/src/generate-cxr.ss deleted file mode 100644 index 48e0621..0000000 --- a/src/generate-cxr.ss +++ /dev/null @@ -1,52 +0,0 @@ - -(define generate-cxr-definitions - (lambda () - (define gen-body - (lambda (name arg ls) - (cond - [(null? (cdr ls)) - `(if (pair? ,arg) - (,(car ls) ,arg) - (err ',name orig))] - [else - (let ([a (car ls)]) - `(if (pair? ,arg) - (let ([x (,a ,arg)]) - ,(gen-body name 'x (cdr ls))) - (err ',name orig)))]))) - (define gen-cxr - (lambda (name ls) - `(primitive-set! ',name (lambda (orig) ,(gen-body name 'orig ls))))) - (define gen-names-n - (lambda (n) - (cond - [(fx= n 0) '(())] - [else - (let ([ls (gen-names-n (fx- n 1))]) - (append - (map (lambda (x) (cons #\a x)) ls) - (map (lambda (x) (cons #\d x)) ls)))]))) - (define gen-names - (lambda (n) - (cond - [(fx= n 0) '()] - [else (append (gen-names (fx- n 1)) (gen-names-n n))]))) - (define ls->name - (lambda (ls) - (string->symbol (list->string (append '(#\c) ls '(#\r)))))) - (define ls->functions - (lambda (ls) - (reverse - (map (lambda (c) (string->symbol (format "$c~ar" c))) ls)))) - `(let ([err - (lambda (who x) - (error who "invalid list structure ~s" x))]) - ,@(map - (lambda (ls) (gen-cxr (ls->name ls) (ls->functions ls))) - (gen-names 4))))) - -(with-output-to-file "libcxr-6.0.ss" - (lambda () - (pretty-print (generate-cxr-definitions))) - 'replace) - diff --git a/src/geninstr/gen.pl b/src/geninstr/gen.pl index 188e773..13b6515 100755 --- a/src/geninstr/gen.pl +++ b/src/geninstr/gen.pl @@ -48,10 +48,8 @@ sub gen3{ } } -gen1 "movl \$0x1234, r1\n"; - -#gen1 "movl \$27, 4(r1)\n"; -#gen1 "movl \$27, 4000(r1)\n"; +gen1 "movl \$27, 4(r1)\n"; +gen1 "movl \$27, 4000(r1)\n"; #gen1 "movb \$0, 4(r1)\n"; #gen1 "movb -2(r1), %ah\n"; diff --git a/src/geninstr/tmp.dump b/src/geninstr/tmp.dump index d0c65b1..821d007 100644 --- a/src/geninstr/tmp.dump +++ b/src/geninstr/tmp.dump @@ -4,11 +4,28 @@ tmp.o: file format elf32-i386 Disassembly of section .text: 00000000 <.text>: - 0: b8 34 12 00 00 mov $0x1234,%eax - 5: b9 34 12 00 00 mov $0x1234,%ecx - a: ba 34 12 00 00 mov $0x1234,%edx - f: bb 34 12 00 00 mov $0x1234,%ebx - 14: bc 34 12 00 00 mov $0x1234,%esp - 19: bd 34 12 00 00 mov $0x1234,%ebp - 1e: be 34 12 00 00 mov $0x1234,%esi - 23: bf 34 12 00 00 mov $0x1234,%edi + 0: c7 40 04 1b 00 00 00 movl $0x1b,0x4(%eax) + 7: c7 41 04 1b 00 00 00 movl $0x1b,0x4(%ecx) + e: c7 42 04 1b 00 00 00 movl $0x1b,0x4(%edx) + 15: c7 43 04 1b 00 00 00 movl $0x1b,0x4(%ebx) + 1c: c7 44 24 04 1b 00 00 movl $0x1b,0x4(%esp) + 23: 00 + 24: c7 45 04 1b 00 00 00 movl $0x1b,0x4(%ebp) + 2b: c7 46 04 1b 00 00 00 movl $0x1b,0x4(%esi) + 32: c7 47 04 1b 00 00 00 movl $0x1b,0x4(%edi) + 39: c7 80 a0 0f 00 00 1b movl $0x1b,0xfa0(%eax) + 40: 00 00 00 + 43: c7 81 a0 0f 00 00 1b movl $0x1b,0xfa0(%ecx) + 4a: 00 00 00 + 4d: c7 82 a0 0f 00 00 1b movl $0x1b,0xfa0(%edx) + 54: 00 00 00 + 57: c7 83 a0 0f 00 00 1b movl $0x1b,0xfa0(%ebx) + 5e: 00 00 00 + 61: c7 84 24 a0 0f 00 00 movl $0x1b,0xfa0(%esp) + 68: 1b 00 00 00 + 6c: c7 85 a0 0f 00 00 1b movl $0x1b,0xfa0(%ebp) + 73: 00 00 00 + 76: c7 86 a0 0f 00 00 1b movl $0x1b,0xfa0(%esi) + 7d: 00 00 00 + 80: c7 87 a0 0f 00 00 1b movl $0x1b,0xfa0(%edi) + 87: 00 00 00 diff --git a/src/geninstr/tmp.s b/src/geninstr/tmp.s index 2bc8fb8..ea423d1 100644 --- a/src/geninstr/tmp.s +++ b/src/geninstr/tmp.s @@ -1,9 +1,17 @@ .text -movl $0x1234, %eax -movl $0x1234, %ecx -movl $0x1234, %edx -movl $0x1234, %ebx -movl $0x1234, %esp -movl $0x1234, %ebp -movl $0x1234, %esi -movl $0x1234, %edi +movl $27, 4(%eax) +movl $27, 4(%ecx) +movl $27, 4(%edx) +movl $27, 4(%ebx) +movl $27, 4(%esp) +movl $27, 4(%ebp) +movl $27, 4(%esi) +movl $27, 4(%edi) +movl $27, 4000(%eax) +movl $27, 4000(%ecx) +movl $27, 4000(%edx) +movl $27, 4000(%ebx) +movl $27, 4000(%esp) +movl $27, 4000(%ebp) +movl $27, 4000(%esi) +movl $27, 4000(%edi) diff --git a/src/ikarus.fasl b/src/ikarus.fasl index 4fad35eeb907006a65c23d4f32338276e8e37880..417845bce590bd9ed851d673c085a660ebd9d517 100644 GIT binary patch literal 1853333 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

fGI6h z8hq?ok0+%CsCX_d@JVUm@&J_b%K}iAUuvMNxWqu=ZqYnbZ{}T~1-NuwTJXc+6G*Vy zI&iW3>e7OrvG&6GXkj(lK=4i-o-BA17vR;Rh4W3T51yAp3pFcEUcuAATLO@{m0?~{ zI)eexHf+HdYNax^qo81Ym9eeEXjx4fI@44mV_S^ZS^;yTBVmBjcxg~MNLRa7#GYoC zxvv^r0jJsB*gw;8yMHRe7G{(3l$K5}KJ`_=HKM%ogiZ(yrGroj-^C{-f-XKSF@Ulb z&@3w|$A|1Qb&o6hchtnclM{osuWBhVXvNn^3|gFD#l=2_!|4(697MRTskN)8efe+~MTZ!2ijnyKr9PMV zHj6l)0`l|iI?%OxJ#uJ_Vfu9R%103Ai*@se7h`B4Vzo1WkYPR4xxAOvJ9SX;6pNg^ z{L_fR79i|23W{*Vpc|@4jm8gE3^XUCX;i(()bB+$iWxvpEiH#)8CCxl)*lBm mC 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 uzI*e{SxLTjB(bHt$S?9cE^#THqMN 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�oY3*%^sR5sXf2?TP2v+P5DO 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%0Dg~FN7N%E()WP@vAe^R2j-Y3>vXUe6&>?FL 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

  • VB~1tMQ@w3`cFD~8@H8w@1UjRq;s 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 NcHeSp0ZRBNkI+s-5onTH~_#dGH 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 diff --git a/src/libassembler-compat-6.0.ss b/src/libassembler-compat-6.0.ss deleted file mode 100644 index 2056db0..0000000 --- a/src/libassembler-compat-6.0.ss +++ /dev/null @@ -1,67 +0,0 @@ - -(let () - (define-record code (closure-size code-vec reloc-vec)) - - (define make-code^ - (lambda (code-size reloc-size closure-size) - (let ([code-size (fxsll (fxsra (fx+ code-size 3) 2) 2)]) - (make-code - closure-size - (make-string code-size (integer->char 0)) - (make-vector (fxsra reloc-size 2)))))) - - (define set-code-byte! - (lambda (code idx byte) - (string-set! (code-code-vec code) idx (integer->char byte)))) - - (define set-code-word! - (lambda (code idx x) - (cond - [(fixnum? x) - (set-code-byte! code (fx+ idx 0) (fxsll (fxlogand x #x3F) 2)) - (set-code-byte! code (fx+ idx 1) (fxlogand (fxsra x 6) #xFF)) - (set-code-byte! code (fx+ idx 2) (fxlogand (fxsra x 14) #xFF)) - (set-code-byte! code (fx+ idx 3) (fxlogand (fxsra x 22) #xFF))] - [else (error 'set-code-word! "unhandled ~s" x)]))) - - (define set-code-object! - (lambda (code obj code-idx reloc-idx) - (let ([v (code-reloc-vec code)]) - (vector-set! v reloc-idx (list 'object code-idx obj))))) - - (define set-code-foreign-object! - (lambda (code obj code-idx reloc-idx) - (let ([v (code-reloc-vec code)]) - (vector-set! v reloc-idx (list 'foreign code-idx obj)) - (vector-set! v (fxadd1 reloc-idx) '(skip))))) - - (define set-code-object+offset/rel! - (lambda (code obj code-idx obj-idx reloc-idx) - (let ([v (code-reloc-vec code)]) - (vector-set! v reloc-idx - (list 'object+off/rel code-idx obj obj-idx)) - (vector-set! v (fxadd1 reloc-idx) '(skip))))) - - (define set-code-object+offset! - (lambda (code obj code-idx obj-idx reloc-idx) - (let ([v (code-reloc-vec code)]) - (vector-set! v reloc-idx - (list 'object+off code-idx obj obj-idx)) - (vector-set! v (fxadd1 reloc-idx) '(skip))))) - - (define make-code-executable! - (lambda (x) (void))) - - (primitive-set! 'make-code make-code^) - (primitive-set! 'code? code?) - (primitive-set! 'code-code-vec code-code-vec) - (primitive-set! 'code-reloc-vec code-reloc-vec) - (primitive-set! 'code-closure-size code-closure-size) - (primitive-set! 'set-code-byte! set-code-byte!) - (primitive-set! 'set-code-word! set-code-word!) - (primitive-set! 'set-code-object! set-code-object!) - (primitive-set! 'set-code-foreign-object! set-code-foreign-object!) - (primitive-set! 'set-code-object+offset/rel! set-code-object+offset/rel!) - (primitive-set! 'set-code-object+offset! set-code-object+offset!) - (primitive-set! 'make-code-executable! make-code-executable!)) - diff --git a/src/libassembler-compat-6.6.ss b/src/libassembler-compat-6.6.ss deleted file mode 100644 index 3dfffec..0000000 --- a/src/libassembler-compat-6.6.ss +++ /dev/null @@ -1,32 +0,0 @@ - -(let () - (define-record code (closure-size code-string reloc-vector)) - - (define make-code^ - (lambda (code-size closure-size) - (let ([code-size (fxsll (fxsra (fx+ code-size 3) 2) 2)]) - (make-code - closure-size - (make-string code-size) - #f)))) - - (define code-set! - (lambda (code idx byte) - (string-set! (code-code-string code) idx (integer->char byte)))) - - (define code-ref - (lambda (code idx) - (char->integer (string-ref (code-code-string code) idx)))) - - (define (code-size code) - (string-length (code-code-string code))) - - (primitive-set! 'make-code make-code^) - (primitive-set! 'code? code?) - (primitive-set! 'code-reloc-vector code-reloc-vector) - (primitive-set! 'code-closure-size code-closure-size) - (primitive-set! 'code-size code-size) - (primitive-set! 'code-set! code-set!) - (primitive-set! 'code-ref code-ref) - (primitive-set! 'set-code-reloc-vector! set-code-reloc-vector!)) - diff --git a/src/libassembler-compat-6.7.ss b/src/libassembler-compat-6.7.ss deleted file mode 100644 index dd34e27..0000000 --- a/src/libassembler-compat-6.7.ss +++ /dev/null @@ -1,32 +0,0 @@ - -(let () - (define-record code (freevars code-string reloc-vector)) - - (define make-code^ - (lambda (code-size freevars) - (let ([code-size (fxsll (fxsra (fx+ code-size 3) 2) 2)]) - (make-code - freevars - (make-string code-size) - #f)))) - - (define code-set! - (lambda (code idx byte) - (string-set! (code-code-string code) idx (integer->char byte)))) - - (define code-ref - (lambda (code idx) - (char->integer (string-ref (code-code-string code) idx)))) - - (define (code-size code) - (string-length (code-code-string code))) - - (primitive-set! 'make-code make-code^) - (primitive-set! 'code? code?) - (primitive-set! 'code-reloc-vector code-reloc-vector) - (primitive-set! 'code-freevars code-freevars) - (primitive-set! 'code-size code-size) - (primitive-set! 'code-set! code-set!) - (primitive-set! 'code-ref code-ref) - (primitive-set! 'set-code-reloc-vector! set-code-reloc-vector!)) - diff --git a/src/libassembler-compat.ss b/src/libassembler-compat.ss deleted file mode 100644 index 12406b243012f66366f609823fbd49a679734ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9714 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 diff --git a/src/libcafe-6.0.ss b/src/libcafe-6.0.ss deleted file mode 100644 index 8968cef..0000000 --- a/src/libcafe-6.0.ss +++ /dev/null @@ -1,72 +0,0 @@ -(let () - (define with-error-handler - (lambda (p thunk) - (let ([old-error-handler (current-error-handler)]) - (dynamic-wind - (lambda () - (current-error-handler - (lambda args - (current-error-handler old-error-handler) - (apply p args) - (apply error args)))) - thunk - (lambda () - (current-error-handler old-error-handler)))))) - - (define eval-depth 0) - - (define display-prompt - (lambda (i) - (if (fx= i eval-depth) - (display " " (console-output-port)) - (begin - (display ">" (console-output-port)) - (display-prompt (fx+ i 1)))))) - - (define wait - (lambda (eval escape-k) - (call/cc - (lambda (k) - (with-error-handler - (lambda args - (reset-input-port! (console-input-port)) - (apply print-error args) - (k (void))) - (lambda () - (display-prompt 0) - (let ([x (read (console-input-port))]) - (cond - [(eof-object? x) - (newline (console-output-port)) - (escape-k (void))] - [else - (call-with-values - (lambda () (eval x)) - (lambda v* - (unless (andmap (lambda (v) (eq? v (void))) v*) - (for-each - (lambda (v) - (write v (console-output-port)) - (newline (console-output-port))) - v*))))])))))) - (wait eval escape-k))) - - (primitive-set! 'new-cafe - (lambda args - (let ([eval - (if (null? args) - (current-eval) - (if (null? (cdr args)) - (let ([f (car args)]) - (if (procedure? f) - f - (error 'new-cafe "not a procedure ~s" f))) - (error 'new-cafe "too many arguments")))]) - (dynamic-wind - (lambda () (set! eval-depth (fxadd1 eval-depth))) - (lambda () - (call/cc - (lambda (k) - (wait eval k)))) - (lambda () (set! eval-depth (fxsub1 eval-depth)))))))) - diff --git a/src/libcafe-6.1.ss b/src/libcafe-6.1.ss index 34cae3c..53f07bc 100644 --- a/src/libcafe-6.1.ss +++ b/src/libcafe-6.1.ss @@ -30,6 +30,7 @@ (with-error-handler (lambda args (reset-input-port! (console-input-port)) + ;(display "repl catch\n" (console-output-port)) (apply print-error args) (k (void))) (lambda () diff --git a/src/libcafe.fasl b/src/libcafe.fasl index b36efff45d5a802233a230b5efd8e890a9d80614..379812f304b962cb34f7a7ee9d91caf87ae3e7c5 100644 GIT binary patch literal 7881 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 diff --git a/src/libchezio-8.1.ss b/src/libchezio-8.1.ss index 3f577c7..c66a5b6 100644 --- a/src/libchezio-8.1.ss +++ b/src/libchezio-8.1.ss @@ -26,27 +26,30 @@ ;;; (port-output-size port) ;;; ;;; * Mutators: + ;;; (set-port-handler! port proc) + ;;; (set-port-input-buffer! port string) ;;; (set-port-input-index! port fixnum) ;;; (set-port-input-size! port fixnum) + ;;; (set-port-output-buffer! port string) ;;; (set-port-output-index! port fixnum) ;;; (set-port-output-size! port fixnum) ;;; - ;;; (begin - ;;; ;;; uncomment this form to use the compiler's definition - ;;; ;;; of ports; otherwise, ports are represented as vanilla - ;;; ;;; records. - ;;; ($define-record-syntax port - ;;; (handler input-buffer input-index input-size - ;;; output-buffer output-index output-size)) - ;;; (define-syntax port? (identifier-syntax $port?)) - ;;; (define-syntax input-port? - ;;; (syntax-rules () - ;;; [(_ x) (identifier? #'x) - ;;; (and ($port? x) (string? ($port-input-buffer x)))])) - ;;; (define-syntax output-port? - ;;; (syntax-rules () - ;;; [(_ x) (identifier? #'x) - ;;; (and ($port? x) (string? ($port-output-buffer x)))]))) + #;(begin + ;;; uncomment this form to use the compiler's definition + ;;; of ports; otherwise, ports are represented as vanilla + ;;; records. + ($define-record-syntax port + (handler input-buffer input-index input-size + output-buffer output-index output-size)) + (define-syntax port? (identifier-syntax $port?)) + (define-syntax input-port? + (syntax-rules () + [(_ x) (identifier? #'x) + (and ($port? x) (string? ($port-input-buffer x)))])) + (define-syntax output-port? + (syntax-rules () + [(_ x) (identifier? #'x) + (and ($port? x) (string? ($port-output-buffer x)))]))) ;;; (primitive-set! 'port? (lambda (x) (port? x))) @@ -59,7 +62,7 @@ ;;; (primitive-set! '$make-input-port (lambda (handler buffer) - ($make-port handler buffer 0 ($string-length buffer) #f 0 0))) + ($make-port/input handler buffer 0 ($string-length buffer) #f 0 0))) ;;; (primitive-set! 'make-input-port (lambda (handler buffer) @@ -71,7 +74,7 @@ ;;; (primitive-set! '$make-output-port (lambda (handler buffer) - ($make-port handler #f 0 0 buffer 0 ($string-length buffer)))) + ($make-port/output handler #f 0 0 buffer 0 ($string-length buffer)))) ;;; (primitive-set! 'make-output-port (lambda (handler buffer) @@ -83,7 +86,7 @@ ;;; (primitive-set! '$make-input/output-port (lambda (handler input-buffer output-buffer) - ($make-port handler + ($make-port/both handler input-buffer 0 ($string-length input-buffer) output-buffer 0 ($string-length output-buffer)))) (primitive-set! 'make-input/output-port @@ -235,7 +238,7 @@ ;;; (primitive-set! '$write-char (lambda (c p) - (let ([idx ($port-output-index p)]) + (let ([idx (port-output-index p)]) (if ($fx< idx ($port-output-size p)) (begin ($string-set! ($port-output-buffer p) idx c) @@ -286,7 +289,7 @@ ;;; (primitive-set! 'read-char (case-lambda - [() ($read-char (current-input-port))] + [() ($read-char *current-input-port*)] [(p) (if (input-port? p) ($read-char p) diff --git a/src/libcollect-6.0.ss b/src/libcollect-6.0.ss deleted file mode 100644 index 86ef942..0000000 --- a/src/libcollect-6.0.ss +++ /dev/null @@ -1,28 +0,0 @@ - -;(primitive-set! 'do-overflow -; (lambda () -; ($do-overflow 4096))) - -(primitive-set! 'do-overflow - (lambda (n) - (foreign-call "ik_collect" n) - (void))) - -(primitive-set! 'do-overflow-words - (lambda (n) - (foreign-call "ik_collect" ($fxsll n 2)) - (void))) - -(primitive-set! 'do-vararg-overflow - (lambda (n) - (foreign-call "ik_collect_vararg" n) - (void))) - -(primitive-set! 'collect - (lambda () - (do-overflow 4096))) - -(primitive-set! 'do-stack-overflow - (lambda () - (foreign-call "ik_stack_overflow"))) - diff --git a/src/libcollect.fasl b/src/libcollect.fasl index 3491553b2cb18cb01ad0e4fda1b7a329db747ed0..0a42a3ea793f4aa168881775349049feb87db2da 100644 GIT binary patch literal 3514 zcmd^BO=uHA6dsdUV=YY-5f6%m=Fo$S^(NSsAXQj2ScwF|Lb^@1F=msElb=Q@2wgpd zc<|swPvRl%LD6HtOKO#P5Gv>)#~uVL2=*X!4=eGT-EGn=u{MX=N*?UXWM+5f&3xbc z-t>F^nt(2@focW6KRx4?>TJ3eY>~MZ_<0YFD z?gJh-`B=nH?NedKLzM4YAW^3JK0?fFqmGJCT)R~Ywb`D?vOxp!fuXJOf9 zzi_PLC782TVi7C`df@q2dkOLR51<*AIXNrRDM_B@=N%Y2iO!r4j+vrruKQ~*FOdS~ z#~P~$R;>rCT7vCjbGHaqHJ9$jFrTxVi;V2S-yCzy76Z)lS8arh;30k&Tr?J(lBpPt zB!VG9lK3#*_On?q5RxTH45j&T_L&~^QM8z`16`{kTD35|e5E*7QrY$+zXDj9@b8&B z1LyM}hxbGiA(>Ll#0fN#;zUYi%H0qWVM(NoV24k|&ZyU~D3(n7C?csb7 z5pTemo0e%fwE^uhj59OPUNX=IceVz26<=D|*#!9frhwnu6!1r#33#6c@H=2}JBfV= zkO1(kK*8z1=l2gwevf@M#As*oo3XW#-$7#&osj0lg8G|yd#LZj!L6%eL&{H}mzkmx zNV&^L3d0XkCs2Jf;w40va3+pjc!w`BXNaS<_k!%F;Scbl|Jtj!^|k_Y=Tnc1CrGvD{V zH@zPI{E3sP8^o~FQM>ETAljuN_s=69LekT2Ew`{>cce?o3oWNrtJP;}(eC)(gO@rS zaBuMRkoR-=seZ^zyNU8cE1gA`GM8RbUOJS#Ej@%uWr}O z+<}sZV9sieMNss2!}CwK6Ef`Eg=R?RcLTFlsiE-xZlH8W5y%+BXjw*B#6eymLRSInJ) z8}=Q9cZZ`vnNrNe33NQhiImEeyDCIOl1S^p_Om$k==xc7jUwr78P4UIwKzZg+#Jrk z5%DUVxha{3Vyn=;h;e2H+Q$vF!JUl(zKAa^>|6tQc3r@4tqb`5_5?g{0sJ~x+)QHc z0VDuCDNu0w@A-YflHXoaj5a5~8C&c59WXZ04r%_tg8K6>&7r;n2e+b%btylLUS^6) zAmuWk9=L}(f$F0X4QqVd9zG*?`%H% zfqm#UQQn89JCcy%;Ymq^U`PqktbzPTXs=$Q8=n6+eCRV%Ro_>jc8%CPrWjSa!7ZV6 z)VN}yMpwBxYB+I@p+sboi->U{E{sazs>1BSATxs(PfT7M&Hg96VEYQx_tjRs@K|^; w`n5S;=#s&B5en1zH7DqEf!dqHPZcbyvg)&l0%wjeux1M*8?GXMYp diff --git a/src/libcompile-6.4.ss b/src/libcompile-6.4.ss deleted file mode 100644 index 2bb199a..0000000 --- a/src/libcompile-6.4.ss +++ /dev/null @@ -1,3035 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(let () - -(include "record-case.ss") - - -(include "set-operations.ss") - - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [bwp-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [pointer-value 1 value] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - ;;; tcbuckets - [$make-tcbucket 4 value] - [$tcbucket-key 1 value] - [$tcbucket-val 1 value] - [$tcbucket-next 1 value] - [$set-tcbucket-val! 2 effect] - [$set-tcbucket-next! 2 effect] - [$set-tcbucket-tconc! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - ;;; - ;;; asm - ;;; - ;[code? 1 pred] - ;[$code-instr-size 1 value] - ;[$code-reloc-size 1 value] - ;[$code-closure-size 1 value] - ;[$code->closure 1 value] - ;[$set-code-byte! 3 effect] - ;[$set-code-word! 3 effect] - ;[$set-code-object! 4 effect] - ;[$set-code-object+offset! 5 effect] - ;[$set-code-object+offset/rel! 5 effect] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - - -;;; primitives table section -(define primitives-table - '(;;; system locations used by the C/Scheme interface - [$apply-nonprocedure-error-handler library] - [$incorrect-args-error-handler library] - [$multiple-values-error library] - [$intern library] - [do-overflow library] - [do-vararg-overflow library] - [do-stack-overflow library] - ;;; type predicates - [fixnum? public] - [immediate? public] - [boolean? public] - [char? public] - [null? public] - [pair? public] - [symbol? public] - [vector? public] - [string? public] - [procedure? public] - [eof-object? public] - [not public] - [eq? public] - [equal? public] - ;;; fixnum primitives - [fxadd1 public] - [fxsub1 public] - [fx+ public] - [fx- public] - [fx* public] - [fxsll public] - [fxsra public] - [fxlogor public] - [fxlogand public] - [fxlogxor public] - [fxlognot public] - [fxquotient public] - [fxremainder public] - [fxmodulo public] - ;;; fixnum predicates - [fxzero? public] - [fx= public] - [fx< public] - [fx<= public] - [fx> public] - [fx>= public] - ;;; characters - [char=? public] - [char? public] - [char>=? public] - [integer->char public] - [char->integer public] - ;;; lists - [cons public] - [car public] - [cdr public] - [caar public] - [cadr public] - [cdar public] - [cddr public] - [caaar public] - [caadr public] - [cadar public] - [caddr public] - [cdaar public] - [cdadr public] - [cddar public] - [cdddr public] - [caaaar public] - [caaadr public] - [caadar public] - [caaddr public] - [cadaar public] - [cadadr public] - [caddar public] - [cadddr public] - [cdaaar public] - [cdaadr public] - [cdadar public] - [cdaddr public] - [cddaar public] - [cddadr public] - [cdddar public] - [cddddr public] - [set-car! public] - [set-cdr! public] - [list public] - [list* ADDME] - [list? public] - [list-ref public] - [length public] - [make-list public] - [reverse public] - [append public] - [list-ref public] - [memq public] - [memv public] - [assq public] - [map public] - [for-each public] - [andmap public] - [ormap public] - ;;; vectors - [make-vector public] - [vector public] - [vector-length public] - [vector-ref public] - [vector-set! public] - [list->vector public] - [vector->list public] - ;;; strings - [make-string public] - [string public] - [string-length public] - [string-ref public] - [string-set! public] - [list->string public] - [string->list public] - [string-append public] - [substring public] - [string=? public] - [fixnum->string public] - ;;; symbols - [gensym public] - [gensym? public] - [symbol->string public] - [gensym->unique-string public] - [gensym-prefix public] - [gensym-count public] - [print-gensym public] - [string->symbol public] - [top-level-value public] - [top-level-bound? public] - [set-top-level-value! public] - [primitive-set! public] - [getprop public] - [putprop public] - [remprop public] - [property-list public] - [oblist public] - [uuid public] - ;;; eof - [eof-object public] - [void public] - ;;; control/debugging - [print-error public] - [error public] - [current-error-handler public] - [exit public] - [apply public] - [make-parameter public] - ;;; output - [output-port? public] - [console-output-port public] - [current-output-port public] - [standard-output-port public] - [standard-error-port public] - [open-output-file public] - [open-output-string public] - [with-output-to-file public] - [call-with-output-file public] - [with-input-from-file public] - [call-with-input-file public] - [get-output-string public] - [close-output-port public] - [flush-output-port public] - [write-char public] - [output-port-name public] - [newline public] - ;;; input - [input-port? public] - [standard-input-port public] - [console-input-port public] - [current-input-port public] - [open-input-file public] - [close-input-port public] - [reset-input-port! public] - [read-char public] - [peek-char public] - [unread-char public] - [input-port-name public] - ;;; writing/printing - [write public] - [display public] - [printf public] - [fprintf public] - [format public] - [read-token public] - [read public] - ;;; evaluation - [primitive? public] - [expand public] - [syntax-error public] - [current-expand public] - [expand-mode public] - [assembler-output public] - [compile-file public] - [fasl-write public] - - [$sc-put-cte public] - [sc-expand public] - [$make-environment public] - [environment? public] - [interaction-environment public] - [identifier? public] - [syntax->list public] - [syntax-object->datum public] - [datum->syntax-object public] - [generate-temporaries public] - [free-identifier=? public] - [bound-identifier=? public] - [literal-identifier=? public] - [syntax-error public] - [$syntax-dispatch public] - - - - [interpret public] - [eval public] - [current-eval public] - [load public] - [new-cafe public] - [collect public] - [call/cc public] - [call/cf library] - [dynamic-wind public] - [values public] - [call-with-values public] - [make-traced-procedure library] - [trace-symbol! library] - [untrace-symbol! library] - ;;; record - [$base-rtd library] - [record? public] - [record-rtd public] - [record-name public] - [record-printer public] - [record-length public] - [record-ref public] - [record-set! public] - ;;; record rtds - [make-record-type public] - [record-type-name public] - [record-type-descriptor public] - [record-type-symbol public] - [record-type-field-names public] - [record-constructor public] - [record-predicate public] - [record-field-accessor public] - [record-field-mutator public] - ;;; hash tables - [make-hash-table public] - [hash-table? public] - [get-hash-table public] - [put-hash-table! public] - ;;; asm - [make-code public] - [code? public] - [make-code-executable! public] - [code-instr-size public] - [code-reloc-size public] - [code-closure-size public] - [set-code-byte! public] - [set-code-word! public] - [set-code-object! public] - [set-code-foreign-object! public] - [set-code-object+offset! public] - [set-code-object+offset/rel! public] - [set-code-object/reloc/relative! public] - [code-reloc-vec public] - [code-code-vec public] - [code->closure public] - [list*->code* library] - ;;; - ;;; POSIX - ;;; - [fork public] - [posix-fork public] - [system public] - [$debug public] - [$underflow-misaligned-error public] - )) - - -(define (primitive? x) - (cond - [(assq x primitives-table) #t] - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [(assq x primitives-table) #f] - [else (error 'open-codeable "invalid primitive ~s" x)])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -;;; end of primitives table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record seq (e0 e1)) -(define-record function (arg* proper body)) -(define-record clambda-case (arg* proper body)) -(define-record clambda (cases)) -(define-record clambda-code (label cases free)) - -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) - -(define-record codes (list body)) -(define-record assign (lhs rhs)) - -(define unique-var - (let ([counter 0]) - (lambda (x) - (let ([g (gensym (format "~a:~a" x counter))]) - (set! counter (fxadd1 counter)) - (make-var g))))) - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(case-lambda) - (let ([cls* - (map - (lambda (cls) - (let ([fml* (car cls)] [body (cadr cls)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([body (E body (extend-env fml* nfml* env))]) - (make-clambda-case - (properize nfml*) - (list? fml*) - body))))) - (cdr x))]) - (make-clambda cls*))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (cond - [(primitive? var) (make-primref var)] - [else (error 'recordize "invalid top-level var ~s" var)]))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(function args proper body) - `(lambda ,(E-args proper args) ,(E body))] - [(clambda-case args proper body) - `(clambda-case ,(E-args proper args) ,(E body))] - [(clambda cls*) - `(case-lambda . ,(map E cls*))] - [(clambda-code label clauses free) - `(code ,label . ,(map E clauses))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes list body) - `(codes ,(map E list) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [(foreign-label x) `(foreign-label ,x)] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline-case cls rand*) - (record-case cls - [(clambda-case fml* proper body) - (if proper - (and (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body)) - (and (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body)))])) - (define (try-inline cls* rand* default) - (cond - [(null? cls*) default] - [(inline-case (car cls*) rand*)] - [else (try-inline (cdr cls*) rand* default)])) - (define (inline rator rand*) - (record-case rator - [(clambda cls*) - (try-inline cls* rand* - (make-funcall rator rand*))] -; [(function fml* proper body) -; (cond -; [proper -; (if (fx= (length fml*) (length rand*)) -; (make-bind fml* rand* body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))] -; [else -; (if (fx<= (length fml*) (length rand*)) -; (make-bind fml* (properize fml* rand*) body) -; (begin -; (warning 'compile "possible application error in ~s" -; (unparse (make-funcall rator rand*))) -; (make-funcall rator rand*)))])] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (make-function fml* proper (Expr body))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (cond - [(null? x*) '()] - [else (union (Expr (car x*)) (Expr* (cdr x*)))])) - (define (Expr x) - (record-case x - [(constant) '()] - [(var) '()] - [(primref) '()] - [(bind lhs* rhs* body) - (union (Expr body) (Expr* rhs*))] - [(conditional test conseq altern) - (union (Expr test) (union (Expr conseq) (Expr altern)))] - [(seq e0 e1) (union (Expr e0) (Expr e1))] - [(clambda cls*) - (Expr* (map clambda-case-body cls*))] - [(function fml* proper body) (Expr body)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (union (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (union (singleton lhs) (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - -(define (rewrite-assignments assigned x) - (define who 'rewrite-assignments) - (define (fix lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix (cdr lhs*))]) - (cond - [(memq x assigned) - (let ([t (make-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(memq x assigned) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(function fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-function fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(clambda cls*) - (make-clambda - (map (lambda (cls) - (record-case cls - [(clambda-case fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix fml*)]) - (make-clambda-case fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))])) - cls*))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (memq lhs assigned) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (remove-assignments x) - (let ([assigned (uncover-assigned x)]) - (rewrite-assignments assigned x))) - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(function fml* proper body) - (let-values ([(body body-free) (Expr body)]) - (let ([free (difference body-free fml*)]) - (values (make-closure (make-code-rec fml* proper free body) free) - free)))] - [(clambda cls*) - (let-values ([(cls* free) - (let f ([cls* cls*]) - (cond - [(null? cls*) (values '() '())] - [else - (record-case (car cls*) - [(clambda-case fml* proper body) - (let-values ([(body body-free) (Expr body)] - [(cls* cls*-free) (f (cdr cls*))]) - (values - (cons (make-clambda-case fml* proper body) - cls*) - (union (difference body-free fml*) - cls*-free)))])]))]) - (values (make-closure (make-clambda-code (gensym) cls* free) free) - free))] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define all-codes '()) - (define (do-code x) - (record-case x - [(clambda-code label cls* free) - (let ([cls* (map - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (E body))])) - cls*)]) - (let ([g (make-code-loc label)]) - (set! all-codes - (cons (make-clambda-code label cls* free) all-codes)) - g))])) - (define (E x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map E rhs*) (E body))] - [(conditional test conseq altern) - (make-conditional (E test) (E conseq) (E altern))] - [(seq e0 e1) (make-seq (E e0) (E e1))] - [(closure c free) (make-closure (do-code c) free)] - [(primcall op rand*) (make-primcall op (map E rand*))] - [(forcall op rand*) (make-forcall op (map E rand*))] - [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] - [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] - [else (error who "invalid expression ~s" (unparse x))])) - (let ([x (E x)]) - (make-codes all-codes x))) - - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? code? $forward-ptr? bwp-object? - pointer-value) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-instr-size $code-reloc-size $code-closure-size - $set-code-byte! $set-code-word! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $make-record $record? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref - $make-tcbucket $tcbucket-key $tcbucket-val $tcbucket-next - $set-tcbucket-val! $set-tcbucket-next! $set-tcbucket-tconc!) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L clauses free) - (make-clambda-code L (map CaseExpr clauses) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (if (Tail body) - (make-clambda-case fml* proper (insert-check body)) - x)])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-funcall (make-primref 'do-overflow) - (list (make-constant n))) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure code free*) - (check-const (fx+ disp-closure-data (fx* (length free*) wordsize)) x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [($make-tcbucket) (check-const tcbucket-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(vector) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp #t (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" call-convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (case op -; [(values) (make-primcall op (simple* arg* r))] - [else (make-return (make-primcall op (simple* arg* r)))])] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'tail live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define CaseExpr - (lambda (r) - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let-values ([(fml* si r live) (bind-fml* fml* r)]) - (make-clambda-case fml* proper (Tail body si r live)))])))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (let ([r (bind-free* free)]) - (make-clambda-code L (map (CaseExpr r) cases) free))])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag #x2F) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define bwp-object #x8F) ; double check - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - (define pagesize 4096) - (define pageshift 12) - (define wordsize 4) - (define wordshift 2) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-closuresize 12) - (define disp-code-data 16) - (define disp-tcbucket-tconc 0) - (define disp-tcbucket-key 4) - (define disp-tcbucket-val 8) - (define disp-tcbucket-next 12) - (define tcbucket-size 16) - - (define record-ptag 5) - (define record-pmask 7) - (define disp-record-rtd 0) - (define disp-record-data 4) - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define dirty-word -1)) - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift)))) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [(dirty-vector) (mem 28 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [(bwp-object?) (type-pred #f bwp-object rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [(code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx< i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($tcbucket-key) - (indirect-ref arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($tcbucket-val) - (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($tcbucket-next) - (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] - [(pointer-value) - (list* - (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (sall (int fx-shift) eax) - ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [($make-tcbucket) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-tcbucket-tconc apr)) - (movl (Simple (cadr arg*)) eax) - (movl eax (mem disp-tcbucket-key apr)) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem disp-tcbucket-val apr)) - (movl (Simple (cadddr arg*)) eax) - (movl eax (mem disp-tcbucket-next apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align tcbucket-size)) apr) - ac)] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-instr-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) - (cons (sall (int fx-shift) eax) ac))] - [($code-reloc-size) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-closure-size) - (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] - [($set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $set-code-byte! $set-code-word! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? code? - $record? bwp-object?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc SL_continuation_code) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc SL_call_with_values) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc SL_values) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (indirect-assignment arg* offset ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem offset eax)) - ;;; record side effect - (addl (int offset) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (addl (int (fx- disp-vector-data vector-tag)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-tcbucket-key!) - (indirect-assignment arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($set-tcbucket-val!) - (indirect-assignment arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($set-tcbucket-next!) - (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($set-tcbucket-tconc!) - (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-system-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-plist symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-unique-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (addl (int (fx- disp-record-data record-ptag)) ebx) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [(cons void $fxadd1 $fxsub1) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address label)] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (movl '(foreign-label "ik_foreign_call") ebx) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - '(byte 0) - '(byte 0) - '(byte 0) - L_CALL - (call ebx) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else - (error who "invalid convention ~s for call-cp" call-convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let ([Lf (unique-label)] [Ljoin (unique-label)]) - (Pred test #f Lf - (Effect conseq - (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (NonTail body - (cond - [check - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac)] - [else - (list* - (movl eax cpr) - ac)]))] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(new-frame idx size body) - (Tail body ac)] - [(call-cp call-convention rp-convention idx argc mask) - (unless (eq? rp-convention 'tail) - (error who "nontail rp (~s) in tail context" rp-convention)) - (let f ([i 0]) - (cond - [(fx= i argc) - (case call-convention - [(normal) - (list* - (movl (int (argc-convention argc)) eax) - (tail-indirect-cpr-call) - ac)] - [(apply) - (list* - (movl (int (argc-convention argc)) eax) - (jmp (label SL_apply)) - ac)] - [else - (error who "invalid conv ~s in tail call-cpr" call-convention)])] - [else - (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) - (fx- 0 wordsize)) fpr) - eax) - (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) - (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (Entry check? x ac) - (record-case x - [(clambda-case fml* proper body) - (let ([ac (Tail body ac)]) - (cond - [(and proper check?) - (list* (cmpl (int (argc-convention (length fml*))) eax) - (jne (label SL_invalid_args)) - ac)] - [proper ac] - [else - (handle-vararg (length fml*) ac)]))])) - (define make-dispatcher - (lambda (j? L L* x x* ac) - (cond - [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] - [else - (record-case x - [(clambda-case fml* proper _) - (cond - [proper - (list* (cmpl (int (argc-convention (length fml*))) eax) - (je (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))] - [else - (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) - (jle (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) - (define (handle-cases x x*) - (let ([L* (map (lambda (_) (gensym)) x*)] - [L (gensym)]) - (make-dispatcher #f L L* x x* - (let f ([x x] [x* x*] [L L] [L* L*]) - (cond - [(null? x*) - (cons (label L) (Entry 'check x '()))] - [else - (cons (label L) - (Entry #f x - (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (list* - (fx+ disp-closure-data (fx* wordsize (length free))) - (label L) - (handle-cases (car cases) (cdr cases)))])) - (record-case x - [(codes list body) - (cons (cons 0 (Tail body '())) - (map CodeExpr list))])) - - -(define SL_nonprocedure (gensym "SL_nonprocedure")) -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(module () -(list*->code* - (list - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)]) - (list disp-closure-data - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list disp-closure-data - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list - (fx+ disp-closure-data wordsize) - (label SL_continuation_code) - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_cont_mult_args) - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - ))) - - - -(define (compile-expr expr) - (let* ([p (recordize expr)] - [p (optimize-direct-calls p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (car code*))) - -(define compile-file - (lambda (input-file output-file . rest) - (let ([ip (open-input-file input-file)] - [op (apply open-output-file output-file rest)]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (fasl-write (compile-expr (expand x)) op) - (f)))) - (close-input-port ip) - (close-output-port op)))) - -(primitive-set! 'compile-file compile-file) -(primitive-set! 'assembler-output (make-parameter #f)) -) - diff --git a/src/libcompile-6.5.ss b/src/libcompile-6.5.ss deleted file mode 100644 index 51dd525..0000000 --- a/src/libcompile-6.5.ss +++ /dev/null @@ -1,3435 +0,0 @@ - - -;;; 6.2: * side-effects now modify the dirty-vector -;;; * added bwp-object? -;;; * added pointer-value -;;; * added tcbuckets -;;; 6.1: * added case-lambda, dropped lambda -;;; 6.0: * basic compiler - -(let () - -(define-syntax cond-expand - (lambda (x) - (syntax-case x () - [(_ test conseq altern) - (if (eval (syntax-object->datum #'test)) - #'conseq - #'altern)]))) - -(cond-expand (eq? "" "") - (include "record-case.chez.ss") - (include "record-case.ss")) - - -(include "set-operations.ss") - - -(define open-coded-primitives -;;; these primitives, when found in operator position with the correct -;;; number of arguments, will be open-coded by the generator. If an -;;; incorrect number of args is detected, or if they appear in non-operator -;;; position, then they cannot be open-coded, and the pcb-primitives table -;;; is consulted for a reference of the pcb slot containing the primitive. -;;; If it's not found there, an error is signalled. -;;; -;;; prim-name args - '([$constant-ref 1 value] - [$constant-set! 2 effect] - [$pcb-ref 1 value] - [$pcb-set! 2 effect] - ;;; type predicates - [fixnum? 1 pred] - [immediate? 1 pred] - [boolean? 1 pred] - [char? 1 pred] - [pair? 1 pred] - [symbol? 1 pred] - [vector? 1 pred] - [string? 1 pred] - [procedure? 1 pred] - [null? 1 pred] - [eof-object? 1 pred] - [bwp-object? 1 pred] - [$unbound-object? 1 pred] - [$forward-ptr? 1 pred] - [not 1 pred] - [pointer-value 1 value] - [eq? 2 pred] - ;;; fixnum primitives - [$fxadd1 1 value] - [$fxsub1 1 value] - [$fx+ 2 value] - [$fx- 2 value] - [$fx* 2 value] - [$fxsll 2 value] - [$fxsra 2 value] - [$fxlogand 2 value] - [$fxlogor 2 value] - [$fxlogxor 2 value] - [$fxlognot 1 value] - [$fxquotient 2 value] - [$fxmodulo 2 value] - ;;; fixnum predicates - [$fxzero? 1 pred] - [$fx= 2 pred] - [$fx< 2 pred] - [$fx<= 2 pred] - [$fx> 2 pred] - [$fx>= 2 pred] - ;;; character predicates - [$char= 2 pred] - [$char< 2 pred] - [$char<= 2 pred] - [$char> 2 pred] - [$char>= 2 pred] - ;;; character conversion - [$fixnum->char 1 value] - [$char->fixnum 1 value] - ;;; lists/pairs - [cons 2 value] - [$car 1 value] - [$cdr 1 value] - [$set-car! 2 effect] - [$set-cdr! 2 effect] - ;;; vectors - [$make-vector 1 value] - [vector any value] - [$vector-length 1 value] - [$vector-ref 2 value] - [$vector-set! 3 effect] - ;;; strings - [$make-string 1 value] - [$string any value] - [$string-length 1 value] - [$string-ref 2 value] - [$string-set! 3 effect] - ;;; symbols - [$make-symbol 1 value] - [$symbol-value 1 value] - [$symbol-string 1 value] - [$symbol-unique-string 1 value] - [$set-symbol-value! 2 effect] - [$set-symbol-string! 2 effect] - [$set-symbol-unique-string! 2 effect] - [$symbol-plist 1 value] - [$set-symbol-plist! 2 effect] - [primitive-ref 1 value] - [primitive-set! 2 effect] - ;;; tcbuckets - [$make-tcbucket 4 value] - [$tcbucket-key 1 value] - [$tcbucket-val 1 value] - [$tcbucket-next 1 value] - [$set-tcbucket-val! 2 effect] - [$set-tcbucket-next! 2 effect] - [$set-tcbucket-tconc! 2 effect] - ;;; misc - [eof-object 0 value] - [void 0 value] - [$exit 1 effect] - [$fp-at-base 0 pred] - [$current-frame 0 value] - [$seal-frame-and-call 1 tail] - [$frame->continuation 1 value] - ;;; - ;;; records - ;;; - [$make-record 2 value] - [$record? 1 pred] - [$record/rtd? 2 pred] - [$record-rtd 1 value] - [$record-ref 2 value] - [$record-set! 3 effect] - ;;; - ;;; asm - ;;; - ;[code? 1 pred] - ;[$code-instr-size 1 value] - ;[$code-reloc-size 1 value] - ;[$code-closure-size 1 value] - ;[$code->closure 1 value] - ;[$set-code-byte! 3 effect] - ;[$set-code-word! 3 effect] - ;[$set-code-object! 4 effect] - ;[$set-code-object+offset! 5 effect] - ;[$set-code-object+offset/rel! 5 effect] - ;;; - [$make-call-with-values-procedure 0 value] - [$make-values-procedure 0 value] - [$install-underflow-handler 0 effect] - )) - -(define (primitive-context x) - (cond - [(assq x open-coded-primitives) => caddr] - [else (error 'primitive-context "unknown prim ~s" x)])) - - -;;; primitives table section -(define primitives-table - '(;;; system locations used by the C/Scheme interface - [$apply-nonprocedure-error-handler library] - [$incorrect-args-error-handler library] - [$multiple-values-error library] - [$intern library] - [do-overflow library] - [do-vararg-overflow library] - [do-stack-overflow library] - ;;; type predicates - [fixnum? public] - [immediate? public] - [boolean? public] - [char? public] - [null? public] - [pair? public] - [symbol? public] - [vector? public] - [string? public] - [procedure? public] - [eof-object? public] - [not public] - [eq? public] - [equal? public] - ;;; fixnum primitives - [fxadd1 public] - [fxsub1 public] - [fx+ public] - [fx- public] - [fx* public] - [fxsll public] - [fxsra public] - [fxlogor public] - [fxlogand public] - [fxlogxor public] - [fxlognot public] - [fxquotient public] - [fxremainder public] - [fxmodulo public] - ;;; fixnum predicates - [fxzero? public] - [fx= public] - [fx< public] - [fx<= public] - [fx> public] - [fx>= public] - ;;; characters - [char=? public] - [char? public] - [char>=? public] - [integer->char public] - [char->integer public] - ;;; lists - [cons public] - [car public] - [cdr public] - [caar public] - [cadr public] - [cdar public] - [cddr public] - [caaar public] - [caadr public] - [cadar public] - [caddr public] - [cdaar public] - [cdadr public] - [cddar public] - [cdddr public] - [caaaar public] - [caaadr public] - [caadar public] - [caaddr public] - [cadaar public] - [cadadr public] - [caddar public] - [cadddr public] - [cdaaar public] - [cdaadr public] - [cdadar public] - [cdaddr public] - [cddaar public] - [cddadr public] - [cdddar public] - [cddddr public] - [set-car! public] - [set-cdr! public] - [list public] - [list* ADDME] - [list? public] - [list-ref public] - [length public] - [make-list public] - [reverse public] - [append public] - [list-ref public] - [memq public] - [memv public] - [assq public] - [map public] - [for-each public] - [andmap public] - [ormap public] - ;;; vectors - [make-vector public] - [vector public] - [vector-length public] - [vector-ref public] - [vector-set! public] - [list->vector public] - [vector->list public] - ;;; strings - [make-string public] - [string public] - [string-length public] - [string-ref public] - [string-set! public] - [list->string public] - [string->list public] - [string-append public] - [substring public] - [string=? public] - [fixnum->string public] - ;;; symbols - [gensym public] - [gensym? public] - [symbol->string public] - [gensym->unique-string public] - [gensym-prefix public] - [gensym-count public] - [print-gensym public] - [string->symbol public] - [top-level-value public] - [top-level-bound? public] - [set-top-level-value! public] - [primitive-set! public] - [getprop public] - [putprop public] - [remprop public] - [property-list public] - [oblist public] - [uuid public] - ;;; eof - [eof-object public] - [void public] - ;;; control/debugging - [print-error public] - [error public] - [current-error-handler public] - [exit public] - [apply public] - [make-parameter public] - ;;; output - [output-port? public] - [console-output-port public] - [current-output-port public] - [standard-output-port public] - [standard-error-port public] - [open-output-file public] - [open-output-string public] - [with-output-to-file public] - [call-with-output-file public] - [with-input-from-file public] - [call-with-input-file public] - [get-output-string public] - [close-output-port public] - [flush-output-port public] - [write-char public] - [output-port-name public] - [newline public] - ;;; input - [input-port? public] - [standard-input-port public] - [console-input-port public] - [current-input-port public] - [open-input-file public] - [close-input-port public] - [reset-input-port! public] - [read-char public] - [peek-char public] - [unread-char public] - [input-port-name public] - ;;; writing/printing - [write public] - [display public] - [printf public] - [fprintf public] - [format public] - [read-token public] - [read public] - ;;; evaluation - [primitive? public] - [expand public] - [syntax-error public] - [current-expand public] - [expand-mode public] - [assembler-output public] - [compile-file public] - [fasl-write public] - - [$sc-put-cte public] - [sc-expand public] - [$make-environment public] - [environment? public] - [interaction-environment public] - [identifier? public] - [syntax->list public] - [syntax-object->datum public] - [datum->syntax-object public] - [generate-temporaries public] - [free-identifier=? public] - [bound-identifier=? public] - [literal-identifier=? public] - [syntax-error public] - [$syntax-dispatch public] - - - - [interpret public] - [eval public] - [current-eval public] - [load public] - [new-cafe public] - [collect public] - [call/cc public] - [call/cf library] - [dynamic-wind public] - [values public] - [call-with-values public] - [make-traced-procedure library] - [trace-symbol! library] - [untrace-symbol! library] - ;;; record - [$base-rtd library] - [record? public] - [record-rtd public] - [record-name public] - [record-printer public] - [record-length public] - [record-ref public] - [record-set! public] - ;;; record rtds - [make-record-type public] - [record-type-name public] - [record-type-descriptor public] - [record-type-symbol public] - [record-type-field-names public] - [record-constructor public] - [record-predicate public] - [record-field-accessor public] - [record-field-mutator public] - ;;; hash tables - [make-hash-table public] - [hash-table? public] - [get-hash-table public] - [put-hash-table! public] - ;;; asm - [make-code public] - [code? public] - [make-code-executable! public] - [code-instr-size public] - [code-reloc-size public] - [code-closure-size public] - [set-code-byte! public] - [set-code-word! public] - [set-code-object! public] - [set-code-foreign-object! public] - [set-code-object+offset! public] - [set-code-object+offset/rel! public] - [set-code-object/reloc/relative! public] - [code-reloc-vec public] - [code-code-vec public] - [code->closure public] - [list*->code* library] - ;;; - ;;; POSIX - ;;; - [fork public] - [posix-fork public] - [system public] - [$debug public] - [$underflow-misaligned-error public] - )) - - -(define (primitive? x) - (cond - [(assq x primitives-table) #t] - [(assq x open-coded-primitives) #t] - [else #f])) - -(define (open-codeable? x) - (cond - [(assq x open-coded-primitives) #t] - [(assq x primitives-table) #f] - [else (error 'open-codeable "invalid primitive ~s" x)])) - -(define (open-coded-primitive-args x) - (cond - [(assq x open-coded-primitives) => cadr] - [else (error 'open-coded-primitive-args "invalid ~s" x)])) - -;;; end of primitives table section - - -(define-record constant (value)) -(define-record code-loc (label)) -(define-record foreign-label (label)) -(define-record var (name assigned)) -(define-record cp-var (idx)) -(define-record frame-var (idx)) -(define-record new-frame (base-idx size body)) -(define-record save-cp (loc)) -(define-record eval-cp (check body)) -(define-record return (value)) -(define-record call-cp - (call-convention rp-convention base-idx arg-count live-mask)) -(define-record primcall (op arg*)) -(define-record primref (name)) -(define-record conditional (test conseq altern)) -(define-record bind (lhs* rhs* body)) -(define-record recbind (lhs* rhs* body)) -(define-record fix (lhs* rhs* body)) - -(define-record seq (e0 e1)) -(define-record clambda-case (arg* proper body)) -(define-record clambda (cases)) -(define-record clambda-code (label cases free)) - -(define-record closure (code free*)) -(define-record funcall (op rand*)) -(define-record appcall (op rand*)) -(define-record forcall (op rand*)) -(define-record code-rec (arg* proper free* body)) - -(define-record codes (list body)) -(define-record assign (lhs rhs)) - -(define unique-var - (let ([counter 0]) - (lambda (x) - (let ([g (gensym (format "~a:~a" x counter))]) - (set! counter (fxadd1 counter)) - (make-var g #f))))) - -(define (make-bind^ lhs* rhs* body) - (if (null? lhs*) - body - (make-bind lhs* rhs* body))) - -(define (recordize x) - (define (gen-fml* fml*) - (cond - [(pair? fml*) - (cons (unique-var (car fml*)) - (gen-fml* (cdr fml*)))] - [(symbol? fml*) - (unique-var fml*)] - [else '()])) - (define (properize fml*) - (cond - [(pair? fml*) - (cons (car fml*) (properize (cdr fml*)))] - [(null? fml*) '()] - [else (list fml*)])) - (define (extend-env fml* nfml* env) - (cons (cons fml* nfml*) env)) - (define (quoted-sym x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (symbol? (cadr x))) - (cadr x) - (error 'quoted-sym "not a quoted symbol ~s" x))) - (define (quoted-string x) - (if (and (list? x) - (fx= (length x) 2) - (eq? 'quote (car x)) - (string? (cadr x))) - (cadr x) - (error 'quoted-string "not a quoted string ~s" x))) - (define (lookup^ x lhs* rhs*) - (cond - [(pair? lhs*) - (if (eq? x (car lhs*)) - (car rhs*) - (lookup^ x (cdr lhs*) (cdr rhs*)))] - [(eq? x lhs*) rhs*] - [else #f])) - (define (lookup x env) - (cond - [(pair? env) - (or (lookup^ x (caar env) (cdar env)) - (lookup x (cdr env)))] - [else #f])) - (define (E x env) - (cond - [(pair? x) - (case (car x) - [(quote) (make-constant (cadr x))] - [(if) - (make-conditional - (E (cadr x) env) - (E (caddr x) env) - (E (cadddr x) env))] - [(set!) - (let ([lhs (cadr x)] [rhs (caddr x)]) - (make-assign - (or (lookup lhs env) - (error 'recordize "invalid assignment ~s" x)) - (E rhs env)))] - [(begin) - (let f ([a (cadr x)] [d (cddr x)]) - (cond - [(null? d) (E a env)] - [else - (make-seq - (E a env) - (f (car d) (cdr d)))]))] - [(letrec) - (unless (fx= (length x) 3) (syntax-error x)) - (let ([bind* (cadr x)] [body (caddr x)]) - (let ([lhs* (map car bind*)] - [rhs* (map cadr bind*)]) - (let ([nlhs* (gen-fml* lhs*)]) - (let ([env (extend-env lhs* nlhs* env)]) - (make-recbind nlhs* - (map (lambda (rhs) (E rhs env)) rhs*) - (E body env))))))] - [(letrec) - (unless (fx= (length x) 3) (syntax-error x)) - (let ([bind* (cadr x)] [body (caddr x)]) - (let ([lhs* (map car bind*)] - [rhs* (map cadr bind*)] - [v* (map (lambda (x) '(void)) bind*)] - [t* (map (lambda (x) (gensym)) bind*)]) - (E `((case-lambda - [,lhs* - ((case-lambda - [,t* - (begin ,@(map (lambda (x v) `(set! ,x ,v)) lhs* t*) - ,body)]) - ,@rhs*)]) - ,@v*) - env)))] - [(case-lambda) - (let ([cls* - (map - (lambda (cls) - (let ([fml* (car cls)] [body (cadr cls)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([body (E body (extend-env fml* nfml* env))]) - (make-clambda-case - (properize nfml*) - (list? fml*) - body))))) - (cdr x))]) - (make-clambda cls*))] - [(foreign-call) - (let ([name (quoted-string (cadr x))] [arg* (cddr x)]) - (make-forcall name - (map (lambda (x) (E x env)) arg*)))] - [(|#primitive|) - (let ([var (cadr x)]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid primitive ~s" var)))] - [(top-level-value) - (let ([var (quoted-sym (cadr x))]) - (cond - [(primitive? var) (make-primref var)] - [else (error 'recordize "invalid top-level var ~s" var)]))] - [(memv) - (make-funcall - (make-primref 'memq) - (map (lambda (x) (E x env)) (cdr x)))] - [($apply) - (let ([proc (cadr x)] [arg* (cddr x)]) - (make-appcall - (E proc env) - (map (lambda (x) (E x env)) arg*)))] - [(void) - (make-constant (void))] - [else - (make-funcall - (E (car x) env) - (map (lambda (x) (E x env)) (cdr x)))])] - [(symbol? x) - (or (lookup x env) - (error 'recordize "invalid reference in ~s" x))] - [else (error 'recordize "invalid expression ~s" x)])) - (E x '())) - - -(define (unparse x) - (define (E-args proper x) - (if proper - (map E x) - (let f ([a (car x)] [d (cdr x)]) - (cond - [(null? d) (E a)] - [else (cons (E a) (f (car d) (cdr d)))])))) - (define (E x) - (record-case x - [(constant c) `(quote ,c)] - [(code-loc x) `(code-loc ,x)] - [(var x) (string->symbol (format "v:~a" x))] - [(primref x) x] - [(conditional test conseq altern) - `(if ,(E test) ,(E conseq) ,(E altern))] - [(primcall op arg*) `(,op . ,(map E arg*))] - [(bind lhs* rhs* body) - `(let ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(recbind lhs* rhs* body) - `(letrec ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(fix lhs* rhs* body) - `(fix ,(map (lambda (lhs rhs) (list (E lhs) (E rhs))) lhs* rhs*) - ,(E body))] - [(seq e0 e1) `(begin ,(E e0) ,(E e1))] - [(clambda-case args proper body) - `(clambda-case ,(E-args proper args) ,(E body))] - [(clambda cls*) - `(case-lambda . ,(map E cls*))] - [(clambda-code label clauses free) - `(code ,label . ,(map E clauses))] - [(closure code free*) - `(closure ,(E code) ,(map E free*))] - [(code-rec arg* proper free* body) - `(code-rec [arg: ,(E-args proper arg*)] - [free: ,(map E free*)] - ,(E body))] - [(codes list body) - `(codes ,(map E list) - ,(E body))] - [(funcall rator rand*) `(funcall ,(E rator) . ,(map E rand*))] - [(appcall rator rand*) `(appcall ,(E rator) . ,(map E rand*))] - [(forcall rator rand*) `(foreign-call ,rator . ,(map E rand*))] - [(assign lhs rhs) `(set! ,(E lhs) ,(E rhs))] - [(return x) `(return ,(E x))] - [(new-frame base-idx size body) - `(new-frame [base: ,base-idx] - [size: ,size] - ,(E body))] - [(frame-var idx) - (string->symbol (format "fv.~a" idx))] - [(cp-var idx) - (string->symbol (format "cp.~a" idx))] - [(save-cp expr) - `(save-cp ,(E expr))] - [(eval-cp check body) - `(eval-cp ,check ,(E body))] - [(call-cp call-convention rp-convention base-idx arg-count live-mask) - `(call-cp [conv: ,call-convention] - [rpconv: ,rp-convention] - [base-idx: ,base-idx] - [arg-count: ,arg-count] - [live-mask: ,live-mask])] - [(foreign-label x) `(foreign-label ,x)] - [else (error 'unparse "invalid record ~s" x)])) - (E x)) - -(define (optimize-direct-calls x) - (define who 'optimize-direct-calls) - (define (make-conses ls) - (cond - [(null? ls) (make-constant '())] - [else - (make-primcall 'cons - (list (car ls) (make-conses (cdr ls))))])) - (define (properize lhs* rhs*) - (cond - [(null? lhs*) (error who "improper improper")] - [(null? (cdr lhs*)) - (list (make-conses rhs*))] - [else (cons (car rhs*) (properize (cdr lhs*) (cdr rhs*)))])) - (define (inline-case cls rand*) - (record-case cls - [(clambda-case fml* proper body) - (if proper - (and (fx= (length fml*) (length rand*)) - (make-bind fml* rand* body)) - (and (fx<= (length fml*) (length rand*)) - (make-bind fml* (properize fml* rand*) body)))])) - (define (try-inline cls* rand* default) - (cond - [(null? cls*) default] - [(inline-case (car cls*) rand*)] - [else (try-inline (cdr cls*) rand* default)])) - (define (inline rator rand*) - (record-case rator - [(clambda cls*) - (try-inline cls* rand* - (make-funcall rator rand*))] - [else (make-funcall rator rand*)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(recbind lhs* rhs* body) - (make-recbind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (inline (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (optimize-letrec x) - (define who 'optimize-letrec) - (define (extend-hash lhs* h ref) - (for-each (lambda (lhs) (put-hash-table! h lhs #t)) lhs*) - (lambda (x) - (unless (get-hash-table h x #f) - (put-hash-table! h x #t) - (ref x)))) - (define (E* x* ref comp) - (cond - [(null? x*) '()] - [else - (cons (E (car x*) ref comp) - (E* (cdr x*) ref comp))])) - (define (do-rhs* i lhs* rhs* ref comp vref vcomp) - (cond - [(null? rhs*) '()] - [else - (let ([h (make-hash-table)]) - (let ([ref - (lambda (x) - (unless (get-hash-table h x #f) - (put-hash-table! h x #t) - (ref x) - (when (memq x lhs*) - (vector-set! vref i #t))))] - [comp - (lambda () - (vector-set! vcomp i #t) - (comp))]) - (cons (E (car rhs*) ref comp) - (do-rhs* (fxadd1 i) lhs* (cdr rhs*) ref comp vref vcomp))))])) - (define (partition-rhs* i lhs* rhs* vref vcomp) - (cond - [(null? lhs*) (values '() '() '() '() '() '())] - [else - (let-values - ([(slhs* srhs* llhs* lrhs* clhs* crhs*) - (partition-rhs* (fxadd1 i) (cdr lhs*) (cdr rhs*) vref vcomp)] - [(lhs rhs) (values (car lhs*) (car rhs*))]) - (cond - [(var-assigned lhs) - (values slhs* srhs* llhs* lrhs* (cons lhs clhs*) (cons rhs crhs*))] - [(clambda? rhs) - (values slhs* srhs* (cons lhs llhs*) (cons rhs lrhs*) clhs* crhs*)] - [(or (vector-ref vref i) (vector-ref vcomp i)) - (values slhs* srhs* llhs* lrhs* (cons lhs clhs*) (cons rhs crhs*))] - [else - (values (cons lhs slhs*) (cons rhs srhs*) llhs* lrhs* clhs* crhs*)] - ))])) - (define (do-recbind lhs* rhs* body ref comp) - (let ([h (make-hash-table)] - [vref (make-vector (length lhs*) #f)] - [vcomp (make-vector (length lhs*) #f)]) - (let* ([ref (extend-hash lhs* h ref)] - [body (E body ref comp)]) - (let ([rhs* (do-rhs* 0 lhs* rhs* ref comp vref vcomp)]) - (let-values ([(slhs* srhs* llhs* lrhs* clhs* crhs*) - (partition-rhs* 0 lhs* rhs* vref vcomp)]) - (let ([v* (map (lambda (x) (make-primcall 'void '())) clhs*)] - [t* (map (lambda (x) (unique-var 'tmp)) clhs*)]) - (make-bind slhs* srhs* - (make-bind clhs* v* - (make-fix llhs* lrhs* - (make-bind t* crhs* - (build-assign* clhs* t* body))))))))))) - (define (build-assign* lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-seq - (make-assign (car lhs*) (car rhs*)) - (build-assign* (cdr lhs*) (cdr rhs*) body))])) - (define (E x ref comp) - (record-case x - [(constant) x] - [(var) (ref x) x] - [(assign lhs rhs) - (set-var-assigned! lhs #t) - (ref lhs) - (make-assign lhs (E rhs ref comp))] - [(primref) x] - [(bind lhs* rhs* body) - (let ([rhs* (E* rhs* ref comp)]) - (let ([h (make-hash-table)]) - (let ([body (E body (extend-hash lhs* h ref) comp)]) - (make-bind lhs* rhs* body))))] - [(recbind lhs* rhs* body) - (if (null? lhs*) - (E body ref comp) - (do-recbind lhs* rhs* body ref comp))] - [(conditional e0 e1 e2) - (make-conditional (E e0 ref comp) (E e1 ref comp) (E e2 ref comp))] - [(seq e0 e1) (make-seq (E e0 ref comp) (E e1 ref comp))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let ([h (make-hash-table)]) - (let ([body (E body (extend-hash fml* h ref) void)]) - (make-clambda-case fml* proper body)))])) - cls*))] - [(primcall rator rand*) - (when (memq rator '(call/cc call/cf)) - (comp)) - (make-primcall rator (E* rand* ref comp))] - [(funcall rator rand*) - (let ([rator (E rator ref comp)] [rand* (E* rand* ref comp)]) - (record-case rator - [(primref op) - (when (memq op '(call/cc call/cf)) - (comp))] - [else - (comp)]) - (make-funcall rator rand*))] - [(appcall rator rand*) - (let ([rator (E rator ref comp)] [rand* (E* rand* ref comp)]) - (record-case rator - [(primref op) - (when (memq op '(call/cc call/cf)) - (comp))] - [else - (comp)]) - (make-appcall rator rand*))] - [(forcall rator rand*) - (make-forcall rator (E* rand* ref comp))] - [else (error who "invalid expression ~s" (unparse x))])) - (E x (lambda (x) (error who "free var ~s found" x)) - void)) - - -(define (remove-letrec x) - (define who 'remove-letrec) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(recbind lhs* rhs* body) - (let ([t* (map (lambda (lhs) (unique-var 'tmp)) lhs*)] - [v* (map (lambda (lhs) (make-primcall 'void '())) lhs*)]) - (make-bind lhs* v* - (make-bind t* (map Expr rhs*) - (let f ([lhs* lhs*] [t* t*]) - (cond - [(null? lhs*) (Expr body)] - [else - (make-seq - (make-assign (car lhs*) (car t*)) - (f (cdr lhs*) (cdr t*)))])))))] - ;[(fix lhs* rhs* body) - ; (Expr (make-recbind lhs* rhs* body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional - (Expr test) - (Expr conseq) - (Expr altern))] - [(seq e0 e1) - (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Expr body))])) - cls*))] - [(primcall rator rand*) - (make-primcall rator (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(forcall rator rand*) - (make-forcall rator (map Expr rand*))] - [(assign lhs rhs) - (make-assign lhs (Expr rhs))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (uncover-assigned x) - (define who 'uncover-assigned) - (define (Expr* x*) - (for-each Expr x*)) - (define (Expr x) - (record-case x - [(constant) (void)] - [(var) (void)] - [(primref) (void)] - [(bind lhs* rhs* body) - (begin (Expr body) (Expr* rhs*))] - [(recbind lhs* rhs* body) - (begin (Expr body) (Expr* rhs*))] - [(fix lhs* rhs* body) - (Expr* rhs*) - (Expr body) - (when (ormap var-assigned lhs*) - (error 'uncover-assigned "a fix lhs is assigned"))] - [(conditional test conseq altern) - (begin (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (begin (Expr e0) (Expr e1))] - [(clambda cls*) - (for-each - (lambda (cls) - (Expr (clambda-case-body cls))) - cls*)] - [(primcall rator rand*) (Expr* rand*)] - [(funcall rator rand*) - (begin (Expr rator) (Expr* rand*))] - [(appcall rator rand*) - (begin (Expr rator) (Expr* rand*))] - [(forcall rator rand*) (Expr* rand*)] - [(assign lhs rhs) - (set-var-assigned! lhs #t) - (Expr rhs)] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - - -(define (rewrite-assignments x) - (define who 'rewrite-assignments) - (define (fix-lhs* lhs*) - (cond - [(null? lhs*) (values '() '() '())] - [else - (let ([x (car lhs*)]) - (let-values ([(lhs* a-lhs* a-rhs*) (fix-lhs* (cdr lhs*))]) - (cond - [(var-assigned x) - (let ([t (unique-var 'assignment-tmp)]) - (values (cons t lhs*) (cons x a-lhs*) (cons t a-rhs*)))] - [else - (values (cons x lhs*) a-lhs* a-rhs*)])))])) - (define (bind-assigned lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (make-bind lhs* - (map (lambda (rhs) (make-primcall 'vector (list rhs))) rhs*) - body)])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) - (cond - [(var-assigned x) - (make-primcall '$vector-ref (list x (make-constant 0)))] - [else x])] - [(primref) x] - [(bind lhs* rhs* body) - (let-values ([(lhs* a-lhs* a-rhs*) (fix-lhs* lhs*)]) - (make-bind lhs* (map Expr rhs*) - (bind-assigned a-lhs* a-rhs* (Expr body))))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(clambda cls*) - (make-clambda - (map (lambda (cls) - (record-case cls - [(clambda-case fml* proper body) - (let-values ([(fml* a-lhs* a-rhs*) (fix-lhs* fml*)]) - (make-clambda-case fml* proper - (bind-assigned a-lhs* a-rhs* (Expr body))))])) - cls*))] - [(primcall op rand*) - (make-primcall op (map Expr rand*))] - [(forcall op rand*) - (make-forcall op (map Expr rand*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall rator rand*) - (make-appcall (Expr rator) (map Expr rand*))] - [(assign lhs rhs) - (unless (var-assigned lhs) - (error 'rewrite-assignments "not assigned ~s in ~s" lhs x)) - (make-primcall '$vector-set! (list lhs (make-constant 0) (Expr rhs)))] - [else (error who "invalid expression ~s" (unparse x))])) - (Expr x)) - - -(define (remove-assignments x) - (uncover-assigned x) - (rewrite-assignments x)) - - - - -(define (convert-closures prog) - (define who 'convert-closures) - (define (Expr* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (Expr (car x*))] - [(d d-free) (Expr* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (do-clambda* x*) - (cond - [(null? x*) (values '() '())] - [else - (let-values ([(a a-free) (do-clambda (car x*))] - [(d d-free) (do-clambda* (cdr x*))]) - (values (cons a d) (union a-free d-free)))])) - (define (do-clambda x) - (record-case x - [(clambda cls*) - (let-values ([(cls* free) - (let f ([cls* cls*]) - (cond - [(null? cls*) (values '() '())] - [else - (record-case (car cls*) - [(clambda-case fml* proper body) - (let-values ([(body body-free) (Expr body)] - [(cls* cls*-free) (f (cdr cls*))]) - (values - (cons (make-clambda-case fml* proper body) - cls*) - (union (difference body-free fml*) - cls*-free)))])]))]) - (values (make-closure (make-clambda-code (gensym) cls* free) free) - free))])) - (define (Expr ex) - (record-case ex - [(constant) (values ex '())] - [(var) (values ex (singleton ex))] - [(primref) (values ex '())] - [(bind lhs* rhs* body) - (let-values ([(rhs* rhs-free) (Expr* rhs*)] - [(body body-free) (Expr body)]) - (values (make-bind lhs* rhs* body) - (union rhs-free (difference body-free lhs*))))] - [(fix lhs* rhs* body) - (let-values ([(rhs* rfree) (do-clambda* rhs*)] - [(body bfree) (Expr body)]) - (values (make-fix lhs* rhs* body) - (difference (union bfree rfree) lhs*)))] - [(conditional test conseq altern) - (let-values ([(test test-free) (Expr test)] - [(conseq conseq-free) (Expr conseq)] - [(altern altern-free) (Expr altern)]) - (values (make-conditional test conseq altern) - (union test-free (union conseq-free altern-free))))] - [(seq e0 e1) - (let-values ([(e0 e0-free) (Expr e0)] - [(e1 e1-free) (Expr e1)]) - (values (make-seq e0 e1) (union e0-free e1-free)))] - [(clambda) - (do-clambda ex)] - [(primcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-primcall op rand*) rand*-free))] - [(forcall op rand*) - (let-values ([(rand* rand*-free) (Expr* rand*)]) - (values (make-forcall op rand*) rand*-free))] - [(funcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-funcall rator rand*) - (union rat-free rand*-free)))] - [(appcall rator rand*) - (let-values ([(rator rat-free) (Expr rator)] - [(rand* rand*-free) (Expr* rand*)]) - (values (make-appcall rator rand*) - (union rat-free rand*-free)))] - [else (error who "invalid expression ~s" (unparse ex))])) - (let-values ([(prog free) (Expr prog)]) - (unless (null? free) - (error 'convert-closures "free vars ~s encountered in ~a" - free (unparse prog))) - prog)) - - -(define (lift-codes x) - (define who 'lift-codes) - (define all-codes '()) - (define (do-code x) - (record-case x - [(clambda-code label cls* free) - (let ([cls* (map - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (E body))])) - cls*)]) - (let ([g (make-code-loc label)]) - (set! all-codes - (cons (make-clambda-code label cls* free) all-codes)) - g))])) - (define (E x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map E rhs*) (E body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map E rhs*) (E body))] - [(conditional test conseq altern) - (make-conditional (E test) (E conseq) (E altern))] - [(seq e0 e1) (make-seq (E e0) (E e1))] - [(closure c free) (make-closure (do-code c) free)] - [(primcall op rand*) (make-primcall op (map E rand*))] - [(forcall op rand*) (make-forcall op (map E rand*))] - [(funcall rator rand*) (make-funcall (E rator) (map E rand*))] - [(appcall rator rand*) (make-appcall (E rator) (map E rand*))] - [else (error who "invalid expression ~s" (unparse x))])) - (let ([x (E x)]) - (make-codes all-codes x))) - - - - -(define (syntactically-valid? op rand*) - (define (valid-arg-count? op rand*) - (let ([n (open-coded-primitive-args op)] [m (length rand*)]) - (cond - [(eq? n 'any) #t] - [(eq? n 'no-code) - (error 'syntactically-valid - "should not primcall non codable prim ~s" op)] - [(fixnum? n) - (cond - [(fx= n m) #t] - [else - (error 'compile - "Possible incorrect number of args in ~s" - (cons op (map unparse rand*))) - #f])] - [else (error 'do-primcall "BUG: what ~s" n)]))) - (define (check op pred?) - (lambda (arg) - (record-case arg - [(constant c) - (cond - [(pred? c) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [(primref) - (cond - [(pred? (lambda (x) x)) #t] - [else - (error 'compile "Possible argument error to primitive ~s" op) - #f])] - [else #t]))) - (define (nonnegative-fixnum? n) - (and (fixnum? n) (fx>= n 0))) - (define (byte? n) - (and (fixnum? n) (fx<= 0 n) (fx<= n 127))) - (define (valid-arg-types? op rand*) - (case op - [(fixnum? immediate? boolean? char? vector? string? procedure? - null? pair? not cons eq? vector symbol? error eof-object eof-object? - void $unbound-object? code? $forward-ptr? bwp-object? - pointer-value) - '#t] - [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* - $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) - (andmap (check op fixnum?) rand*)] - [($fixnum->char) - (andmap (check op byte?) rand*)] - [($char->fixnum $char= $char< $char<= $char> $char>= $string) - (andmap (check op char?) rand*)] - [($make-vector $make-string) - (andmap (check op nonnegative-fixnum?) rand*)] - [($car $cdr) - (andmap (check op pair?) rand*)] - [($vector-length) - (andmap (check op vector?) rand*)] - [($string-length) - (andmap (check op string?) rand*)] - [($set-car! $set-cdr!) - ((check op pair?) (car rand*))] - [($vector-ref $vector-set!) - (and ((check op vector?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($string-ref $string-set! - $string-ref-16+0 $string-ref-16+1 $string-ref-8+0 $string-ref-8+2) - (and ((check op string?) (car rand*)) - ((check op nonnegative-fixnum?) (cadr rand*)))] - [($symbol-string $symbol-unique-string) - (andmap (check op symbol?) rand*)] - [($constant-ref $set-constant! $intern $pcb-set! $pcb-ref $make-symbol - $symbol-value $set-symbol-value! $symbol-plist $set-symbol-plist! - $set-symbol-system-value! $set-symbol-system-value! - $set-symbol-unique-string! - $set-symbol-string! - $seal-frame-and-call $frame->continuation $code->closure - $code-instr-size $code-reloc-size $code-closure-size - $set-code-byte! $set-code-word! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $make-record $record? $record/rtd? $record-rtd $record-ref $record-set! - primitive-set! primitive-ref - $make-tcbucket $tcbucket-key $tcbucket-val $tcbucket-next - $set-tcbucket-val! $set-tcbucket-next! $set-tcbucket-tconc!) - #t] - [else (error 'valid-arg-types? "unhandled op ~s" op)])) - (and (valid-arg-count? op rand*) - (or (null? rand*) - (valid-arg-types? op rand*)))) - - -;;; the output of simplify-operands differs from the input in that the -;;; operands to primcalls are all simple (variables, primrefs, or constants). -;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to -;;; primcalls. - -(define (introduce-primcalls x) - (define who 'introduce-primcalls) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (Expr (car arg*)) - ; (begin - ; (warning 'compile "possible incorrect number of values") - ; (make-funcall (make-primref 'values) (map Expr arg*))))] - [else - (make-primcall op (map Expr arg*))])] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Expr (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(constant) (make-return x)] - [(var) (make-return x)] - [(primref) (make-return x)] - [(closure) (make-return x)] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(primcall op arg*) - (case op - ;[(values) - ; (if (fx= (length arg*) 1) - ; (make-return (Expr (car arg*))) - ; (make-return* (map Expr arg*)))] - [else - (make-return (make-primcall op (map Expr arg*)))])] - [(forcall op arg*) - (make-return (make-forcall op (map Expr arg*)))] - [(funcall rator rand*) - (cond - [(and (primref? rator) - (open-codeable? (primref-name rator)) - (syntactically-valid? (primref-name rator) rand*)) - (Tail (make-primcall (primref-name rator) rand*))] - [else - (make-funcall (Expr rator) (map Expr rand*))])] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (simplify-operands x) - (define who 'simplify-operands) - (define (simple? x) - (or (constant? x) (var? x) (primref? x))) - (define (simplify arg lhs* rhs* k) - (if (simple? arg) - (k arg lhs* rhs*) - (let ([v (unique-var 'tmp)]) - (k v (cons v lhs*) (cons (Expr arg) rhs*))))) - (define (simplify* arg* lhs* rhs* k) - (cond - [(null? arg*) (k '() lhs* rhs*)] - [else - (simplify (car arg*) lhs* rhs* - (lambda (a lhs* rhs*) - (simplify* (cdr arg*) lhs* rhs* - (lambda (d lhs* rhs*) - (k (cons a d) lhs* rhs*)))))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) x] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (make-fix lhs* (map Expr rhs*) (Tail body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L clauses free) - (make-clambda-code L (map CaseExpr clauses) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (insert-stack-overflow-checks x) - (define who 'insert-stack-overflow-checks) - (define (insert-check body) - (make-seq - (make-conditional - (make-primcall '$fp-overflow '()) - (make-funcall (make-primref 'do-stack-overflow) '()) - (make-primcall 'void '())) - body)) - (define (Expr x) - (record-case x - [(constant) #f] - [(var) #f] - [(primref) #f] - [(closure code free*) #f] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Expr body))] - [(fix lhs* rhs* body) (Expr body)] - [(conditional test conseq altern) - (or (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (or (Expr e0) (Expr e1))] - [(primcall op arg*) (ormap Expr arg*)] - [(forcall op arg*) (ormap Expr arg*)] - [(funcall rator arg*) #t] - [(appcall rator arg*) #t] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (Expr v)] - [(bind lhs* rhs* body) - (or (ormap Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) (Tail body)] - [(conditional test conseq altern) - (or (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (or (Expr e0) (Tail e1))] - [(funcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [(appcall rator arg*) (or (Expr rator) (ormap Expr arg*))] - [else (error who "invalid tail expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (if (Tail body) - (make-clambda-case fml* proper (insert-check body)) - x)])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (if (Tail body) - (insert-check body) - body))])) - (CodesExpr x)) - - -(define (insert-allocation-checks x) - (define who 'insert-allocation-checks) - (define (check-bytes n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-bytes - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-words n var body) - (make-seq - (make-conditional - (make-primcall '$ap-check-words - (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow-words) - (list - (make-primcall '$fx+ - (list (make-constant n) var)))) - (make-primcall 'void '())) - body)) - (define (check-const n body) - (make-seq - (make-conditional - (make-primcall '$ap-check-const - (list (make-constant n))) - (make-funcall (make-primref 'do-overflow) - (list (make-constant n))) - (make-primcall 'void '())) - body)) - (define (closure-size x) - (record-case x - [(closure code free*) - (align (fx+ disp-closure-data (fx* (length free*) wordsize)))] - [else (error 'closure-size "~s is not a closure" x)])) - (define (sum ac ls) - (cond - [(null? ls) ac] - [else (sum (fx+ ac (car ls)) (cdr ls))])) - (define (Expr x) - (record-case x - [(constant) x] - [(var) x] - [(primref) x] - [(closure) - (check-const (closure-size x) x)] - [(fix lhs* rhs* body) - (if (null? lhs*) - (Expr body) - (check-const (sum 0 (map closure-size rhs*)) - (make-fix lhs* rhs* - (Expr body))))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Expr body))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Expr conseq) (Expr altern))] - [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] - [(primcall op arg*) - (let ([x (make-primcall op (map Expr arg*))]) - (case op - [(cons) (check-const pair-size x)] - [($make-symbol) (check-const symbol-size x)] - [($make-tcbucket) (check-const tcbucket-size x)] - [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] - [($make-string) - (record-case (car arg*) - [(constant i) - (check-const (fx+ i (fx+ disp-string-data 1)) x)] - [else - (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] - [($string) - (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] - [($make-vector) - (record-case (car arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-vector-data) x)] - [else - (check-words (fxadd1 disp-vector-data) (car arg*) x)])] - [($make-record) - (record-case (cadr arg*) - [(constant i) - (check-const (fx+ (fx* i wordsize) disp-record-data) x)] - [else - (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(vector) - (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] - [else x]))] - [(forcall op arg*) - (make-forcall op (map Expr arg*))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Tail x) - (record-case x - [(return v) (make-return (Expr v))] - [(bind lhs* rhs* body) - (make-bind lhs* (map Expr rhs*) (Tail body))] - [(fix lhs* rhs* body) - (if (null? lhs*) - (Tail body) - (check-const (sum 0 (map closure-size rhs*)) - (make-fix lhs* rhs* - (Tail body))))] - [(conditional test conseq altern) - (make-conditional (Expr test) (Tail conseq) (Tail altern))] - [(seq e0 e1) (make-seq (Expr e0) (Tail e1))] - [(funcall rator rand*) - (make-funcall (Expr rator) (map Expr rand*))] - [(appcall op arg*) - (make-appcall (Expr op) (map Expr arg*))] - [else (error who "invalid expression ~s" (unparse x))])) - (define (CaseExpr x) - (record-case x - [(clambda-case fml* proper body) - (make-clambda-case fml* proper (Tail body))])) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (make-clambda-code L (map CaseExpr cases) free)])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) (Tail body))])) - (CodesExpr x)) - - -(define (remove-local-variables x) - (define who 'remove-local-variables) - (define (simple* x* r) - (map (lambda (x) - (cond - [(assq x r) => cdr] - [else - (when (var? x) (error who "unbound var ~s" x)) - x])) - x*)) - (define (env->mask r sz) - (let ([s (make-vector (fxsra (fx+ sz 7) 3) 0)]) - (for-each - (lambda (idx) - (let ([q (fxsra idx 3)] - [r (fxlogand idx 7)]) - (vector-set! s q - (fxlogor (vector-ref s q) (fxsll 1 r))))) - r) - s)) - (define (do-new-frame op rand* si r call-convention rp-convention orig-live) - (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) - (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) - (cond - [(null? r*) - (make-seq - (make-seq - (make-save-cp (make-frame-var si)) - (case call-convention - [(normal apply) - (make-eval-cp #t (Expr op nsi r (cons si live)))] - [(foreign) - (make-eval-cp #f (make-foreign-label op))] - [else (error who "invalid convention ~s" call-convention)])) - (make-call-cp call-convention - rp-convention - (fxadd1 si) ; frame size - (length rand*) ; argc - (env->mask (cons si orig-live) ; cp and everything before it - (fxadd1 si))))] ; mask-size ~~ frame size - [else - (make-seq - (make-assign (make-frame-var nsi) - (Expr (car r*) nsi r live)) - (f (cdr r*) (fxadd1 nsi) (cons nsi live)))])))) - (define (nop) (make-primcall 'void '())) - (define (do-bind lhs* rhs* body si r live k) - (let f ([lhs* lhs*] [rhs* rhs*] [si si] [nr r] [live live]) - (cond - [(null? lhs*) (k body si nr live)] - [else - (let ([v (make-frame-var si)]) - (make-seq - (make-assign v (Expr (car rhs*) si r live)) - (f (cdr lhs*) (cdr rhs*) (fxadd1 si) - (cons (cons (car lhs*) v) nr) - (cons si live))))]))) - (define (do-closure r) - (lambda (x) - (record-case x - [(closure code free*) - (make-closure code (simple* free* r))]))) - (define (do-fix lhs* rhs* body si r live k) - (let f ([l* lhs*] [nlhs* '()] [si si] [r r] [live live]) - (cond - [(null? l*) - (make-fix (reverse nlhs*) - (map (do-closure r) rhs*) - (k body si r live))] - [else - (let ([v (make-frame-var si)]) - (f (cdr l*) (cons v nlhs*) (fxadd1 si) - (cons (cons (car l*) v) r) - (cons si live)))]))) - (define (Tail x si r live) - (record-case x - [(return v) (make-return (Expr v si r live))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Tail)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Tail)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Tail conseq si r live) - (Tail altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] - [(primcall op arg*) - (case op -; [(values) (make-primcall op (simple* arg* r))] - [else (make-return (make-primcall op (simple* arg* r)))])] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'tail live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'tail live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (Effect x si r live) - (record-case x - [(constant) (nop)] - [(var) (nop)] - [(primref) (nop)] - [(closure code free*) (nop)] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Effect)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Effect)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Effect conseq si r live) - (Effect altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'effect live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'effect live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'effect live)] - [else (error who "invalid effect expression ~s" (unparse x))])) - (define (Expr x si r live) - (record-case x - [(constant) x] - [(var) - (cond - [(assq x r) => cdr] - [else (error who "unbound var ~s" x)])] - [(primref) x] - [(closure code free*) - (make-closure code (simple* free* r))] - [(bind lhs* rhs* body) - (do-bind lhs* rhs* body si r live Expr)] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* body si r live Expr)] - [(conditional test conseq altern) - (make-conditional - (Expr test si r live) - (Expr conseq si r live) - (Expr altern si r live))] - [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] - [(primcall op arg*) - (make-primcall op (simple* arg* r))] - [(forcall op rand*) - (do-new-frame op rand* si r 'foreign 'value live)] - [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'value live)] - [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'value live)] - [else (error who "invalid expression ~s" (unparse x))])) - (define (bind-fml* fml* r) - (let f ([si 1] [fml* fml*]) - (cond - [(null? fml*) (values '() si r '())] - [else - (let-values ([(nfml* nsi r live) (f (fxadd1 si) (cdr fml*))]) - (let ([v (make-frame-var si)]) - (values (cons v nfml*) - nsi - (cons (cons (car fml*) v) r) - (cons si live))))]))) - (define (bind-free* free*) - (let f ([free* free*] [idx 0] [r '()]) - (cond - [(null? free*) r] - [else - (f (cdr free*) (fxadd1 idx) - (cons (cons (car free*) (make-cp-var idx)) r))]))) - (define CaseExpr - (lambda (r) - (lambda (x) - (record-case x - [(clambda-case fml* proper body) - (let-values ([(fml* si r live) (bind-fml* fml* r)]) - (make-clambda-case fml* proper (Tail body si r live)))])))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (let ([r (bind-free* free)]) - (make-clambda-code L (map (CaseExpr r) cases) free))])) - (define (CodesExpr x) - (record-case x - [(codes list body) - (make-codes (map CodeExpr list) - (Tail body 1 '() '()))])) - (CodesExpr x)) - - -(begin - (define fx-shift 2) - (define fx-mask #x03) - (define fx-tag 0) - (define bool-f #x2F) - (define bool-t #x3F) - (define bool-mask #xEF) - (define bool-tag #x2F) - (define bool-shift 4) - (define nil #x4F) - (define eof #x5F) ; double check - (define unbound #x6F) ; double check - (define void-object #x7F) ; double check - (define bwp-object #x8F) ; double check - (define char-shift 8) - (define char-tag #x0F) - (define char-mask #xFF) - (define pair-mask 7) - (define pair-tag 1) - (define disp-car 0) - (define disp-cdr 4) - (define pair-size 8) - (define pagesize 4096) - (define pageshift 12) - (define wordsize 4) - (define wordshift 2) - - (define symbol-mask 7) - (define symbol-tag 2) - (define disp-symbol-string 0) - (define disp-symbol-unique-string 4) - (define disp-symbol-value 8) - (define disp-symbol-plist 12) - (define disp-symbol-system-value 16) - (define disp-symbol-system-plist 20) - (define symbol-size 24) - (define vector-tag 5) - (define vector-mask 7) - (define disp-vector-length 0) - (define disp-vector-data 4) - (define string-mask 7) - (define string-tag 6) - (define disp-string-length 0) - (define disp-string-data 4) - (define closure-mask 7) - (define closure-tag 3) - (define disp-closure-data 4) - (define disp-closure-code 0) - (define continuation-size 16) - (define continuation-tag #x1F) - (define disp-continuation-top 4) - (define disp-continuation-size 8) - (define disp-continuation-next 12) - (define code-tag #x2F) - (define disp-code-instrsize 4) - (define disp-code-relocsize 8) - (define disp-code-closuresize 12) - (define disp-code-data 16) - (define disp-tcbucket-tconc 0) - (define disp-tcbucket-key 4) - (define disp-tcbucket-val 8) - (define disp-tcbucket-next 12) - (define tcbucket-size 16) - - (define record-ptag 5) - (define record-pmask 7) - (define disp-record-rtd 0) - (define disp-record-data 4) - (define disp-frame-size -17) - (define disp-frame-offset -13) - (define disp-multivalue-rp -9) - (define object-alignment 8) - (define align-shift 3) - (define dirty-word -1)) - -(define (align n) - (fxsll (fxsra (fx+ n (fxsub1 object-alignment)) align-shift) align-shift)) - -(begin - (define (mem off val) - (cond - [(fixnum? off) (list 'disp (int off) val)] - [(register? off) (list 'disp off val)] - [else (error 'mem "invalid disp ~s" off)])) - (define (int x) (list 'int x)) - (define (obj x) (list 'obj x)) - (define (byte x) (list 'byte x)) - (define (byte-vector x) (list 'byte-vector x)) - (define (movzbl src targ) (list 'movzbl src targ)) - (define (sall src targ) (list 'sall src targ)) - (define (sarl src targ) (list 'sarl src targ)) - (define (shrl src targ) (list 'shrl src targ)) - (define (notl src) (list 'notl src)) - (define (pushl src) (list 'pushl src)) - (define (popl src) (list 'popl src)) - (define (orl src targ) (list 'orl src targ)) - (define (xorl src targ) (list 'xorl src targ)) - (define (andl src targ) (list 'andl src targ)) - (define (movl src targ) (list 'movl src targ)) - (define (movb src targ) (list 'movb src targ)) - (define (addl src targ) (list 'addl src targ)) - (define (imull src targ) (list 'imull src targ)) - (define (idivl src) (list 'idivl src)) - (define (subl src targ) (list 'subl src targ)) - (define (push src) (list 'push src)) - (define (pop targ) (list 'pop targ)) - (define (sete targ) (list 'sete targ)) - (define (call targ) (list 'call targ)) - (define (tail-indirect-cpr-call) - (jmp (mem (fx- disp-closure-code closure-tag) cpr))) - (define (indirect-cpr-call) - (call (mem (fx- disp-closure-code closure-tag) cpr))) - (define (negl targ) (list 'negl targ)) - (define (label x) (list 'label x)) - (define (label-address x) (list 'label-address x)) - (define (ret) '(ret)) - (define (cltd) '(cltd)) - (define (cmpl arg1 arg2) (list 'cmpl arg1 arg2)) - (define (je label) (list 'je label)) - (define (jne label) (list 'jne label)) - (define (jle label) (list 'jle label)) - (define (jge label) (list 'jge label)) - (define (jg label) (list 'jg label)) - (define (jl label) (list 'jl label)) - (define (jb label) (list 'jb label)) - (define (ja label) (list 'ja label)) - (define (jmp label) (list 'jmp label)) - (define edi '%edx) ; closure pointer - (define esi '%esi) ; pcb - (define ebp '%ebp) ; allocation pointer - (define esp '%esp) ; stack base pointer - (define al '%al) - (define ah '%ah) - (define bh '%bh) - (define cl '%cl) - (define eax '%eax) - (define ebx '%ebx) - (define ecx '%ecx) - (define edx '%edx) - (define apr '%ebp) - (define fpr '%esp) - (define cpr '%edi) - (define pcr '%esi) - (define register? symbol?) - (define (argc-convention n) - (fx- 0 (fxsll n fx-shift)))) - - -(define pcb-ref - (lambda (x) - (case x - [(allocation-pointer) (mem 0 pcr)] - [(allocation-redline) (mem 4 pcr)] - [(frame-pointer) (mem 8 pcr)] - [(frame-base) (mem 12 pcr)] - [(frame-redline) (mem 16 pcr)] - [(next-continuation) (mem 20 pcr)] - [(system-stack) (mem 24 pcr)] - [(dirty-vector) (mem 28 pcr)] - [else (error 'pcb-ref "invalid arg ~s" x)]))) - -(define (primref-loc op) - (unless (symbol? op) (error 'primref-loc "not a symbol ~s" op)) - (mem (fx- disp-symbol-system-value symbol-tag) - (obj op))) - -(define (generate-code x) - (define who 'generate-code) - (define (rp-label x) - (case x - [(value) (label-address SL_multiple_values_error_rp)] - [(effect) (label-address SL_multiple_values_ignore_rp)] - [else (error who "invalid rp-convention ~s" x)])) - (define unique-label - (lambda () - (label (gensym)))) - (define (constant-val x) - (cond - [(fixnum? x) (obj x)] - [(boolean? x) (int (if x bool-t bool-f))] - [(null? x) (int nil)] - [(char? x) (int (fx+ (fxsll (char->integer x) char-shift) char-tag))] - [(eq? x (void)) (int void-object)] - [else (obj x)])) - (define (cond-branch op Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je jne] [jl jge] [jle jg] [jg jle] [jge jl])))) - (unless (or Lt Lf) - (error 'cond-branch "no labels")) - (cond - [(not Lf) (cons (list op Lt) ac)] - [(not Lt) (cons (list (opposite op) Lf) ac)] - [else (list* (list op Lt) (jmp Lf) ac)])) - (define (indirect-type-pred pri-mask pri-tag sec-mask sec-tag rand* Lt Lf ac) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - (jmp Lt) - ac)] - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne Lf) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (jne Lf) - ac)] - [Lt - (let ([L_END (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int pri-mask) ebx) - (cmpl (int pri-tag) ebx) - (jne L_END) - (movl (mem (fx- 0 pri-tag) eax) ebx) - (if sec-mask - (andl (int sec-mask) ebx) - '(nop)) - (cmpl (int sec-tag) ebx) - (je Lt) - L_END - ac))] - [else ac])) - (define (type-pred mask tag rand* Lt Lf ac) - (cond - [mask - (list* - (movl (Simple (car rand*)) eax) - (andl (int mask) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))] - [else - (let ([v (Simple (car rand*))]) - (cond - [(memq (car v) '(mem register)) - (list* - (cmpl (int tag) (Simple (car rand*))) - (cond-branch 'je Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (int tag) eax) - (cond-branch 'je Lt Lf ac))]))])) - (define (compare-and-branch op rand* Lt Lf ac) - (define (opposite x) - (cadr (assq x '([je je] [jl jg] [jle jge] [jg jl] [jge jle])))) - (cond - [(and (constant? (car rand*)) (constant? (cadr rand*))) - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))] - [(constant? (cadr rand*)) - (list* - (cmpl (Simple (cadr rand*)) (Simple (car rand*))) - (cond-branch op Lt Lf ac))] - [(constant? (car rand*)) - (list* - (cmpl (Simple (car rand*)) (Simple (cadr rand*))) - (cond-branch (opposite op) Lt Lf ac))] - [else - (list* - (movl (Simple (car rand*)) eax) - (cmpl (Simple (cadr rand*)) eax) - (cond-branch op Lt Lf ac))])) - (define (do-pred-prim op rand* Lt Lf ac) - (case op - [(fixnum?) (type-pred fx-mask fx-tag rand* Lt Lf ac)] - [(pair?) (type-pred pair-mask pair-tag rand* Lt Lf ac)] - [(char?) (type-pred char-mask char-tag rand* Lt Lf ac)] - [(string?) (type-pred string-mask string-tag rand* Lt Lf ac)] - [(symbol?) (type-pred symbol-mask symbol-tag rand* Lt Lf ac)] - [(procedure?) (type-pred closure-mask closure-tag rand* Lt Lf ac)] - [(boolean?) (type-pred bool-mask bool-tag rand* Lt Lf ac)] - [(null?) (type-pred #f nil rand* Lt Lf ac)] - [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] - [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (type-pred #f bool-f rand* Lt Lf ac)] - [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] - [(bwp-object?) (type-pred #f bwp-object rand* Lt Lf ac)] - [($fxzero?) (type-pred #f 0 rand* Lt Lf ac)] - [($fx= $char= eq?) (compare-and-branch 'je rand* Lt Lf ac)] - [($fx< $char<) (compare-and-branch 'jl rand* Lt Lf ac)] - [($fx<= $char<=) (compare-and-branch 'jle rand* Lt Lf ac)] - [($fx> $char>) (compare-and-branch 'jg rand* Lt Lf ac)] - [($fx>= $char>=) (compare-and-branch 'jge rand* Lt Lf ac)] - [(vector?) - (indirect-type-pred vector-mask vector-tag fx-mask fx-tag - rand* Lt Lf ac)] - [($record?) - (indirect-type-pred record-pmask record-ptag record-pmask record-ptag - rand* Lt Lf ac)] - [($record/rtd?) - (cond - [Lf - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int vector-mask) eax) - (cmpl (int vector-tag) eax) - (jne Lf) - (movl (Simple (cadr rand*)) eax) - (cmpl (mem (fx- disp-record-rtd vector-tag) ebx) eax) - (jne Lf) - (if Lt - (cons (jmp Lt) ac) - ac))] - [Lt - (let ([Ljoin (unique-label)]) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int vector-mask) eax) - (cmpl (int vector-tag) eax) - (jne Ljoin) - (movl (Simple (cadr rand*)) eax) - (cmpl (mem (fx- disp-record-rtd vector-tag) ebx) eax) - (je Lt) - (label Ljoin) - ac))] - [else ac])] - [(code?) - (indirect-type-pred vector-mask vector-tag #f code-tag - rand* Lt Lf ac)] - [(immediate?) - (cond - [(and Lt Lf) - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - (jmp Lf) - ac)] - [Lt - (list* (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Lt) - (andl (int 7) eax) - (cmpl (int 7) eax) - (je Lt) - ac)] - [Lf - (let ([Ljoin (unique-label)]) - (list* - (movl (Simple (car rand*)) eax) - (movl eax ebx) - (andl (int fx-mask) ebx) - (cmpl (int 0) ebx) - (je Ljoin) - (andl (int 7) eax) - (cmpl (int 7) eax) - (jne Lf) - Ljoin - ac))] - [else ac])] - [($ap-check-words) - (record-case (car rand*) - [(constant i) - (list* (movl (pcb-ref 'allocation-redline) eax) - (subl (Simple (cadr rand*)) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-words")])] - [($ap-check-bytes) - (record-case (car rand*) - [(constant i) - (list* (movl (Simple (cadr rand*)) eax) - (negl eax) - (addl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac))] - [else (error who "ap-check-bytes")])] - [($ap-check-const) - (record-case (car rand*) - [(constant i) - (if (fx< i pagesize) - (list* - (cmpl (pcb-ref 'allocation-redline) apr) - (cond-branch 'jge Lt Lf ac)) - (list* - (movl (pcb-ref 'allocation-redline) eax) - (subl (int i) eax) - (cmpl eax apr) - (cond-branch 'jge Lt Lf ac)))] - [else (error who "ap-check-const")])] - [($fp-at-base) - (list* - (movl (pcb-ref 'frame-base) eax) - (subl (int wordsize) eax) - (cmpl eax fpr) - (cond-branch 'je Lt Lf ac))] - [($fp-overflow) - (list* (cmpl (pcb-ref 'frame-redline) fpr) - (cond-branch 'jle Lt Lf ac))] - [($vector-ref) - (do-value-prim op rand* - (do-simple-test eax Lt Lf ac))] - [(cons void $fxadd1 $fxsub1) - ;;; always true - (do-effect-prim op rand* - (cond - [(not Lt) ac] - [else (cons (jmp Lt) ac)]))] - [else - (error 'pred-prim "HERE unhandled ~s" op)])) - (define (do-pred->value-prim op rand* ac) - (case op - [else - (let ([Lf (unique-label)] [Lj (unique-label)]) - (do-pred-prim op rand* #f Lf - (list* (movl (constant-val #t) eax) - (jmp Lj) - Lf - (movl (constant-val #f) eax) - Lj - ac)))])) - (define (indirect-ref arg* off ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (mem off eax) eax) - ac)) - (define (do-value-prim op arg* ac) - (case op - [(eof-object) (cons (movl (int eof) eax) ac)] - [(void) (cons (movl (int void-object) eax) ac)] - [($fxadd1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val 1) eax) - ac)] - [($fxsub1) - (list* (movl (Simple (car arg*)) eax) - (addl (constant-val -1) eax) - ac)] - [($fx+) - (list* (movl (Simple (car arg*)) eax) - (addl (Simple (cadr arg*)) eax) - ac)] - [($fx-) - (list* (movl (Simple (car arg*)) eax) - (subl (Simple (cadr arg*)) eax) - ac)] - [($fx*) - (cond - [(constant? (car arg*)) - (record-case (car arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (cadr arg*)) eax) - (imull (int c) eax) - ac)])] - [(constant? (cadr arg*)) - (record-case (cadr arg*) - [(constant c) - (unless (fixnum? c) - (error who "invalid arg ~s to fx*" c)) - (list* (movl (Simple (car arg*)) eax) - (imull (int c) eax) - ac)])] - [else - (list* (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (imull (Simple (cadr arg*)) eax) - ac)])] - [($fxquotient) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (cltd) - (idivl ecx) - (sall (int fx-shift) eax) - ac)] - [($fxmodulo) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax ecx) - (xorl ebx ecx) - (sarl (int (fxsub1 (fx* wordsize 8))) ecx) - (andl ebx ecx) - (cltd) - (idivl ebx) - (movl edx eax) - (addl ecx eax) - ac)] - [($fxlogor) - (list* (movl (Simple (car arg*)) eax) - (orl (Simple (cadr arg*)) eax) - ac)] - [($fxlogand) - (list* (movl (Simple (car arg*)) eax) - (andl (Simple (cadr arg*)) eax) - ac)] - [($fxlogxor) - (list* (movl (Simple (car arg*)) eax) - (xorl (Simple (cadr arg*)) eax) - ac)] - [($fxsra) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsra")) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx+ i fx-shift)) eax) - (sall (int fx-shift) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sarl (int fx-shift) eax) - (sarl cl eax) - (sall (int fx-shift) eax) - ac)])] - [($fxsll) - (record-case (cadr arg*) - [(constant i) - (unless (fixnum? i) (error who "invalid arg to fxsll")) - (list* (movl (Simple (car arg*)) eax) - (sall (int i) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ecx) - (sarl (int fx-shift) ecx) - (sall cl eax) - ac)])] - [($fixnum->char) - (list* (movl (Simple (car arg*)) eax) - (sall (int (fx- char-shift fx-shift)) eax) - (orl (int char-tag) eax) - ac)] - [($char->fixnum) - (list* (movl (Simple (car arg*)) eax) - (sarl (int (fx- char-shift fx-shift)) eax) - ac)] - [($fxlognot) - (list* (movl (Simple (car arg*)) eax) - (orl (int fx-mask) eax) - (notl eax) - ac)] - [($car) (indirect-ref arg* (fx- disp-car pair-tag) ac)] - [($cdr) (indirect-ref arg* (fx- disp-cdr pair-tag) ac)] - [($vector-length) - (indirect-ref arg* (fx- disp-vector-length vector-tag) ac)] - [($string-length) - (indirect-ref arg* (fx- disp-string-length string-tag) ac)] - [($symbol-string) - (indirect-ref arg* (fx- disp-symbol-string symbol-tag) ac)] - [($symbol-unique-string) - (indirect-ref arg* (fx- disp-symbol-unique-string symbol-tag) ac)] - [($symbol-value) - (indirect-ref arg* (fx- disp-symbol-value symbol-tag) ac)] - [(primitive-ref) - (indirect-ref arg* (fx- disp-symbol-system-value symbol-tag) ac)] - [($tcbucket-key) - (indirect-ref arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($tcbucket-val) - (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($tcbucket-next) - (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] - [(pointer-value) - (list* - (movl (Simple (car arg*)) eax) - (sarl (int fx-shift) eax) - (sall (int fx-shift) eax) - ac)] - [($symbol-plist) - (indirect-ref arg* (fx- disp-symbol-plist symbol-tag) ac)] - [($record-rtd) - (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] - [($constant-ref) - (list* (movl (Simple (car arg*)) eax) ac)] - [($vector-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-vector-data vector-tag) ebx) eax) - ac)] - [($record-ref) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (mem (fx- disp-record-data record-ptag) ebx) eax) - ac)] - [($string-ref) - (list* (movl (Simple (cadr arg*)) ebx) - (sarl (int fx-shift) ebx) - (addl (Simple (car arg*)) ebx) - (movl (int char-tag) eax) - (movb (mem (fx- disp-string-data string-tag) ebx) ah) - ac)] - [($make-string) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-string-length apr)) - (movl apr eax) - (addl (int string-tag) eax) - (sarl (int fx-shift) ebx) - (addl ebx apr) - (movb (int 0) (mem disp-string-data apr)) - (addl (int (fx+ disp-string-data object-alignment)) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-vector) - (list* (movl (Simple (car arg*)) ebx) - (movl ebx (mem disp-vector-length apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl ebx apr) - (addl (int (fx+ disp-vector-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [($make-record) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-record-rtd apr)) - (movl apr eax) - (addl (int record-ptag) eax) - (addl (Simple (cadr arg*)) apr) - (addl (int (fx+ disp-record-data (fxsub1 object-alignment))) apr) - (sarl (int align-shift) apr) - (sall (int align-shift) apr) - ac)] - [(cons) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl eax (mem disp-car apr)) - (movl apr eax) - (movl ebx (mem disp-cdr apr)) - (addl (int pair-tag) eax) - (addl (int (align pair-size)) apr) - ac)] - [($make-symbol) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-symbol-string apr)) - (movl (int 0) (mem disp-symbol-unique-string apr)) - (movl (int unbound) (mem disp-symbol-value apr)) - (movl (int nil) (mem disp-symbol-plist apr)) - (movl (int unbound) (mem disp-symbol-system-value apr)) - (movl (int nil) (mem disp-symbol-system-plist apr)) - (movl apr eax) - (addl (int symbol-tag) eax) - (addl (int (align symbol-size)) apr) - ac)] - [($make-tcbucket) - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem disp-tcbucket-tconc apr)) - (movl (Simple (cadr arg*)) eax) - (movl eax (mem disp-tcbucket-key apr)) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem disp-tcbucket-val apr)) - (movl (Simple (cadddr arg*)) eax) - (movl eax (mem disp-tcbucket-next apr)) - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int (align tcbucket-size)) apr) - ac)] - [(vector) - (let f ([arg* arg*] [idx disp-vector-data]) - (cond - [(null? arg*) - (list* (movl apr eax) - (addl (int vector-tag) eax) - (movl (int (fx- idx disp-vector-data)) - (mem disp-vector-length apr)) - (addl (int (align idx)) apr) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem idx apr)) - (f (cdr arg*) (fx+ idx wordsize)))]))] - [($string) - (let f ([arg* arg*] [idx disp-string-data]) - (cond - [(null? arg*) - (list* (movb (int 0) (mem idx apr)) - (movl apr eax) - (addl (int string-tag) eax) - (movl (int (fx* (fx- idx disp-string-data) wordsize)) - (mem disp-string-length apr)) - (addl (int (align (fxadd1 idx))) apr) - ac)] - [else - (record-case (car arg*) - [(constant c) - (unless (char? c) (error who "invalid arg to string ~s" x)) - (list* (movb (int (char->integer c)) (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))] - [else - (list* (movl (Simple (car arg*)) ebx) - (movb bh (mem idx apr)) - (f (cdr arg*) (fxadd1 idx)))])]))] - [($current-frame) - (list* (movl (pcb-ref 'next-continuation) eax) - ac)] - [($seal-frame-and-call) - (list* (movl (Simple (car arg*)) cpr) ; proc - (movl (pcb-ref 'frame-base) eax) - ; eax=baseofstack - (movl (mem (fx- 0 wordsize) eax) ebx) ; underflow handler - (movl ebx (mem (fx- 0 wordsize) fpr)) ; set - ; create a new cont record - (movl (int continuation-tag) (mem 0 apr)) - (movl fpr (mem disp-continuation-top apr)) - ; compute the size of the captured frame - (movl eax ebx) - (subl fpr ebx) - (subl (int wordsize) ebx) - ; and store it - (movl ebx (mem disp-continuation-size apr)) - ; load next cont - (movl (pcb-ref 'next-continuation) ebx) - ; and store it - (movl ebx (mem disp-continuation-next apr)) - ; adjust ap - (movl apr eax) - (addl (int vector-tag) eax) - (addl (int continuation-size) apr) - ; store new cont in current-cont - (movl eax (pcb-ref 'next-continuation)) - ; adjust fp - (movl fpr (pcb-ref 'frame-base)) - (subl (int wordsize) fpr) - ; tail-call f - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call) - ac)] - [($code-instr-size) - (indirect-ref arg* (fx- disp-code-instrsize vector-tag) - (cons (sall (int fx-shift) eax) ac))] - [($code-reloc-size) - (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-closure-size) - (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] - [($set-car! $set-cdr! $vector-set! $string-set! $exit - $set-symbol-value! $set-symbol-plist! - $set-code-byte! $set-code-word! primitive-set! - $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) - (do-effect-prim op arg* - (cons (movl (int void-object) eax) ac))] - [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? - procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? - $char= $char< $char<= $char> $char>= $unbound-object? code? - $record? bwp-object?) - (do-pred->value-prim op arg* ac)] - [($code->closure) - (list* - (movl (Simple (car arg*)) eax) - (addl (int (fx- disp-code-data vector-tag)) eax) - (movl eax (mem 0 apr)) - (movl apr eax) - (addl (int closure-tag) eax) - (addl (int (align disp-closure-data)) apr) - ac)] - [($frame->continuation) - (NonTail - (make-closure (make-code-loc SL_continuation_code) arg*) - ac)] - [($make-call-with-values-procedure) - (NonTail - (make-closure (make-code-loc SL_call_with_values) arg*) - ac)] - [($make-values-procedure) - (NonTail - (make-closure (make-code-loc SL_values) arg*) - ac)] - [else - (error 'value-prim "unhandled ~s" op)])) - (define (indirect-assignment arg* offset ac) - (list* - (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem offset eax)) - ;;; record side effect - (addl (int offset) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)) - (define (do-effect-prim op arg* ac) - (case op - [($vector-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (addl (int (fx- disp-vector-data vector-tag)) ebx) - (movl (Simple (caddr arg*)) eax) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [($string-set!) - (list* (movl (Simple (cadr arg*)) eax) - (sarl (int fx-shift) eax) - (addl (Simple (car arg*)) eax) - (movl (Simple (caddr arg*)) ebx) - (movb bh (mem (fx- disp-string-data string-tag) eax)) - ac)] - [($set-car!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-car pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-cdr!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-cdr pair-tag) eax)) - ;;; record side effect - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-tcbucket-key!) - (indirect-assignment arg* (fx- disp-tcbucket-key vector-tag) ac)] - [($set-tcbucket-val!) - (indirect-assignment arg* (fx- disp-tcbucket-val vector-tag) ac)] - [($set-tcbucket-next!) - (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] - [($set-tcbucket-tconc!) - (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - - [($set-symbol-value!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [(primitive-set!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-system-value symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-system-value symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-plist!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-plist symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-plist symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-unique-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-unique-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-unique-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($set-symbol-string!) - (list* (movl (Simple (car arg*)) eax) - (movl (Simple (cadr arg*)) ebx) - (movl ebx (mem (fx- disp-symbol-string symbol-tag) eax)) - ;;; record side effect - (addl (int (fx- disp-symbol-string symbol-tag)) eax) - (shrl (int pageshift) eax) - (sall (int wordshift) eax) - (addl (pcb-ref 'dirty-vector) eax) - (movl (int dirty-word) (mem 0 eax)) - ac)] - [($record-set!) - (list* (movl (Simple (car arg*)) ebx) - (addl (Simple (cadr arg*)) ebx) - (movl (Simple (caddr arg*)) eax) - (addl (int (fx- disp-record-data record-ptag)) ebx) - (movl eax (mem 0 ebx)) - ;;; record side effect - (shrl (int pageshift) ebx) - (sall (int wordshift) ebx) - (addl (pcb-ref 'dirty-vector) ebx) - (movl (int dirty-word) (mem 0 ebx)) - ac)] - [(cons void $fxadd1 $fxsub1) - (let f ([arg* arg*]) - (cond - [(null? arg*) ac] - [else - (Effect (car arg*) (f (cdr arg*)))]))] - [else - (error 'do-effect-prim "unhandled op ~s" op)])) - (define (do-simple-test x Lt Lf ac) - (unless (or Lt Lf) - (error 'Pred "no labels")) - (cond - [(not Lt) - (list* (cmpl (int bool-f) x) (je Lf) ac)] - [(not Lf) - (list* (cmpl (int bool-f) x) (jne Lt) ac)] - [else - (list* (cmpl (int bool-f) x) (je Lf) (jmp Lt) ac)])) - (define (Simple x) - (record-case x - [(cp-var i) - (mem (fx+ (fx* i wordsize) (fx- disp-closure-data closure-tag)) cpr)] - [(frame-var i) (mem (fx* i (fx- 0 wordsize)) fpr)] - [(constant c) (constant-val c)] - [(code-loc label) (label-address label)] - [(primref op) (primref-loc op)] - [else (error 'Simple "what ~s" x)])) - (define (closure-size x) - (align (fx+ disp-closure-data - (fx* wordsize (length (closure-free* x)))))) - (define (assign-codes rhs* n* i ac) - (cond - [(null? rhs*) ac] - [else - (record-case (car rhs*) - [(closure label free*) - (cons (movl (Simple label) (mem i apr)) - (assign-codes - (cdr rhs*) (cdr n*) (fx+ i (car n*)) ac))])])) - (define (whack-free x i n* rhs* ac) - (cond - [(null? rhs*) ac] - [else - (let ([free (closure-free* (car rhs*))]) - (let f ([free free] [j (fx+ i disp-closure-data)]) - (cond - [(null? free) - (whack-free x (fx+ i (car n*)) (cdr n*) (cdr rhs*) ac)] - [(eq? (car free) x) - (cons - (movl eax (mem j apr)) - (f (cdr free) (fx+ j wordsize)))] - [else (f (cdr free) (fx+ j wordsize))])))])) - (define (assign-nonrec-free* rhs* all-rhs* n* seen ac) - (cond - [(null? rhs*) ac] - [else - (let f ([ls (closure-free* (car rhs*))] [seen seen]) - (cond - [(null? ls) - (assign-nonrec-free* (cdr rhs*) all-rhs* n* seen ac)] - [(memq (car ls) seen) (f (cdr ls) seen)] - [else - (cons - (movl (Simple (car ls)) eax) - (whack-free (car ls) 0 n* all-rhs* - (f (cdr ls) (cons (car ls) seen))))]))])) - (define (assign-rec-free* lhs* rhs* all-n* ac) - (list* (movl apr eax) - (addl (int closure-tag) eax) - (let f ([lhs* lhs*] [n* all-n*]) - (cond - [(null? (cdr lhs*)) - (cons - (movl eax (Simple (car lhs*))) - (whack-free (car lhs*) 0 all-n* rhs* ac))] - [else - (cons - (movl eax (Simple (car lhs*))) - (whack-free (car lhs*) 0 all-n* rhs* - (cons - (addl (int (car n*)) eax) - (f (cdr lhs*) (cdr n*)))))])))) - (define (sum ac ls) - (cond - [(null? ls) ac] - [else (sum (fx+ ac (car ls)) (cdr ls))])) - (define (do-fix lhs* rhs* ac) - ;;; 1. first, set the code pointers in the right places - ;;; 2. next, for every variable appearing in the rhs* but is not in - ;;; the lhs*, load it once and set it everywhere it occurs. - ;;; 3. next, compute the values of the lhs*, and for every computed - ;;; value, store it on the stack, and set it everywhere it occurs - ;;; in the rhs* - ;;; 4. that's it. - (let* ([n* (map closure-size rhs*)]) - (assign-codes rhs* n* 0 - (assign-nonrec-free* rhs* rhs* n* lhs* - (assign-rec-free* lhs* rhs* n* - (cons (addl (int (sum 0 n*)) apr) ac)))))) - (define (frame-adjustment offset) - (fx* (fxsub1 offset) (fx- 0 wordsize))) - (define (NonTail x ac) - (record-case x - [(constant c) - (cons (movl (constant-val c) eax) ac)] - [(frame-var) - (cons (movl (Simple x) eax) ac)] - [(cp-var) - (cons (movl (Simple x) eax) ac)] - [(foreign-label L) - (cons (movl (list 'foreign-label L) eax) ac)] - [(primref c) - (cons (movl (primref-loc c) eax) ac)] - [(closure label arg*) - (let f ([arg* arg*] [off disp-closure-data]) - (cond - [(null? arg*) - (list* (movl (Simple label) (mem 0 apr)) - (movl apr eax) - (addl (int (align off)) apr) - (addl (int closure-tag) eax) - ac)] - [else - (list* (movl (Simple (car arg*)) eax) - (movl eax (mem off apr)) - (f (cdr arg*) (fx+ off wordsize)))]))] - [(conditional test conseq altern) - (let ([Lj (unique-label)] [Lf (unique-label)]) - (Pred test #f Lf - (NonTail conseq - (list* (jmp Lj) Lf (NonTail altern (cons Lj ac))))))] - [(seq e0 e1) - (Effect e0 (NonTail e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (NonTail body ac))] - [(primcall op rand*) - (do-value-prim op rand* ac)] - [(new-frame base-idx size body) - (NonTail body ac)] - [(call-cp call-convention rp-convention offset size mask) - (let ([L_CALL (unique-label)]) - (case call-convention - [(normal) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (jmp L_CALL) - ; NEW FRAME - `(byte-vector ,mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) - `(byte 0) ; padding for indirect calls only - `(byte 0) ; direct calls are ok - L_CALL - (indirect-cpr-call) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [(foreign) - (list* (addl (int (frame-adjustment offset)) fpr) - (movl (int (argc-convention size)) eax) - (movl '(foreign-label "ik_foreign_call") ebx) - (jmp L_CALL) - ; NEW FRAME - (byte-vector mask) - `(int ,(fx* offset wordsize)) - `(current-frame-offset) - (rp-label rp-convention) ; should be 0, since C has 1 rv - '(byte 0) - '(byte 0) - '(byte 0) - L_CALL - (call ebx) - (movl (mem 0 fpr) cpr) - (subl (int (frame-adjustment offset)) fpr) - ac)] - [else - (error who "invalid convention ~s for call-cp" call-convention)]))] - [else (error 'NonTail "invalid expression ~s" x)])) - (define (Pred x Lt Lf ac) - (record-case x - [(frame-var i) - (do-simple-test (idx->frame-loc i) Lt Lf ac)] - [(cp-var i) - (do-simple-test (Simple x) Lt Lf ac)] - [(constant c) - (if c - (if Lt (cons (jmp Lt) ac) ac) - (if Lf (cons (jmp Lf) ac) ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Pred body Lt Lf ac))] - [(primcall op rand*) - (do-pred-prim op rand* Lt Lf ac)] - [(conditional test conseq altern) - (cond - [(not Lt) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lj^ Lf - (cons Lf^ - (Pred altern #f Lf - (cons Lj^ ac))))))] - [(not Lf) - (let ([Lj^ (unique-label)] [Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lj^ - (cons Lf^ - (Pred altern Lt #f - (cons Lj^ ac))))))] - [else - (let ([Lf^ (unique-label)]) - (Pred test #f Lf^ - (Pred conseq Lt Lf - (cons Lf^ - (Pred altern Lt Lf ac)))))])] - [(seq e0 e1) - (Effect e0 (Pred e1 Lt Lf ac))] - [(new-frame) - (NonTail x (do-simple-test eax Lt Lf ac))] - [else (error 'Pred "invalid expression ~s" x)])) - (define (idx->frame-loc i) - (mem (fx* i (fx- 0 wordsize)) fpr)) - (define (Effect x ac) - (record-case x - [(constant) ac] - [(primcall op rand*) - (do-effect-prim op rand* ac)] - [(conditional test conseq altern) - (let ([Lf (unique-label)] [Ljoin (unique-label)]) - (Pred test #f Lf - (Effect conseq - (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] - [(seq e0 e1) - (Effect e0 (Effect e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Effect body ac))] - [(assign loc val) - (record-case loc - [(frame-var i) - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))] - [else (error who "invalid assign loc ~s" loc)])] - [(eval-cp check body) - (NonTail body - (cond - [check - (list* - (movl eax cpr) - (andl (int closure-mask) eax) - (cmpl (int closure-tag) eax) - (jne (label SL_nonprocedure)) - ac)] - [else - (list* - (movl eax cpr) - ac)]))] - [(save-cp loc) - (record-case loc - [(frame-var i) - (cons (movl cpr (idx->frame-loc i)) ac)] - [else (error who "invalid cpr loc ~s" x)])] - [(new-frame) (NonTail x ac)] - [(frame-var) ac] - [else (error 'Effect "invalid expression ~s" x)])) - (define (Tail x ac) - (record-case x - [(return x) - (NonTail x (cons (ret) ac))] - [(conditional test conseq altern) - (let ([L (unique-label)]) - (Pred test #f L - (Tail conseq - (cons L (Tail altern ac)))))] - [(seq e0 e1) - (Effect e0 (Tail e1 ac))] - [(fix lhs* rhs* body) - (do-fix lhs* rhs* (Tail body ac))] - [(new-frame idx size body) - (Tail body ac)] - [(call-cp call-convention rp-convention idx argc mask) - (unless (eq? rp-convention 'tail) - (error who "nontail rp (~s) in tail context" rp-convention)) - (let f ([i 0]) - (cond - [(fx= i argc) - (case call-convention - [(normal) - (list* - (movl (int (argc-convention argc)) eax) - (tail-indirect-cpr-call) - ac)] - [(apply) - (list* - (movl (int (argc-convention argc)) eax) - (jmp (label SL_apply)) - ac)] - [else - (error who "invalid conv ~s in tail call-cpr" call-convention)])] - [else - (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) - (fx- 0 wordsize)) fpr) - eax) - (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) - (f (fxadd1 i)))]))] - [else (error 'Tail "invalid expression ~s" x)])) - (define (handle-vararg fml-count ac) - (define CONTINUE_LABEL (unique-label)) - (define DONE_LABEL (unique-label)) - (define CONS_LABEL (unique-label)) - (define LOOP_HEAD (unique-label)) - (define L_CALL (unique-label)) - (list* (cmpl (int (argc-convention (fxsub1 fml-count))) eax) - (jg (label SL_invalid_args)) - (jl CONS_LABEL) - (movl (int nil) ebx) - (jmp DONE_LABEL) - CONS_LABEL - (movl (pcb-ref 'allocation-redline) ebx) - (addl eax ebx) - (addl eax ebx) - (cmpl ebx apr) - (jle LOOP_HEAD) - ; overflow - (addl eax esp) ; advance esp to cover args - (pushl cpr) ; push current cp - (pushl eax) ; push argc - (negl eax) ; make argc positive - (addl (int (fx* 4 wordsize)) eax) ; add 4 words to adjust frame size - (pushl eax) ; push frame size - (addl eax eax) ; double the number of args - (movl eax (mem (fx* -2 wordsize) fpr)) ; pass it as first arg - (movl (int (argc-convention 1)) eax) ; setup argc - (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler - (jmp L_CALL) ; go to overflow handler - ; NEW FRAME - (int 0) ; if the framesize=0, then the framesize is dynamic - '(current-frame-offset) - (int 0) ; multiarg rp - (byte 0) - (byte 0) - L_CALL - (indirect-cpr-call) - (popl eax) ; pop framesize and drop it - (popl eax) ; reload argc - (popl cpr) ; reload cp - (subl eax fpr) ; readjust fp - LOOP_HEAD - (movl (int nil) ebx) - CONTINUE_LABEL - (movl ebx (mem disp-cdr apr)) - (movl (mem fpr eax) ebx) - (movl ebx (mem disp-car apr)) - (movl apr ebx) - (addl (int pair-tag) ebx) - (addl (int pair-size) apr) - (addl (int (fxsll 1 fx-shift)) eax) - (cmpl (int (fx- 0 (fxsll fml-count fx-shift))) eax) - (jle CONTINUE_LABEL) - DONE_LABEL - (movl ebx (mem (fx- 0 (fxsll fml-count fx-shift)) fpr)) - ac)) - (define (Entry check? x ac) - (record-case x - [(clambda-case fml* proper body) - (let ([ac (Tail body ac)]) - (cond - [(and proper check?) - (list* (cmpl (int (argc-convention (length fml*))) eax) - (jne (label SL_invalid_args)) - ac)] - [proper ac] - [else - (handle-vararg (length fml*) ac)]))])) - (define make-dispatcher - (lambda (j? L L* x x* ac) - (cond - [(null? L*) (if j? (cons (jmp (label L)) ac) ac)] - [else - (record-case x - [(clambda-case fml* proper _) - (cond - [proper - (list* (cmpl (int (argc-convention (length fml*))) eax) - (je (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))] - [else - (list* (cmpl (int (argc-convention (fxsub1 (length fml*)))) eax) - (jle (label L)) - (make-dispatcher #t - (car L*) (cdr L*) (car x*) (cdr x*) ac))])])]))) - (define (handle-cases x x*) - (let ([L* (map (lambda (_) (gensym)) x*)] - [L (gensym)]) - (make-dispatcher #f L L* x x* - (let f ([x x] [x* x*] [L L] [L* L*]) - (cond - [(null? x*) - (cons (label L) (Entry 'check x '()))] - [else - (cons (label L) - (Entry #f x - (f (car x*) (cdr x*) (car L*) (cdr L*))))]))))) - (define (CodeExpr x) - (record-case x - [(clambda-code L cases free) - (list* - (fx+ disp-closure-data (fx* wordsize (length free))) - (label L) - (handle-cases (car cases) (cdr cases)))])) - (record-case x - [(codes list body) - (cons (cons 0 (Tail body '())) - (map CodeExpr list))])) - - -(define SL_nonprocedure (gensym "SL_nonprocedure")) -(define SL_invalid_args (gensym "SL_invalid_args")) -(define SL_foreign_call (gensym "SL_foreign_call")) -(define SL_continuation_code (gensym "SL_continuation_code")) -(define SL_multiple_values_error_rp (gensym "SL_multiple_values_error_rp")) -(define SL_multiple_values_ignore_rp (gensym "SL_multiple_ignore_error_rp")) -(define SL_underflow_multiple_values (gensym "SL_underflow_multiple_values")) -(define SL_underflow_handler (gensym "SL_underflow_handler")) -(define SL_scheme_exit (gensym "SL_scheme_exit")) -(define SL_apply (gensym "SL_apply")) -(define SL_values (gensym "SL_values")) -(define SL_call_with_values (gensym "SL_call_with_values")) - -(module () -(list*->code* - (list - (let ([L_cwv_done (gensym)] - [L_cwv_loop (gensym)] - [L_cwv_multi_rp (gensym)] - [L_cwv_call (gensym)]) - (list disp-closure-data - (label SL_call_with_values) - (cmpl (int (argc-convention 2)) eax) - (jne (label SL_invalid_args)) - (movl (mem (fx- 0 wordsize) fpr) ebx) ; producer - (movl ebx cpr) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (movl (int (argc-convention 0)) eax) - (subl (int (fx* wordsize 2)) fpr) - (jmp (label L_cwv_call)) - ; MV NEW FRAME - (byte-vector '#(#b110)) - (int (fx* wordsize 3)) - '(current-frame-offset) - (label-address L_cwv_multi_rp) - (byte 0) - (byte 0) - (label L_cwv_call) - (indirect-cpr-call) - ;;; one value returned - (addl (int (fx* wordsize 2)) fpr) - (movl (mem (fx* -2 wordsize) fpr) ebx) ; consumer - (movl ebx cpr) - (movl eax (mem (fx- 0 wordsize) fpr)) - (movl (int (argc-convention 1)) eax) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call) - ;;; multiple values returned - (label L_cwv_multi_rp) - ; because values does not pop the return point - ; we have to adjust fp one more word here - (addl (int (fx* wordsize 3)) fpr) - (movl (mem (fx* -2 wordsize) fpr) cpr) ; consumer - (cmpl (int (argc-convention 0)) eax) - (je (label L_cwv_done)) - (movl (int (fx* -4 wordsize)) ebx) - (addl fpr ebx) ; ebx points to first value - (movl ebx ecx) - (addl eax ecx) ; ecx points to the last value - (label L_cwv_loop) - (movl (mem 0 ebx) edx) - (movl edx (mem (fx* 3 wordsize) ebx)) - (subl (int wordsize) ebx) - (cmpl ecx ebx) - (jge (label L_cwv_loop)) - (label L_cwv_done) - (movl cpr ebx) - (andl (int closure-mask) ebx) - (cmpl (int closure-tag) ebx) - (jne (label SL_nonprocedure)) - (tail-indirect-cpr-call))) - - (let ([L_values_one_value (gensym)] - [L_values_many_values (gensym)]) - (list disp-closure-data - (label SL_values) - (cmpl (int (argc-convention 1)) eax) - (je (label L_values_one_value)) - (label L_values_many_values) - (movl (mem 0 fpr) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_values_one_value) - (movl (mem (fx- 0 wordsize) fpr) eax) - (ret))) - - (let ([L_apply_done (gensym)] - [L_apply_loop (gensym)]) - (list 0 - (label SL_apply) - (movl (mem fpr eax) ebx) - (cmpl (int nil) ebx) - (je (label L_apply_done)) - (label L_apply_loop) - (movl (mem (fx- disp-car pair-tag) ebx) ecx) - (movl (mem (fx- disp-cdr pair-tag) ebx) ebx) - (movl ecx (mem fpr eax)) - (subl (int wordsize) eax) - (cmpl (int nil) ebx) - (jne (label L_apply_loop)) - (label L_apply_done) - (addl (int wordsize) eax) - (tail-indirect-cpr-call))) - - (list 0 - (label SL_nonprocedure) - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (movl (primref-loc '$apply-nonprocedure-error-handler) cpr) - (movl (int (argc-convention 1)) eax) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_error_rp) - (movl (primref-loc '$multiple-values-error) cpr) - (tail-indirect-cpr-call)) - - (list 0 - (label SL_multiple_values_ignore_rp) - (ret)) - - (list 0 - (label SL_invalid_args) - ;;; - (movl cpr (mem (fx- 0 wordsize) fpr)) ; first arg - (negl eax) - (movl eax (mem (fx- 0 (fx* 2 wordsize)) fpr)) - (movl (primref-loc '$incorrect-args-error-handler) cpr) - (movl (int (argc-convention 2)) eax) - (tail-indirect-cpr-call)) - - (let ([Lset (gensym)] [Lloop (gensym)]) - (list 0 - (label SL_foreign_call) - (movl fpr (pcb-ref 'frame-pointer)) - (movl apr (pcb-ref 'allocation-pointer)) - (movl fpr ebx) - (movl (pcb-ref 'system-stack) esp) - (pushl pcr) - (cmpl (int 0) eax) - (je (label Lset)) - (label Lloop) - (movl (mem ebx eax) ecx) - (pushl ecx) - (addl (int 4) eax) - (cmpl (int 0) eax) - (jne (label Lloop)) - (label Lset) - ; FOREIGN NEW FRAME - (call cpr) - (movl (pcb-ref 'frame-pointer) fpr) - (movl (pcb-ref 'allocation-pointer) apr) - (ret))) - - (let ([L_cont_zero_args (gensym)] - [L_cont_mult_args (gensym)] - [L_cont_one_arg (gensym)] - [L_cont_mult_move_args (gensym)] - [L_cont_mult_copy_loop (gensym)]) - (list - (fx+ disp-closure-data wordsize) - (label SL_continuation_code) - (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k - (movl ebx (pcb-ref 'next-continuation)) ; set - (movl (pcb-ref 'frame-base) ebx) - (cmpl (int (argc-convention 1)) eax) - (jg (label L_cont_zero_args)) - (jl (label L_cont_mult_args)) - (label L_cont_one_arg) - (movl (mem (fx- 0 wordsize) fpr) eax) - (movl ebx fpr) - (subl (int wordsize) fpr) - (ret) - (label L_cont_zero_args) - (subl (int wordsize) ebx) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) ; return point - (jmp (mem disp-multivalue-rp ebx)) ; go - (label L_cont_mult_args) - (subl (int wordsize) ebx) - (cmpl ebx fpr) - (jne (label L_cont_mult_move_args)) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - (label L_cont_mult_move_args) - ; move args from fpr to ebx - (movl (int 0) ecx) - (label L_cont_mult_copy_loop) - (subl (int wordsize) ecx) - (movl (mem fpr ecx) edx) - (movl edx (mem ebx ecx)) - (cmpl ecx eax) - (jne (label L_cont_mult_copy_loop)) - (movl ebx fpr) - (movl (mem 0 ebx) ebx) - (jmp (mem disp-multivalue-rp ebx)) - )) - ))) - - - -(define (compile-expr expr) - (let* ([p (recordize expr)] - [p (optimize-direct-calls p)] - [p (optimize-letrec p)] - [p (remove-letrec p)] - [p (remove-assignments p)] - [p (convert-closures p)] - [p (lift-codes p)] - [p (introduce-primcalls p)] - [p (simplify-operands p)] - [p (insert-stack-overflow-checks p)] - [p (insert-allocation-checks p)] - [p (remove-local-variables p)] - [ls* (generate-code p)] - [f (when (assembler-output) - (for-each - (lambda (ls) - (for-each (lambda (x) (printf " ~s\n" x)) ls)) - ls*))] - [code* (list*->code* ls*)]) - (car code*))) - -(define compile-file - (lambda (input-file output-file . rest) - (let ([ip (open-input-file input-file)] - [op (apply open-output-file output-file rest)]) - (let f () - (let ([x (read ip)]) - (unless (eof-object? x) - (fasl-write (compile-expr (expand x)) op) - (f)))) - (close-input-port ip) - (close-output-port op)))) - -(primitive-set! 'compile-file compile-file) -(primitive-set! 'assembler-output (make-parameter #f)) -) - diff --git a/src/libcompile-8.1.ss b/src/libcompile-8.1.ss index b25dcf3..984d346 100644 --- a/src/libcompile-8.1.ss +++ b/src/libcompile-8.1.ss @@ -126,7 +126,9 @@ [port? 1 pred] [input-port? 1 pred] [output-port? 1 pred] - [$make-port 7 value] + [$make-port/input 7 value] + [$make-port/output 7 value] + [$make-port/both 7 value] [$port-handler 1 value] [$port-input-buffer 1 value] [$port-input-index 1 value] @@ -362,8 +364,8 @@ [(top-level-value) (let ([var (quoted-sym (cadr x))]) (if (eq? (expand-mode) 'bootstrap) - ;(error 'compile "reference to ~s in bootstrap mode" var) - (make-primref var) + (error 'compile "reference to ~s in bootstrap mode" var) + ;(make-primref var) (make-funcall (make-primref 'top-level-value) (list (make-constant var)))))] @@ -1096,7 +1098,14 @@ [(fixnum? immediate? boolean? char? vector? string? procedure? null? pair? not cons eq? vector symbol? error eof-object eof-object? void $unbound-object? $code? $forward-ptr? bwp-object? - pointer-value top-level-value car cdr list* list $record) + pointer-value top-level-value car cdr list* list $record + port? input-port? output-port? + $make-port/input $make-port/output $make-port/both + $port-handler + $port-input-buffer $port-input-index $port-input-size + $port-output-buffer $port-output-index $port-output-size + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size! ) '#t] [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) @@ -1468,6 +1477,8 @@ (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] [($string) (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] + [($make-port/input $make-port/output $make-port/both) + (check-const port-size x)] [($make-vector) (record-case (car arg*) [(constant i) @@ -1551,7 +1562,7 @@ s)) (define (check? x) (cond - [(primref? x) #t] ;;;; PRIMREF CHECK + [(primref? x) #f] ;;;; PRIMREF CHECK [else #t])) (define (do-new-frame op rand* si r call-convention rp-convention orig-live) (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) @@ -1967,6 +1978,19 @@ (define disp-code-relocsize 8) (define disp-code-freevars 12) (define disp-code-data 16) + (define port-tag #x3F) + (define input-port-tag #x7F) + (define output-port-tag #xBF) + (define input/output-port-tag #xFF) + (define port-mask #x3F) + (define disp-port-handler 4) + (define disp-port-input-buffer 8) + (define disp-port-input-index 12) + (define disp-port-input-size 16) + (define disp-port-output-buffer 20) + (define disp-port-output-index 24) + (define disp-port-output-size 28) + (define port-size 32) (define disp-tcbucket-tconc 0) (define disp-tcbucket-key 4) (define disp-tcbucket-val 8) @@ -2220,6 +2244,15 @@ [($record?) (indirect-type-pred record-pmask record-ptag record-pmask record-ptag rand* Lt Lf ac)] + [(output-port?) + (indirect-type-pred + vector-mask vector-tag #f output-port-tag rand* Lt Lf ac)] + [(input-port?) + (indirect-type-pred + vector-mask vector-tag #f input-port-tag rand* Lt Lf ac)] + [(port?) + (indirect-type-pred + vector-mask vector-tag port-mask port-tag rand* Lt Lf ac)] [($record/rtd?) (cond [Lf @@ -2352,6 +2385,23 @@ (movl (Simple (car arg*)) eax) (movl (mem off eax) eax) ac)) + (define (do-make-port tag args ac) + (let f ([args args] [idx disp-vector-data]) + (cond + [(null? args) + (if (fx= idx port-size) + (list* + (movl (int tag) (mem 0 apr)) + (movl apr eax) + (addl (int port-size) apr) + (addl (int vector-tag) eax) + ac) + (error 'do-make-port "BUG"))] + [else + (list* + (movl (Simple (car args)) eax) + (movl eax (mem idx apr)) + (f (cdr args) (fx+ idx wordsize)))]))) (define (do-value-prim op arg* ac) (case op [(eof-object) (cons (movl (int eof) eax) ac)] @@ -2489,6 +2539,20 @@ (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] [($tcbucket-next) (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] + [($port-handler) + (indirect-ref arg* (fx- disp-port-handler vector-tag) ac)] + [($port-input-buffer) + (indirect-ref arg* (fx- disp-port-input-buffer vector-tag) ac)] + [($port-input-index) + (indirect-ref arg* (fx- disp-port-input-index vector-tag) ac)] + [($port-input-size) + (indirect-ref arg* (fx- disp-port-input-size vector-tag) ac)] + [($port-output-buffer) + (indirect-ref arg* (fx- disp-port-output-buffer vector-tag) ac)] + [($port-output-index) + (indirect-ref arg* (fx- disp-port-output-index vector-tag) ac)] + [($port-output-size) + (indirect-ref arg* (fx- disp-port-output-size vector-tag) ac)] [(pointer-value) (list* (movl (Simple (car arg*)) eax) @@ -2668,6 +2732,9 @@ (addl (int symbol-tag) eax) (addl (int (align symbol-size)) apr) ac)] + [($make-port/input) (do-make-port input-port-tag arg* ac)] + [($make-port/output) (do-make-port output-port-tag arg* ac)] + [($make-port/both) (do-make-port input/output-port-tag arg* ac)] [($make-tcbucket) (list* (movl (Simple (car arg*)) eax) (movl eax (mem disp-tcbucket-tconc apr)) @@ -2781,13 +2848,15 @@ $set-symbol-value! $set-symbol-plist! $code-set! primitive-set! $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) + $record-set! + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size!) (do-effect-prim op arg* (cons (movl (int void-object) eax) ac))] [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? $char= $char< $char<= $char> $char>= $unbound-object? $code? - $record? $record/rtd? bwp-object?) + $record? $record/rtd? bwp-object? port? input-port? output-port?) (do-pred->value-prim op arg* ac)] [($code->closure) (list* @@ -2881,7 +2950,32 @@ (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] [($set-tcbucket-tconc!) (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - + [($set-port-input-index!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-port-input-index vector-tag) eax)) + ac)] + [($set-port-input-size!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl (int 0) (mem (fx- disp-port-input-index vector-tag) eax)) + (movl ebx (mem (fx- disp-port-input-size vector-tag) eax)) + ac)] + [($set-port-output-index!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-port-output-index vector-tag) eax)) + ac)] + [($set-port-output-size!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl (int 0) (mem (fx- disp-port-output-index vector-tag) eax)) + (movl ebx (mem (fx- disp-port-output-size vector-tag) eax)) + ac)] [($set-symbol-value!) (list* (movl (Simple (car arg*)) eax) (movl (Simple (cadr arg*)) ebx) diff --git a/src/libcompile-6.7.ss b/src/libcompile-9.0.ss similarity index 96% rename from src/libcompile-6.7.ss rename to src/libcompile-9.0.ss index 8e21502..8e8dc40 100644 --- a/src/libcompile-6.7.ss +++ b/src/libcompile-9.0.ss @@ -1,4 +1,7 @@ +;;; 9.0: * calls (gensym ) instead of +;;; (gensym (symbol->string )) in order to avoid incrementing +;;; gensym-count. ;;; 6.7: * open-coded top-level-value, car, cdr ;;; 6.2: * side-effects now modify the dirty-vector ;;; * added bwp-object? @@ -122,6 +125,24 @@ [primitive-ref 1 value] [primitive-set! 2 effect] [top-level-value 1 value] + ;;; ports + [port? 1 pred] + [input-port? 1 pred] + [output-port? 1 pred] + [$make-port/input 7 value] + [$make-port/output 7 value] + [$make-port/both 7 value] + [$port-handler 1 value] + [$port-input-buffer 1 value] + [$port-input-index 1 value] + [$port-input-size 1 value] + [$port-output-buffer 1 value] + [$port-output-index 1 value] + [$port-output-size 1 value] + [$set-port-input-index! 2 effect] + [$set-port-input-size! 2 effect] + [$set-port-output-index! 2 effect] + [$set-port-output-size! 2 effect] ;;; tcbuckets [$make-tcbucket 4 value] [$tcbucket-key 1 value] @@ -215,7 +236,7 @@ (define-record assign (lhs rhs)) (define (unique-var x) - (make-var (gensym (symbol->string x)) #f)) + (make-var (gensym x) #f)) (define (make-bind^ lhs* rhs* body) @@ -347,6 +368,7 @@ (let ([var (quoted-sym (cadr x))]) (if (eq? (expand-mode) 'bootstrap) (error 'compile "reference to ~s in bootstrap mode" var) + ;(make-primref var) (make-funcall (make-primref 'top-level-value) (list (make-constant var)))))] @@ -1079,7 +1101,14 @@ [(fixnum? immediate? boolean? char? vector? string? procedure? null? pair? not cons eq? vector symbol? error eof-object eof-object? void $unbound-object? $code? $forward-ptr? bwp-object? - pointer-value top-level-value car cdr list* list $record) + pointer-value top-level-value car cdr list* list $record + port? input-port? output-port? + $make-port/input $make-port/output $make-port/both + $port-handler + $port-input-buffer $port-input-index $port-input-size + $port-output-buffer $port-output-index $port-output-size + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size! ) '#t] [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) @@ -1451,6 +1480,8 @@ (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] [($string) (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] + [($make-port/input $make-port/output $make-port/both) + (check-const port-size x)] [($make-vector) (record-case (car arg*) [(constant i) @@ -1950,11 +1981,24 @@ (define disp-code-relocsize 8) (define disp-code-freevars 12) (define disp-code-data 16) + (define port-tag #x3F) + (define input-port-tag #x7F) + (define output-port-tag #xBF) + (define input/output-port-tag #xFF) + (define port-mask #x3F) + (define disp-port-handler 4) + (define disp-port-input-buffer 8) + (define disp-port-input-index 12) + (define disp-port-input-size 16) + (define disp-port-output-buffer 20) + (define disp-port-output-index 24) + (define disp-port-output-size 28) + (define port-size 32) (define disp-tcbucket-tconc 0) (define disp-tcbucket-key 4) (define disp-tcbucket-val 8) (define disp-tcbucket-next 12) - (define tcbucket-size 16) + (define tcbucket-size 24) (define record-ptag 5) (define record-pmask 7) (define disp-record-rtd 0) @@ -2203,6 +2247,15 @@ [($record?) (indirect-type-pred record-pmask record-ptag record-pmask record-ptag rand* Lt Lf ac)] + [(output-port?) + (indirect-type-pred + vector-mask vector-tag #f output-port-tag rand* Lt Lf ac)] + [(input-port?) + (indirect-type-pred + vector-mask vector-tag #f input-port-tag rand* Lt Lf ac)] + [(port?) + (indirect-type-pred + vector-mask vector-tag port-mask port-tag rand* Lt Lf ac)] [($record/rtd?) (cond [Lf @@ -2335,6 +2388,23 @@ (movl (Simple (car arg*)) eax) (movl (mem off eax) eax) ac)) + (define (do-make-port tag args ac) + (let f ([args args] [idx disp-vector-data]) + (cond + [(null? args) + (if (fx= idx port-size) + (list* + (movl (int tag) (mem 0 apr)) + (movl apr eax) + (addl (int port-size) apr) + (addl (int vector-tag) eax) + ac) + (error 'do-make-port "BUG"))] + [else + (list* + (movl (Simple (car args)) eax) + (movl eax (mem idx apr)) + (f (cdr args) (fx+ idx wordsize)))]))) (define (do-value-prim op arg* ac) (case op [(eof-object) (cons (movl (int eof) eax) ac)] @@ -2472,6 +2542,20 @@ (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] [($tcbucket-next) (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] + [($port-handler) + (indirect-ref arg* (fx- disp-port-handler vector-tag) ac)] + [($port-input-buffer) + (indirect-ref arg* (fx- disp-port-input-buffer vector-tag) ac)] + [($port-input-index) + (indirect-ref arg* (fx- disp-port-input-index vector-tag) ac)] + [($port-input-size) + (indirect-ref arg* (fx- disp-port-input-size vector-tag) ac)] + [($port-output-buffer) + (indirect-ref arg* (fx- disp-port-output-buffer vector-tag) ac)] + [($port-output-index) + (indirect-ref arg* (fx- disp-port-output-index vector-tag) ac)] + [($port-output-size) + (indirect-ref arg* (fx- disp-port-output-size vector-tag) ac)] [(pointer-value) (list* (movl (Simple (car arg*)) eax) @@ -2651,6 +2735,9 @@ (addl (int symbol-tag) eax) (addl (int (align symbol-size)) apr) ac)] + [($make-port/input) (do-make-port input-port-tag arg* ac)] + [($make-port/output) (do-make-port output-port-tag arg* ac)] + [($make-port/both) (do-make-port input/output-port-tag arg* ac)] [($make-tcbucket) (list* (movl (Simple (car arg*)) eax) (movl eax (mem disp-tcbucket-tconc apr)) @@ -2764,13 +2851,15 @@ $set-symbol-value! $set-symbol-plist! $code-set! primitive-set! $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) + $record-set! + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size!) (do-effect-prim op arg* (cons (movl (int void-object) eax) ac))] [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? $char= $char< $char<= $char> $char>= $unbound-object? $code? - $record? $record/rtd? bwp-object?) + $record? $record/rtd? bwp-object? port? input-port? output-port?) (do-pred->value-prim op arg* ac)] [($code->closure) (list* @@ -2864,7 +2953,32 @@ (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] [($set-tcbucket-tconc!) (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - + [($set-port-input-index!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-port-input-index vector-tag) eax)) + ac)] + [($set-port-input-size!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl (int 0) (mem (fx- disp-port-input-index vector-tag) eax)) + (movl ebx (mem (fx- disp-port-input-size vector-tag) eax)) + ac)] + [($set-port-output-index!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-port-output-index vector-tag) eax)) + ac)] + [($set-port-output-size!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl (int 0) (mem (fx- disp-port-output-index vector-tag) eax)) + (movl ebx (mem (fx- disp-port-output-size vector-tag) eax)) + ac)] [($set-symbol-value!) (list* (movl (Simple (car arg*)) eax) (movl (Simple (cadr arg*)) ebx) diff --git a/src/libcompile-6.6.ss b/src/libcompile-9.1.ss similarity index 80% rename from src/libcompile-6.6.ss rename to src/libcompile-9.1.ss index 6e2ba57..84b1cb1 100644 --- a/src/libcompile-6.6.ss +++ b/src/libcompile-9.1.ss @@ -1,5 +1,8 @@ - +;;; 9.0: * calls (gensym ) instead of +;;; (gensym (symbol->string )) in order to avoid incrementing +;;; gensym-count. +;;; 6.7: * open-coded top-level-value, car, cdr ;;; 6.2: * side-effects now modify the dirty-vector ;;; * added bwp-object? ;;; * added pointer-value @@ -88,6 +91,10 @@ [$char->fixnum 1 value] ;;; lists/pairs [cons 2 value] + [list* positive value] + [list any value] + [car 1 value] + [cdr 1 value] [$car 1 value] [$cdr 1 value] [$set-car! 2 effect] @@ -98,6 +105,7 @@ [$vector-length 1 value] [$vector-ref 2 value] [$vector-set! 3 effect] + [$vector-memq 2 value] ;;; strings [$make-string 1 value] [$string any value] @@ -116,13 +124,36 @@ [$set-symbol-plist! 2 effect] [primitive-ref 1 value] [primitive-set! 2 effect] + [top-level-value 1 value] + ;;; ports + [port? 1 pred] + [input-port? 1 pred] + [output-port? 1 pred] + [$make-port/input 7 value] + [$make-port/output 7 value] + [$make-port/both 7 value] + [$port-handler 1 value] + [$port-input-buffer 1 value] + [$port-input-index 1 value] + [$port-input-size 1 value] + [$port-output-buffer 1 value] + [$port-output-index 1 value] + [$port-output-size 1 value] + [$set-port-input-index! 2 effect] + [$set-port-input-size! 2 effect] + [$set-port-output-index! 2 effect] + [$set-port-output-size! 2 effect] ;;; tcbuckets [$make-tcbucket 4 value] [$tcbucket-key 1 value] [$tcbucket-val 1 value] [$tcbucket-next 1 value] + [$tcbucket-dlink-next 1 value] + [$tcbucket-dlink-prev 1 value] [$set-tcbucket-val! 2 effect] [$set-tcbucket-next! 2 effect] + [$set-tcbucket-dlink-next! 2 effect] + [$set-tcbucket-dlink-prev! 2 effect] [$set-tcbucket-tconc! 2 effect] ;;; misc [eof-object 0 value] @@ -141,13 +172,14 @@ [$record-rtd 1 value] [$record-ref 2 value] [$record-set! 3 effect] + [$record any value] ;;; ;;; asm ;;; [$code? 1 pred] [$code-size 1 value] [$code-reloc-vector 1 value] - [$code-closure-size 1 value] + [$code-freevars 1 value] [$code-ref 2 value] [$code-set! 3 value] [$code->closure 1 value] @@ -162,299 +194,10 @@ [(assq x open-coded-primitives) => caddr] [else (error 'primitive-context "unknown prim ~s" x)])) - -;;; primitives table section -(define primitives-table - '(;;; system locations used by the C/Scheme interface - [$apply-nonprocedure-error-handler library] - [$incorrect-args-error-handler library] - [$multiple-values-error library] - [$intern library] - [do-overflow library] - [do-vararg-overflow library] - [do-stack-overflow library] - ;;; type predicates - [fixnum? public] - [immediate? public] - [boolean? public] - [char? public] - [null? public] - [pair? public] - [symbol? public] - [vector? public] - [string? public] - [procedure? public] - [eof-object? public] - [not public] - [eq? public] - [equal? public] - ;;; fixnum primitives - [fxadd1 public] - [fxsub1 public] - [fx+ public] - [fx- public] - [fx* public] - [fxsll public] - [fxsra public] - [fxlogor public] - [fxlogand public] - [fxlogxor public] - [fxlognot public] - [fxquotient public] - [fxremainder public] - [fxmodulo public] - ;;; fixnum predicates - [fxzero? public] - [fx= public] - [fx< public] - [fx<= public] - [fx> public] - [fx>= public] - ;;; characters - [char=? public] - [char? public] - [char>=? public] - [integer->char public] - [char->integer public] - ;;; lists - [cons public] - [car public] - [cdr public] - [caar public] - [cadr public] - [cdar public] - [cddr public] - [caaar public] - [caadr public] - [cadar public] - [caddr public] - [cdaar public] - [cdadr public] - [cddar public] - [cdddr public] - [caaaar public] - [caaadr public] - [caadar public] - [caaddr public] - [cadaar public] - [cadadr public] - [caddar public] - [cadddr public] - [cdaaar public] - [cdaadr public] - [cdadar public] - [cdaddr public] - [cddaar public] - [cddadr public] - [cdddar public] - [cddddr public] - [set-car! public] - [set-cdr! public] - [list public] - [list* ADDME] - [list? public] - [list-ref public] - [length public] - [make-list public] - [reverse public] - [append public] - [list-ref public] - [memq public] - [memv public] - [assq public] - [map public] - [for-each public] - [andmap public] - [ormap public] - ;;; vectors - [make-vector public] - [vector public] - [vector-length public] - [vector-ref public] - [vector-set! public] - [list->vector public] - [vector->list public] - ;;; strings - [make-string public] - [string public] - [string-length public] - [string-ref public] - [string-set! public] - [list->string public] - [string->list public] - [string-append public] - [substring public] - [string=? public] - [fixnum->string public] - ;;; symbols - [gensym public] - [gensym? public] - [symbol->string public] - [gensym->unique-string public] - [gensym-prefix public] - [gensym-count public] - [print-gensym public] - [string->symbol public] - [top-level-value public] - [top-level-bound? public] - [set-top-level-value! public] - [primitive-set! public] - [getprop public] - [putprop public] - [remprop public] - [property-list public] - [oblist public] - [uuid public] - ;;; eof - [eof-object public] - [void public] - ;;; control/debugging - [print-error public] - [error public] - [current-error-handler public] - [exit public] - [apply public] - [make-parameter public] - ;;; output - [output-port? public] - [console-output-port public] - [current-output-port public] - [standard-output-port public] - [standard-error-port public] - [open-output-file public] - [open-output-string public] - [with-output-to-file public] - [call-with-output-file public] - [with-input-from-file public] - [call-with-input-file public] - [get-output-string public] - [close-output-port public] - [flush-output-port public] - [write-char public] - [output-port-name public] - [newline public] - ;;; input - [input-port? public] - [standard-input-port public] - [console-input-port public] - [current-input-port public] - [open-input-file public] - [close-input-port public] - [reset-input-port! public] - [read-char public] - [peek-char public] - [unread-char public] - [input-port-name public] - ;;; writing/printing - [write public] - [display public] - [printf public] - [fprintf public] - [format public] - [read-token public] - [read public] - ;;; evaluation - [primitive? public] - [expand public] - [syntax-error public] - [current-expand public] - [expand-mode public] - [assembler-output public] - [compile-file public] - [fasl-write public] - - [$sc-put-cte public] - [sc-expand public] - [$make-environment public] - [environment? public] - [interaction-environment public] - [identifier? public] - [syntax->list public] - [syntax-object->datum public] - [datum->syntax-object public] - [generate-temporaries public] - [free-identifier=? public] - [bound-identifier=? public] - [literal-identifier=? public] - [syntax-error public] - [$syntax-dispatch public] - - - - [interpret public] - [compile public] - [eval public] - [current-eval public] - [load public] - [new-cafe public] - [collect public] - [call/cc public] - [call/cf library] - [dynamic-wind public] - [values public] - [call-with-values public] - [make-traced-procedure library] - [trace-symbol! library] - [untrace-symbol! library] - ;;; record - [$base-rtd library] - [record? public] - [record-rtd public] - [record-name public] - [record-printer public] - [record-length public] - [record-ref public] - [record-set! public] - ;;; record rtds - [make-record-type public] - [record-type-name public] - [record-type-descriptor public] - [record-type-symbol public] - [record-type-field-names public] - [record-constructor public] - [record-predicate public] - [record-field-accessor public] - [record-field-mutator public] - ;;; hash tables - [make-hash-table public] - [hash-table? public] - [get-hash-table public] - [put-hash-table! public] - ;;; asm - [make-code public] - [code? public] - [code-size public] - [code-closure-size public] - [code-ref public] - [code-set! public] - [code-reloc-vector public] - [set-code-reloc-vector! public] - [code->closure public] - [list*->code* library] - ;;; - ;;; POSIX - ;;; - [fork public] - [posix-fork public] - [system public] - [$debug public] - [$underflow-misaligned-error public] - )) - - -(define (primitive? x) - (cond - [(assq x primitives-table) #t] - [(assq x open-coded-primitives) #t] - [else #f])) - (define (open-codeable? x) (cond [(assq x open-coded-primitives) #t] - [(assq x primitives-table) #f] - [else (error 'open-codeable "invalid primitive ~s" x)])) + [else #f])) (define (open-coded-primitive-args x) (cond @@ -476,6 +219,7 @@ (define-record return (value)) (define-record call-cp (call-convention rp-convention base-idx arg-count live-mask)) +(define-record tailcall-cp (convention arg-count)) (define-record primcall (op arg*)) (define-record primref (name)) (define-record conditional (test conseq altern)) @@ -487,22 +231,17 @@ (define-record clambda-case (arg* proper body)) (define-record clambda (cases)) (define-record clambda-code (label cases free)) - (define-record closure (code free*)) (define-record funcall (op rand*)) (define-record appcall (op rand*)) (define-record forcall (op rand*)) (define-record code-rec (arg* proper free* body)) - (define-record codes (list body)) (define-record assign (lhs rhs)) -(define unique-var - (let ([counter 0]) - (lambda (x) - (let ([g (gensym (format "~a:~a" x counter))]) - (set! counter (fxadd1 counter)) - (make-var g #f))))) +(define (unique-var x) + (make-var (gensym x) #f)) + (define (make-bind^ lhs* rhs* body) (if (null? lhs*) @@ -623,14 +362,32 @@ (map (lambda (x) (E x env)) arg*)))] [(|#primitive|) (let ([var (cadr x)]) - (if (primitive? var) - (make-primref var) - (error 'recordize "invalid primitive ~s" var)))] + (make-primref var))] + ;;; [(|#primitive|) + ;;; (let ([var (cadr x)]) + ;;; (if (primitive? var) + ;;; (make-primref var) + ;;; (error 'recordize "invalid primitive ~s" var)))] [(top-level-value) (let ([var (quoted-sym (cadr x))]) - (cond - [(primitive? var) (make-primref var)] - [else (error 'recordize "invalid top-level var ~s" var)]))] + (if (eq? (expand-mode) 'bootstrap) + (error 'compile "reference to ~s in bootstrap mode" var) + ;(make-primref var) + (make-funcall + (make-primref 'top-level-value) + (list (make-constant var)))))] + ;;; [(top-level-value) + ;;; (let ([var (quoted-sym (cadr x))]) + ;;; (if (eq? (expand-mode) 'bootstrap) + ;;; (if (primitive? var) + ;;; (make-primref var) + ;;; (error 'compile "invalid primitive ~s" var)) + ;;; (make-funcall + ;;; (make-primref 'top-level-value) + ;;; (list (make-constant var)))))] + [(set-top-level-value!) + (make-funcall (make-primref 'set-top-level-value!) + (map (lambda (x) (E x env)) (cdr x)))] [(memv) (make-funcall (make-primref 'memq) @@ -792,6 +549,95 @@ (Expr x)) + + +(define lambda-both 0) +(define lambda-producer 0) +(define lambda-consumer 0) +(define lambda-none 0) +(define branching-producer 0) + + +(define (analyze-cwv x) + (define who 'analyze-cwv) + (define (lambda? x) + (record-case x + [(clambda) #t] + [else #f])) + (define (branching-producer? x) + (define (bt? x) + (record-case x + [(bind lhs* rhs* body) (bt? body)] + [(recbind lhs* rhs* body) (bt? body)] + [(conditional test conseq altern) #t] + [(seq e0 e1) (bt? e1)] + [else #f])) + (define (branching-clause? x) + (record-case x + [(clambda-case fml* proper body) + (bt? body)])) + (record-case x + [(clambda cls*) + (ormap branching-clause? cls*)] + [else #f])) + (define (analyze producer consumer) + (cond + [(and (lambda? producer) (lambda? consumer)) + (set! lambda-both (fxadd1 lambda-both))] + [(lambda? producer) + (set! lambda-producer (fxadd1 lambda-producer))] + [(lambda? consumer) + (set! lambda-consumer (fxadd1 lambda-consumer))] + [else + (set! lambda-none (fxadd1 lambda-none))]) + (when (branching-producer? producer) + (set! branching-producer (fxadd1 branching-producer))) + (printf "both=~s p=~s c=~s none=~s branching-prod=~s\n" + lambda-both lambda-producer lambda-consumer lambda-none + branching-producer)) + (define (E x) + (record-case x + [(constant) (void)] + [(var) (void)] + [(primref) (void)] + [(bind lhs* rhs* body) + (for-each E rhs*) (E body)] + [(recbind lhs* rhs* body) + (for-each E rhs*) (E body)] + [(conditional test conseq altern) + (E test) + (E conseq) + (E altern)] + [(seq e0 e1) (E e0) (E e1)] + [(clambda cls*) + (for-each + (lambda (x) + (record-case x + [(clambda-case fml* proper body) (E body)])) + cls*)] + [(primcall rator rand*) + (for-each E rand*) + (when (and (eq? rator 'call-with-values) (fx= (length rand*) 2)) + (analyze (car rand*) (cadr rand*)))] + [(funcall rator rand*) + (E rator) (for-each E rand*) + (when (and (record-case rator + [(primref op) (eq? op 'call-with-values)] + [else #f]) + (fx= (length rand*) 2)) + (analyze (car rand*) (cadr rand*)))] + [(appcall rator rand*) + (E rator) (for-each E rand*)] + [(forcall rator rand*) + (for-each E rand*)] + [(assign lhs rhs) + (E rhs)] + [else (error who "invalid expression ~s" (unparse x))])) + (E x)) + + + + (define (optimize-letrec x) (define who 'optimize-letrec) (define (extend-hash lhs* h ref) @@ -1089,6 +935,7 @@ + (define (convert-closures prog) (define who 'convert-closures) (define (Expr* x*) @@ -1220,6 +1067,7 @@ (let ([n (open-coded-primitive-args op)] [m (length rand*)]) (cond [(eq? n 'any) #t] + [(eq? n 'positive) (fx> m 1)] [(eq? n 'no-code) (error 'syntactically-valid "should not primcall non codable prim ~s" op)] @@ -1257,7 +1105,14 @@ [(fixnum? immediate? boolean? char? vector? string? procedure? null? pair? not cons eq? vector symbol? error eof-object eof-object? void $unbound-object? $code? $forward-ptr? bwp-object? - pointer-value) + pointer-value top-level-value car cdr list* list $record + port? input-port? output-port? + $make-port/input $make-port/output $make-port/both + $port-handler + $port-input-buffer $port-input-index $port-input-size + $port-output-buffer $port-output-index $port-output-size + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size! ) '#t] [($fxadd1 $fxsub1 $fxzero? $fxlognot $fxlogor $fxlogand $fx+ $fx- $fx* $fx= $fx< $fx<= $fx> $fx>= $fxquotient $fxmodulo $fxsll $fxsra $fxlogxor $exit) @@ -1291,12 +1146,17 @@ $set-symbol-unique-string! $set-symbol-string! $seal-frame-and-call $frame->continuation $code->closure - $code-size $code-reloc-vector $code-closure-size + $code-size $code-reloc-vector $code-freevars $code-ref $code-set! $make-record $record? $record/rtd? $record-rtd $record-ref $record-set! primitive-set! primitive-ref $make-tcbucket $tcbucket-key $tcbucket-val $tcbucket-next - $set-tcbucket-val! $set-tcbucket-next! $set-tcbucket-tconc!) + $tcbucket-dlink-next + $tcbucket-dlink-prev + $set-tcbucket-val! + $set-tcbucket-dlink-next! + $set-tcbucket-dlink-prev! + $set-tcbucket-next! $set-tcbucket-tconc!) #t] [else (error 'valid-arg-types? "unhandled op ~s" op)])) (and (valid-arg-count? op rand*) @@ -1309,6 +1169,24 @@ ;;; funcalls to open-codable primrefs whos arguments are "ok" are converted to ;;; primcalls. + +(define uninlined '()) +(define (mark-uninlined x) + (cond + [(assq x uninlined) => + (lambda (p) (set-cdr! p (fxadd1 (cdr p))))] + [else (set! uninlined (cons (cons x 1) uninlined))])) + +(module () + (primitive-set! 'uninlined-stats + (lambda () + (let f ([ls uninlined] [ac '()]) + (cond + [(null? ls) ac] + [(fx> (cdar ls) 15) + (f (cdr ls) (cons (car ls) ac))] + [else (f (cdr ls) ac)]))))) + (define (introduce-primcalls x) (define who 'introduce-primcalls) (define (simple? x) @@ -1345,6 +1223,8 @@ (syntactically-valid? (primref-name rator) rand*)) (Expr (make-primcall (primref-name rator) rand*))] [else + (when (primref? rator) + (mark-uninlined (primref-name rator))) (make-funcall (Expr rator) (map Expr rand*))])] [(appcall op arg*) (make-appcall (Expr op) (map Expr arg*))] @@ -1430,10 +1310,14 @@ (make-conditional (Expr test) (Expr conseq) (Expr altern))] [(seq e0 e1) (make-seq (Expr e0) (Expr e1))] [(primcall op arg*) - (simplify* arg* '() '() - (lambda (arg* lhs* rhs*) - (make-bind^ lhs* rhs* - (make-primcall op arg*))))] + (cond + [(memq op '(not car cdr)) + (make-primcall op (map Expr arg*))] + [else + (simplify* arg* '() '() + (lambda (arg* lhs* rhs*) + (make-bind^ lhs* rhs* + (make-primcall op arg*))))])] [(forcall op arg*) (make-forcall op (map Expr arg*))] [(funcall rator rand*) @@ -1536,10 +1420,10 @@ (make-conditional (make-primcall '$ap-check-bytes (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow) + (make-forcall "ik_collect" ;(make-primref 'do-overflow) (list (make-primcall '$fx+ - (list (make-constant n) var)))) + (list (make-constant (fx+ n 4096)) var)))) (make-primcall 'void '())) body)) (define (check-words n var body) @@ -1547,10 +1431,10 @@ (make-conditional (make-primcall '$ap-check-words (list (make-constant n) var)) - (make-funcall (make-primref 'do-overflow-words) + (make-forcall "ik_collect" ; (make-primref 'do-overflow-words) (list (make-primcall '$fx+ - (list (make-constant n) var)))) + (list (make-constant (fx+ n 4096)) var)))) (make-primcall 'void '())) body)) (define (check-const n body) @@ -1558,8 +1442,8 @@ (make-conditional (make-primcall '$ap-check-const (list (make-constant n))) - (make-funcall (make-primref 'do-overflow) - (list (make-constant n))) + (make-forcall "ik_collect" ;(make-primref 'do-overflow) + (list (make-constant (fx+ n 4096)))) (make-primcall 'void '())) body)) (define (closure-size x) @@ -1596,7 +1480,8 @@ [($make-symbol) (check-const symbol-size x)] [($make-tcbucket) (check-const tcbucket-size x)] [($frame->continuation $code->closure) - (check-const (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] + (check-const + (fx+ disp-closure-data (fx* (length arg*) wordsize)) x)] [($make-string) (record-case (car arg*) [(constant i) @@ -1605,6 +1490,8 @@ (check-bytes (fxadd1 disp-string-data) (car arg*) x)])] [($string) (check-const (fx+ (length arg*) (fx+ disp-string-data 1)) x)] + [($make-port/input $make-port/output $make-port/both) + (check-const port-size x)] [($make-vector) (record-case (car arg*) [(constant i) @@ -1617,7 +1504,11 @@ (check-const (fx+ (fx* i wordsize) disp-record-data) x)] [else (check-words (fxadd1 disp-record-data) (cadr arg*) x)])] - [(vector) + [(list*) + (check-const (fx* (fxsub1 (length arg*)) pair-size) x)] + [(list) + (check-const (fx* (length arg*) pair-size) x)] + [(vector $record) (check-const (fx+ (fx* (length arg*) wordsize) disp-vector-data) x)] [else x]))] [(forcall op arg*) @@ -1661,6 +1552,7 @@ (CodesExpr x)) + (define (remove-local-variables x) (define who 'remove-local-variables) (define (simple* x* r) @@ -1681,6 +1573,10 @@ (fxlogor (vector-ref s q) (fxsll 1 r))))) r) s)) + (define (check? x) + (cond + [(primref? x) #f] ;;;; PRIMREF CHECK + [else #t])) (define (do-new-frame op rand* si r call-convention rp-convention orig-live) (make-new-frame (fxadd1 si) (fx+ (length rand*) 2) (let f ([r* rand*] [nsi (fx+ si 2)] [live orig-live]) @@ -1691,7 +1587,7 @@ (make-save-cp (make-frame-var si)) (case call-convention [(normal apply) - (make-eval-cp #t (Expr op nsi r (cons si live)))] + (make-eval-cp (check? op) (Expr op nsi r (cons si live)))] [(foreign) (make-eval-cp #f (make-foreign-label op))] [else (error who "invalid convention ~s" call-convention)])) @@ -1735,6 +1631,82 @@ (f (cdr l*) (cons v nlhs*) (fxadd1 si) (cons (cons (car l*) v) r) (cons si live)))]))) + (define (do-tail-frame-old op rand* si r call-conv live) + (define (const? x) + (record-case x + [(constant) #t] + [(primref) #t] + [else #f])) + (define (evalrand* rand* i si r live) + (cond + [(null? rand*) + (make-eval-cp (check? op) (Expr op si r live))] + [(const? (car rand*)) + (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r live)] + [else + (let ([v (make-frame-var si)] + [rhs (Expr (car rand*) si r live)]) + (cond + [(and (frame-var? rhs) + (fx= (frame-var-idx rhs) i)) + (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r (cons si live))] + [else + (make-seq + (make-assign v rhs) + (evalrand* (cdr rand*) (fx+ 1 i) (fx+ 1 si) r + (cons si live)))]))])) + (define (moverand* rand* i si ac) + (cond + [(null? rand*) ac] + [(const? (car rand*)) + (make-seq + (make-assign (make-frame-var i) (car rand*)) + (moverand* (cdr rand*) (fxadd1 i) (fxadd1 si) ac))] + [else + (make-seq + (make-assign (make-frame-var i) (make-frame-var si)) + (moverand* (cdr rand*) (fxadd1 i) (fxadd1 si) ac))])) + (make-seq + (evalrand* rand* 1 si r live) + (moverand* rand* 1 si + (make-tailcall-cp call-conv (length rand*))))) + (define (do-tail-frame op rand* si r call-conv live) + (define (const? x) + (record-case x + [(constant) #t] + [(primref) #t] + [else #f])) + (define (evalrand* rand* i si r live ac) + (cond + [(null? rand*) + (make-seq + (make-eval-cp (check? op) (Expr op si r live)) + ac)] + [(const? (car rand*)) + (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r live + (make-seq ac + (make-assign (make-frame-var i) (car rand*))))] + [else + (let ([vsi (make-frame-var si)] + [rhs (Expr (car rand*) si r live)]) + (cond + [(and (frame-var? rhs) + (fx= (frame-var-idx rhs) i)) + (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r (cons si live) ac)] + [(fx= i si) + (make-seq + (make-assign vsi rhs) + (evalrand* (cdr rand*) (fx+ i 1) (fx+ si 1) r + (cons si live) ac))] + [else + (make-seq + (make-assign vsi rhs) + (evalrand* (cdr rand*) (fxadd1 i) (fxadd1 si) r (cons si live) + (make-seq ac + (make-assign (make-frame-var i) vsi))))]))])) + (make-seq + (evalrand* rand* 1 si r live (make-primcall 'void '())) + (make-tailcall-cp call-conv (length rand*)))) (define (Tail x si r live) (record-case x [(return v) (make-return (Expr v si r live))] @@ -1749,13 +1721,18 @@ (Tail altern si r live))] [(seq e0 e1) (make-seq (Effect e0 si r live) (Tail e1 si r live))] [(primcall op arg*) - (case op -; [(values) (make-primcall op (simple* arg* r))] - [else (make-return (make-primcall op (simple* arg* r)))])] + (make-return + (make-primcall op + (map (lambda (x) (Expr x si r live)) arg*)))] + [(funcall op rand*) - (do-new-frame op rand* si r 'normal 'tail live)] + (do-tail-frame op rand* si r 'normal live)] [(appcall op rand*) - (do-new-frame op rand* si r 'apply 'tail live)] + (do-tail-frame op rand* si r 'apply live)] +;;; [(funcall op rand*) +;;; (do-new-frame op rand* si r 'normal 'tail live)] +;;; [(appcall op rand*) +;;; (do-new-frame op rand* si r 'apply 'tail live)] [else (error who "invalid expression ~s" (unparse x))])) (define (Effect x si r live) (record-case x @@ -1774,7 +1751,8 @@ (Effect altern si r live))] [(seq e0 e1) (make-seq (Effect e0 si r live) (Effect e1 si r live))] [(primcall op arg*) - (make-primcall op (simple* arg* r))] + (make-primcall op + (map (lambda (x) (Expr x si r live)) arg*))] [(forcall op rand*) (do-new-frame op rand* si r 'foreign 'effect live)] [(funcall op rand*) @@ -1803,7 +1781,8 @@ (Expr altern si r live))] [(seq e0 e1) (make-seq (Effect e0 si r live) (Expr e1 si r live))] [(primcall op arg*) - (make-primcall op (simple* arg* r))] + (make-primcall op + (map (lambda (x) (Expr x si r live)) arg*))] [(forcall op rand*) (do-new-frame op rand* si r 'foreign 'value live)] [(funcall op rand*) @@ -1847,7 +1826,112 @@ (make-codes (map CodeExpr list) (Tail body 1 '() '()))])) (CodesExpr x)) - + + + +(define checks-elim-count 0) +(define (optimize-ap-check x) + (define who 'optimize-ap-check) + (define (min x y) + (if (fx< x y) x y)) + (define (Tail x f) + (record-case x + [(return v) + (let-values ([(v f) (NonTail v f)]) + (make-return v))] + [(fix lhs* rhs* body) + (make-fix lhs* rhs* (Tail body f))] + [(conditional test conseq altern) + (let-values ([(test f) (NonTail test f)]) + (make-conditional + test + (Tail conseq f) + (Tail altern f)))] + [(seq e0 e1) + (let-values ([(e0 f) (NonTail e0 f)]) + (make-seq e0 (Tail e1 f)))] + [(tailcall-cp) x] + [else (error who "invalid tail expression ~s" (unparse x))])) + (define (do-primcall op arg* f) + (case op + [($ap-check-const) + (let ([n (constant-value (car arg*))]) + (cond + [(fx< n f) + ;(set! checks-elim-count (fxadd1 checks-elim-count)) + ;(printf "~s checks eliminated\n" checks-elim-count) + (values (make-constant #f) (fx- f n))] + [(fx<= n 4096) + (values (make-primcall '$ap-check-const + (list (make-constant 4096))) + (fx- 4096 n))] + [else + (values (make-primcall '$ap-check-const + (list (make-constant (fx+ n 4096)))) + 4096)]))] + [($ap-check-bytes $ap-check-words) + (values (make-primcall op + (list (make-constant (fx+ (constant-value (car arg*)) + 4096)) + (cadr arg*))) + 4096)] + [else (values (make-primcall op arg*) f)])) + (define (NonTail x f) + (record-case x + [(constant) (values x f)] + [(frame-var) (values x f)] + [(cp-var) (values x f)] + [(save-cp) (values x f)] + [(foreign-label) (values x f)] + [(primref) (values x f)] + [(closure) (values x f)] + [(call-cp call-conv) + (if (eq? call-conv 'foreign) + (values x f) + (values x 0))] + [(primcall op arg*) (do-primcall op arg* f)] + [(fix lhs* rhs* body) + (let-values ([(body f) (NonTail body f)]) + (values (make-fix lhs* rhs* body) f))] + [(conditional test conseq altern) + (let-values ([(test f) (NonTail test f)]) + (if (constant? test) + (if (constant-value test) + (NonTail conseq f) + (NonTail altern f)) + (let-values ([(conseq f0) (NonTail conseq f)] + [(altern f1) (NonTail altern f)]) + (values (make-conditional test conseq altern) + (min f0 f1)))))] + [(seq e0 e1) + (let-values ([(e0 f) (NonTail e0 f)]) + (let-values ([(e1 f) (NonTail e1 f)]) + (values (make-seq e0 e1) f)))] + [(assign lhs rhs) + (let-values ([(rhs f) (NonTail rhs f)]) + (values (make-assign lhs rhs) f))] + [(eval-cp check body) + (let-values ([(body f) (NonTail body f)]) + (values (make-eval-cp check body) f))] + [(new-frame base-idx size body) + (let-values ([(body f) (NonTail body f)]) + (values (make-new-frame base-idx size body) f))] + [else (error who "invalid nontail expression ~s" (unparse x))])) + (define CaseExpr + (lambda (x) + (record-case x + [(clambda-case fml* proper body) + (make-clambda-case fml* proper (Tail body 0))]))) + (define (CodeExpr x) + (record-case x + [(clambda-code L cases free) + (make-clambda-code L (map CaseExpr cases) free)])) + (define (CodesExpr x) + (record-case x + [(codes list body) + (make-codes (map CodeExpr list) + (Tail body 0))])) + (CodesExpr x)) (begin (define fx-shift 2) @@ -1905,14 +1989,28 @@ (define code-tag #x2F) (define disp-code-instrsize 4) (define disp-code-relocsize 8) - (define disp-code-closuresize 12) + (define disp-code-freevars 12) (define disp-code-data 16) + (define port-tag #x3F) + (define input-port-tag #x7F) + (define output-port-tag #xBF) + (define input/output-port-tag #xFF) + (define port-mask #x3F) + (define disp-port-handler 4) + (define disp-port-input-buffer 8) + (define disp-port-input-index 12) + (define disp-port-input-size 16) + (define disp-port-output-buffer 20) + (define disp-port-output-index 24) + (define disp-port-output-size 28) + (define port-size 32) (define disp-tcbucket-tconc 0) (define disp-tcbucket-key 4) (define disp-tcbucket-val 8) (define disp-tcbucket-next 12) - (define tcbucket-size 16) - + (define disp-tcbucket-dlink-prev 16) + (define disp-tcbucket-dlink-next 20) + (define tcbucket-size 24) (define record-ptag 5) (define record-pmask 7) (define disp-record-rtd 0) @@ -2015,6 +2113,7 @@ (mem (fx- disp-symbol-system-value symbol-tag) (obj op))) + (define (generate-code x) (define who 'generate-code) (define (rp-label x) @@ -2141,7 +2240,8 @@ [(null?) (type-pred #f nil rand* Lt Lf ac)] [($unbound-object?) (type-pred #f unbound rand* Lt Lf ac)] [($forward-ptr?) (type-pred #f -1 rand* Lt Lf ac)] - [(not) (type-pred #f bool-f rand* Lt Lf ac)] + [(not) (Pred (car rand*) Lf Lt ac)] + ;[(not) (type-pred #f bool-f rand* Lt Lf ac)] [(eof-object?) (type-pred #f eof rand* Lt Lf ac)] [(bwp-object?) (type-pred #f bwp-object rand* Lt Lf ac)] [($code?) @@ -2159,6 +2259,15 @@ [($record?) (indirect-type-pred record-pmask record-ptag record-pmask record-ptag rand* Lt Lf ac)] + [(output-port?) + (indirect-type-pred + vector-mask vector-tag #f output-port-tag rand* Lt Lf ac)] + [(input-port?) + (indirect-type-pred + vector-mask vector-tag #f input-port-tag rand* Lt Lf ac)] + [(port?) + (indirect-type-pred + vector-mask vector-tag port-mask port-tag rand* Lt Lf ac)] [($record/rtd?) (cond [Lf @@ -2183,7 +2292,7 @@ (movl (Simple (cadr rand*)) eax) (cmpl (mem (fx- disp-record-rtd vector-tag) ebx) eax) (je Lt) - (label Ljoin) + Ljoin ac))] [else ac])] [(immediate?) @@ -2245,7 +2354,7 @@ [($ap-check-const) (record-case (car rand*) [(constant i) - (if (fx< i pagesize) + (if (fx<= i pagesize) (list* (cmpl (pcb-ref 'allocation-redline) apr) (cond-branch 'jge Lt Lf ac)) @@ -2264,7 +2373,7 @@ [($fp-overflow) (list* (cmpl (pcb-ref 'frame-redline) fpr) (cond-branch 'jle Lt Lf ac))] - [($vector-ref) + [($vector-ref top-level-value car cdr $record-ref) (do-value-prim op rand* (do-simple-test eax Lt Lf ac))] [(cons void $fxadd1 $fxsub1) @@ -2291,6 +2400,23 @@ (movl (Simple (car arg*)) eax) (movl (mem off eax) eax) ac)) + (define (do-make-port tag args ac) + (let f ([args args] [idx disp-vector-data]) + (cond + [(null? args) + (if (fx= idx port-size) + (list* + (movl (int tag) (mem 0 apr)) + (movl apr eax) + (addl (int port-size) apr) + (addl (int vector-tag) eax) + ac) + (error 'do-make-port "BUG"))] + [else + (list* + (movl (Simple (car args)) eax) + (movl eax (mem idx apr)) + (f (cdr args) (fx+ idx wordsize)))]))) (define (do-value-prim op arg* ac) (case op [(eof-object) (cons (movl (int eof) eax) ac)] @@ -2428,6 +2554,24 @@ (indirect-ref arg* (fx- disp-tcbucket-val vector-tag) ac)] [($tcbucket-next) (indirect-ref arg* (fx- disp-tcbucket-next vector-tag) ac)] + [($tcbucket-dlink-next) + (indirect-ref arg* (fx- disp-tcbucket-dlink-next vector-tag) ac)] + [($tcbucket-dlink-prev) + (indirect-ref arg* (fx- disp-tcbucket-dlink-prev vector-tag) ac)] + [($port-handler) + (indirect-ref arg* (fx- disp-port-handler vector-tag) ac)] + [($port-input-buffer) + (indirect-ref arg* (fx- disp-port-input-buffer vector-tag) ac)] + [($port-input-index) + (indirect-ref arg* (fx- disp-port-input-index vector-tag) ac)] + [($port-input-size) + (indirect-ref arg* (fx- disp-port-input-size vector-tag) ac)] + [($port-output-buffer) + (indirect-ref arg* (fx- disp-port-output-buffer vector-tag) ac)] + [($port-output-index) + (indirect-ref arg* (fx- disp-port-output-index vector-tag) ac)] + [($port-output-size) + (indirect-ref arg* (fx- disp-port-output-size vector-tag) ac)] [(pointer-value) (list* (movl (Simple (car arg*)) eax) @@ -2440,6 +2584,51 @@ (indirect-ref arg* (fx- disp-record-rtd record-ptag) ac)] [($constant-ref) (list* (movl (Simple (car arg*)) eax) ac)] + [(car cdr) + (let ([x (car arg*)]) + (NonTail x + (list* + (movl eax ebx) + (andl (int pair-mask) eax) + (cmpl (int pair-tag) eax) + (if (eq? op 'car) + (list* + (jne (label SL_car_error)) + (movl (mem (fx- disp-car pair-tag) ebx) eax) + ac) + (list* + (jne (label SL_cdr_error)) + (movl (mem (fx- disp-cdr pair-tag) ebx) eax) + ac)))))] + [(top-level-value) + (let ([x (car arg*)]) + (cond + [(constant? x) + (let ([v (constant-value x)]) + (cond + [(symbol? v) + (list* + (movl (mem (fx- disp-symbol-value symbol-tag) (obj v)) eax) + (movl (obj v) ebx) + (cmpl (int unbound) eax) + (je (label SL_top_level_value_error)) + ac)] + [else + (list* + (movl (obj v) ebx) + (jmp (label SL_top_level_value_error)) + ac)]))] + [else + (NonTail x + (list* + (movl eax ebx) + (andl (int symbol-mask) eax) + (cmpl (int symbol-tag) eax) + (jne (label SL_top_level_value_error)) + (movl (mem (fx- disp-symbol-value symbol-tag) ebx) eax) + (cmpl (int unbound) eax) + (je (label SL_top_level_value_error)) + ac))]))] [($vector-ref) (list* (movl (Simple (car arg*)) ebx) (addl (Simple (cadr arg*)) ebx) @@ -2506,6 +2695,50 @@ (addl (int pair-tag) eax) (addl (int (align pair-size)) apr) ac)] + [(list) + (cond + [(null? arg*) (NonTail (make-constant '()) ac)] + [else + (list* + (addl (int pair-tag) apr) + (movl apr eax) + (let f ([a (car arg*)] [d (cdr arg*)]) + (list* + (movl (Simple a) ebx) + (movl ebx (mem (fx- disp-car pair-tag) apr)) + (if (null? d) + (list* + (movl (int nil) (mem (fx- disp-cdr pair-tag) apr)) + (addl (int (fx- pair-size pair-tag)) apr) + ac) + (list* + (addl (int pair-size) apr) + (movl apr + (mem (fx- disp-cdr (fx+ pair-tag pair-size)) apr)) + (f (car d) (cdr d)))))))])] + [(list*) + (cond + [(fx= (length arg*) 1) (NonTail (car arg*) ac)] + [(fx= (length arg*) 2) (NonTail (make-primcall 'cons arg*) ac)] + [else + (list* + (addl (int pair-tag) apr) + (movl apr eax) + (let f ([a (car arg*)] [b (cadr arg*)] [d (cddr arg*)]) + (list* + (movl (Simple a) ebx) + (movl ebx (mem (fx- disp-car pair-tag) apr)) + (if (null? d) + (list* + (movl (Simple b) ebx) + (movl ebx (mem (fx- disp-cdr pair-tag) apr)) + (addl (int (fx- pair-size pair-tag)) apr) + ac) + (list* + (addl (int pair-size) apr) + (movl apr + (mem (fx- disp-cdr (fx+ pair-tag pair-size)) apr)) + (f b (car d) (cdr d)))))))])] [($make-symbol) (list* (movl (Simple (car arg*)) eax) (movl eax (mem disp-symbol-string apr)) @@ -2518,6 +2751,9 @@ (addl (int symbol-tag) eax) (addl (int (align symbol-size)) apr) ac)] + [($make-port/input) (do-make-port input-port-tag arg* ac)] + [($make-port/output) (do-make-port output-port-tag arg* ac)] + [($make-port/both) (do-make-port input/output-port-tag arg* ac)] [($make-tcbucket) (list* (movl (Simple (car arg*)) eax) (movl eax (mem disp-tcbucket-tconc apr)) @@ -2527,10 +2763,31 @@ (movl eax (mem disp-tcbucket-val apr)) (movl (Simple (cadddr arg*)) eax) (movl eax (mem disp-tcbucket-next apr)) + (movl (int 0) (mem disp-tcbucket-dlink-prev apr)) + (movl (int 0) (mem disp-tcbucket-dlink-next apr)) (movl apr eax) (addl (int vector-tag) eax) (addl (int (align tcbucket-size)) apr) - ac)] + ac)] + [($record) + (let ([rtd (car arg*)] + [ac + (let f ([arg* (cdr arg*)] [idx disp-record-data]) + (cond + [(null? arg*) + (list* (movl apr eax) + (addl (int vector-tag) eax) + (addl (int (align idx)) apr) + ac)] + [else + (list* (movl (Simple (car arg*)) eax) + (movl eax (mem idx apr)) + (f (cdr arg*) (fx+ idx wordsize)))]))]) + (cond + [(constant? rtd) + (list* (movl (Simple rtd) (mem 0 apr)) ac)] + [else + (list* (movl (Simple rtd) eax) (movl eax (mem 0 apr)) ac)]))] [(vector) (let f ([arg* arg*] [idx disp-vector-data]) (cond @@ -2606,19 +2863,21 @@ (indirect-ref arg* (fx- disp-code-instrsize vector-tag) ac)] [($code-reloc-vector) (indirect-ref arg* (fx- disp-code-relocsize vector-tag) ac)] - [($code-closure-size) - (indirect-ref arg* (fx- disp-code-closuresize vector-tag) ac)] + [($code-freevars) + (indirect-ref arg* (fx- disp-code-freevars vector-tag) ac)] [($set-car! $set-cdr! $vector-set! $string-set! $exit $set-symbol-value! $set-symbol-plist! $code-set! primitive-set! $set-code-object! $set-code-object+offset! $set-code-object+offset/rel! - $record-set!) + $record-set! + $set-port-input-index! $set-port-input-size! + $set-port-output-index! $set-port-output-size!) (do-effect-prim op arg* (cons (movl (int void-object) eax) ac))] [(fixnum? immediate? $fxzero? boolean? char? pair? vector? string? symbol? procedure? null? not eof-object? $fx= $fx< $fx<= $fx> $fx>= eq? $char= $char< $char<= $char> $char>= $unbound-object? $code? - $record? bwp-object?) + $record? $record/rtd? bwp-object? port? input-port? output-port?) (do-pred->value-prim op arg* ac)] [($code->closure) (list* @@ -2710,9 +2969,38 @@ (indirect-assignment arg* (fx- disp-tcbucket-val vector-tag) ac)] [($set-tcbucket-next!) (indirect-assignment arg* (fx- disp-tcbucket-next vector-tag) ac)] + [($set-tcbucket-dlink-next!) + (indirect-assignment arg* (fx- disp-tcbucket-dlink-next vector-tag) ac)] + [($set-tcbucket-dlink-prev!) + (indirect-assignment arg* (fx- disp-tcbucket-dlink-prev vector-tag) ac)] [($set-tcbucket-tconc!) (indirect-assignment arg* (fx- disp-tcbucket-tconc vector-tag) ac)] - + [($set-port-input-index!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-port-input-index vector-tag) eax)) + ac)] + [($set-port-input-size!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl (int 0) (mem (fx- disp-port-input-index vector-tag) eax)) + (movl ebx (mem (fx- disp-port-input-size vector-tag) eax)) + ac)] + [($set-port-output-index!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl ebx (mem (fx- disp-port-output-index vector-tag) eax)) + ac)] + [($set-port-output-size!) + (list* + (movl (Simple (car arg*)) eax) + (movl (Simple (cadr arg*)) ebx) + (movl (int 0) (mem (fx- disp-port-output-index vector-tag) eax)) + (movl ebx (mem (fx- disp-port-output-size vector-tag) eax)) + ac)] [($set-symbol-value!) (list* (movl (Simple (car arg*)) eax) (movl (Simple (cadr arg*)) ebx) @@ -2780,7 +3068,7 @@ (addl (pcb-ref 'dirty-vector) ebx) (movl (int dirty-word) (mem 0 ebx)) ac)] - [(cons void $fxadd1 $fxsub1) + [(cons void $fxadd1 $fxsub1 $record-ref) (let f ([arg* arg*]) (cond [(null? arg*) ac] @@ -3009,10 +3297,31 @@ [(primcall op rand*) (do-effect-prim op rand* ac)] [(conditional test conseq altern) - (let ([Lf (unique-label)] [Ljoin (unique-label)]) - (Pred test #f Lf - (Effect conseq - (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] + (let* ([Ljoin (unique-label)] + [ac (cons Ljoin ac)] + [altern-ac (Effect altern ac)]) + (cond + [(eq? altern-ac ac) ;; altern is nop + (let* ([conseq-ac (Effect conseq ac)]) + (cond + [(eq? conseq-ac ac) ;; conseq is nop too! + (Effect test ac)] + [else ; "when" pattern + (Pred test #f Ljoin conseq-ac)]))] + [else + (let* ([Lf (unique-label)] + [nac (list* (jmp Ljoin) Lf altern-ac)] + [conseq-ac (Effect conseq nac)]) + (cond + [(eq? conseq-ac nac) ;; "unless" pattern" + (Pred test Ljoin #f altern-ac)] + [else + (Pred test #f Lf conseq-ac)]))]))] +;;; [(conditional test conseq altern) +;;; (let ([Lf (unique-label)] [Ljoin (unique-label)]) +;;; (Pred test #f Lf +;;; (Effect conseq +;;; (list* (jmp Ljoin) Lf (Effect altern (cons Ljoin ac))))))] [(seq e0 e1) (Effect e0 (Effect e1 ac))] [(fix lhs* rhs* body) @@ -3020,23 +3329,27 @@ [(assign loc val) (record-case loc [(frame-var i) - (NonTail val - (cons (movl eax (idx->frame-loc i)) ac))] + (record-case val + [(constant c) + (cons (movl (constant-val c) (idx->frame-loc i)) ac)] + [else + (NonTail val + (cons (movl eax (idx->frame-loc i)) ac))])] [else (error who "invalid assign loc ~s" loc)])] [(eval-cp check body) - (NonTail body - (cond - [check + (cond + [check + (NonTail body (list* - (movl eax cpr) + (movl eax cpr) (andl (int closure-mask) eax) (cmpl (int closure-tag) eax) (jne (label SL_nonprocedure)) - ac)] - [else - (list* - (movl eax cpr) - ac)]))] + ac))] + [(primref? body) + (list* (movl (primref-loc (primref-name body)) cpr) ac)] + [else + (NonTail body (list* (movl eax cpr) ac))])] [(save-cp loc) (record-case loc [(frame-var i) @@ -3060,31 +3373,40 @@ (do-fix lhs* rhs* (Tail body ac))] [(new-frame idx size body) (Tail body ac)] - [(call-cp call-convention rp-convention idx argc mask) - (unless (eq? rp-convention 'tail) - (error who "nontail rp (~s) in tail context" rp-convention)) - (let f ([i 0]) - (cond - [(fx= i argc) - (case call-convention - [(normal) - (list* - (movl (int (argc-convention argc)) eax) - (tail-indirect-cpr-call) - ac)] - [(apply) - (list* - (movl (int (argc-convention argc)) eax) - (jmp (label SL_apply)) - ac)] - [else - (error who "invalid conv ~s in tail call-cpr" call-convention)])] - [else - (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) - (fx- 0 wordsize)) fpr) - eax) - (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) - (f (fxadd1 i)))]))] + [(tailcall-cp call-convention argc) + (list* + (movl (int (argc-convention argc)) eax) + (case call-convention + [(normal) (tail-indirect-cpr-call)] + [(apply) (jmp (label SL_apply))] + [else + (error who "invalid tail-call convention ~s" call-convention)]) + ac)] +;;; [(call-cp call-convention rp-convention idx argc mask) +;;; (unless (eq? rp-convention 'tail) +;;; (error who "nontail rp (~s) in tail context" rp-convention)) +;;; (let f ([i 0]) +;;; (cond +;;; [(fx= i argc) +;;; (case call-convention +;;; [(normal) +;;; (list* +;;; (movl (int (argc-convention argc)) eax) +;;; (tail-indirect-cpr-call) +;;; ac)] +;;; [(apply) +;;; (list* +;;; (movl (int (argc-convention argc)) eax) +;;; (jmp (label SL_apply)) +;;; ac)] +;;; [else +;;; (error who "invalid conv ~s in tail call-cpr" call-convention)])] +;;; [else +;;; (list* (movl (mem (fx* (fx+ idx (fxadd1 i)) +;;; (fx- 0 wordsize)) fpr) +;;; eax) +;;; (movl eax (mem (fx* (fx+ i 1) (fx- 0 wordsize)) fpr)) +;;; (f (fxadd1 i)))]))] [else (error 'Tail "invalid expression ~s" x)])) (define (handle-vararg fml-count ac) (define CONTINUE_LABEL (unique-label)) @@ -3188,7 +3510,7 @@ (record-case x [(clambda-code L cases free) (list* - (fx+ disp-closure-data (fx* wordsize (length free))) + (length free) (label L) (handle-cases (car cases) (cdr cases)))])) (record-case x @@ -3198,6 +3520,11 @@ (define SL_nonprocedure (gensym "SL_nonprocedure")) + +(define SL_top_level_value_error (gensym "SL_top_level_value_error")) +(define SL_car_error (gensym "SL_car_error")) +(define SL_cdr_error (gensym "SL_cdr_error")) + (define SL_invalid_args (gensym "SL_invalid_args")) (define SL_foreign_call (gensym "SL_foreign_call")) (define SL_continuation_code (gensym "SL_continuation_code")) @@ -3213,11 +3540,33 @@ (module () (list*->code* (list + (list 0 + (label SL_car_error) + (movl ebx (mem (fx- 0 wordsize) fpr)) + (movl (primref-loc 'car-error) cpr) + (movl (int (argc-convention 1)) eax) + (tail-indirect-cpr-call)) + + (list 0 + (label SL_cdr_error) + (movl ebx (mem (fx- 0 wordsize) fpr)) + (movl (primref-loc 'cdr-error) cpr) + (movl (int (argc-convention 1)) eax) + (tail-indirect-cpr-call)) + + (list 0 + (label SL_top_level_value_error) + (movl ebx (mem (fx- 0 wordsize) fpr)) + (movl (primref-loc 'top-level-value-error) cpr) + (movl (int (argc-convention 1)) eax) + (tail-indirect-cpr-call)) + (let ([L_cwv_done (gensym)] [L_cwv_loop (gensym)] [L_cwv_multi_rp (gensym)] [L_cwv_call (gensym)]) - (list disp-closure-data + (list + 0 ; no free vars (label SL_call_with_values) (cmpl (int (argc-convention 2)) eax) (jne (label SL_invalid_args)) @@ -3275,7 +3624,7 @@ (let ([L_values_one_value (gensym)] [L_values_many_values (gensym)]) - (list disp-closure-data + (list 0 ; no freevars (label SL_values) (cmpl (int (argc-convention 1)) eax) (je (label L_values_one_value)) @@ -3358,8 +3707,7 @@ [L_cont_one_arg (gensym)] [L_cont_mult_move_args (gensym)] [L_cont_mult_copy_loop (gensym)]) - (list - (fx+ disp-closure-data wordsize) + (list 1 ; freevars (label SL_continuation_code) (movl (mem (fx- disp-closure-data closure-tag) cpr) ebx) ; captured-k (movl ebx (pcb-ref 'next-continuation)) ; set @@ -3403,6 +3751,7 @@ (define (compile-expr expr) (let* ([p (recordize expr)] [p (optimize-direct-calls p)] +;;; [foo (analyze-cwv p)] [p (optimize-letrec p)] ;[p (remove-letrec p)] [p (remove-assignments p)] @@ -3413,6 +3762,7 @@ [p (insert-stack-overflow-checks p)] [p (insert-allocation-checks p)] [p (remove-local-variables p)] + [p (optimize-ap-check p)] [ls* (generate-code p)] [f (when (assembler-output) (for-each diff --git a/src/libcontrol-6.0.ss b/src/libcontrol-6.0.ss deleted file mode 100644 index 44d95ca..0000000 --- a/src/libcontrol-6.0.ss +++ /dev/null @@ -1,97 +0,0 @@ - -(let ([winders '()]) - - (define call-with-current-frame - (lambda (f) - (if ($fp-at-base) - (f ($current-frame)) - ($seal-frame-and-call f)))) - - (define primitive-call/cc - (lambda (f) - (call-with-current-frame - (lambda (frm) - (f ($frame->continuation frm)))))) - - (define len - (lambda (ls n) - (if (null? ls) - n - (len (cdr ls) (fxadd1 n))))) - - (define list-tail - (lambda (ls n) - (if (fxzero? n) - ls - (list-tail (cdr ls) (fxsub1 n))))) - - (define drop-uncommon-heads - (lambda (x y) - (if (eq? x y) - x - (drop-uncommon-heads (cdr x) (cdr y))))) - - (define common-tail - (lambda (x y) - (let ([lx (len x 0)] [ly (len y 0)]) - (let ([x (if (fx> lx ly) (list-tail x (fx- lx ly)) x)] - [y (if (fx> ly lx) (list-tail y (fx- ly lx)) y)]) - (if (eq? x y) - x - (drop-uncommon-heads (cdr x) (cdr y))))))) - - (define unwind* - (lambda (ls tail) - (unless (eq? ls tail) - (set! winders (cdr ls)) - ((cdar ls)) - (unwind* (cdr ls) tail)))) - - (define rewind* - (lambda (ls tail) - (unless (eq? ls tail) - (rewind* (cdr ls) tail) - ((caar ls)) - (set! winders ls)))) - - (define do-wind - (lambda (new) - (let ([tail (common-tail new winders)]) - (unwind* winders tail) - (rewind* new tail)))) - - (define call/cc - (lambda (f) - (primitive-call/cc - (lambda (k) - (let ([save winders]) - (f (lambda v* - (unless (eq? save winders) (do-wind save)) - (apply k v*)))))))) - -;;; (define dynamic-wind -;;; (lambda (in body out) -;;; (in) -;;; (set! winders (cons (cons in out) winders)) -;;; (let ([v (body)]) -;;; (set! winders (cdr winders)) -;;; (out) -;;; v))) - - (define dynamic-wind - (lambda (in body out) - (in) - (set! winders (cons (cons in out) winders)) - (call-with-values - body - (lambda v* - (set! winders (cdr winders)) - (out) - (apply values v*))))) - - (primitive-set! 'call/cf call-with-current-frame) - (primitive-set! 'call/cc call/cc) - (primitive-set! 'dynamic-wind dynamic-wind) - ;($install-underflow-handler) - (void)) - diff --git a/src/libcontrol.fasl b/src/libcontrol.fasl index aabf1e33fb47f0e1d8d2db771783f6710490d9ee..32f5af532d6f576fba57c912611c1ff600202fb2 100644 GIT binary patch delta 1960 zcmb7FU1%It7@fI0n{0MBnVY!(v+FL+8dGbsD;SSGs#X8ZN!JY zAMBht-*?YB_l|Z*J9METKJcU97+a9%^_hIJSp0f!PH;TH9LJTp>5`*A%q?B)+(SlW zb>WBuUtk5}&shoJIaXqLiIsZ1%*uYOv2ql18CqV(n3Vw>qh)l2(H+ZNT)2dKROsU) ztc;jtf`7+5OSprtVlkVfxUsWwO-UU)u0kUU@=I_O#ll&_$@AI_eabx$>GHUTE>pZQ zBaBx@;0p4UHk8}8q2>Su3pNvc7Y%xPGwRri{0)}pY-4TloRS*oRpE^7ZA5#HyJ*i3 zg*ZwOs1s7*Vb)o(fE={j{q=4)DN!SVUxif55F^@-TecfS zD#sOHDkx{;oSe%msY`w8q(NBhFUYzsW=~uv&|}|^I#u|{-o?gzXlK%lSBBiTjQN)AH?Ue2@B0 z1)-iC4qrCo%FdM)SHWol3Y7`etxh*qead@_TXV0Q^F9>WyybWwS|relgZv`Af)9ol z8SC1NzQJn9*t?#zFR;YWxABWCC3V#qubAF)rq)dE*=ol9Q*{z$3Ak!@F|QIe?7!!0 zV(63#uhj&l#m!RZES&`ko-n{SYF53`|7bvctMD{Gdx{+p^Gq6IGzO@$E9?YmkLnX& zB{1j-?%U$gn$i}}kCoz{qb4bb*#TZt+U?eicYY)Az2`e`Vu$Iz^(Mkp`hTig@{vsgxnUzic zXUtbuEbgH&)nuyNeD$2aDPnN{Yy#M6X|~nVRbv^W-S7Bo!v!|~c8Xku33x2<9J)rJ zGvE(h+mLBlX|J$ksw$A_a{=H{OB(#4+P$+IFebBZ$$X>qKvUXz>-{TY8eR{*E^G(<(GbY}@V9QxZ+^hGnctTYSa5?CUA&yn#}sD2g)X5d0!ddwX_ZzZGtj?mdEV znG(7qtZiK+iV`MaU*rQcoCYo8FWpT4`t7r>Huu624u2vWUke9xIz6`0jx>0pNvu#e nsMDOR=f%-K-~9iq$)(M#E$L}b)W@T28lH|lfqK%=9lQKD3L)5J delta 1960 zcmb7FU2GIp7@fI0+uiO@_qOi;%(@%8)*`mMhEyQ9Z3!jCuwyA2H75PxMNLF$;)^jr z8-^O|fD3*vm^dvYrfqx>O^qorr07@+?mFENpPl9GLo?E}Hd!bZi(hG3&VCm&3{&AEOOE_7Gk>OY%f6U2 zI@XsO2ov~0(xY1xa<(efhxjFvupnUui+N~cO^X3nB(3LIo3 zvUW_C8zK?Yerw@J97j7if46M*cb+ntqemk81OY51K>wfstn*5eke zI?*V@6kk}DkHi@%SCCU@=an&?u=vWdq-mZ^SCt4o*6rwP1wOPMpkv;%QfY?WVOLgK zut^&08O)qYLqkOh{gQ@574+#l74`P4GA3IIAADKy5&A}f=WN~Rssdlw#tGR(xBWdf z)j_m>gY%qhCUeiU#nskU-2-iM!+@v+tp~&lI~*9zNwCksqo@e4I+{_72;+`NONQjv z8B#@KmRxb~562d?AVJK@Baa9vXHS_6Vfewh85Ps8>A5oF$~g?cvO9sY%0y$;C#~reU5pG{vJP1Q&Lxb!gqKrci!Nhs;1mORVUF>8k{wos8@*^ z`rp$vF?2(L*J?uiT)EUaQ)iBVM|AMTnk8TVe>5PzReGDByg?6$aVB*!8iPdHMS6nN z2la_}h;Y;!+P21{yxbNq43*-ZBPPka=>g8m?N)Qf>(7XA)jR9UY%tw-zJx%e|EHRF zXeiY=sP=C)0IDgse&@uf+yv0;uNQ6_8!P#t-!n$lIm+FUbx7~Cr9Ukf{QI=q&_3nF-< rNh}jLh|`Ru6+DA~UHkv6$@y~D5plvB^|NS6gvVo#peYfajVXTv)char - (lambda (n) - (unless (fixnum? n) - (error 'integer->char "~s is not a fixnum" n)) - (unless (and ($fx>= n 0) - ($fx<= n 255)) - (error 'integer->char "~s is out of range[0..255]" n)) - ($fixnum->char n))) - -(primitive-set! 'char->integer - (lambda (x) - (unless (char? x) - (error 'char->integer "~s is not a character" x)) - ($char->fixnum x))) - -(primitive-set! 'fxlognot - (lambda (x) - (unless (fixnum? x) - (error 'fxlognot "~s is not a fixnum" x)) - ($fxlognot x))) - -(primitive-set! 'fixnum? (lambda (x) (fixnum? x))) -(primitive-set! 'immediate? (lambda (x) (immediate? x))) - -(primitive-set! 'fxzero? - (lambda (x) - (unless (fixnum? x) - (error 'fxzero? "~s is not a fixnum" x)) - ($fxzero? x))) - -(primitive-set! 'boolean? (lambda (x) (boolean? x))) - -(primitive-set! 'char? (lambda (x) (char? x))) - -(primitive-set! 'vector? (lambda (x) (vector? x))) - -(primitive-set! 'string? (lambda (x) (string? x))) - -(primitive-set! 'procedure? (lambda (x) (procedure? x))) - -(primitive-set! 'null? (lambda (x) (null? x))) - -(primitive-set! 'pair? (lambda (x) (pair? x))) - -(let () - (define fill! - (lambda (v i n fill) - (cond - [($fx= i n) v] - [else - ($vector-set! v i fill) - (fill! v ($fx+ i 1) n fill)]))) - (primitive-set! 'make-vector - (lambda (n . opt) - (unless (and (fixnum? n) ($fx>= n 0)) - (error 'make-vector "~s is not a valid size" n)) - (let ([fill (if (null? opt) - (void) - (if (null? ($cdr opt)) - ($car opt) - (error 'make-vector "too many arguments")))]) - (let ([v ($make-vector n)]) - (fill! v 0 n fill)))))) - -(primitive-set! 'vector-length - (lambda (x) - (unless (vector? x) - (error 'vector-length "~s is not a vector" x)) - ($vector-length x))) - -(primitive-set! 'make-string - (lambda (x) - (unless (and (fixnum? x) ($fx>= x 0)) - (error 'make-string "~s is not a valid size" x)) - ($make-string x))) - -(primitive-set! 'string-length - (lambda (x) - (unless (string? x) - (error 'string-length "~s is not a string" x)) - ($string-length x))) - -(primitive-set! 'string->list - (lambda (x) - (unless (string? x) - (error 'string->list "~s is not a string" x)) - (let f ([x x] [i ($string-length x)] [ac '()]) - (cond - [($fxzero? i) ac] - [else - (let ([i ($fxsub1 i)]) - (f x i (cons ($string-ref x i) ac)))])))) - -(let () - (define bstring=? - (lambda (s1 s2 i j) - (or ($fx= i j) - (and ($char= ($string-ref s1 i) ($string-ref s2 i)) - (bstring=? s1 s2 ($fxadd1 i) j))))) - (define check-strings-and-return-false - (lambda (s*) - (cond - [(null? s*) #f] - [(string? ($car s*)) - (check-strings-and-return-false ($cdr s*))] - [else (error 'string=? "~s is not a string" ($car s*))]))) - (define strings=? - (lambda (s s* n) - (or (null? s*) - (let ([a ($car s*)]) - (unless (string? a) - (error 'string=? "~s is not a string" a)) - (if ($fx= n ($string-length a)) - (and (strings=? s ($cdr s*) n) - (bstring=? s a 0 n)) - (check-strings-and-return-false ($cdr s*))))))) - (primitive-set! 'string=? - (lambda (s . s*) - (if (string? s) - (strings=? s s* ($string-length s)) - (error 'string=? "~s is not a string" s))))) - -(let () - (define length* - (lambda (s* n) - (cond - [(null? s*) n] - [else - (let ([a ($car s*)]) - (unless (string? a) - (error 'string-append "~s is not a string" a)) - (length* ($cdr s*) ($fx+ n ($string-length a))))]))) - (define fill-string - (lambda (s a si sj ai) - (unless ($fx= si sj) - ($string-set! s si ($string-ref a ai)) - (fill-string s a ($fxadd1 si) sj ($fxadd1 ai))))) - (define fill-strings - (lambda (s s* i) - (cond - [(null? s*) s] - [else - (let ([a ($car s*)]) - (let ([n ($string-length a)]) - (let ([j ($fx+ i n)]) - (fill-string s a i j 0) - (fill-strings s ($cdr s*) j))))]))) - (primitive-set! 'string-append - (lambda s* - (let ([n (length* s* 0)]) - (let ([s ($make-string n)]) - (fill-strings s s* 0)))))) - - -(let () - (define fill - (lambda (s d si sj di) - (cond - [($fx= si sj) d] - [else - ($string-set! d di ($string-ref s si)) - (fill s d ($fxadd1 si) sj ($fxadd1 di))]))) - (primitive-set! 'substring - (lambda (s n m) - (unless (string? s) - (error 'substring "~s is not a string" s)) - (let ([len ($string-length s)]) - (unless (and (fixnum? n) - ($fx>= n 0) - ($fx< n len)) - (error 'substring "~s is not a valid start index for ~s" n s)) - (unless (and (fixnum? m) - ($fx>= m 0) - ($fx<= m len)) - (error 'substring "~s is not a valid end index for ~s" m s)) - (let ([len ($fx- m n)]) - (if ($fx<= len 0) - "" - (fill s ($make-string len) n m 0))))))) - -(primitive-set! 'not (lambda (x) (not x))) - -(primitive-set! 'symbol->string - (lambda (x) - (unless (symbol? x) - (error 'symbol->string "~s is not a symbol" x)) - (let ([str ($symbol-string x)]) - (or str - (let ([ct (gensym-count)]) - (let ([str (string-append (gensym-prefix) (fixnum->string ct))]) - ($set-symbol-string! x str) - (gensym-count ($fxadd1 ct)) - str)))))) - -(primitive-set! 'gensym? - (lambda (x) - (and (symbol? x) - (let ([s ($symbol-unique-string x)]) - (and s #t))))) - -(let () - (define f - (lambda (n i j) - (cond - [($fxzero? n) - (values (make-string i) j)] - [else - (let ([q ($fxquotient n 10)]) - (call-with-values - (lambda () (f q ($fxadd1 i) j)) - (lambda (str j) - (let ([r ($fx- n ($fx* q 10))]) - (string-set! str j - ($fixnum->char ($fx+ r ($char->fixnum #\0)))) - (values str ($fxadd1 j))))))]))) - (primitive-set! 'fixnum->string - (lambda (x) - (unless (fixnum? x) (error 'fixnum->string "~s is not a fixnum" x)) - (cond - [($fxzero? x) "0"] - [($fx> x 0) - (call-with-values - (lambda () (f x 0 0)) - (lambda (str j) str))] - [($fx= x -536870912) "-536870912"] - [else - (call-with-values - (lambda () (f ($fx- 0 x) 1 1)) - (lambda (str j) - ($string-set! str 0 #\-) - str))])))) - -(primitive-set! 'top-level-value - (lambda (x) - (unless (symbol? x) - (error 'top-level-value "~s is not a symbol" x)) - (let ([v ($symbol-value x)]) - (when ($unbound-object? v) - (error 'top-level-value "unbound variable ~s" x)) - v))) - -(primitive-set! 'top-level-bound? - (lambda (x) - (unless (symbol? x) - (error 'top-level-bound? "~s is not a symbol" x)) - (not ($unbound-object? ($symbol-value x))))) - -(primitive-set! 'set-top-level-value! - (lambda (x v) - (unless (symbol? x) - (error 'set-top-level-value! "~s is not a symbol" x)) - ($set-symbol-value! x v))) - -(primitive-set! 'symbol? (lambda (x) (symbol? x))) - -(primitive-set! 'primitive? - (lambda (x) - (unless (symbol? x) - (error 'primitive? "~s is not a symbol" x)) - (procedure? (primitive-ref x)))) - -(primitive-set! 'primitive-ref - (lambda (x) - (unless (symbol? x) - (error 'primitive-ref "~s is not a symbol" x)) - (primitive-ref x))) - - -(primitive-set! 'fx+ - (lambda (x y) - (unless (fixnum? x) - (error 'fx+ "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx+ "~s is not a fixnum" y)) - ($fx+ x y))) - -(primitive-set! 'fx- - (lambda (x y) - (unless (fixnum? x) - (error 'fx- "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx- "~s is not a fixnum" y)) - ($fx- x y))) - -(primitive-set! 'fx* - (lambda (x y) - (unless (fixnum? x) - (error 'fx* "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx* "~s is not a fixnum" y)) - ($fx* x y))) - - - -(primitive-set! 'fxquotient - (lambda (x y) - (unless (fixnum? x) - (error 'fxquotient "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxquotient "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxquotient "zero dividend ~s" y)) - ($fxquotient x y))) - - -(primitive-set! 'fxremainder - (lambda (x y) - (unless (fixnum? x) - (error 'fxremainder "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxremainder "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxremainder "zero dividend ~s" y)) - (let ([q ($fxquotient x y)]) - ($fx- x ($fx* q y))))) - - -(primitive-set! 'fxmodulo - (lambda (x y) - (unless (fixnum? x) - (error 'fxmodulo "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxmodulo "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxmodulo "zero dividend ~s" y)) - ($fxmodulo x y))) - - -(primitive-set! 'fxlogor - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogor "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogor "~s is not a fixnum" y)) - ($fxlogor x y))) - -(primitive-set! 'fxlogxor - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogxor "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogxor "~s is not a fixnum" y)) - ($fxlogxor x y))) - -(primitive-set! 'fxlogand - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogand "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogand "~s is not a fixnum" y)) - ($fxlogand x y))) - -(primitive-set! 'fxsra - (lambda (x y) - (unless (fixnum? x) - (error 'fxsra "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxsra "~s is not a fixnum" y)) - (unless ($fx>= y 0) - (error 'fxsra "negative shift not allowed, got ~s" y)) - ($fxsra x y))) - -(primitive-set! 'fxsll - (lambda (x y) - (unless (fixnum? x) - (error 'fxsll "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxsll "~s is not a fixnum" y)) - (unless ($fx>= y 0) - (error 'fxsll "negative shift not allowed, got ~s" y)) - ($fxsll x y))) - -(primitive-set! 'fx= - (lambda (x y) - (unless (fixnum? x) - (error 'fx= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx= "~s is not a fixnum" y)) - ($fx= x y))) - -(primitive-set! 'fx< - (lambda (x y) - (unless (fixnum? x) - (error 'fx< "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx< "~s is not a fixnum" y)) - ($fx< x y))) - -(primitive-set! 'fx<= - (lambda (x y) - (unless (fixnum? x) - (error 'fx<= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx<= "~s is not a fixnum" y)) - ($fx<= x y))) - -(primitive-set! 'fx> - (lambda (x y) - (unless (fixnum? x) - (error 'fx> "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx> "~s is not a fixnum" y)) - ($fx> x y))) - -(primitive-set! 'fx>= - (lambda (x y) - (unless (fixnum? x) - (error 'fx>= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx>= "~s is not a fixnum" y)) - ($fx>= x y))) - -(primitive-set! 'char= - (lambda (x y) - (unless (char? x) - (error 'char= "~s is not a character" x)) - (unless (char? y) - (error 'char= "~s is not a character" y)) - ($char= x y))) - -(primitive-set! 'char< - (lambda (x y) - (unless (char? x) - (error 'char< "~s is not a character" x)) - (unless (char? y) - (error 'char< "~s is not a character" y)) - ($char< x y))) - -(primitive-set! 'char<= - (lambda (x y) - (unless (char? x) - (error 'char<= "~s is not a character" x)) - (unless (char? y) - (error 'char<= "~s is not a character" y)) - ($char<= x y))) - -(primitive-set! 'char> - (lambda (x y) - (unless (char? x) - (error 'char> "~s is not a character" x)) - (unless (char? y) - (error 'char> "~s is not a character" y)) - ($char> x y))) - -(primitive-set! 'char>= - (lambda (x y) - (unless (char? x) - (error 'char>= "~s is not a character" x)) - (unless (char? y) - (error 'char>= "~s is not a character" y)) - ($char>= x y))) - -(primitive-set! 'cons (lambda (x y) (cons x y))) - -(primitive-set! 'eq? (lambda (x y) (eq? x y))) - -(primitive-set! 'set-car! - (lambda (x y) - (unless (pair? x) - (error 'set-car! "~s is not a pair" x)) - ($set-car! x y))) - -(primitive-set! 'set-cdr! - (lambda (x y) - (unless (pair? x) - (error 'set-cdr! "~s is not a pair" x)) - ($set-cdr! x y))) - -(primitive-set! 'vector-ref - (lambda (v i) - (unless (vector? v) - (error 'vector-ref "~s is not a vector" v)) - (unless (fixnum? i) - (error 'vector-ref "~s is not a valid index" i)) - (unless (and ($fx< i ($vector-length v)) - ($fx<= 0 i)) - (error 'vector-ref "index ~s is out of range for ~s" i v)) - ($vector-ref v i))) - -(primitive-set! 'string-ref - (lambda (s i) - (unless (string? s) - (error 'string-ref "~s is not a string" s)) - (unless (fixnum? i) - (error 'string-ref "~s is not a valid index" i)) - (unless (and ($fx< i ($string-length s)) - ($fx<= 0 i)) - (error 'string-ref "index ~s is out of range for ~s" i s)) - ($string-ref s i))) - -(primitive-set! 'vector-set! - (lambda (v i c) - (unless (vector? v) - (error 'vector-set! "~s is not a vector" v)) - (unless (fixnum? i) - (error 'vector-set! "~s is not a valid index" i)) - (unless (and ($fx< i ($vector-length v)) - ($fx<= 0 i)) - (error 'vector-set! "index ~s is out of range for ~s" i v)) - ($vector-set! v i c))) - - -(primitive-set! 'string-set! - (lambda (s i c) - (unless (string? s) - (error 'string-set! "~s is not a string" s)) - (unless (fixnum? i) - (error 'string-set! "~s is not a valid index" i)) - (unless (and ($fx< i ($string-length s)) - ($fx>= i 0)) - (error 'string-set! "index ~s is out of range for ~s" i s)) - (unless (char? c) - (error 'string-set! "~s is not a character" c)) - ($string-set! s i c))) - -(primitive-set! 'vector - (letrec ([length - (lambda (ls n) - (cond - [(null? ls) n] - [else (length ($cdr ls) ($fx+ n 1))]))] - [loop - (lambda (v ls i n) - (cond - [($fx= i n) v] - [else - ($vector-set! v i ($car ls)) - (loop v ($cdr ls) ($fx+ i 1) n)]))]) - (lambda ls - (let ([n (length ls 0)]) - (let ([v (make-vector n)]) - (loop v ls 0 n)))))) - -(letrec ([length - (lambda (ls n) - (cond - [(null? ls) n] - [else (length ($cdr ls) ($fx+ n 1))]))] - [loop - (lambda (s ls i n) - (cond - [($fx= i n) s] - [else - (let ([c ($car ls)]) - (unless (char? c) - (error 'string "~s is not a character" c)) - ($string-set! s i c) - (loop s ($cdr ls) ($fx+ i 1) n))]))]) - (let ([f - (lambda ls - (let ([n (length ls 0)]) - (let ([s ($make-string n)]) - (loop s ls 0 n))))]) - (primitive-set! 'string f))) - -(primitive-set! 'list? - (letrec ([race - (lambda (h t) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (and (not (eq? h t)) - (race ($cdr h) ($cdr t))) - (null? h))) - (null? h)))]) - (lambda (x) (race x x)))) - - - -(primitive-set! 'reverse - (letrec ([race - (lambda (h t ls ac) - (if (pair? h) - (let ([h ($cdr h)] [ac (cons ($car h) ac)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls (cons ($car h) ac)) - (error 'reverse "~s is a circular list" ls)) - (if (null? h) - ac - (error 'reverse "~s is not a proper list" ls)))) - (if (null? h) - ac - (error 'reverse "~s is not a proper list" ls))))]) - (lambda (x) - (race x x x '())))) - -(primitive-set! 'memq - (letrec ([race - (lambda (h t ls x) - (if (pair? h) - (if (eq? ($car h) x) - h - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? ($car h) x) - h - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls x) - (error 'memq "circular list ~s" ls))) - (if (null? h) - '#f - (error 'memq "~s is not a proper list" ls))))) - (if (null? h) - '#f - (error 'memq "~s is not a proper list" ls))))]) - (lambda (x ls) - (race ls ls ls x)))) - -(primitive-set! 'list->string - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'reverse "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'reverse "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'reverse "~s is not a proper list" ls))))] - [fill - (lambda (s i ls) - (cond - [(null? ls) s] - [else - (let ([c ($car ls)]) - (unless (char? c) - (error 'list->string "~s is not a character" c)) - ($string-set! s i c) - (fill s ($fxadd1 i) (cdr ls)))]))]) - (lambda (ls) - (let ([n (race ls ls ls 0)]) - (let ([s ($make-string n)]) - (fill s 0 ls)))))) - -(primitive-set! 'length - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'length "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'length "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'length "~s is not a proper list" ls))))]) - (lambda (ls) - (race ls ls ls 0)))) - - -(primitive-set! 'list-ref - (lambda (list index) - (define f - (lambda (ls i) - (cond - [($fxzero? i) - (if (pair? ls) - ($car ls) - (error 'list-ref "index ~s is out of range for ~s" index list))] - [(pair? ls) - (f ($cdr ls) ($fxsub1 i))] - [(null? ls) - (error 'list-rec "index ~s is out of range for ~s" index list)] - [else (error 'list-ref "~s is not a list" list)]))) - (unless (and (fixnum? index) ($fx>= index 0)) - (error 'list-ref "~s is not a valid index" index)) - (f list index))) - - - -;(primitive-set! 'apply -; (letrec ([fix -; (lambda (arg arg*) -; (cond -; [(null? arg*) -; (if (list? arg) -; arg -; (error 'apply "last arg is not a list"))] -; [else -; (cons arg (fix ($car arg*) ($cdr arg*)))]))]) -; (lambda (f arg . arg*) -; (unless (procedure? f) -; (error 'apply "APPLY ~s ~s ~s" f arg arg*)) -; ($apply f (fix arg arg*))))) -; - -(primitive-set! 'apply - (letrec ([fix - (lambda (arg arg*) - (cond - [(null? arg*) - (if (list? arg) - arg - (error 'apply "last arg is not a list"))] - [else - (cons arg (fix ($car arg*) ($cdr arg*)))]))]) - (lambda (f arg . arg*) - (unless (procedure? f) - (error 'apply "APPLY ~s ~s ~s" f arg arg*)) - (let ([args (fix arg arg*)]) - ($apply f args))))) - - -(primitive-set! 'assq - (letrec ([race - (lambda (x h t ls) - (if (pair? h) - (let ([a ($car h)] [h ($cdr h)]) - (if (pair? a) - (if (eq? ($car a) x) - a - (if (pair? h) - (if (not (eq? h t)) - (let ([a ($car h)]) - (if (pair? a) - (if (eq? ($car a) x) - a - (race x ($cdr h) ($cdr t) ls)) - (error 'assq "malformed alist ~s" - ls))) - (error 'assq "circular list ~s" ls)) - (if (null? h) - #f - (error 'assq "~s is not a proper list" ls)))) - (error 'assq "malformed alist ~s" ls))) - (if (null? h) - #f - (error 'assq "~s is not a proper list" ls))))]) - (lambda (x ls) - (race x ls ls ls)))) - -(primitive-set! 'string->symbol - (lambda (x) - (unless (string? x) - (error 'string->symbol "~s is not a string" x)) - (foreign-call "ik_intern_string" x))) - -(primitive-set! 'oblist - (lambda () - (foreign-call "ik_oblist"))) - -(primitive-set! 'gensym - (lambda args - (if (null? args) - ($make-symbol #f) - (if (null? ($cdr args)) - (let ([a ($car args)]) - (if (string? a) - ($make-symbol a) - (error 'gensym "~s is not a string" a))) - (error 'gensym "too many arguments"))))) - -(primitive-set! 'putprop - (lambda (x k v) - (unless (symbol? x) (error 'putprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'putprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (cond - [(assq k p) => (lambda (x) (set-cdr! x v))] - [else - ($set-symbol-plist! x (cons (cons k v) p))])))) - -(primitive-set! 'getprop - (lambda (x k) - (unless (symbol? x) (error 'getprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'getprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (cond - [(assq k p) => cdr] - [else #f])))) - -(primitive-set! 'remprop - (lambda (x k) - (unless (symbol? x) (error 'remprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'remprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (unless (null? p) - (let ([a ($car p)]) - (cond - [(eq? ($car a) k) ($set-symbol-plist! x ($cdr p))] - [else - (let f ([q p] [p ($cdr p)]) - (unless (null? p) - (let ([a ($car p)]) - (cond - [(eq? ($car a) k) - ($set-cdr! q ($cdr p))] - [else - (f p ($cdr p))]))))])))))) - -(primitive-set! 'property-list - (lambda (x) - (unless (symbol? x) - (error 'property-list "~s is not a symbol" x)) - (letrec ([f - (lambda (ls ac) - (cond - [(null? ls) ac] - [else - (let ([a ($car ls)]) - (f ($cdr ls) - (cons ($car a) (cons ($cdr a) ac))))]))]) - (f ($symbol-plist x) '())))) - - -(primitive-set! 'make-parameter - (letrec ([make-param-no-guard - (lambda (x) - (lambda args - (if (null? args) - x - (if (null? ($cdr args)) - (set! x ($car args)) - (error #f "too many arguments to parameter")))))] - [make-param-with-guard - (lambda (x g) - (let ([f - (lambda args - (if (null? args) - x - (if (null? ($cdr args)) - (set! x (g ($car args))) - (error #f "too many arguments to parameter"))))]) - (if (procedure? g) - (begin (set! x (g x)) f) - (error 'make-parameter "not a procedure ~s" g))))]) - (lambda args - (if (pair? args) - (let ([x ($car args)] [args ($cdr args)]) - (if (null? args) - (make-param-no-guard x) - (let ([g ($car args)]) - (if (null? ($cdr args)) - (make-param-with-guard x g) - (error 'make-parameter "too many arguments"))))) - (error 'make-parameter "insufficient arguments"))))) - -(let () - (define vector-loop - (lambda (x y i n) - (or ($fx= i n) - (and (equal? ($vector-ref x i) ($vector-ref y i)) - (vector-loop x y ($fxadd1 i) n))))) - (define string-loop - (lambda (x y i n) - (or ($fx= i n) - (and ($char= ($string-ref x i) ($string-ref y i)) - (string-loop x y ($fxadd1 i) n))))) - (define equal? - (lambda (x y) - (cond - [(eq? x y) #t] - [(pair? x) - (and (pair? y) - (equal? ($car x) ($car y)) - (equal? ($cdr x) ($cdr y)))] - [(vector? x) - (and (vector? y) - (let ([n ($vector-length x)]) - (and ($fx= n ($vector-length y)) - (vector-loop x y 0 n))))] - [(string? x) - (and (string? y) - (let ([n ($string-length x)]) - (and ($fx= n ($string-length y)) - (string-loop x y 0 n))))] - [else #f]))) - (primitive-set! 'equal? equal?)) - - -(let () - (define who 'map) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - - (define map1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (cons (f a) - (map1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (cons (f a) '()) - (error who "list was altered"))] - [else (error who "list was altered")]))) - - (define map2 - (lambda (f a1 a2 d1 d2 n) - (cond - [(pair? d1) - (cond - [(pair? d2) - (if ($fxzero? n) - (error who "list was altered") - (cons (f a1 a2) - (map2 f - ($car d1) ($car d2) - ($cdr d1) ($cdr d2) - ($fxsub1 n))))] - [else (error who "length mismatch")])] - [(null? d1) - (cond - [(null? d2) - (if ($fxzero? n) - (cons (f a1 a2) '()) - (error who "list was altered"))] - [else (error who "length mismatch")])] - [else (error who "list was altered")]))) - - (define cars - (lambda (ls*) - (cond - [(null? ls*) '()] - [else - (let ([a (car ls*)]) - (cond - [(pair? a) - (cons (car a) (cars (cdr ls*)))] - [else - (error 'map "length mismatch")]))]))) - (define cdrs - (lambda (ls*) - (cond - [(null? ls*) '()] - [else - (let ([a (car ls*)]) - (cond - [(pair? a) - (cons (cdr a) (cdrs (cdr ls*)))] - [else - (error 'map "length mismatch")]))]))) - (define mapm - (lambda (f ls ls* n) - (cond - [(null? ls) - (if (andmap null? ls*) - (if (fxzero? n) - '() - (error 'map "lists were mutated during operation")) - (error 'map "length mismatch"))] - [(fxzero? n) - (error 'map "lists were mutated during operation")] - [else - (cons - (apply f (car ls) (cars ls*)) - (mapm f (cdr ls) (cdrs ls*) (fxsub1 n)))]))) - - (define dup - (lambda (ls ac) - (cond - [(null? ls) ac] - [else (dup (cdr ls) (cons '() ac))]))) - (primitive-set! 'map - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (map1 f ($car ls) d (len d d 0)))] - [(null? ls) '()] - [else (error who "improper list")])] - [(null? ($cdr ls*)) - (let ([ls2 ($car ls*)]) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (map2 f ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - '() - (error who "length mismatch"))] - [else (error who "not a list")]))] - [else - (cond - [(pair? ls) - (let ([n (len ls ls 0)]) - (mapm f ls ls* n))] - [(null? ls) - (if (andmap null? ls*) - '() - (error who "length mismatch"))])])))) - -(let () - (define who 'for-each) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - - (define for-each1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (begin - (f a) - (for-each1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - - (define for-each2 - (lambda (f a1 a2 d1 d2 n) - (cond - [(pair? d1) - (cond - [(pair? d2) - (if ($fxzero? n) - (error who "list was altered") - (begin - (f a1 a2) - (for-each2 f - ($car d1) ($car d2) - ($cdr d1) ($cdr d2) - ($fxsub1 n))))] - [else (error who "length mismatch")])] - [(null? d1) - (cond - [(null? d2) - (if ($fxzero? n) - (f a1 a2) - (error who "list was altered"))] - [else (error who "length mismatch")])] - [else (error who "list was altered")]))) - - (primitive-set! 'for-each - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (for-each1 f ($car ls) d (len d d 0)))] - [(null? ls) (void)] - [else (error who "improper list")])] - [(null? ($cdr ls*)) - (let ([ls2 ($car ls*)]) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (for-each2 f - ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - (void) - (error who "length mismatch"))] - [else (error who "not a list")]))] - [else (error who "vararg not supported yet")])))) - - - -(let () - (define who 'andmap) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - - (define andmap1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (and (f a) - (andmap1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - - (primitive-set! 'andmap - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (andmap1 f ($car ls) d (len d d 0)))] - [(null? ls) #t] - [else (error who "improper list")])] - [else (error who "vararg not supported yet")])))) - - -(let () - (define who 'ormap) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - - (define ormap1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (or (f a) - (ormap1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - - (primitive-set! 'ormap - (lambda (f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(null? ls*) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (ormap1 f ($car ls) d (len d d 0)))] - [(null? ls) #f] - [else (error who "improper list")])] - [else (error who "vararg not supported yet")])))) - - - - -(let () - (define reverse - (lambda (h t ls ac) - (if (pair? h) - (let ([h ($cdr h)] [a1 ($car h)]) - (if (pair? h) - (if (not (eq? h t)) - (let ([a2 ($car h)]) - (reverse ($cdr h) ($cdr t) ls (cons a2 (cons a1 ac)))) - (error 'append "circular list ~s" ls)) - (if (null? h) - (cons a1 ac) - (error 'append "~s is not a proper list" ls)))) - (if (null? h) - ac - (error 'append "~s is not a proper list" ls))))) - (define revcons - (lambda (ls ac) - (cond - [(null? ls) ac] - [else - (revcons ($cdr ls) (cons ($car ls) ac))]))) - (define append - (lambda (ls ls*) - (cond - [(null? ls*) ls] - [else - (revcons (reverse ls ls ls '()) - (append ($car ls*) ($cdr ls*)))]))) - (primitive-set! 'append - (lambda (ls . ls*) - (append ls ls*)))) - - -(primitive-set! 'list->vector - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'list->vector "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'list->vector "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'list->vector "~s is not a proper list" ls))))] - [fill - (lambda (v i ls) - (cond - [(null? ls) v] - [else - (let ([c ($car ls)]) - ($vector-set! v i c) - (fill v ($fxadd1 i) (cdr ls)))]))]) - (lambda (ls) - (let ([n (race ls ls ls 0)]) - (let ([v (make-vector n)]) - (fill v 0 ls)))))) - - -(let () - (define f - (lambda (v i ls) - (cond - [($fx< i 0) ls] - [else - (f v ($fxsub1 i) (cons ($vector-ref v i) ls))]))) - (primitive-set! 'vector->list - (lambda (v) - (if (vector? v) - (let ([n ($vector-length v)]) - (if ($fxzero? n) - '() - (f v ($fxsub1 n) '()))) - (error 'vector->list "~s is not a vector" v))))) - -(let () - (define f - (lambda (n fill ls) - (cond - [($fxzero? n) ls] - [else - (f ($fxsub1 n) fill (cons fill ls))]))) - (primitive-set! 'make-list - (lambda (n . args) - (let ([fill - (if (null? args) - (void) - (if (null? (cdr args)) - (car args) - (error 'make-list "too many arguments")))]) - (if (fixnum? n) - (if ($fx>= n 0) - (f n fill '()) - (error 'make-list "negative size ~s" n)) - (error 'make-list "invalid size ~s" n)))))) - -(primitive-set! 'list (lambda x x)) - -(primitive-set! 'uuid - (lambda () - (let ([s (make-string 36)]) - (foreign-call "ik_uuid" s)))) - -(primitive-set! 'gensym->unique-string - (lambda (x) - (unless (symbol? x) - (error 'gensym->unique-string "~s is not a gensym" x)) - (let ([us ($symbol-unique-string x)]) - (cond - [(string? us) us] - [(eq? us #t) - (error 'gensym->unique-string "~s is not a gensym" x)] - [else - (let ([id (uuid)]) - ($set-symbol-unique-string! x id) - id)])))) - -(primitive-set! 'gensym-prefix - (make-parameter - "g" - (lambda (x) - (unless (string? x) - (error 'gensym-prefix "~s is not a string" x)) - x))) - -(primitive-set! 'gensym-count - (make-parameter - 0 - (lambda (x) - (unless (and (fixnum? x) ($fx>= x 0)) - (error 'gensym-count "~s is not a valid count" x)) - x))) - -(primitive-set! 'print-gensym - (make-parameter - #t - (lambda (x) - (unless (boolean? x) - (error 'print-gensym "~s is not a boolean" x)) - x))) - - -(primitive-set! 'make-hash-table - (lambda () - (make-hash-table))) - -(primitive-set! 'hash-table? - (lambda (x) - (hash-table? x))) - -(primitive-set! 'get-hash-table - (lambda (h k v) - (foreign-call "ik_get_hash_table" h k v))) - -(primitive-set! 'put-hash-table! - (lambda (h k v) - (foreign-call "ik_put_hash_table" h k v))) - diff --git a/src/libcore-6.1.ss b/src/libcore-6.1.ss deleted file mode 100644 index bed6703..0000000 --- a/src/libcore-6.1.ss +++ /dev/null @@ -1,1596 +0,0 @@ - -;;; 6.1: added uses of case-lambda to replace the ugly code -;;; 6.0: basic version working - - -(primitive-set! 'call-with-values - ($make-call-with-values-procedure)) - -(primitive-set! 'values - ($make-values-procedure)) - -(primitive-set! 'exit - (case-lambda - [() (exit 0)] - [(status) (foreign-call "exit" status)])) - -(primitive-set! 'eof-object - (lambda () (eof-object))) - -(primitive-set! 'void - (lambda () (void))) - -(primitive-set! 'eof-object? - (lambda (x) (eof-object? x))) - -(primitive-set! 'fxadd1 - (lambda (n) - (unless (fixnum? n) - (error 'fxadd1 "~s is not a fixnum" n)) - ($fxadd1 n))) - -(primitive-set! 'fxsub1 - (lambda (n) - (unless (fixnum? n) - (error 'fxsub1 "~s is not a fixnum" n)) - ($fxsub1 n))) - -(primitive-set! 'integer->char - (lambda (n) - (unless (fixnum? n) - (error 'integer->char "~s is not a fixnum" n)) - (unless (and ($fx>= n 0) - ($fx<= n 255)) - (error 'integer->char "~s is out of range[0..255]" n)) - ($fixnum->char n))) - -(primitive-set! 'char->integer - (lambda (x) - (unless (char? x) - (error 'char->integer "~s is not a character" x)) - ($char->fixnum x))) - -(primitive-set! 'fxlognot - (lambda (x) - (unless (fixnum? x) - (error 'fxlognot "~s is not a fixnum" x)) - ($fxlognot x))) - -(primitive-set! 'fixnum? (lambda (x) (fixnum? x))) -(primitive-set! 'immediate? (lambda (x) (immediate? x))) - -(primitive-set! 'fxzero? - (lambda (x) - (unless (fixnum? x) - (error 'fxzero? "~s is not a fixnum" x)) - ($fxzero? x))) - -(primitive-set! 'boolean? (lambda (x) (boolean? x))) - -(primitive-set! 'char? (lambda (x) (char? x))) - -(primitive-set! 'vector? (lambda (x) (vector? x))) - -(primitive-set! 'string? (lambda (x) (string? x))) - -(primitive-set! 'procedure? (lambda (x) (procedure? x))) - -(primitive-set! 'null? (lambda (x) (null? x))) - -(primitive-set! 'pair? (lambda (x) (pair? x))) - -(let () - (define fill! - (lambda (v i n fill) - (cond - [($fx= i n) v] - [else - ($vector-set! v i fill) - (fill! v ($fx+ i 1) n fill)]))) - (define make-vector - (case-lambda - [(n) (make-vector n (void))] - [(n fill) - (unless (and (fixnum? n) (fx>= n 0)) - (error 'make-vector "~s is not a valid length" n)) - (fill! ($make-vector n) 0 n fill)])) - (primitive-set! 'make-vector make-vector)) - -(primitive-set! 'vector-length - (lambda (x) - (unless (vector? x) - (error 'vector-length "~s is not a vector" x)) - ($vector-length x))) - -(let () - (define fill! - (lambda (s i n c) - (cond - [($fx= i n) s] - [else - ($string-set! s i c) - (fill! s ($fx+ i 1) n c)]))) - (define make-string - (case-lambda - [(n) - (unless (and (fixnum? n) (fx>= n 0)) - (error 'make-string "~s is not a valid length" n)) - ($make-string n)] - [(n c) - (unless (and (fixnum? n) (fx>= n 0)) - (error 'make-string "~s is not a valid length" n)) - (unless (char? c) - (error 'make-string "~s is not a character" c)) - (fill! ($make-string n) 0 n c)])) - (primitive-set! 'make-string make-string)) - - -(primitive-set! 'string-length - (lambda (x) - (unless (string? x) - (error 'string-length "~s is not a string" x)) - ($string-length x))) - -(primitive-set! 'string->list - (lambda (x) - (unless (string? x) - (error 'string->list "~s is not a string" x)) - (let f ([x x] [i ($string-length x)] [ac '()]) - (cond - [($fxzero? i) ac] - [else - (let ([i ($fxsub1 i)]) - (f x i (cons ($string-ref x i) ac)))])))) - - -(let () - (define bstring=? - (lambda (s1 s2 i j) - (or ($fx= i j) - (and ($char= ($string-ref s1 i) ($string-ref s2 i)) - (bstring=? s1 s2 ($fxadd1 i) j))))) - (define check-strings-and-return-false - (lambda (s*) - (cond - [(null? s*) #f] - [(string? ($car s*)) - (check-strings-and-return-false ($cdr s*))] - [else (err ($car s*))]))) - (define strings=? - (lambda (s s* n) - (or (null? s*) - (let ([a ($car s*)]) - (unless (string? a) - (error 'string=? "~s is not a string" a)) - (if ($fx= n ($string-length a)) - (and (strings=? s ($cdr s*) n) - (bstring=? s a 0 n)) - (check-strings-and-return-false ($cdr s*))))))) - (define (err x) - (error 'string=? "~s is not a string" x)) - (primitive-set! 'string=? - (case-lambda - [(s s1) - (if (string? s) - (if (string? s1) - (let ([n ($string-length s)]) - (and ($fx= n ($string-length s1)) - (bstring=? s s1 0 n))) - (err s1)) - (err s))] - [(s . s*) - (if (string? s) - (strings=? s s* ($string-length s)) - (err s))]))) - - - -(let () - ;; FIXME: make nonconsing on 0,1,2, and 3 args - (define length* - (lambda (s* n) - (cond - [(null? s*) n] - [else - (let ([a ($car s*)]) - (unless (string? a) - (error 'string-append "~s is not a string" a)) - (length* ($cdr s*) ($fx+ n ($string-length a))))]))) - (define fill-string - (lambda (s a si sj ai) - (unless ($fx= si sj) - ($string-set! s si ($string-ref a ai)) - (fill-string s a ($fxadd1 si) sj ($fxadd1 ai))))) - (define fill-strings - (lambda (s s* i) - (cond - [(null? s*) s] - [else - (let ([a ($car s*)]) - (let ([n ($string-length a)]) - (let ([j ($fx+ i n)]) - (fill-string s a i j 0) - (fill-strings s ($cdr s*) j))))]))) - (primitive-set! 'string-append - (lambda s* - (let ([n (length* s* 0)]) - (let ([s ($make-string n)]) - (fill-strings s s* 0)))))) - - -(let () - (define fill - (lambda (s d si sj di) - (cond - [($fx= si sj) d] - [else - ($string-set! d di ($string-ref s si)) - (fill s d ($fxadd1 si) sj ($fxadd1 di))]))) - (primitive-set! 'substring - (lambda (s n m) - (unless (string? s) - (error 'substring "~s is not a string" s)) - (let ([len ($string-length s)]) - (unless (and (fixnum? n) - ($fx>= n 0) - ($fx< n len)) - (error 'substring "~s is not a valid start index for ~s" n s)) - (unless (and (fixnum? m) - ($fx>= m 0) - ($fx<= m len)) - (error 'substring "~s is not a valid end index for ~s" m s)) - (let ([len ($fx- m n)]) - (if ($fx<= len 0) - "" - (fill s ($make-string len) n m 0))))))) - -(primitive-set! 'not (lambda (x) (not x))) - -(primitive-set! 'symbol->string - (lambda (x) - (unless (symbol? x) - (error 'symbol->string "~s is not a symbol" x)) - (let ([str ($symbol-string x)]) - (or str - (let ([ct (gensym-count)]) - (let ([str (string-append (gensym-prefix) (fixnum->string ct))]) - ($set-symbol-string! x str) - (gensym-count ($fxadd1 ct)) - str)))))) - -(primitive-set! 'gensym? - (lambda (x) - (and (symbol? x) - (let ([s ($symbol-unique-string x)]) - (and s #t))))) - -(let () - (define f - (lambda (n i j) - (cond - [($fxzero? n) - (values (make-string i) j)] - [else - (let ([q ($fxquotient n 10)]) - (call-with-values - (lambda () (f q ($fxadd1 i) j)) - (lambda (str j) - (let ([r ($fx- n ($fx* q 10))]) - (string-set! str j - ($fixnum->char ($fx+ r ($char->fixnum #\0)))) - (values str ($fxadd1 j))))))]))) - (primitive-set! 'fixnum->string - (lambda (x) - (unless (fixnum? x) (error 'fixnum->string "~s is not a fixnum" x)) - (cond - [($fxzero? x) "0"] - [($fx> x 0) - (call-with-values - (lambda () (f x 0 0)) - (lambda (str j) str))] - [($fx= x -536870912) "-536870912"] - [else - (call-with-values - (lambda () (f ($fx- 0 x) 1 1)) - (lambda (str j) - ($string-set! str 0 #\-) - str))])))) - -(primitive-set! 'top-level-value - (lambda (x) - (unless (symbol? x) - (error 'top-level-value "~s is not a symbol" x)) - (let ([v ($symbol-value x)]) - (when ($unbound-object? v) - (error 'top-level-value "unbound variable ~s" x)) - v))) - -(primitive-set! 'top-level-bound? - (lambda (x) - (unless (symbol? x) - (error 'top-level-bound? "~s is not a symbol" x)) - (not ($unbound-object? ($symbol-value x))))) - -(primitive-set! 'set-top-level-value! - (lambda (x v) - (unless (symbol? x) - (error 'set-top-level-value! "~s is not a symbol" x)) - ($set-symbol-value! x v))) - -(primitive-set! 'symbol? (lambda (x) (symbol? x))) - -(primitive-set! 'primitive? - (lambda (x) - (unless (symbol? x) - (error 'primitive? "~s is not a symbol" x)) - (procedure? (primitive-ref x)))) - -(primitive-set! 'primitive-ref - (lambda (x) - (unless (symbol? x) - (error 'primitive-ref "~s is not a symbol" x)) - (let ([v (primitive-ref x)]) - (unless (procedure? v) - (error 'primitive-ref "~s is not a primitive" x)) - v))) - -(primitive-set! 'fx+ - (lambda (x y) - (unless (fixnum? x) - (error 'fx+ "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx+ "~s is not a fixnum" y)) - ($fx+ x y))) - -(primitive-set! 'fx- - (lambda (x y) - (unless (fixnum? x) - (error 'fx- "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx- "~s is not a fixnum" y)) - ($fx- x y))) - -(primitive-set! 'fx* - (lambda (x y) - (unless (fixnum? x) - (error 'fx* "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx* "~s is not a fixnum" y)) - ($fx* x y))) - - - -(primitive-set! 'fxquotient - (lambda (x y) - (unless (fixnum? x) - (error 'fxquotient "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxquotient "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxquotient "zero dividend ~s" y)) - ($fxquotient x y))) - - -(primitive-set! 'fxremainder - (lambda (x y) - (unless (fixnum? x) - (error 'fxremainder "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxremainder "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxremainder "zero dividend ~s" y)) - (let ([q ($fxquotient x y)]) - ($fx- x ($fx* q y))))) - - -(primitive-set! 'fxmodulo - (lambda (x y) - (unless (fixnum? x) - (error 'fxmodulo "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxmodulo "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxmodulo "zero dividend ~s" y)) - ($fxmodulo x y))) - - -(primitive-set! 'fxlogor - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogor "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogor "~s is not a fixnum" y)) - ($fxlogor x y))) - -(primitive-set! 'fxlogxor - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogxor "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogxor "~s is not a fixnum" y)) - ($fxlogxor x y))) - -(primitive-set! 'fxlogand - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogand "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogand "~s is not a fixnum" y)) - ($fxlogand x y))) - -(primitive-set! 'fxsra - (lambda (x y) - (unless (fixnum? x) - (error 'fxsra "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxsra "~s is not a fixnum" y)) - (unless ($fx>= y 0) - (error 'fxsra "negative shift not allowed, got ~s" y)) - ($fxsra x y))) - -(primitive-set! 'fxsll - (lambda (x y) - (unless (fixnum? x) - (error 'fxsll "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxsll "~s is not a fixnum" y)) - (unless ($fx>= y 0) - (error 'fxsll "negative shift not allowed, got ~s" y)) - ($fxsll x y))) - -(primitive-set! 'fx= - (lambda (x y) - (unless (fixnum? x) - (error 'fx= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx= "~s is not a fixnum" y)) - ($fx= x y))) - -(primitive-set! 'fx< - (lambda (x y) - (unless (fixnum? x) - (error 'fx< "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx< "~s is not a fixnum" y)) - ($fx< x y))) - -(primitive-set! 'fx<= - (lambda (x y) - (unless (fixnum? x) - (error 'fx<= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx<= "~s is not a fixnum" y)) - ($fx<= x y))) - -(primitive-set! 'fx> - (lambda (x y) - (unless (fixnum? x) - (error 'fx> "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx> "~s is not a fixnum" y)) - ($fx> x y))) - -(primitive-set! 'fx>= - (lambda (x y) - (unless (fixnum? x) - (error 'fx>= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx>= "~s is not a fixnum" y)) - ($fx>= x y))) - - -(primitive-set! 'char=? - (let () - (define (err x) - (error 'char=? "~s is not a character" x)) - (case-lambda - [(c1 c2) - (if (char? c1) - (if (char? c2) - ($char= c1 c2) - (err c2)) - (err c1))] - [(c1 c2 c3) - (if (char? c1) - (if (char? c2) - (if (char? c3) - (and ($char= c1 c2) - ($char= c2 c3)) - (err c3)) - (err c2)) - (err c1))] - [(c1 . c*) - (if (char? c1) - (let f ([c* c*]) - (or (null? c*) - (let ([c2 ($car c*)]) - (if (char? c2) - (if ($char= c1 c2) - (f ($cdr c*)) - (let g ([c* ($cdr c*)]) - (if (null? c*) - #f - (if (char? ($car c*)) - (g ($cdr c*)) - (err ($car c*)))))) - (err c2))))) - (err c1))]))) - - -(primitive-set! 'char? - (let () - (define (err x) - (error 'char>? "~s is not a character" x)) - (case-lambda - [(c1 c2) - (if (char? c1) - (if (char? c2) - ($char> c1 c2) - (err c2)) - (err c1))] - [(c1 c2 c3) - (if (char? c1) - (if (char? c2) - (if (char? c3) - (and ($char> c1 c2) - ($char> c2 c3)) - (err c3)) - (err c2)) - (err c1))] - [(c1 . c*) - (if (char? c1) - (let f ([c1 c1] [c* c*]) - (or (null? c*) - (let ([c2 ($car c*)]) - (if (char? c2) - (if ($char> c1 c2) - (f c2 ($cdr c*)) - (let g ([c* ($cdr c*)]) - (if (null? c*) - #f - (if (char? ($car c*)) - (g ($cdr c*)) - (err ($car c*)))))) - (err c2))))) - (err c1))]))) - -(primitive-set! 'char>=? - (let () - (define (err x) - (error 'char>=? "~s is not a character" x)) - (case-lambda - [(c1 c2) - (if (char? c1) - (if (char? c2) - ($char>= c1 c2) - (err c2)) - (err c1))] - [(c1 c2 c3) - (if (char? c1) - (if (char? c2) - (if (char? c3) - (and ($char>= c1 c2) - ($char>= c2 c3)) - (err c3)) - (err c2)) - (err c1))] - [(c1 . c*) - (if (char? c1) - (let f ([c1 c1] [c* c*]) - (or (null? c*) - (let ([c2 ($car c*)]) - (if (char? c2) - (if ($char>= c1 c2) - (f c2 ($cdr c*)) - (let g ([c* ($cdr c*)]) - (if (null? c*) - #f - (if (char? ($car c*)) - (g ($cdr c*)) - (err ($car c*)))))) - (err c2))))) - (err c1))]))) - - -(primitive-set! 'cons (lambda (x y) (cons x y))) - -(primitive-set! 'eq? (lambda (x y) (eq? x y))) - -(primitive-set! 'set-car! - (lambda (x y) - (unless (pair? x) - (error 'set-car! "~s is not a pair" x)) - ($set-car! x y))) - -(primitive-set! 'set-cdr! - (lambda (x y) - (unless (pair? x) - (error 'set-cdr! "~s is not a pair" x)) - ($set-cdr! x y))) - -(primitive-set! 'vector-ref - (lambda (v i) - (unless (vector? v) - (error 'vector-ref "~s is not a vector" v)) - (unless (fixnum? i) - (error 'vector-ref "~s is not a valid index" i)) - (unless (and ($fx< i ($vector-length v)) - ($fx<= 0 i)) - (error 'vector-ref "index ~s is out of range for ~s" i v)) - ($vector-ref v i))) - -(primitive-set! 'string-ref - (lambda (s i) - (unless (string? s) - (error 'string-ref "~s is not a string" s)) - (unless (fixnum? i) - (error 'string-ref "~s is not a valid index" i)) - (unless (and ($fx< i ($string-length s)) - ($fx<= 0 i)) - (error 'string-ref "index ~s is out of range for ~s" i s)) - ($string-ref s i))) - -(primitive-set! 'vector-set! - (lambda (v i c) - (unless (vector? v) - (error 'vector-set! "~s is not a vector" v)) - (unless (fixnum? i) - (error 'vector-set! "~s is not a valid index" i)) - (unless (and ($fx< i ($vector-length v)) - ($fx<= 0 i)) - (error 'vector-set! "index ~s is out of range for ~s" i v)) - ($vector-set! v i c))) - - -(primitive-set! 'string-set! - (lambda (s i c) - (unless (string? s) - (error 'string-set! "~s is not a string" s)) - (unless (fixnum? i) - (error 'string-set! "~s is not a valid index" i)) - (unless (and ($fx< i ($string-length s)) - ($fx>= i 0)) - (error 'string-set! "index ~s is out of range for ~s" i s)) - (unless (char? c) - (error 'string-set! "~s is not a character" c)) - ($string-set! s i c))) - -(primitive-set! 'vector - ;;; FIXME: add case-lambda - (letrec ([length - (lambda (ls n) - (cond - [(null? ls) n] - [else (length ($cdr ls) ($fx+ n 1))]))] - [loop - (lambda (v ls i n) - (cond - [($fx= i n) v] - [else - ($vector-set! v i ($car ls)) - (loop v ($cdr ls) ($fx+ i 1) n)]))]) - (lambda ls - (let ([n (length ls 0)]) - (let ([v (make-vector n)]) - (loop v ls 0 n)))))) - -(primitive-set! 'string - ;;; FIXME: add case-lambda - (letrec ([length - (lambda (ls n) - (cond - [(null? ls) n] - [(char? ($car ls)) (length ($cdr ls) ($fx+ n 1))] - [else (error 'string "~s is not a character" ($car ls))]))] - [loop - (lambda (s ls i n) - (cond - [($fx= i n) s] - [else - ($string-set! s i ($car ls)) - (loop s ($cdr ls) ($fx+ i 1) n)]))]) - (lambda ls - (let ([n (length ls 0)]) - (let ([s (make-string n)]) - (loop s ls 0 n)))))) - -(primitive-set! 'list? - (letrec ([race - (lambda (h t) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (and (not (eq? h t)) - (race ($cdr h) ($cdr t))) - (null? h))) - (null? h)))]) - (lambda (x) (race x x)))) - - - -(primitive-set! 'reverse - (letrec ([race - (lambda (h t ls ac) - (if (pair? h) - (let ([h ($cdr h)] [ac (cons ($car h) ac)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls (cons ($car h) ac)) - (error 'reverse "~s is a circular list" ls)) - (if (null? h) - ac - (error 'reverse "~s is not a proper list" ls)))) - (if (null? h) - ac - (error 'reverse "~s is not a proper list" ls))))]) - (lambda (x) - (race x x x '())))) - -(primitive-set! 'memq - (letrec ([race - (lambda (h t ls x) - (if (pair? h) - (if (eq? ($car h) x) - h - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? ($car h) x) - h - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls x) - (error 'memq "circular list ~s" ls))) - (if (null? h) - '#f - (error 'memq "~s is not a proper list" ls))))) - (if (null? h) - '#f - (error 'memq "~s is not a proper list" ls))))]) - (lambda (x ls) - (race ls ls ls x)))) - -(primitive-set! 'list->string - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'reverse "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'reverse "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'reverse "~s is not a proper list" ls))))] - [fill - (lambda (s i ls) - (cond - [(null? ls) s] - [else - (let ([c ($car ls)]) - (unless (char? c) - (error 'list->string "~s is not a character" c)) - ($string-set! s i c) - (fill s ($fxadd1 i) (cdr ls)))]))]) - (lambda (ls) - (let ([n (race ls ls ls 0)]) - (let ([s ($make-string n)]) - (fill s 0 ls)))))) - -(primitive-set! 'length - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'length "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'length "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'length "~s is not a proper list" ls))))]) - (lambda (ls) - (race ls ls ls 0)))) - - -(primitive-set! 'list-ref - (lambda (list index) - (define f - (lambda (ls i) - (cond - [($fxzero? i) - (if (pair? ls) - ($car ls) - (error 'list-ref "index ~s is out of range for ~s" index list))] - [(pair? ls) - (f ($cdr ls) ($fxsub1 i))] - [(null? ls) - (error 'list-rec "index ~s is out of range for ~s" index list)] - [else (error 'list-ref "~s is not a list" list)]))) - (unless (and (fixnum? index) ($fx>= index 0)) - (error 'list-ref "~s is not a valid index" index)) - (f list index))) - - - -;(primitive-set! 'apply -; (letrec ([fix -; (lambda (arg arg*) -; (cond -; [(null? arg*) -; (if (list? arg) -; arg -; (error 'apply "last arg is not a list"))] -; [else -; (cons arg (fix ($car arg*) ($cdr arg*)))]))]) -; (lambda (f arg . arg*) -; (unless (procedure? f) -; (error 'apply "APPLY ~s ~s ~s" f arg arg*)) -; ($apply f (fix arg arg*))))) -; - -;(primitive-set! 'apply -; (letrec ([fix -; (lambda (arg arg*) -; (cond -; [(null? arg*) -; (if (list? arg) -; arg -; (error 'apply "last arg is not a list"))] -; [else -; (cons arg (fix ($car arg*) ($cdr arg*)))]))]) -; (lambda (f arg . arg*) -; (unless (procedure? f) -; (error 'apply "APPLY ~s ~s ~s" f arg arg*)) -; (let ([args (fix arg arg*)]) -; ($apply f args))))) - -(primitive-set! 'apply - (let () - (define (err f ls) - (if (procedure? f) - (error 'apply "not a list") - (error 'apply "~s is not a procedure" f))) - (define (fixandgo f a0 a1 ls p d) - (cond - [(null? ($cdr d)) - (let ([last ($car d)]) - ($set-cdr! p last) - (if (and (procedure? f) (list? last)) - ($apply f a0 a1 ls) - (err f last)))] - [else (fixandgo f a0 a1 ls d ($cdr d))])) - (define apply - (case-lambda - [(f ls) - (if (and (procedure? f) (list? ls)) - ($apply f ls) - (err f ls))] - [(f a0 ls) - (if (and (procedure? f) (list? ls)) - ($apply f a0 ls) - (err f ls))] - [(f a0 a1 ls) - (if (and (procedure? f) (list? ls)) - ($apply f a0 a1 ls) - (err f ls))] - [(f a0 a1 . ls) - (fixandgo f a0 a1 ls ls ($cdr ls))])) - apply)) - - - - - -(primitive-set! 'assq - (letrec ([race - (lambda (x h t ls) - (if (pair? h) - (let ([a ($car h)] [h ($cdr h)]) - (if (pair? a) - (if (eq? ($car a) x) - a - (if (pair? h) - (if (not (eq? h t)) - (let ([a ($car h)]) - (if (pair? a) - (if (eq? ($car a) x) - a - (race x ($cdr h) ($cdr t) ls)) - (error 'assq "malformed alist ~s" - ls))) - (error 'assq "circular list ~s" ls)) - (if (null? h) - #f - (error 'assq "~s is not a proper list" ls)))) - (error 'assq "malformed alist ~s" ls))) - (if (null? h) - #f - (error 'assq "~s is not a proper list" ls))))]) - (lambda (x ls) - (race x ls ls ls)))) - -(primitive-set! 'string->symbol - (lambda (x) - (unless (string? x) - (error 'string->symbol "~s is not a string" x)) - (foreign-call "ik_intern_string" x))) - -(primitive-set! 'oblist - (lambda () - (foreign-call "ik_oblist"))) - -(primitive-set! 'gensym - (case-lambda - [() ($make-symbol #f)] - [(s) - (if (string? s) - ($make-symbol s) - (error 'gensym "~s is not a string" s))])) - -(primitive-set! 'putprop - (lambda (x k v) - (unless (symbol? x) (error 'putprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'putprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (cond - [(assq k p) => (lambda (x) (set-cdr! x v))] - [else - ($set-symbol-plist! x (cons (cons k v) p))])))) - -(primitive-set! 'getprop - (lambda (x k) - (unless (symbol? x) (error 'getprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'getprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (cond - [(assq k p) => cdr] - [else #f])))) - -(primitive-set! 'remprop - (lambda (x k) - (unless (symbol? x) (error 'remprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'remprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (unless (null? p) - (let ([a ($car p)]) - (cond - [(eq? ($car a) k) ($set-symbol-plist! x ($cdr p))] - [else - (let f ([q p] [p ($cdr p)]) - (unless (null? p) - (let ([a ($car p)]) - (cond - [(eq? ($car a) k) - ($set-cdr! q ($cdr p))] - [else - (f p ($cdr p))]))))])))))) - -(primitive-set! 'property-list - (lambda (x) - (unless (symbol? x) - (error 'property-list "~s is not a symbol" x)) - (letrec ([f - (lambda (ls ac) - (cond - [(null? ls) ac] - [else - (let ([a ($car ls)]) - (f ($cdr ls) - (cons ($car a) (cons ($cdr a) ac))))]))]) - (f ($symbol-plist x) '())))) - - -;;X (primitive-set! 'make-parameter -;;X (letrec ([make-param-no-guard -;;X (lambda (x) -;;X (lambda args -;;X (if (null? args) -;;X x -;;X (if (null? ($cdr args)) -;;X (set! x ($car args)) -;;X (error #f "too many arguments to parameter")))))] -;;X [make-param-with-guard -;;X (lambda (x g) -;;X (let ([f -;;X (lambda args -;;X (if (null? args) -;;X x -;;X (if (null? ($cdr args)) -;;X (set! x (g ($car args))) -;;X (error #f "too many arguments to parameter"))))]) -;;X (if (procedure? g) -;;X (begin (set! x (g x)) f) -;;X (error 'make-parameter "not a procedure ~s" g))))]) -;;X (lambda args -;;X (if (pair? args) -;;X (let ([x ($car args)] [args ($cdr args)]) -;;X (if (null? args) -;;X (make-param-no-guard x) -;;X (let ([g ($car args)]) -;;X (if (null? ($cdr args)) -;;X (make-param-with-guard x g) -;;X (error 'make-parameter "too many arguments"))))) -;;X (error 'make-parameter "insufficient arguments"))))) -;;X - -(primitive-set! 'make-parameter - (case-lambda - [(x) - (case-lambda - [() x] - [(v) (set! x v)])] - [(x guard) - (unless (procedure? guard) - (error 'make-parameter "~s is not a procedure" guard)) - (set! x (guard x)) - (case-lambda - [() x] - [(v) (set! x (guard v))])])) - -(let () - (define vector-loop - (lambda (x y i n) - (or ($fx= i n) - (and (equal? ($vector-ref x i) ($vector-ref y i)) - (vector-loop x y ($fxadd1 i) n))))) - (define string-loop - (lambda (x y i n) - (or ($fx= i n) - (and ($char= ($string-ref x i) ($string-ref y i)) - (string-loop x y ($fxadd1 i) n))))) - (define equal? - (lambda (x y) - (cond - [(eq? x y) #t] - [(pair? x) - (and (pair? y) - (equal? ($car x) ($car y)) - (equal? ($cdr x) ($cdr y)))] - [(vector? x) - (and (vector? y) - (let ([n ($vector-length x)]) - (and ($fx= n ($vector-length y)) - (vector-loop x y 0 n))))] - [(string? x) - (and (string? y) - (let ([n ($string-length x)]) - (and ($fx= n ($string-length y)) - (string-loop x y 0 n))))] - [else #f]))) - (primitive-set! 'equal? equal?)) - - -(let () - (define who 'map) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define map1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (cons (f a) - (map1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (cons (f a) '()) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (define map2 - (lambda (f a1 a2 d1 d2 n) - (cond - [(pair? d1) - (cond - [(pair? d2) - (if ($fxzero? n) - (error who "list was altered") - (cons (f a1 a2) - (map2 f - ($car d1) ($car d2) - ($cdr d1) ($cdr d2) - ($fxsub1 n))))] - [else (error who "length mismatch")])] - [(null? d1) - (cond - [(null? d2) - (if ($fxzero? n) - (cons (f a1 a2) '()) - (error who "list was altered"))] - [else (error who "length mismatch")])] - [else (error who "list was altered")]))) - (define cars - (lambda (ls*) - (cond - [(null? ls*) '()] - [else - (let ([a (car ls*)]) - (cond - [(pair? a) - (cons (car a) (cars (cdr ls*)))] - [else - (error 'map "length mismatch")]))]))) - (define cdrs - (lambda (ls*) - (cond - [(null? ls*) '()] - [else - (let ([a (car ls*)]) - (cond - [(pair? a) - (cons (cdr a) (cdrs (cdr ls*)))] - [else - (error 'map "length mismatch")]))]))) - (define mapm - (lambda (f ls ls* n) - (cond - [(null? ls) - (if (andmap null? ls*) - (if (fxzero? n) - '() - (error 'map "lists were mutated during operation")) - (error 'map "length mismatch"))] - [(fxzero? n) - (error 'map "lists were mutated during operation")] - [else - (cons - (apply f (car ls) (cars ls*)) - (mapm f (cdr ls) (cdrs ls*) (fxsub1 n)))]))) - (primitive-set! 'map - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (map1 f ($car ls) d (len d d 0)))] - [(null? ls) '()] - [else (error who "improper list")])] - [(f ls ls2) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (map2 f ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - '() - (error who "length mismatch"))] - [else (error who "not a list")])] - [(f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([n (len ls ls 0)]) - (mapm f ls ls* n))] - [(null? ls) - (if (andmap null? ls*) - '() - (error who "length mismatch"))])]))) - - -(let () - (define who 'for-each) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define for-each1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (begin - (f a) - (for-each1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (define for-each2 - (lambda (f a1 a2 d1 d2 n) - (cond - [(pair? d1) - (cond - [(pair? d2) - (if ($fxzero? n) - (error who "list was altered") - (begin - (f a1 a2) - (for-each2 f - ($car d1) ($car d2) - ($cdr d1) ($cdr d2) - ($fxsub1 n))))] - [else (error who "length mismatch")])] - [(null? d1) - (cond - [(null? d2) - (if ($fxzero? n) - (f a1 a2) - (error who "list was altered"))] - [else (error who "length mismatch")])] - [else (error who "list was altered")]))) - (primitive-set! 'for-each - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (for-each1 f ($car ls) d (len d d 0)))] - [(null? ls) (void)] - [else (error who "improper list")])] - [(f ls ls2) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (for-each2 f - ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - (void) - (error who "length mismatch"))] - [else (error who "not a list")])] - [_ (error who "vararg not supported yet")]))) - - - -(let () - (define who 'andmap) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define andmap1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (and (f a) - (andmap1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (primitive-set! 'andmap - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (andmap1 f ($car ls) d (len d d 0)))] - [(null? ls) #t] - [else (error who "improper list")])] - [_ (error who "vararg not supported yet")]))) - - -(let () - (define who 'ormap) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define ormap1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (or (f a) - (ormap1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (primitive-set! 'ormap - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (ormap1 f ($car ls) d (len d d 0)))] - [(null? ls) #f] - [else (error who "improper list")])] - [_ (error who "vararg not supported yet")]))) - - - - -(let () - (define reverse - (lambda (h t ls ac) - (if (pair? h) - (let ([h ($cdr h)] [a1 ($car h)]) - (if (pair? h) - (if (not (eq? h t)) - (let ([a2 ($car h)]) - (reverse ($cdr h) ($cdr t) ls (cons a2 (cons a1 ac)))) - (error 'append "circular list ~s" ls)) - (if (null? h) - (cons a1 ac) - (error 'append "~s is not a proper list" ls)))) - (if (null? h) - ac - (error 'append "~s is not a proper list" ls))))) - (define revcons - (lambda (ls ac) - (cond - [(null? ls) ac] - [else - (revcons ($cdr ls) (cons ($car ls) ac))]))) - (define append - (lambda (ls ls*) - (cond - [(null? ls*) ls] - [else - (revcons (reverse ls ls ls '()) - (append ($car ls*) ($cdr ls*)))]))) - (primitive-set! 'append - (lambda (ls . ls*) - (append ls ls*)))) - - -(primitive-set! 'list->vector - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'list->vector "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'list->vector "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'list->vector "~s is not a proper list" ls))))] - [fill - (lambda (v i ls) - (cond - [(null? ls) v] - [else - (let ([c ($car ls)]) - ($vector-set! v i c) - (fill v ($fxadd1 i) (cdr ls)))]))]) - (lambda (ls) - (let ([n (race ls ls ls 0)]) - (let ([v (make-vector n)]) - (fill v 0 ls)))))) - - -(let () - (define f - (lambda (v i ls) - (cond - [($fx< i 0) ls] - [else - (f v ($fxsub1 i) (cons ($vector-ref v i) ls))]))) - (primitive-set! 'vector->list - (lambda (v) - (if (vector? v) - (let ([n ($vector-length v)]) - (if ($fxzero? n) - '() - (f v ($fxsub1 n) '()))) - (error 'vector->list "~s is not a vector" v))))) - -(let () - (define f - (lambda (n fill ls) - (cond - [($fxzero? n) ls] - [else - (f ($fxsub1 n) fill (cons fill ls))]))) - (primitive-set! 'make-list - (case-lambda - [(n) - (if (and (fixnum? n) ($fx>= n 0)) - (f n (void) '()) - (error 'make-list "~s is not a valid length" n))] - [(n fill) - (if (and (fixnum? n) ($fx>= n 0)) - (f n fill '()) - (error 'make-list "~s is not a valid length" n))]))) - -(primitive-set! 'list (lambda x x)) - -(primitive-set! 'uuid - (lambda () - (let ([s (make-string 36)]) - (foreign-call "ik_uuid" s)))) - -(primitive-set! 'gensym->unique-string - (lambda (x) - (unless (symbol? x) - (error 'gensym->unique-string "~s is not a gensym" x)) - (let ([us ($symbol-unique-string x)]) - (cond - [(string? us) us] - [(eq? us #t) - (error 'gensym->unique-string "~s is not a gensym" x)] - [else - (let ([id (uuid)]) - ($set-symbol-unique-string! x id) - id)])))) - -(primitive-set! 'gensym-prefix - (make-parameter - "g" - (lambda (x) - (unless (string? x) - (error 'gensym-prefix "~s is not a string" x)) - x))) - -(primitive-set! 'gensym-count - (make-parameter - 0 - (lambda (x) - (unless (and (fixnum? x) ($fx>= x 0)) - (error 'gensym-count "~s is not a valid count" x)) - x))) - -(primitive-set! 'print-gensym - (make-parameter - #t - (lambda (x) - (unless (boolean? x) - (error 'print-gensym "~s is not a boolean" x)) - x))) - -(primitive-set! 'make-hash-table - (lambda () - (make-hash-table))) - -(primitive-set! 'hash-table? - (lambda (x) - (hash-table? x))) - -(primitive-set! 'get-hash-table - (lambda (h k v) - (foreign-call "ik_get_hash_table" h k v))) - -(primitive-set! 'put-hash-table! - (lambda (h k v) - (foreign-call "ik_put_hash_table" h k v))) - diff --git a/src/libcore-6.2.ss b/src/libcore-6.2.ss deleted file mode 100644 index b222960..0000000 --- a/src/libcore-6.2.ss +++ /dev/null @@ -1,1628 +0,0 @@ - -;;; 6.2 * added bwp-object?, weak-cons, weak-pair? -;;; * pointer-value -;;; 6.1: * added uses of case-lambda to replace the ugly code -;;; 6.0: * basic version working - - -(primitive-set! 'call-with-values - ($make-call-with-values-procedure)) - -(primitive-set! 'values - ($make-values-procedure)) - -(primitive-set! 'exit - (case-lambda - [() (exit 0)] - [(status) (foreign-call "exit" status)])) - -(primitive-set! 'eof-object - (lambda () (eof-object))) - -(primitive-set! 'void - (lambda () (void))) - -(primitive-set! 'eof-object? - (lambda (x) (eof-object? x))) - -(primitive-set! 'fxadd1 - (lambda (n) - (unless (fixnum? n) - (error 'fxadd1 "~s is not a fixnum" n)) - ($fxadd1 n))) - -(primitive-set! 'fxsub1 - (lambda (n) - (unless (fixnum? n) - (error 'fxsub1 "~s is not a fixnum" n)) - ($fxsub1 n))) - -(primitive-set! 'integer->char - (lambda (n) - (unless (fixnum? n) - (error 'integer->char "~s is not a fixnum" n)) - (unless (and ($fx>= n 0) - ($fx<= n 255)) - (error 'integer->char "~s is out of range[0..255]" n)) - ($fixnum->char n))) - -(primitive-set! 'char->integer - (lambda (x) - (unless (char? x) - (error 'char->integer "~s is not a character" x)) - ($char->fixnum x))) - -(primitive-set! 'fxlognot - (lambda (x) - (unless (fixnum? x) - (error 'fxlognot "~s is not a fixnum" x)) - ($fxlognot x))) - -(primitive-set! 'fixnum? (lambda (x) (fixnum? x))) -(primitive-set! 'immediate? (lambda (x) (immediate? x))) - -(primitive-set! 'fxzero? - (lambda (x) - (unless (fixnum? x) - (error 'fxzero? "~s is not a fixnum" x)) - ($fxzero? x))) - -(primitive-set! 'boolean? (lambda (x) (boolean? x))) - -(primitive-set! 'char? (lambda (x) (char? x))) - -(primitive-set! 'vector? (lambda (x) (vector? x))) - -(primitive-set! 'string? (lambda (x) (string? x))) - -(primitive-set! 'procedure? (lambda (x) (procedure? x))) - -(primitive-set! 'null? (lambda (x) (null? x))) - -(primitive-set! 'pair? (lambda (x) (pair? x))) - -(let () - (define fill! - (lambda (v i n fill) - (cond - [($fx= i n) v] - [else - ($vector-set! v i fill) - (fill! v ($fx+ i 1) n fill)]))) - (define make-vector - (case-lambda - [(n) (make-vector n (void))] - [(n fill) - (unless (and (fixnum? n) (fx>= n 0)) - (error 'make-vector "~s is not a valid length" n)) - (fill! ($make-vector n) 0 n fill)])) - (primitive-set! 'make-vector make-vector)) - -(primitive-set! 'vector-length - (lambda (x) - (unless (vector? x) - (error 'vector-length "~s is not a vector" x)) - ($vector-length x))) - -(let () - (define fill! - (lambda (s i n c) - (cond - [($fx= i n) s] - [else - ($string-set! s i c) - (fill! s ($fx+ i 1) n c)]))) - (define make-string - (case-lambda - [(n) - (unless (and (fixnum? n) (fx>= n 0)) - (error 'make-string "~s is not a valid length" n)) - ($make-string n)] - [(n c) - (unless (and (fixnum? n) (fx>= n 0)) - (error 'make-string "~s is not a valid length" n)) - (unless (char? c) - (error 'make-string "~s is not a character" c)) - (fill! ($make-string n) 0 n c)])) - (primitive-set! 'make-string make-string)) - - -(primitive-set! 'string-length - (lambda (x) - (unless (string? x) - (error 'string-length "~s is not a string" x)) - ($string-length x))) - -(primitive-set! 'string->list - (lambda (x) - (unless (string? x) - (error 'string->list "~s is not a string" x)) - (let f ([x x] [i ($string-length x)] [ac '()]) - (cond - [($fxzero? i) ac] - [else - (let ([i ($fxsub1 i)]) - (f x i (cons ($string-ref x i) ac)))])))) - - -(let () - (define bstring=? - (lambda (s1 s2 i j) - (or ($fx= i j) - (and ($char= ($string-ref s1 i) ($string-ref s2 i)) - (bstring=? s1 s2 ($fxadd1 i) j))))) - (define check-strings-and-return-false - (lambda (s*) - (cond - [(null? s*) #f] - [(string? ($car s*)) - (check-strings-and-return-false ($cdr s*))] - [else (err ($car s*))]))) - (define strings=? - (lambda (s s* n) - (or (null? s*) - (let ([a ($car s*)]) - (unless (string? a) - (error 'string=? "~s is not a string" a)) - (if ($fx= n ($string-length a)) - (and (strings=? s ($cdr s*) n) - (bstring=? s a 0 n)) - (check-strings-and-return-false ($cdr s*))))))) - (define (err x) - (error 'string=? "~s is not a string" x)) - (primitive-set! 'string=? - (case-lambda - [(s s1) - (if (string? s) - (if (string? s1) - (let ([n ($string-length s)]) - (and ($fx= n ($string-length s1)) - (bstring=? s s1 0 n))) - (err s1)) - (err s))] - [(s . s*) - (if (string? s) - (strings=? s s* ($string-length s)) - (err s))]))) - - - -(let () - ;; FIXME: make nonconsing on 0,1,2, and 3 args - (define length* - (lambda (s* n) - (cond - [(null? s*) n] - [else - (let ([a ($car s*)]) - (unless (string? a) - (error 'string-append "~s is not a string" a)) - (length* ($cdr s*) ($fx+ n ($string-length a))))]))) - (define fill-string - (lambda (s a si sj ai) - (unless ($fx= si sj) - ($string-set! s si ($string-ref a ai)) - (fill-string s a ($fxadd1 si) sj ($fxadd1 ai))))) - (define fill-strings - (lambda (s s* i) - (cond - [(null? s*) s] - [else - (let ([a ($car s*)]) - (let ([n ($string-length a)]) - (let ([j ($fx+ i n)]) - (fill-string s a i j 0) - (fill-strings s ($cdr s*) j))))]))) - (primitive-set! 'string-append - (lambda s* - (let ([n (length* s* 0)]) - (let ([s ($make-string n)]) - (fill-strings s s* 0)))))) - - -(let () - (define fill - (lambda (s d si sj di) - (cond - [($fx= si sj) d] - [else - ($string-set! d di ($string-ref s si)) - (fill s d ($fxadd1 si) sj ($fxadd1 di))]))) - (primitive-set! 'substring - (lambda (s n m) - (unless (string? s) - (error 'substring "~s is not a string" s)) - (let ([len ($string-length s)]) - (unless (and (fixnum? n) - ($fx>= n 0) - ($fx< n len)) - (error 'substring "~s is not a valid start index for ~s" n s)) - (unless (and (fixnum? m) - ($fx>= m 0) - ($fx<= m len)) - (error 'substring "~s is not a valid end index for ~s" m s)) - (let ([len ($fx- m n)]) - (if ($fx<= len 0) - "" - (fill s ($make-string len) n m 0))))))) - -(primitive-set! 'not (lambda (x) (not x))) - -(primitive-set! 'symbol->string - (lambda (x) - (unless (symbol? x) - (error 'symbol->string "~s is not a symbol" x)) - (let ([str ($symbol-string x)]) - (or str - (let ([ct (gensym-count)]) - (let ([str (string-append (gensym-prefix) (fixnum->string ct))]) - ($set-symbol-string! x str) - (gensym-count ($fxadd1 ct)) - str)))))) - -(primitive-set! 'gensym? - (lambda (x) - (and (symbol? x) - (let ([s ($symbol-unique-string x)]) - (and s #t))))) - -(let () - (define f - (lambda (n i j) - (cond - [($fxzero? n) - (values (make-string i) j)] - [else - (let ([q ($fxquotient n 10)]) - (call-with-values - (lambda () (f q ($fxadd1 i) j)) - (lambda (str j) - (let ([r ($fx- n ($fx* q 10))]) - (string-set! str j - ($fixnum->char ($fx+ r ($char->fixnum #\0)))) - (values str ($fxadd1 j))))))]))) - (primitive-set! 'fixnum->string - (lambda (x) - (unless (fixnum? x) (error 'fixnum->string "~s is not a fixnum" x)) - (cond - [($fxzero? x) "0"] - [($fx> x 0) - (call-with-values - (lambda () (f x 0 0)) - (lambda (str j) str))] - [($fx= x -536870912) "-536870912"] - [else - (call-with-values - (lambda () (f ($fx- 0 x) 1 1)) - (lambda (str j) - ($string-set! str 0 #\-) - str))])))) - -(primitive-set! 'top-level-value - (lambda (x) - (unless (symbol? x) - (error 'top-level-value "~s is not a symbol" x)) - (let ([v ($symbol-value x)]) - (when ($unbound-object? v) - (error 'top-level-value "unbound variable ~s" x)) - v))) - -(primitive-set! 'top-level-bound? - (lambda (x) - (unless (symbol? x) - (error 'top-level-bound? "~s is not a symbol" x)) - (not ($unbound-object? ($symbol-value x))))) - -(primitive-set! 'set-top-level-value! - (lambda (x v) - (unless (symbol? x) - (error 'set-top-level-value! "~s is not a symbol" x)) - ($set-symbol-value! x v))) - -(primitive-set! 'symbol? (lambda (x) (symbol? x))) - -(primitive-set! 'primitive? - (lambda (x) - (unless (symbol? x) - (error 'primitive? "~s is not a symbol" x)) - (procedure? (primitive-ref x)))) - -(primitive-set! 'primitive-ref - (lambda (x) - (unless (symbol? x) - (error 'primitive-ref "~s is not a symbol" x)) - (let ([v (primitive-ref x)]) - (unless (procedure? v) - (error 'primitive-ref "~s is not a primitive" x)) - v))) - -(primitive-set! 'primitive-set! - (lambda (x v) - (unless (symbol? x) - (error 'primitive-set! "~s is not a symbol" x)) - (primitive-set! x v) - (set-top-level-value! x v))) - - - - - -(primitive-set! 'fx+ - (lambda (x y) - (unless (fixnum? x) - (error 'fx+ "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx+ "~s is not a fixnum" y)) - ($fx+ x y))) - -(primitive-set! 'fx- - (lambda (x y) - (unless (fixnum? x) - (error 'fx- "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx- "~s is not a fixnum" y)) - ($fx- x y))) - -(primitive-set! 'fx* - (lambda (x y) - (unless (fixnum? x) - (error 'fx* "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx* "~s is not a fixnum" y)) - ($fx* x y))) - - - -(primitive-set! 'fxquotient - (lambda (x y) - (unless (fixnum? x) - (error 'fxquotient "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxquotient "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxquotient "zero dividend ~s" y)) - ($fxquotient x y))) - - -(primitive-set! 'fxremainder - (lambda (x y) - (unless (fixnum? x) - (error 'fxremainder "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxremainder "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxremainder "zero dividend ~s" y)) - (let ([q ($fxquotient x y)]) - ($fx- x ($fx* q y))))) - - -(primitive-set! 'fxmodulo - (lambda (x y) - (unless (fixnum? x) - (error 'fxmodulo "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxmodulo "~s is not a fixnum" y)) - (when ($fxzero? y) - (error 'fxmodulo "zero dividend ~s" y)) - ($fxmodulo x y))) - - -(primitive-set! 'fxlogor - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogor "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogor "~s is not a fixnum" y)) - ($fxlogor x y))) - -(primitive-set! 'fxlogxor - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogxor "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogxor "~s is not a fixnum" y)) - ($fxlogxor x y))) - -(primitive-set! 'fxlogand - (lambda (x y) - (unless (fixnum? x) - (error 'fxlogand "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxlogand "~s is not a fixnum" y)) - ($fxlogand x y))) - -(primitive-set! 'fxsra - (lambda (x y) - (unless (fixnum? x) - (error 'fxsra "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxsra "~s is not a fixnum" y)) - (unless ($fx>= y 0) - (error 'fxsra "negative shift not allowed, got ~s" y)) - ($fxsra x y))) - -(primitive-set! 'fxsll - (lambda (x y) - (unless (fixnum? x) - (error 'fxsll "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fxsll "~s is not a fixnum" y)) - (unless ($fx>= y 0) - (error 'fxsll "negative shift not allowed, got ~s" y)) - ($fxsll x y))) - -(primitive-set! 'fx= - (lambda (x y) - (unless (fixnum? x) - (error 'fx= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx= "~s is not a fixnum" y)) - ($fx= x y))) - -(primitive-set! 'fx< - (lambda (x y) - (unless (fixnum? x) - (error 'fx< "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx< "~s is not a fixnum" y)) - ($fx< x y))) - -(primitive-set! 'fx<= - (lambda (x y) - (unless (fixnum? x) - (error 'fx<= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx<= "~s is not a fixnum" y)) - ($fx<= x y))) - -(primitive-set! 'fx> - (lambda (x y) - (unless (fixnum? x) - (error 'fx> "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx> "~s is not a fixnum" y)) - ($fx> x y))) - -(primitive-set! 'fx>= - (lambda (x y) - (unless (fixnum? x) - (error 'fx>= "~s is not a fixnum" x)) - (unless (fixnum? y) - (error 'fx>= "~s is not a fixnum" y)) - ($fx>= x y))) - - -(primitive-set! 'char=? - (let () - (define (err x) - (error 'char=? "~s is not a character" x)) - (case-lambda - [(c1 c2) - (if (char? c1) - (if (char? c2) - ($char= c1 c2) - (err c2)) - (err c1))] - [(c1 c2 c3) - (if (char? c1) - (if (char? c2) - (if (char? c3) - (and ($char= c1 c2) - ($char= c2 c3)) - (err c3)) - (err c2)) - (err c1))] - [(c1 . c*) - (if (char? c1) - (let f ([c* c*]) - (or (null? c*) - (let ([c2 ($car c*)]) - (if (char? c2) - (if ($char= c1 c2) - (f ($cdr c*)) - (let g ([c* ($cdr c*)]) - (if (null? c*) - #f - (if (char? ($car c*)) - (g ($cdr c*)) - (err ($car c*)))))) - (err c2))))) - (err c1))]))) - - -(primitive-set! 'char? - (let () - (define (err x) - (error 'char>? "~s is not a character" x)) - (case-lambda - [(c1 c2) - (if (char? c1) - (if (char? c2) - ($char> c1 c2) - (err c2)) - (err c1))] - [(c1 c2 c3) - (if (char? c1) - (if (char? c2) - (if (char? c3) - (and ($char> c1 c2) - ($char> c2 c3)) - (err c3)) - (err c2)) - (err c1))] - [(c1 . c*) - (if (char? c1) - (let f ([c1 c1] [c* c*]) - (or (null? c*) - (let ([c2 ($car c*)]) - (if (char? c2) - (if ($char> c1 c2) - (f c2 ($cdr c*)) - (let g ([c* ($cdr c*)]) - (if (null? c*) - #f - (if (char? ($car c*)) - (g ($cdr c*)) - (err ($car c*)))))) - (err c2))))) - (err c1))]))) - -(primitive-set! 'char>=? - (let () - (define (err x) - (error 'char>=? "~s is not a character" x)) - (case-lambda - [(c1 c2) - (if (char? c1) - (if (char? c2) - ($char>= c1 c2) - (err c2)) - (err c1))] - [(c1 c2 c3) - (if (char? c1) - (if (char? c2) - (if (char? c3) - (and ($char>= c1 c2) - ($char>= c2 c3)) - (err c3)) - (err c2)) - (err c1))] - [(c1 . c*) - (if (char? c1) - (let f ([c1 c1] [c* c*]) - (or (null? c*) - (let ([c2 ($car c*)]) - (if (char? c2) - (if ($char>= c1 c2) - (f c2 ($cdr c*)) - (let g ([c* ($cdr c*)]) - (if (null? c*) - #f - (if (char? ($car c*)) - (g ($cdr c*)) - (err ($car c*)))))) - (err c2))))) - (err c1))]))) - - -(primitive-set! 'cons (lambda (x y) (cons x y))) - -(primitive-set! 'eq? (lambda (x y) (eq? x y))) - -(primitive-set! 'set-car! - (lambda (x y) - (unless (pair? x) - (error 'set-car! "~s is not a pair" x)) - ($set-car! x y))) - -(primitive-set! 'set-cdr! - (lambda (x y) - (unless (pair? x) - (error 'set-cdr! "~s is not a pair" x)) - ($set-cdr! x y))) - -(primitive-set! 'vector-ref - (lambda (v i) - (unless (vector? v) - (error 'vector-ref "~s is not a vector" v)) - (unless (fixnum? i) - (error 'vector-ref "~s is not a valid index" i)) - (unless (and ($fx< i ($vector-length v)) - ($fx<= 0 i)) - (error 'vector-ref "index ~s is out of range for ~s" i v)) - ($vector-ref v i))) - -(primitive-set! 'string-ref - (lambda (s i) - (unless (string? s) - (error 'string-ref "~s is not a string" s)) - (unless (fixnum? i) - (error 'string-ref "~s is not a valid index" i)) - (unless (and ($fx< i ($string-length s)) - ($fx<= 0 i)) - (error 'string-ref "index ~s is out of range for ~s" i s)) - ($string-ref s i))) - -(primitive-set! 'vector-set! - (lambda (v i c) - (unless (vector? v) - (error 'vector-set! "~s is not a vector" v)) - (unless (fixnum? i) - (error 'vector-set! "~s is not a valid index" i)) - (unless (and ($fx< i ($vector-length v)) - ($fx<= 0 i)) - (error 'vector-set! "index ~s is out of range for ~s" i v)) - ($vector-set! v i c))) - - -(primitive-set! 'string-set! - (lambda (s i c) - (unless (string? s) - (error 'string-set! "~s is not a string" s)) - (unless (fixnum? i) - (error 'string-set! "~s is not a valid index" i)) - (unless (and ($fx< i ($string-length s)) - ($fx>= i 0)) - (error 'string-set! "index ~s is out of range for ~s" i s)) - (unless (char? c) - (error 'string-set! "~s is not a character" c)) - ($string-set! s i c))) - -(primitive-set! 'vector - ;;; FIXME: add case-lambda - (letrec ([length - (lambda (ls n) - (cond - [(null? ls) n] - [else (length ($cdr ls) ($fx+ n 1))]))] - [loop - (lambda (v ls i n) - (cond - [($fx= i n) v] - [else - ($vector-set! v i ($car ls)) - (loop v ($cdr ls) ($fx+ i 1) n)]))]) - (lambda ls - (let ([n (length ls 0)]) - (let ([v (make-vector n)]) - (loop v ls 0 n)))))) - -(primitive-set! 'string - ;;; FIXME: add case-lambda - (letrec ([length - (lambda (ls n) - (cond - [(null? ls) n] - [(char? ($car ls)) (length ($cdr ls) ($fx+ n 1))] - [else (error 'string "~s is not a character" ($car ls))]))] - [loop - (lambda (s ls i n) - (cond - [($fx= i n) s] - [else - ($string-set! s i ($car ls)) - (loop s ($cdr ls) ($fx+ i 1) n)]))]) - (lambda ls - (let ([n (length ls 0)]) - (let ([s (make-string n)]) - (loop s ls 0 n)))))) - -(primitive-set! 'list? - (letrec ([race - (lambda (h t) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (and (not (eq? h t)) - (race ($cdr h) ($cdr t))) - (null? h))) - (null? h)))]) - (lambda (x) (race x x)))) - - - -(primitive-set! 'reverse - (letrec ([race - (lambda (h t ls ac) - (if (pair? h) - (let ([h ($cdr h)] [ac (cons ($car h) ac)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls (cons ($car h) ac)) - (error 'reverse "~s is a circular list" ls)) - (if (null? h) - ac - (error 'reverse "~s is not a proper list" ls)))) - (if (null? h) - ac - (error 'reverse "~s is not a proper list" ls))))]) - (lambda (x) - (race x x x '())))) - -(primitive-set! 'memq - (letrec ([race - (lambda (h t ls x) - (if (pair? h) - (if (eq? ($car h) x) - h - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? ($car h) x) - h - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls x) - (error 'memq "circular list ~s" ls))) - (if (null? h) - '#f - (error 'memq "~s is not a proper list" ls))))) - (if (null? h) - '#f - (error 'memq "~s is not a proper list" ls))))]) - (lambda (x ls) - (race ls ls ls x)))) - -(primitive-set! 'memv memq) - -(primitive-set! 'list->string - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'reverse "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'reverse "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'reverse "~s is not a proper list" ls))))] - [fill - (lambda (s i ls) - (cond - [(null? ls) s] - [else - (let ([c ($car ls)]) - (unless (char? c) - (error 'list->string "~s is not a character" c)) - ($string-set! s i c) - (fill s ($fxadd1 i) (cdr ls)))]))]) - (lambda (ls) - (let ([n (race ls ls ls 0)]) - (let ([s ($make-string n)]) - (fill s 0 ls)))))) - -(primitive-set! 'length - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'length "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'length "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'length "~s is not a proper list" ls))))]) - (lambda (ls) - (race ls ls ls 0)))) - - -(primitive-set! 'list-ref - (lambda (list index) - (define f - (lambda (ls i) - (cond - [($fxzero? i) - (if (pair? ls) - ($car ls) - (error 'list-ref "index ~s is out of range for ~s" index list))] - [(pair? ls) - (f ($cdr ls) ($fxsub1 i))] - [(null? ls) - (error 'list-rec "index ~s is out of range for ~s" index list)] - [else (error 'list-ref "~s is not a list" list)]))) - (unless (and (fixnum? index) ($fx>= index 0)) - (error 'list-ref "~s is not a valid index" index)) - (f list index))) - - - -;(primitive-set! 'apply -; (letrec ([fix -; (lambda (arg arg*) -; (cond -; [(null? arg*) -; (if (list? arg) -; arg -; (error 'apply "last arg is not a list"))] -; [else -; (cons arg (fix ($car arg*) ($cdr arg*)))]))]) -; (lambda (f arg . arg*) -; (unless (procedure? f) -; (error 'apply "APPLY ~s ~s ~s" f arg arg*)) -; ($apply f (fix arg arg*))))) -; - -;(primitive-set! 'apply -; (letrec ([fix -; (lambda (arg arg*) -; (cond -; [(null? arg*) -; (if (list? arg) -; arg -; (error 'apply "last arg is not a list"))] -; [else -; (cons arg (fix ($car arg*) ($cdr arg*)))]))]) -; (lambda (f arg . arg*) -; (unless (procedure? f) -; (error 'apply "APPLY ~s ~s ~s" f arg arg*)) -; (let ([args (fix arg arg*)]) -; ($apply f args))))) - -(primitive-set! 'apply - (let () - (define (err f ls) - (if (procedure? f) - (error 'apply "not a list") - (error 'apply "~s is not a procedure" f))) - (define (fixandgo f a0 a1 ls p d) - (cond - [(null? ($cdr d)) - (let ([last ($car d)]) - ($set-cdr! p last) - (if (and (procedure? f) (list? last)) - ($apply f a0 a1 ls) - (err f last)))] - [else (fixandgo f a0 a1 ls d ($cdr d))])) - (define apply - (case-lambda - [(f ls) - (if (and (procedure? f) (list? ls)) - ($apply f ls) - (err f ls))] - [(f a0 ls) - (if (and (procedure? f) (list? ls)) - ($apply f a0 ls) - (err f ls))] - [(f a0 a1 ls) - (if (and (procedure? f) (list? ls)) - ($apply f a0 a1 ls) - (err f ls))] - [(f a0 a1 . ls) - (fixandgo f a0 a1 ls ls ($cdr ls))])) - apply)) - - - - - -(primitive-set! 'assq - (letrec ([race - (lambda (x h t ls) - (if (pair? h) - (let ([a ($car h)] [h ($cdr h)]) - (if (pair? a) - (if (eq? ($car a) x) - a - (if (pair? h) - (if (not (eq? h t)) - (let ([a ($car h)]) - (if (pair? a) - (if (eq? ($car a) x) - a - (race x ($cdr h) ($cdr t) ls)) - (error 'assq "malformed alist ~s" - ls))) - (error 'assq "circular list ~s" ls)) - (if (null? h) - #f - (error 'assq "~s is not a proper list" ls)))) - (error 'assq "malformed alist ~s" ls))) - (if (null? h) - #f - (error 'assq "~s is not a proper list" ls))))]) - (lambda (x ls) - (race x ls ls ls)))) - -(primitive-set! 'string->symbol - (lambda (x) - (unless (string? x) - (error 'string->symbol "~s is not a string" x)) - (foreign-call "ik_intern_string" x))) - -(primitive-set! 'oblist - (lambda () - (foreign-call "ik_oblist"))) - -(primitive-set! 'gensym - (case-lambda - [() ($make-symbol #f)] - [(s) - (if (string? s) - ($make-symbol s) - (error 'gensym "~s is not a string" s))])) - -(primitive-set! 'putprop - (lambda (x k v) - (unless (symbol? x) (error 'putprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'putprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (cond - [(assq k p) => (lambda (x) (set-cdr! x v))] - [else - ($set-symbol-plist! x (cons (cons k v) p))])))) - -(primitive-set! 'getprop - (lambda (x k) - (unless (symbol? x) (error 'getprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'getprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (cond - [(assq k p) => cdr] - [else #f])))) - -(primitive-set! 'remprop - (lambda (x k) - (unless (symbol? x) (error 'remprop "~s is not a symbol" x)) - (unless (symbol? k) (error 'remprop "~s is not a symbol" k)) - (let ([p ($symbol-plist x)]) - (unless (null? p) - (let ([a ($car p)]) - (cond - [(eq? ($car a) k) ($set-symbol-plist! x ($cdr p))] - [else - (let f ([q p] [p ($cdr p)]) - (unless (null? p) - (let ([a ($car p)]) - (cond - [(eq? ($car a) k) - ($set-cdr! q ($cdr p))] - [else - (f p ($cdr p))]))))])))))) - -(primitive-set! 'property-list - (lambda (x) - (unless (symbol? x) - (error 'property-list "~s is not a symbol" x)) - (letrec ([f - (lambda (ls ac) - (cond - [(null? ls) ac] - [else - (let ([a ($car ls)]) - (f ($cdr ls) - (cons ($car a) (cons ($cdr a) ac))))]))]) - (f ($symbol-plist x) '())))) - - -;;X (primitive-set! 'make-parameter -;;X (letrec ([make-param-no-guard -;;X (lambda (x) -;;X (lambda args -;;X (if (null? args) -;;X x -;;X (if (null? ($cdr args)) -;;X (set! x ($car args)) -;;X (error #f "too many arguments to parameter")))))] -;;X [make-param-with-guard -;;X (lambda (x g) -;;X (let ([f -;;X (lambda args -;;X (if (null? args) -;;X x -;;X (if (null? ($cdr args)) -;;X (set! x (g ($car args))) -;;X (error #f "too many arguments to parameter"))))]) -;;X (if (procedure? g) -;;X (begin (set! x (g x)) f) -;;X (error 'make-parameter "not a procedure ~s" g))))]) -;;X (lambda args -;;X (if (pair? args) -;;X (let ([x ($car args)] [args ($cdr args)]) -;;X (if (null? args) -;;X (make-param-no-guard x) -;;X (let ([g ($car args)]) -;;X (if (null? ($cdr args)) -;;X (make-param-with-guard x g) -;;X (error 'make-parameter "too many arguments"))))) -;;X (error 'make-parameter "insufficient arguments"))))) -;;X - -(primitive-set! 'make-parameter - (case-lambda - [(x) - (case-lambda - [() x] - [(v) (set! x v)])] - [(x guard) - (unless (procedure? guard) - (error 'make-parameter "~s is not a procedure" guard)) - (set! x (guard x)) - (case-lambda - [() x] - [(v) (set! x (guard v))])])) - -(let () - (define vector-loop - (lambda (x y i n) - (or ($fx= i n) - (and (equal? ($vector-ref x i) ($vector-ref y i)) - (vector-loop x y ($fxadd1 i) n))))) - (define string-loop - (lambda (x y i n) - (or ($fx= i n) - (and ($char= ($string-ref x i) ($string-ref y i)) - (string-loop x y ($fxadd1 i) n))))) - (define equal? - (lambda (x y) - (cond - [(eq? x y) #t] - [(pair? x) - (and (pair? y) - (equal? ($car x) ($car y)) - (equal? ($cdr x) ($cdr y)))] - [(vector? x) - (and (vector? y) - (let ([n ($vector-length x)]) - (and ($fx= n ($vector-length y)) - (vector-loop x y 0 n))))] - [(string? x) - (and (string? y) - (let ([n ($string-length x)]) - (and ($fx= n ($string-length y)) - (string-loop x y 0 n))))] - [else #f]))) - (primitive-set! 'equal? equal?)) - - -(let () - (define who 'map) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define map1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (cons (f a) - (map1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (cons (f a) '()) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (define map2 - (lambda (f a1 a2 d1 d2 n) - (cond - [(pair? d1) - (cond - [(pair? d2) - (if ($fxzero? n) - (error who "list was altered") - (cons (f a1 a2) - (map2 f - ($car d1) ($car d2) - ($cdr d1) ($cdr d2) - ($fxsub1 n))))] - [else (error who "length mismatch")])] - [(null? d1) - (cond - [(null? d2) - (if ($fxzero? n) - (cons (f a1 a2) '()) - (error who "list was altered"))] - [else (error who "length mismatch")])] - [else (error who "list was altered")]))) - (define cars - (lambda (ls*) - (cond - [(null? ls*) '()] - [else - (let ([a (car ls*)]) - (cond - [(pair? a) - (cons (car a) (cars (cdr ls*)))] - [else - (error 'map "length mismatch")]))]))) - (define cdrs - (lambda (ls*) - (cond - [(null? ls*) '()] - [else - (let ([a (car ls*)]) - (cond - [(pair? a) - (cons (cdr a) (cdrs (cdr ls*)))] - [else - (error 'map "length mismatch")]))]))) - (define mapm - (lambda (f ls ls* n) - (cond - [(null? ls) - (if (andmap null? ls*) - (if (fxzero? n) - '() - (error 'map "lists were mutated during operation")) - (error 'map "length mismatch"))] - [(fxzero? n) - (error 'map "lists were mutated during operation")] - [else - (cons - (apply f (car ls) (cars ls*)) - (mapm f (cdr ls) (cdrs ls*) (fxsub1 n)))]))) - (primitive-set! 'map - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (map1 f ($car ls) d (len d d 0)))] - [(null? ls) '()] - [else (error who "improper list")])] - [(f ls ls2) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (map2 f ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - '() - (error who "length mismatch"))] - [else (error who "not a list")])] - [(f ls . ls*) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([n (len ls ls 0)]) - (mapm f ls ls* n))] - [(null? ls) - (if (andmap null? ls*) - '() - (error who "length mismatch"))])]))) - - -(let () - (define who 'for-each) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define for-each1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (begin - (f a) - (for-each1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (define for-each2 - (lambda (f a1 a2 d1 d2 n) - (cond - [(pair? d1) - (cond - [(pair? d2) - (if ($fxzero? n) - (error who "list was altered") - (begin - (f a1 a2) - (for-each2 f - ($car d1) ($car d2) - ($cdr d1) ($cdr d2) - ($fxsub1 n))))] - [else (error who "length mismatch")])] - [(null? d1) - (cond - [(null? d2) - (if ($fxzero? n) - (f a1 a2) - (error who "list was altered"))] - [else (error who "length mismatch")])] - [else (error who "list was altered")]))) - (primitive-set! 'for-each - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (for-each1 f ($car ls) d (len d d 0)))] - [(null? ls) (void)] - [else (error who "improper list")])] - [(f ls ls2) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (if (pair? ls2) - (let ([d ($cdr ls)]) - (for-each2 f - ($car ls) ($car ls2) d ($cdr ls2) (len d d 0))) - (error who "length mismatch"))] - [(null? ls) - (if (null? ls2) - (void) - (error who "length mismatch"))] - [else (error who "not a list")])] - [_ (error who "vararg not supported yet")]))) - - - -(let () - (define who 'andmap) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define andmap1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (and (f a) - (andmap1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (primitive-set! 'andmap - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (andmap1 f ($car ls) d (len d d 0)))] - [(null? ls) #t] - [else (error who "improper list")])] - [_ (error who "vararg not supported yet")]))) - - -(let () - (define who 'ormap) - (define len - (lambda (h t n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (eq? h t) - (error who "circular list") - (len ($cdr h) ($cdr t) ($fx+ n 2))) - (if (null? h) - ($fxadd1 n) - (error who "improper list")))) - (if (null? h) - n - (error who "improper list"))))) - (define ormap1 - (lambda (f a d n) - (cond - [(pair? d) - (if ($fxzero? n) - (error who "list was altered!") - (or (f a) - (ormap1 f ($car d) ($cdr d) ($fxsub1 n))))] - [(null? d) - (if ($fxzero? n) - (f a) - (error who "list was altered"))] - [else (error who "list was altered")]))) - (primitive-set! 'ormap - (case-lambda - [(f ls) - (unless (procedure? f) - (error who "~s is not a procedure" f)) - (cond - [(pair? ls) - (let ([d ($cdr ls)]) - (ormap1 f ($car ls) d (len d d 0)))] - [(null? ls) #f] - [else (error who "improper list")])] - [_ (error who "vararg not supported yet")]))) - - - - -(let () - (define reverse - (lambda (h t ls ac) - (if (pair? h) - (let ([h ($cdr h)] [a1 ($car h)]) - (if (pair? h) - (if (not (eq? h t)) - (let ([a2 ($car h)]) - (reverse ($cdr h) ($cdr t) ls (cons a2 (cons a1 ac)))) - (error 'append "circular list ~s" ls)) - (if (null? h) - (cons a1 ac) - (error 'append "~s is not a proper list" ls)))) - (if (null? h) - ac - (error 'append "~s is not a proper list" ls))))) - (define revcons - (lambda (ls ac) - (cond - [(null? ls) ac] - [else - (revcons ($cdr ls) (cons ($car ls) ac))]))) - (define append - (lambda (ls ls*) - (cond - [(null? ls*) ls] - [else - (revcons (reverse ls ls ls '()) - (append ($car ls*) ($cdr ls*)))]))) - (primitive-set! 'append - (lambda (ls . ls*) - (append ls ls*)))) - - -(primitive-set! 'list->vector - (letrec ([race - (lambda (h t ls n) - (if (pair? h) - (let ([h ($cdr h)]) - (if (pair? h) - (if (not (eq? h t)) - (race ($cdr h) ($cdr t) ls ($fx+ n 2)) - (error 'list->vector "circular list ~s" ls)) - (if (null? h) - ($fx+ n 1) - (error 'list->vector "~s is not a proper list" ls)))) - (if (null? h) - n - (error 'list->vector "~s is not a proper list" ls))))] - [fill - (lambda (v i ls) - (cond - [(null? ls) v] - [else - (let ([c ($car ls)]) - ($vector-set! v i c) - (fill v ($fxadd1 i) (cdr ls)))]))]) - (lambda (ls) - (let ([n (race ls ls ls 0)]) - (let ([v (make-vector n)]) - (fill v 0 ls)))))) - - -(let () - (define f - (lambda (v i ls) - (cond - [($fx< i 0) ls] - [else - (f v ($fxsub1 i) (cons ($vector-ref v i) ls))]))) - (primitive-set! 'vector->list - (lambda (v) - (if (vector? v) - (let ([n ($vector-length v)]) - (if ($fxzero? n) - '() - (f v ($fxsub1 n) '()))) - (error 'vector->list "~s is not a vector" v))))) - -(let () - (define f - (lambda (n fill ls) - (cond - [($fxzero? n) ls] - [else - (f ($fxsub1 n) fill (cons fill ls))]))) - (primitive-set! 'make-list - (case-lambda - [(n) - (if (and (fixnum? n) ($fx>= n 0)) - (f n (void) '()) - (error 'make-list "~s is not a valid length" n))] - [(n fill) - (if (and (fixnum? n) ($fx>= n 0)) - (f n fill '()) - (error 'make-list "~s is not a valid length" n))]))) - -(primitive-set! 'list (lambda x x)) - -(primitive-set! 'uuid - (lambda () - (let ([s (make-string 36)]) - (foreign-call "ik_uuid" s)))) - -(primitive-set! 'gensym->unique-string - (lambda (x) - (unless (symbol? x) - (error 'gensym->unique-string "~s is not a gensym" x)) - (let ([us ($symbol-unique-string x)]) - (cond - [(string? us) us] - [(eq? us #t) - (error 'gensym->unique-string "~s is not a gensym" x)] - [else - (let ([id (uuid)]) - ($set-symbol-unique-string! x id) - id)])))) - -(primitive-set! 'gensym-prefix - (make-parameter - "g" - (lambda (x) - (unless (string? x) - (error 'gensym-prefix "~s is not a string" x)) - x))) - -(primitive-set! 'gensym-count - (make-parameter - 0 - (lambda (x) - (unless (and (fixnum? x) ($fx>= x 0)) - (error 'gensym-count "~s is not a valid count" x)) - x))) - -(primitive-set! 'print-gensym - (make-parameter - #t - (lambda (x) - (unless (boolean? x) - (error 'print-gensym "~s is not a boolean" x)) - x))) - -;; X (primitive-set! 'make-hash-table -;; X (lambda () -;; X (make-hash-table))) -;; X -;; X (primitive-set! 'hash-table? -;; X (lambda (x) -;; X (hash-table? x))) -;; X -;; X (primitive-set! 'get-hash-table -;; X (lambda (h k v) -;; X (foreign-call "ik_get_hash_table" h k v))) -;; X -;; X (primitive-set! 'put-hash-table! -;; X (lambda (h k v) -;; X (foreign-call "ik_put_hash_table" h k v))) - -(primitive-set! 'bwp-object? - (lambda (x) - (bwp-object? x))) - -(primitive-set! 'weak-cons - (lambda (a d) - (foreign-call "ikrt_weak_cons" a d))) - -(primitive-set! 'weak-pair? - (lambda (x) - (and (pair? x) - (foreign-call "ikrt_is_weak_pair" x)))) - -(primitive-set! 'pointer-value - (lambda (x) - (pointer-value x))) - diff --git a/src/libcore-6.9.ss b/src/libcore-6.9.ss index 680b691..5a655b2 100644 --- a/src/libcore-6.9.ss +++ b/src/libcore-6.9.ss @@ -1036,7 +1036,9 @@ [(s) (if (string? s) ($make-symbol s) - (error 'gensym "~s is not a string" s))])) + (if (symbol? s) + ($make-symbol ($symbol-string s)) + (error 'gensym "~s is neither a string nor a symbol" s)))])) (primitive-set! 'putprop (lambda (x k v) diff --git a/src/libcore.fasl b/src/libcore.fasl index 13bff9cc2340b1292708ed15a6fa4f2bc51fc6a5..c6b5b550b48762a3c142a8e610a8ea854355334c 100644 GIT binary patch literal 129685 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 Core Scheme -;;; -;;; ::= (quote datum) -;;; | -;;; | (if ) -;;; | (set! ) -;;; | (begin ...) -;;; | (letrec ([ ] ...) ...) -;;; | (lambda ...) -;;; | ( ...) -;;; | (#primitive| ) -;;; | ( ...) -;;; ::= () -;;; | -;;; | ( . ) -;;; ::= void | memv | top-level-value | set-top-level-value! -;;; | primitive-set! '| foreign-call | $apply -;;; -;;; -;;; Handled keywords: -;;; Core: lambda set! if quote begin define -;;; Extended: let let* letrec letrec* when unless or and cond case -;;; define-record record-case - - -(let () - (define *keyword* (gensym "*keyword*")) - (define build-void - (lambda () - (build-application (build-primref 'void) '()))) - (define build-primref - (lambda (x) - (list '|#primitive| x))) - (define build-global-assignment - (lambda (x val) - (list 'set-top-level-value! - (build-constant x) val))) - (define build-foreign-call - (lambda (name rand*) - (cons 'foreign-call - (cons name rand*)))) - (define build-apply - (lambda (proc rand*) - (cons '$apply - (cons proc rand*)))) - (define build-global-reference - (lambda (x) - (list 'top-level-value (build-constant x)))) - (define build-memv - (lambda (x ls) - (list 'memv x ls))) - (define build-application - (lambda (fun arg*) - (cons fun arg*))) - (define build-sequence - (lambda (a b) - (let ([a* - (if (and (pair? a) (eq? (car a) 'begin)) - (cdr a) - (list a))] - [b* - (if (and (pair? b) (eq? (car b) 'begin)) - (cdr b) - (list b))]) - (cons 'begin (append a* b*))))) - (define sequence - (lambda args - (if (null? args) - (build-void) - (let f ([a (car args)] [args (cdr args)]) - (cond - [(null? args) a] - [else - (build-sequence a (f (car args) (cdr args)))]))))) - (define build-constant - (lambda (x) (list 'quote x))) - (define build-lexical-reference - (lambda (x) x)) - (define build-lexical-assignment - (lambda (lhs rhs) - (list 'set! lhs rhs))) - (define build-conditional - (lambda (test conseq altern) - (list 'if test conseq altern))) - (define build-function - (lambda (fml* body) - (list 'lambda fml* body))) - (define build-assignments - (lambda (lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (build-sequence - (build-lexical-assignment (car lhs*) (car rhs*)) - (build-assignments (cdr lhs*) (cdr rhs*) body))]))) - (define build-letrec - (lambda (lhs* rhs* body) - (if (null? lhs*) - body - (let ([g* (map (lambda (x) (gensym)) lhs*)]) - (build-let lhs* (map (lambda (x) (build-void)) lhs*) - (build-let g* rhs* - (build-assignments lhs* g* body))))))) - (define build-letrec* - (lambda (lhs* rhs* body) - (if (null? lhs*) - body - (build-let lhs* (map (lambda (x) (build-void)) lhs*) - (build-assignments lhs* rhs* body))))) - (define build-let - (lambda (lhs* rhs* body) - (build-application - (build-function lhs* body) - rhs*))) - (define build-let* - (lambda (lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (build-let (list (car lhs*)) (list (car rhs*)) - (build-let* (cdr lhs*) (cdr rhs*) body))]))) - ;;; builds - (define keyword? - (lambda (x) (getprop x *keyword*))) - (define self-evaluating? - (lambda (x) - (or (immediate? x) (string? x)))) - (define syntax-error - (lambda (x) - (error 'expand "invalid syntax ~s" x))) - (define empty-env '()) - (define E* - (lambda (x* env) - (cond - [(null? x*) '()] - [else - (cons (E (car x*) env) (E* (cdr x*) env))]))) - (define lookup - (lambda (x env) - (cond - [(assq x env) => cdr] - [else #f]))) - (define bug - (lambda (str . args) - (error 'bug "~a ~a" str args))) - ;;; - (define E-quote - (lambda (d env x) - (unless (fx= (length d) 1) - (syntax-error x)) - (build-constant (car d)))) - ;;; - (define E-if - (lambda (d env x) - (let ([n (length d)]) - (cond - [(fx= n 2) - (build-conditional - (E (car d) env) - (E (cadr d) env) - (build-void))] - [(fx= n 3) - (build-conditional - (E (car d) env) - (E (cadr d) env) - (E (caddr d) env))] - [else (syntax-error x)])))) - ;;; - (define E-set! - (lambda (d env x) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([lhs (car d)] [rhs (cadr d)]) - (unless (symbol? lhs) (syntax-error x)) - (cond - [(lookup lhs env) => - (lambda (b) - (build-lexical-assignment b (E rhs env)))] - [(keyword? lhs) (syntax-error x)] - [else - (build-global-assignment lhs (E rhs env))])))) - ;;; - (define E-begin - (lambda (d env x) - (unless (fx>= (length d) 1) - (syntax-error x)) - (E-begin^ (car d) (cdr d) env))) - (define E-begin^ - (lambda (a d env) - (cond - [(null? d) (E a env)] - [else - (build-sequence - (E a env) - (E-begin^ (car d) (cdr d) env))]))) - ;;; - (define E-named-let - (lambda (name d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([rator - (let ([gname (gensym)] - [nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env - (extend-env-fml* lhs* nlhs* - (cons (cons name gname) env))]) - (let ([body (E-internal body* env x)]) - (let ([fun (build-function nlhs* body)]) - (build-letrec - (list gname) - (list fun) - (build-lexical-reference gname))))))] - [rand* (map (lambda (x) (E x env)) rhs*)]) - (build-application rator rand*)))))) - ;;; - (define E-let - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (cond - [(symbol? bindings) - (E-named-let bindings body* env x)] - [else - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (build-let nlhs* nrhs* (E-internal body* env x))))))])))) - (define verify-bindings - (lambda (b* x) - (unless (list? b*) (syntax-error x)) - (for-each - (lambda (b) - (unless (and (list? b) - (fx= (length b) 2) - (symbol? (car b))) - (syntax-error x))) - b*))) - ;;; - (define E-let* - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let f ([lhs* lhs*] [nlhs* nlhs*] [rhs* rhs*] [env env]) - (cond - [(null? lhs*) (E-internal body* env x)] - [else - (build-let (list (car nlhs*)) - (list (E (car rhs*) env)) - (f (cdr lhs*) (cdr nlhs*) (cdr rhs*) - (cons (cons (car lhs*) (car nlhs*)) env)))]))))))) - ;;; - (define E-letrec - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (build-letrec nlhs* nrhs* (E-internal body* env x))))))))) - ;;; - (define E-letrec* - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (build-letrec* nlhs* nrhs* (E-internal body* env x))))))))) - ;;; - (define E-let-values - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (unless (list? bindings) (syntax-error x)) - (let f ([bindings bindings] [nenv env]) - (cond - [(null? bindings) (E-internal body* nenv x)] - [else - (let ([b (car bindings)]) - (unless (and (list? b) (fx= (length b) 2)) - (syntax-error x)) - (let ([fml* (car b)] [rhs (cadr b)]) - (verify-fml* fml* x) - (let ([nfml* (gen-fml* fml*)]) - (let ([nenv (extend-env-fml* fml* nfml* nenv)]) - (build-application - (build-primref 'call-with-values) - (list (build-function '() - (E rhs env)) - (build-function nfml* - (f (cdr bindings) nenv))))))))]))))) - ;;; - (define E-parameterize - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (cond - [(null? bindings) - (E-internal body* env x)] - [else - (unless (and (list? bindings) - (andmap (lambda (b) - (and (list? b) (fx= (length b) 2))) - bindings)) - (syntax-error x)) - (let ([lhs* (map car bindings)] [rhs* (map cadr bindings)]) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)] - [nrhs* (map (lambda (x) (gensym)) lhs*)] - [swap (gensym)] - [t* (map (lambda (x) (gensym)) lhs*)]) - (build-let - (append nlhs* nrhs*) - (map (lambda (x) (E x env)) - (append lhs* rhs*)) - (build-let - (list swap) - (list - (build-function '() - (apply sequence - (map (lambda (t lhs/rhs) - ;;; FIXME: vararg map - (define nlhs (car lhs/rhs)) - (define nrhs (cdr lhs/rhs)) - (build-let - (list t) - (list (build-application - (build-lexical-reference nlhs) - '())) - (build-sequence - (build-application - (build-lexical-reference nlhs) - (list (build-lexical-reference nrhs))) - (build-lexical-assignment - nrhs - (build-lexical-reference t))))) - t* (map cons nlhs* nrhs*))))) - (build-application - (build-primref 'dynamic-wind) - (list - (build-lexical-reference swap) - (build-function - '() - (E-internal body* env x)) - (build-lexical-reference swap)))))))])))) - ;;; - (define E-lambda - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([fml* (car d)] [body* (cdr d)]) - (verify-fml* fml* x) - (let ([nfml* (gen-fml* fml*)]) - (let ([env (extend-env-fml* fml* nfml* env)]) - (build-function - nfml* - (E-internal body* env x))))))) - (define verify-fml* - (lambda (fml* x) - (let ([g (gensym)]) - (let f ([fml* fml*]) - (cond - [(pair? fml*) - (let ([a (car fml*)]) - (unless (symbol? a) (syntax-error x)) - (when (getprop a g) (syntax-error x)) - (putprop a g a) - (f (cdr fml*)) - (remprop a g))] - [(symbol? fml*) - (when (getprop fml* g) (syntax-error x))] - [(null? fml*) (void)] - [else (syntax-error x)]))))) - (define gen-fml* - (lambda (fml*) - (cond - [(pair? fml*) - (cons (gensym) (gen-fml* (cdr fml*)))] - [(symbol? fml*) (gensym)] - [else '()]))) - (define extend-env-fml* - (lambda (fml* nfml* env) - (cond - [(pair? fml*) - (cons (cons (car fml*) (car nfml*)) - (extend-env-fml* (cdr fml*) (cdr nfml*) env))] - [(symbol? fml*) - (cons (cons fml* nfml*) env)] - [else env]))) - ;;; - (define E-internal - (lambda (body* env x) - (let f ([a (car body*)] [body* (cdr body*)] [lhs* '()] [rhs* '()]) - (cond - [(and (pair? a) (symbol? (car a))) - (let ([fst (car a)]) - (cond - [(or (memq fst lhs*) (lookup a env)) - (E-internal-done a body* lhs* rhs* env)] - [(keyword? fst) - (cond - [(eq? fst 'begin) - (let ([d (cdr a)]) - (unless (list? d) (syntax-error x)) - (let ([body* (append d body*)]) - (if (null? body*) - (syntax-error x) - (f (car body*) (cdr body*) lhs* rhs*))))] - [(eq? fst 'define) - (let ([def (parse-define (cdr a) env fst)]) - (f (car body*) (cdr body*) - (cons (car def) lhs*) - (cons (cdr def) rhs*)))] - [else (E-internal-done a body* lhs* rhs* env)])] - [else (E-internal-done a body* lhs* rhs* env)]))] - [else (E-internal-done a body* lhs* rhs* env)])))) - (define parse-define - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([fst (car d)] [rest (cdr d)]) - (cond - [(symbol? fst) - (unless (fx= (length rest) 1) (syntax-error x)) - (list fst 'expr (car rest))] - [(pair? fst) - (unless (symbol? (car fst)) (syntax-error x)) - (verify-fml* (cdr fst) x) - (list (car fst) 'defun (cdr fst) rest)] - [else (syntax-error x)])))) - (define E-def - (lambda (x env) - (let ([type (car x)]) - (cond - [(eq? type 'expr) (E (cadr x) env)] - [(eq? type 'defun) - (let ([fml* (cadr x)] [body* (caddr x)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([env (extend-env-fml* fml* nfml* env)]) - (build-function nfml* - (E-internal body* env x)))))] - [else (bug "invalid type" x)])))) - (define E-internal-done - (lambda (a d lhs* rhs* env) - (if (null? lhs*) - (E-begin^ a d env) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (append (map cons lhs* nlhs*) env)]) - (let ([nrhs* (map (lambda (x) (E-def x env)) rhs*)]) - (build-letrec* nlhs* nrhs* (E-begin^ a d env)))))))) - ;;; - (define E-when - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([test (car d)] [body* (cdr d)]) - (build-conditional - (E test env) - (E-begin^ (car body*) (cdr body*) env) - (build-void))))) - ;;; - (define E-unless - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([test (car d)] [body* (cdr d)]) - (build-conditional - (E test env) - (build-void) - (E-begin^ (car body*) (cdr body*) env))))) - ;;; - (define E-or - (lambda (d env x) - (cond - [(null? d) (build-constant #f)] - [(null? (cdr d)) (E (car d) env)] - [else - (let ([t (gensym)]) - (build-let (list t) (list (E (car d) env)) - (build-conditional - (build-lexical-reference t) - (build-lexical-reference t) - (E-or (cdr d) env x))))]))) - ;;; - (define E-and - (lambda (d env x) - (cond - [(null? d) (build-constant #t)] - [(null? (cdr d)) (E (car d) env)] - [else - (build-conditional - (E (car d) env) - (E-and (cdr d) env x) - (build-constant #f))]))) - ;;; - (define E-case - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([val (car d)] [cls* (cdr d)]) - (let ([g (gensym)]) - (build-let (list g) - (list (E val env)) - (E-case-cls* g (car cls*) (cdr cls*) env x)))))) - (define E-case-cls* - (lambda (g cls cls* env x) - (cond - [(null? cls*) (E-case-cls-last g cls env x)] - [else - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([ls (car cls)] [b* (cdr cls)]) - (unless (list? ls) (syntax-error x)) - (build-conditional - (build-memv (build-lexical-reference g) - (build-constant ls)) - (E-begin^ (car b*) (cdr b*) env) - (E-case-cls* g (car cls*) (cdr cls*) env x)))]))) - (define E-case-cls-last - (lambda (g cls env x) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([fst (car cls)] [b* (cdr cls)]) - (cond - [(and (eq? fst 'else) - (not (lookup fst env))) - (E-begin^ (car b*) (cdr b*) env)] - [(list? fst) - (build-conditional - (build-memv (build-lexical-reference g) - (build-constant fst)) - (E-begin^ (car b*) (cdr b*) env) - (build-void))] - [else (syntax-error x)])))) - ;;; - (define E-cond - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (E-cond-cls* (car d) (cdr d) env x))) - (define E-cond-cls* - (lambda (cls cls* env x) - (cond - [(null? cls*) (E-cond-cls-last cls env x)] - [else - (E-cond-cls cls env x - (E-cond-cls* (car cls*) (cdr cls*) env x))]))) - (define E-cond-cls - (lambda (cls env x k) - (unless (list? cls) (syntax-error x)) - (let ([n (length cls)]) - (unless (fx>= n 1) (syntax-error x)) - (cond - [(fx= n 1) - (let ([g (gensym)]) - (build-let (list g) - (list (E (car cls) env)) - (build-conditional - (build-lexical-reference g) - (build-lexical-reference g) - k)))] - [(and (fx= n 3) - (eq? (cadr cls) '=>) - (not (lookup '=> env))) - (let ([g (gensym)]) - (build-let (list g) - (list (E (car cls) env)) - (build-conditional - (build-lexical-reference g) - (build-application - (E (caddr cls) env) - (list (build-lexical-reference g))) - k)))] - [else - (let ([test (car cls)] [body* (cdr cls)]) - (build-conditional - (E test env) - (E-begin^ (car body*) (cdr body*) env) - k))])))) - (define E-cond-cls-last - (lambda (cls env x) - (unless (list? cls) (syntax-error x)) - (cond - [(and (fx>= (length cls) 2) - (eq? (car cls) 'else) - (not (lookup 'else env))) - (let ([body* (cdr cls)]) - (E-begin^ (car body*) (cdr body*) env))] - [else (E-cond-cls cls env x (build-void))]))) - ;;; - (define E-quasiquote - (lambda (d env x) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([expr (car d)]) - (Eqq expr 0 env x - (lambda (what expr^) - (case what - [(splice) (syntax-error x)] - [(unquot) expr^] - [(quoted) expr^] - [else (error 'quasiquote "what ~s" what)])))))) - (define qqmacro? - (lambda (sym expr env) - (and (pair? expr) - (eq? (car expr) sym) - (let ([d (cdr expr)]) - (and (pair? d) (null? (cdr d)))) - (not (lookup sym env))))) - (define Eqq - (lambda (x depth env orig k) - (cond - [(qqmacro? 'unquote x env) - (if (fx= depth 0) - (k 'unquot (E (cadr x) env)) - (Eqq (cadr x) (fx- depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'unquot (qqbuild 'cons (build-constant 'unquote) v))] - [(unquot) - (k 'unquot (qqbuild 'list (build-constant 'unquote) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)]))))] - [(qqmacro? 'unquote-splicing x env) - (if (fx= depth 0) - (k 'splice (E (cadr x) env)) - (Eqq (cadr x) (fx- depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'splice - (qqbuild 'cons (build-constant 'unquote-splicing) v))] - [(unquot) - (k 'splice - (qqbuild 'list (build-constant 'unquote-splicing) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)]))))] - [(qqmacro? 'quasiquote x env) - (Eqq (cadr x) (fx+ depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'unquot - (qqbuild 'cons (build-constant 'quasiquote) v))] - [(unquot) - (k 'unquot - (qqbuild 'list (build-constant 'quasiquote) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)])))] - [(pair? x) - (Eqq (car x) depth env orig - (lambda (what-a v-a) - (Eqq (cdr x) depth env orig - (lambda (what-d v-d) - (case what-a - [(splice) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'append v-a v-d))] - [(quoted) - (k 'unquot (qqbuild 'append v-a v-d))] - [else (error 'quasiquote "what ~s" what-d)])] - [(unquot) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'cons v-a v-d))] - [(quoted) - (k 'unquot (qqbuild 'cons v-a v-d))] - [else (error 'quasiquote "what ~s" what-d)])] - [(quoted) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'cons v-a v-d))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what-d)])] - [else (error 'quasiquote "what ~s" what-a)])))))] - [(vector? x) - (let () - (define vmap-list - (lambda (i ac) - (cond - [(fx= i -1) - (k 'unquot (qqbuild 'list->vector ac))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (vmap-list (fx- i 1) - (qqbuild 'append vi ac))] - [(unquot) - (vmap-list (fx- i 1) (qqbuild 'cons vi ac))] - [(quoted) - (vmap-list (fx- i 1) (qqbuild 'cons vi ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (define vmap-vec - (lambda (i ac) - (cond - [(fx= i -1) - (k 'unquot - (build-application - (build-primref 'vector) - ac))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (vmap-list (fx- i 1) - (qqbuild 'append vi - (build-application - (build-primref 'list) - ac)))] - [(unquot) - (vmap-vec (fx- i 1) (cons vi ac))] - [(quoted) - (vmap-vec (fx- i 1) (cons vi ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (define vmap-const - (lambda (i ac) - (cond - [(fx= i -1) (k 'quoted (build-constant x))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (if (null? ac) - (vmap-list (fx- i 1) vi) - (vmap-list (fx- i 1) - (qqbuild 'append vi (build-constant ac))))] - [(unquot) - (vmap-vec (fx- i 1) - (cons vi (map build-constant ac)))] - [(quoted) - (vmap-const (fx- i 1) - (cons (vector-ref x i) ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (vmap-const (fx- (vector-length x) 1) '()))] - [else (k 'quoted (build-constant x))]))) - (define qqbuild - (lambda (prim . args) - (build-application - (build-primref prim) - args))) - ;;; - (define E-record-case - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([val (car d)] [cls* (cdr d)]) - (let ([g (gensym)]) - (build-let - (list g) - (list (E val env)) - (E-record-case-cls* (car cls*) (cdr cls*) g env x)))))) - (define E-record-case-cls* - (lambda (cls cls* v env x) - (cond - [(null? cls*) (E-record-case-last-cls cls v env x)] - [else - (E-record-case-cls cls v env x - (E-record-case-cls* (car cls*) (cdr cls*) v env x))]))) - (define E-record-case-cls - (lambda (cls v env x k) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([pat (car cls)] [body* (cdr cls)]) - (unless (and (list? pat) (andmap symbol? pat) (fx>= (length pat) 1)) - (syntax-error x)) - (let ([rtd-name (car pat)] [vars (cdr pat)]) - (cond - [(lookup rtd-name env) (syntax-error x)] - [(getprop rtd-name *keyword*) => - (lambda (type) - (unless (and (pair? type) (eq? (car type) '$rtd)) - (syntax-error x)) - (let ([rtd (cdr type)] - [lhs* (map (lambda (x) (gensym)) vars)]) - (build-conditional - (build-application - (build-application - (build-primref 'record-predicate) - (list (build-constant rtd))) - (list (build-lexical-reference v))) - (build-let - lhs* - (map (lambda (i) - (build-application - (build-application - (build-primref 'record-field-accessor) - (list (build-constant rtd) - (build-constant i))) - (list (build-lexical-reference v)))) - (enumerate lhs*)) - (E-begin^ (car body*) (cdr body*) - (extend-env-fml* vars lhs* env))) - k)))] - [else (syntax-error x)]))))) - (define E-record-case-last-cls - (lambda (cls v env x) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([pat (car cls)] [body* (cdr cls)]) - (cond - [(and (eq? pat 'else) (not (lookup 'else env))) - (E-begin^ (car body*) (cdr body*) env)] - [else - (E-record-case-cls cls v env x - (build-application - (build-primref 'error) - (list - (build-constant 'record-case) - (build-constant "unmatched ~s in ~s") - (build-lexical-reference v) - (build-constant x))))])))) - ;;; - (define E-foreign-call - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-foreign-call - (E (car d) env) - (map (lambda (x) (E x env)) (cdr d))))) - ;;; - (define E-primref - (lambda (d env x) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([sym (car d)]) - (unless (symbol? sym) (syntax-error x)) - (cond - [(primitive? sym) (build-primref sym)] - [else (syntax-error x)])))) - ;;; - (define E-apply - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-apply - (E (car d) env) - (map (lambda (x) (E x env)) (cdr d))))) - ;;; - (define E - (lambda (x env) - (cond - [(self-evaluating? x) (build-constant x)] - [(symbol? x) - (cond - [(lookup x env) => - (lambda (b) - (build-lexical-reference b))] - [(keyword? x) - (syntax-error x)] - [else - (build-global-reference x)])] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(symbol? a) - (cond - [(lookup a env) => - (lambda (b) - (build-application - (build-lexical-reference b) - (E* d env)))] - [(keyword? a) - (cond - [(eq? a 'quote) (E-quote d env x)] - [(eq? a 'if) (E-if d env x)] - [(eq? a 'set!) (E-set! d env x)] - [(eq? a 'begin) (E-begin d env x)] - [(eq? a 'lambda) (E-lambda d env x)] - [(eq? a 'let) (E-let d env x)] - [(eq? a 'letrec) (E-letrec d env x)] - [(eq? a 'let*) (E-let* d env x)] - [(eq? a 'letrec*) (E-letrec* d env x)] - [(eq? a 'when) (E-when d env x)] - [(eq? a 'unless) (E-unless d env x)] - [(eq? a 'or) (E-or d env x)] - [(eq? a 'and) (E-and d env x)] - [(eq? a 'case) (E-case d env x)] - [(eq? a 'cond) (E-cond d env x)] - [(eq? a 'let-values) (E-let-values d env x)] - [(eq? a 'quasiquote) (E-quasiquote d env x)] - [(eq? a 'parameterize) (E-parameterize d env x)] - [(eq? a 'record-case) (E-record-case d env x)] - [(eq? a 'foreign-call) (E-foreign-call d env x)] - [(eq? a '|#primitive|) (E-primref d env x)] - [(eq? a '$apply) (E-apply d env x)] - [else (syntax-error x)])] - [else - (build-application - (build-global-reference a) - (E* d env))])] - [else - (build-application - (E a env) - (E* d env))]))] - [else (syntax-error x)]))) - ;;; - (define E*-top - (lambda (x x*) - (cond - [(null? x*) (E-top x)] - [else - (let ([x (E-top x)]) - (build-sequence x (E*-top (car x*) (cdr x*))))]))) - ;;; - (define E-top-level-define - (lambda (d ctxt) - (let ([def (parse-define d empty-env ctxt)]) - (let ([lhs (car def)] [rhs (cdr def)]) - (remprop lhs *keyword*) - (build-global-assignment lhs - (E-def rhs empty-env)))))) - ;;; - (define enumerate - (lambda (ls) - (let f ([ls ls] [i 0]) - (cond - [(null? ls) '()] - [else (cons i (f (cdr ls) (fxadd1 i)))])))) - (define E-top-level-define-record - (lambda (d x) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([name (car d)] [fields (cadr d)]) - (unless (symbol? name) (syntax-error x)) - (unless (and (list? fields) - (andmap symbol? fields)) - (syntax-error x)) - (let ([str (symbol->string name)]) - (let ([rtd (make-record-type str fields)]) - (let ([constructor - (string->symbol (string-append "make-" str))] - [predicate - (string->symbol (string-append str "?"))] - [accessors - (map (lambda (field) - (string->symbol - (string-append str "-" (symbol->string field)))) - fields)] - [mutators - (map (lambda (field) - (string->symbol - (string-append "set-" str "-" - (symbol->string field) - "!"))) - fields)]) - (for-each - (lambda (x) (remprop x *keyword*)) - (cons constructor - (cons predicate - (append accessors mutators)))) - (putprop name *keyword* (cons '$rtd rtd)) - (sequence - (build-global-assignment - constructor - (build-application - (build-primref 'record-constructor) - (list (build-constant rtd)))) - (build-global-assignment - predicate - (build-application - (build-primref 'record-predicate) - (list (build-constant rtd)))) - (apply sequence - (map (lambda (accessor i) - (build-global-assignment - accessor - (build-application - (build-primref 'record-field-accessor) - (list (build-constant rtd) - (build-constant i))))) - accessors - (enumerate fields))) - (apply sequence - (map (lambda (mutator i) - (build-global-assignment - mutator - (build-application - (build-primref 'record-field-mutator) - (list (build-constant rtd) - (build-constant i))))) - mutators - (enumerate fields))) - ))))))) - ;;; - (define E-top - (lambda (x) - (cond - [(self-evaluating? x) - (build-constant x)] - [(symbol? x) - (when (keyword? x) (syntax-error x)) - (build-global-reference x)] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(and (symbol? a) (keyword? a)) - (cond - [(eq? a 'begin) - (if (null? d) - (build-void) - (E*-top (car d) (cdr d)))] - [(eq? a 'define) - (E-top-level-define d x)] - [(eq? a 'define-record) - (E-top-level-define-record d x)] - [else (E x empty-env)])] - [else - (build-application - (E a empty-env) - (E* d empty-env))]))] - [else (syntax-error x)]))) - ;;; - (primitive-set! 'core-expand E-top) - ;;; - (primitive-set! 'current-expand - (make-parameter - core-expand - (lambda (x) - (unless (procedure? x) - (error 'current-expand "~s is not a procedure" x)) - x))) - ;;; - (primitive-set! 'expand - (lambda (x) - ((current-expand) x))) - ;;; - (for-each - (lambda (x) - (putprop x *keyword* x)) - '(lambda set! let let* letrec letrec* if quote when unless set! begin - define or and cond case foreign-call $apply |#primitive| - define-record record-case - quasiquote unquote unquote-splicing let-values parameterize - ))) - diff --git a/src/libexpand-6.1.ss b/src/libexpand-6.1.ss deleted file mode 100644 index 5d7b137..0000000 --- a/src/libexpand-6.1.ss +++ /dev/null @@ -1,1074 +0,0 @@ - -;;; 6.1: case-lambda -;;; -;;; Extended: cond case - -;;; -;;; -;;; Expand : Scheme -> Core Scheme -;;; -;;; ::= (quote datum) -;;; | -;;; | (if ) -;;; | (set! ) -;;; | (begin ...) -;;; | (letrec ([ ] ...) ...) -;;; | (lambda ...) -;;; | ( ...) -;;; | (#primitive| ) -;;; | ( ...) -;;; ::= () -;;; | -;;; | ( . ) -;;; ::= void | memv | top-level-value | set-top-level-value! -;;; | primitive-set! '| foreign-call | $apply -;;; -;;; -;;; Handled keywords: -;;; Core: case-lambda lambda set! if quote begin define -;;; Extended: let let* letrec letrec* when unless or and cond case -;;; define-record record-case - - -(let () - (define *keyword* (gensym "*keyword*")) - (define build-void - (lambda () - (build-application (build-primref 'void) '()))) - (define build-primref - (lambda (x) - (list '|#primitive| x))) - (define build-global-assignment - (lambda (x val) - (list 'set-top-level-value! - (build-constant x) val))) - (define build-foreign-call - (lambda (name rand*) - (cons 'foreign-call - (cons name rand*)))) - (define build-apply - (lambda (proc rand*) - (cons '$apply - (cons proc rand*)))) - (define build-global-reference - (lambda (x) - (list 'top-level-value (build-constant x)))) - (define build-memv - (lambda (x ls) - (list 'memv x ls))) - (define build-application - (lambda (fun arg*) - (cons fun arg*))) - (define build-sequence - (lambda (a b) - (let ([a* - (if (and (pair? a) (eq? (car a) 'begin)) - (cdr a) - (list a))] - [b* - (if (and (pair? b) (eq? (car b) 'begin)) - (cdr b) - (list b))]) - (cons 'begin (append a* b*))))) - (define sequence - (lambda args - (if (null? args) - (build-void) - (let f ([a (car args)] [args (cdr args)]) - (cond - [(null? args) a] - [else - (build-sequence a (f (car args) (cdr args)))]))))) - (define build-constant - (lambda (x) (list 'quote x))) - (define build-lexical-reference - (lambda (x) x)) - (define build-lexical-assignment - (lambda (lhs rhs) - (list 'set! lhs rhs))) - (define build-conditional - (lambda (test conseq altern) - (list 'if test conseq altern))) - (define build-function - (lambda (fml* body) - (build-case-lambda (list (list fml* body))))) - (define build-case-lambda - (lambda (cases) - (cons 'case-lambda cases))) - (define build-assignments - (lambda (lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (build-sequence - (build-lexical-assignment (car lhs*) (car rhs*)) - (build-assignments (cdr lhs*) (cdr rhs*) body))]))) - (define build-letrec - (lambda (lhs* rhs* body) - (if (null? lhs*) - body - (let ([g* (map (lambda (x) (gensym)) lhs*)]) - (build-let lhs* (map (lambda (x) (build-void)) lhs*) - (build-let g* rhs* - (build-assignments lhs* g* body))))))) - (define build-letrec* - (lambda (lhs* rhs* body) - (if (null? lhs*) - body - (build-let lhs* (map (lambda (x) (build-void)) lhs*) - (build-assignments lhs* rhs* body))))) - (define build-let - (lambda (lhs* rhs* body) - (build-application - (build-function lhs* body) - rhs*))) - (define build-let* - (lambda (lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (build-let (list (car lhs*)) (list (car rhs*)) - (build-let* (cdr lhs*) (cdr rhs*) body))]))) - ;;; builds - (define keyword? - (lambda (x) (getprop x *keyword*))) - (define self-evaluating? - (lambda (x) - (or (immediate? x) (string? x)))) - (define syntax-error - (lambda (x) - (error 'expand "invalid syntax ~s" x))) - (define empty-env '()) - (define E* - (lambda (x* env) - (cond - [(null? x*) '()] - [else - (cons (E (car x*) env) (E* (cdr x*) env))]))) - (define lookup - (lambda (x env) - (cond - [(assq x env) => cdr] - [else #f]))) - (define bug - (lambda (str . args) - (error 'bug "~a ~a" str args))) - ;;; - (define E-quote - (lambda (d env x) - (unless (fx= (length d) 1) - (syntax-error x)) - (build-constant (car d)))) - ;;; - (define E-if - (lambda (d env x) - (let ([n (length d)]) - (cond - [(fx= n 2) - (build-conditional - (E (car d) env) - (E (cadr d) env) - (build-void))] - [(fx= n 3) - (build-conditional - (E (car d) env) - (E (cadr d) env) - (E (caddr d) env))] - [else (syntax-error x)])))) - ;;; - (define E-set! - (lambda (d env x) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([lhs (car d)] [rhs (cadr d)]) - (unless (symbol? lhs) (syntax-error x)) - (cond - [(lookup lhs env) => - (lambda (b) - (build-lexical-assignment b (E rhs env)))] - [(keyword? lhs) (syntax-error x)] - [else - (build-global-assignment lhs (E rhs env))])))) - ;;; - (define E-begin - (lambda (d env x) - (unless (fx>= (length d) 1) - (syntax-error x)) - (E-begin^ (car d) (cdr d) env))) - (define E-begin^ - (lambda (a d env) - (cond - [(null? d) (E a env)] - [else - (build-sequence - (E a env) - (E-begin^ (car d) (cdr d) env))]))) - ;;; - (define E-named-let - (lambda (name d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([rator - (let ([gname (gensym)] - [nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env - (extend-env-fml* lhs* nlhs* - (cons (cons name gname) env))]) - (let ([body (E-internal body* env x)]) - (let ([fun (build-function nlhs* body)]) - (build-letrec - (list gname) - (list fun) - (build-lexical-reference gname))))))] - [rand* (map (lambda (x) (E x env)) rhs*)]) - (build-application rator rand*)))))) - ;;; - (define E-let - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (cond - [(symbol? bindings) - (E-named-let bindings body* env x)] - [else - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (build-let nlhs* nrhs* (E-internal body* env x))))))])))) - (define verify-bindings - (lambda (b* x) - (unless (list? b*) (syntax-error x)) - (for-each - (lambda (b) - (unless (and (list? b) - (fx= (length b) 2) - (symbol? (car b))) - (syntax-error x))) - b*))) - ;;; - (define E-let* - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let f ([lhs* lhs*] [nlhs* nlhs*] [rhs* rhs*] [env env]) - (cond - [(null? lhs*) (E-internal body* env x)] - [else - (build-let (list (car nlhs*)) - (list (E (car rhs*) env)) - (f (cdr lhs*) (cdr nlhs*) (cdr rhs*) - (cons (cons (car lhs*) (car nlhs*)) env)))]))))))) - ;;; - (define E-letrec - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (build-letrec nlhs* nrhs* (E-internal body* env x))))))))) - ;;; - (define E-letrec* - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (build-letrec* nlhs* nrhs* (E-internal body* env x))))))))) - ;;; - (define E-let-values - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (unless (list? bindings) (syntax-error x)) - (let f ([bindings bindings] [nenv env]) - (cond - [(null? bindings) (E-internal body* nenv x)] - [else - (let ([b (car bindings)]) - (unless (and (list? b) (fx= (length b) 2)) - (syntax-error x)) - (let ([fml* (car b)] [rhs (cadr b)]) - (verify-fml* fml* x) - (let ([nfml* (gen-fml* fml*)]) - (let ([nenv (extend-env-fml* fml* nfml* nenv)]) - (build-application - (build-primref 'call-with-values) - (list (build-function '() - (E rhs env)) - (build-function nfml* - (f (cdr bindings) nenv))))))))]))))) - ;;; - (define E-parameterize - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (cond - [(null? bindings) - (E-internal body* env x)] - [else - (unless (and (list? bindings) - (andmap (lambda (b) - (and (list? b) (fx= (length b) 2))) - bindings)) - (syntax-error x)) - (let ([lhs* (map car bindings)] [rhs* (map cadr bindings)]) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)] - [nrhs* (map (lambda (x) (gensym)) lhs*)] - [swap (gensym)] - [t* (map (lambda (x) (gensym)) lhs*)]) - (build-let - (append nlhs* nrhs*) - (map (lambda (x) (E x env)) - (append lhs* rhs*)) - (build-let - (list swap) - (list - (build-function '() - (apply sequence - (map (lambda (t lhs/rhs) - ;;; FIXME: vararg map - (define nlhs (car lhs/rhs)) - (define nrhs (cdr lhs/rhs)) - (build-let - (list t) - (list (build-application - (build-lexical-reference nlhs) - '())) - (build-sequence - (build-application - (build-lexical-reference nlhs) - (list (build-lexical-reference nrhs))) - (build-lexical-assignment - nrhs - (build-lexical-reference t))))) - t* (map cons nlhs* nrhs*))))) - (build-application - (build-primref 'dynamic-wind) - (list - (build-lexical-reference swap) - (build-function - '() - (E-internal body* env x)) - (build-lexical-reference swap)))))))])))) - ;;; - (define E-lambda - (lambda (d env x) - (build-case-lambda - (list ((lambda-clause env x) d))))) - (define (lambda-clause env x) - (lambda (d) - (unless (and (list? d) (fx>= (length d) 2)) (syntax-error x)) - (let ([fml* (car d)] [body* (cdr d)]) - (verify-fml* fml* x) - (let ([nfml* (gen-fml* fml*)]) - (let ([env (extend-env-fml* fml* nfml* env)]) - (list nfml* (E-internal body* env x))))))) - (define E-case-lambda - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-case-lambda - (map (lambda-clause env x) d)))) - (define verify-fml* - (lambda (fml* x) - (let ([g (gensym)]) - (let f ([fml* fml*]) - (cond - [(pair? fml*) - (let ([a (car fml*)]) - (unless (symbol? a) (syntax-error x)) - (when (getprop a g) (syntax-error x)) - (putprop a g a) - (f (cdr fml*)) - (remprop a g))] - [(symbol? fml*) - (when (getprop fml* g) (syntax-error x))] - [(null? fml*) (void)] - [else (syntax-error x)]))))) - (define gen-fml* - (lambda (fml*) - (cond - [(pair? fml*) - (cons (gensym) (gen-fml* (cdr fml*)))] - [(symbol? fml*) (gensym)] - [else '()]))) - (define extend-env-fml* - (lambda (fml* nfml* env) - (cond - [(pair? fml*) - (cons (cons (car fml*) (car nfml*)) - (extend-env-fml* (cdr fml*) (cdr nfml*) env))] - [(symbol? fml*) - (cons (cons fml* nfml*) env)] - [else env]))) - ;;; - (define E-internal - (lambda (body* env x) - (let f ([a (car body*)] [body* (cdr body*)] [lhs* '()] [rhs* '()]) - (cond - [(and (pair? a) (symbol? (car a))) - (let ([fst (car a)]) - (cond - [(or (memq fst lhs*) (lookup a env)) - (E-internal-done a body* lhs* rhs* env)] - [(keyword? fst) - (cond - [(eq? fst 'begin) - (let ([d (cdr a)]) - (unless (list? d) (syntax-error x)) - (let ([body* (append d body*)]) - (if (null? body*) - (syntax-error x) - (f (car body*) (cdr body*) lhs* rhs*))))] - [(eq? fst 'define) - (let ([def (parse-define (cdr a) env fst)]) - (f (car body*) (cdr body*) - (cons (car def) lhs*) - (cons (cdr def) rhs*)))] - [else (E-internal-done a body* lhs* rhs* env)])] - [else (E-internal-done a body* lhs* rhs* env)]))] - [else (E-internal-done a body* lhs* rhs* env)])))) - (define parse-define - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([fst (car d)] [rest (cdr d)]) - (cond - [(symbol? fst) - (unless (fx= (length rest) 1) (syntax-error x)) - (list fst 'expr (car rest))] - [(pair? fst) - (unless (symbol? (car fst)) (syntax-error x)) - (verify-fml* (cdr fst) x) - (list (car fst) 'defun (cdr fst) rest)] - [else (syntax-error x)])))) - (define E-def - (lambda (x env) - (let ([type (car x)]) - (cond - [(eq? type 'expr) (E (cadr x) env)] - [(eq? type 'defun) - (let ([fml* (cadr x)] [body* (caddr x)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([env (extend-env-fml* fml* nfml* env)]) - (build-function nfml* - (E-internal body* env x)))))] - [else (bug "invalid type" x)])))) - (define E-internal-done - (lambda (a d lhs* rhs* env) - (if (null? lhs*) - (E-begin^ a d env) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (append (map cons lhs* nlhs*) env)]) - (let ([nrhs* (map (lambda (x) (E-def x env)) rhs*)]) - (build-letrec* nlhs* nrhs* (E-begin^ a d env)))))))) - ;;; - (define E-when - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([test (car d)] [body* (cdr d)]) - (build-conditional - (E test env) - (E-begin^ (car body*) (cdr body*) env) - (build-void))))) - ;;; - (define E-unless - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([test (car d)] [body* (cdr d)]) - (build-conditional - (E test env) - (build-void) - (E-begin^ (car body*) (cdr body*) env))))) - ;;; - (define E-or - (lambda (d env x) - (cond - [(null? d) (build-constant #f)] - [(null? (cdr d)) (E (car d) env)] - [else - (let ([t (gensym)]) - (build-let (list t) (list (E (car d) env)) - (build-conditional - (build-lexical-reference t) - (build-lexical-reference t) - (E-or (cdr d) env x))))]))) - ;;; - (define E-and - (lambda (d env x) - (cond - [(null? d) (build-constant #t)] - [(null? (cdr d)) (E (car d) env)] - [else - (build-conditional - (E (car d) env) - (E-and (cdr d) env x) - (build-constant #f))]))) - ;;; - (define E-case - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([val (car d)] [cls* (cdr d)]) - (let ([g (gensym)]) - (build-let (list g) - (list (E val env)) - (E-case-cls* g (car cls*) (cdr cls*) env x)))))) - (define E-case-cls* - (lambda (g cls cls* env x) - (cond - [(null? cls*) (E-case-cls-last g cls env x)] - [else - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([ls (car cls)] [b* (cdr cls)]) - (unless (list? ls) (syntax-error x)) - (build-conditional - (build-memv (build-lexical-reference g) - (build-constant ls)) - (E-begin^ (car b*) (cdr b*) env) - (E-case-cls* g (car cls*) (cdr cls*) env x)))]))) - (define E-case-cls-last - (lambda (g cls env x) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([fst (car cls)] [b* (cdr cls)]) - (cond - [(and (eq? fst 'else) - (not (lookup fst env))) - (E-begin^ (car b*) (cdr b*) env)] - [(list? fst) - (build-conditional - (build-memv (build-lexical-reference g) - (build-constant fst)) - (E-begin^ (car b*) (cdr b*) env) - (build-void))] - [else (syntax-error x)])))) - ;;; - (define E-cond - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (E-cond-cls* (car d) (cdr d) env x))) - (define E-cond-cls* - (lambda (cls cls* env x) - (cond - [(null? cls*) (E-cond-cls-last cls env x)] - [else - (E-cond-cls cls env x - (E-cond-cls* (car cls*) (cdr cls*) env x))]))) - (define E-cond-cls - (lambda (cls env x k) - (unless (list? cls) (syntax-error x)) - (let ([n (length cls)]) - (unless (fx>= n 1) (syntax-error x)) - (cond - [(fx= n 1) - (let ([g (gensym)]) - (build-let (list g) - (list (E (car cls) env)) - (build-conditional - (build-lexical-reference g) - (build-lexical-reference g) - k)))] - [(and (fx= n 3) - (eq? (cadr cls) '=>) - (not (lookup '=> env))) - (let ([g (gensym)]) - (build-let (list g) - (list (E (car cls) env)) - (build-conditional - (build-lexical-reference g) - (build-application - (E (caddr cls) env) - (list (build-lexical-reference g))) - k)))] - [else - (let ([test (car cls)] [body* (cdr cls)]) - (build-conditional - (E test env) - (E-begin^ (car body*) (cdr body*) env) - k))])))) - (define E-cond-cls-last - (lambda (cls env x) - (unless (list? cls) (syntax-error x)) - (cond - [(and (fx>= (length cls) 2) - (eq? (car cls) 'else) - (not (lookup 'else env))) - (let ([body* (cdr cls)]) - (E-begin^ (car body*) (cdr body*) env))] - [else (E-cond-cls cls env x (build-void))]))) - ;;; - (define E-quasiquote - (lambda (d env x) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([expr (car d)]) - (Eqq expr 0 env x - (lambda (what expr^) - (case what - [(splice) (syntax-error x)] - [(unquot) expr^] - [(quoted) expr^] - [else (error 'quasiquote "what ~s" what)])))))) - (define qqmacro? - (lambda (sym expr env) - (and (pair? expr) - (eq? (car expr) sym) - (let ([d (cdr expr)]) - (and (pair? d) (null? (cdr d)))) - (not (lookup sym env))))) - (define Eqq - (lambda (x depth env orig k) - (cond - [(qqmacro? 'unquote x env) - (if (fx= depth 0) - (k 'unquot (E (cadr x) env)) - (Eqq (cadr x) (fx- depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'unquot (qqbuild 'cons (build-constant 'unquote) v))] - [(unquot) - (k 'unquot (qqbuild 'list (build-constant 'unquote) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)]))))] - [(qqmacro? 'unquote-splicing x env) - (if (fx= depth 0) - (k 'splice (E (cadr x) env)) - (Eqq (cadr x) (fx- depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'splice - (qqbuild 'cons (build-constant 'unquote-splicing) v))] - [(unquot) - (k 'splice - (qqbuild 'list (build-constant 'unquote-splicing) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)]))))] - [(qqmacro? 'quasiquote x env) - (Eqq (cadr x) (fx+ depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'unquot - (qqbuild 'cons (build-constant 'quasiquote) v))] - [(unquot) - (k 'unquot - (qqbuild 'list (build-constant 'quasiquote) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)])))] - [(pair? x) - (Eqq (car x) depth env orig - (lambda (what-a v-a) - (Eqq (cdr x) depth env orig - (lambda (what-d v-d) - (case what-a - [(splice) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'append v-a v-d))] - [(quoted) - (k 'unquot (qqbuild 'append v-a v-d))] - [else (error 'quasiquote "what ~s" what-d)])] - [(unquot) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'cons v-a v-d))] - [(quoted) - (k 'unquot (qqbuild 'cons v-a v-d))] - [else (error 'quasiquote "what ~s" what-d)])] - [(quoted) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'cons v-a v-d))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what-d)])] - [else (error 'quasiquote "what ~s" what-a)])))))] - [(vector? x) - (let () - (define vmap-list - (lambda (i ac) - (cond - [(fx= i -1) - (k 'unquot (qqbuild 'list->vector ac))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (vmap-list (fx- i 1) - (qqbuild 'append vi ac))] - [(unquot) - (vmap-list (fx- i 1) (qqbuild 'cons vi ac))] - [(quoted) - (vmap-list (fx- i 1) (qqbuild 'cons vi ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (define vmap-vec - (lambda (i ac) - (cond - [(fx= i -1) - (k 'unquot - (build-application - (build-primref 'vector) - ac))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (vmap-list (fx- i 1) - (qqbuild 'append vi - (build-application - (build-primref 'list) - ac)))] - [(unquot) - (vmap-vec (fx- i 1) (cons vi ac))] - [(quoted) - (vmap-vec (fx- i 1) (cons vi ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (define vmap-const - (lambda (i ac) - (cond - [(fx= i -1) (k 'quoted (build-constant x))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (if (null? ac) - (vmap-list (fx- i 1) vi) - (vmap-list (fx- i 1) - (qqbuild 'append vi (build-constant ac))))] - [(unquot) - (vmap-vec (fx- i 1) - (cons vi (map build-constant ac)))] - [(quoted) - (vmap-const (fx- i 1) - (cons (vector-ref x i) ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (vmap-const (fx- (vector-length x) 1) '()))] - [else (k 'quoted (build-constant x))]))) - (define qqbuild - (lambda (prim . args) - (build-application - (build-primref prim) - args))) - ;;; - (define E-record-case - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([val (car d)] [cls* (cdr d)]) - (let ([g (gensym)]) - (build-let - (list g) - (list (E val env)) - (E-record-case-cls* (car cls*) (cdr cls*) g env x)))))) - (define E-record-case-cls* - (lambda (cls cls* v env x) - (cond - [(null? cls*) (E-record-case-last-cls cls v env x)] - [else - (E-record-case-cls cls v env x - (E-record-case-cls* (car cls*) (cdr cls*) v env x))]))) - (define E-record-case-cls - (lambda (cls v env x k) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([pat (car cls)] [body* (cdr cls)]) - (unless (and (list? pat) (andmap symbol? pat) (fx>= (length pat) 1)) - (syntax-error x)) - (let ([rtd-name (car pat)] [vars (cdr pat)]) - (cond - [(lookup rtd-name env) (syntax-error x)] - [(getprop rtd-name *keyword*) => - (lambda (type) - (unless (and (pair? type) (eq? (car type) '$rtd)) - (syntax-error x)) - (let ([rtd (cdr type)] - [lhs* (map (lambda (x) (gensym)) vars)]) - (build-conditional - (build-application - (build-application - (build-primref 'record-predicate) - (list (build-constant rtd))) - (list (build-lexical-reference v))) - (build-let - lhs* - (map (lambda (i) - (build-application - (build-application - (build-primref 'record-field-accessor) - (list (build-constant rtd) - (build-constant i))) - (list (build-lexical-reference v)))) - (enumerate lhs*)) - (E-begin^ (car body*) (cdr body*) - (extend-env-fml* vars lhs* env))) - k)))] - [else (syntax-error x)]))))) - (define E-record-case-last-cls - (lambda (cls v env x) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([pat (car cls)] [body* (cdr cls)]) - (cond - [(and (eq? pat 'else) (not (lookup 'else env))) - (E-begin^ (car body*) (cdr body*) env)] - [else - (E-record-case-cls cls v env x - (build-application - (build-primref 'error) - (list - (build-constant 'record-case) - (build-constant "unmatched ~s in ~s") - (build-lexical-reference v) - (build-constant x))))])))) - ;;; - (define E-foreign-call - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-foreign-call - (E (car d) env) - (map (lambda (x) (E x env)) (cdr d))))) - ;;; - (define E-primref - (lambda (d env x) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([sym (car d)]) - (unless (symbol? sym) (syntax-error x)) - (cond - [(primitive? sym) (build-primref sym)] - [else (syntax-error x)])))) - ;;; - (define E-apply - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-apply - (E (car d) env) - (map (lambda (x) (E x env)) (cdr d))))) - ;;; - (define E - (lambda (x env) - (cond - [(self-evaluating? x) (build-constant x)] - [(symbol? x) - (cond - [(lookup x env) => - (lambda (b) - (build-lexical-reference b))] - [(keyword? x) - (syntax-error x)] - [else - (build-global-reference x)])] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(symbol? a) - (cond - [(lookup a env) => - (lambda (b) - (build-application - (build-lexical-reference b) - (E* d env)))] - [(keyword? a) - (cond - [(eq? a 'quote) (E-quote d env x)] - [(eq? a 'if) (E-if d env x)] - [(eq? a 'set!) (E-set! d env x)] - [(eq? a 'begin) (E-begin d env x)] - [(eq? a 'lambda) (E-lambda d env x)] - [(eq? a 'case-lambda) (E-case-lambda d env x)] - [(eq? a 'let) (E-let d env x)] - [(eq? a 'letrec) (E-letrec d env x)] - [(eq? a 'let*) (E-let* d env x)] - [(eq? a 'letrec*) (E-letrec* d env x)] - [(eq? a 'when) (E-when d env x)] - [(eq? a 'unless) (E-unless d env x)] - [(eq? a 'or) (E-or d env x)] - [(eq? a 'and) (E-and d env x)] - [(eq? a 'case) (E-case d env x)] - [(eq? a 'cond) (E-cond d env x)] - [(eq? a 'let-values) (E-let-values d env x)] - [(eq? a 'quasiquote) (E-quasiquote d env x)] - [(eq? a 'parameterize) (E-parameterize d env x)] - [(eq? a 'record-case) (E-record-case d env x)] - [(eq? a 'foreign-call) (E-foreign-call d env x)] - [(eq? a '|#primitive|) (E-primref d env x)] - [(eq? a '$apply) (E-apply d env x)] - [else (syntax-error x)])] - [else - (build-application - (build-global-reference a) - (E* d env))])] - [else - (build-application - (E a env) - (E* d env))]))] - [else (syntax-error x)]))) - ;;; - (define E*-top - (lambda (x x*) - (cond - [(null? x*) (E-top x)] - [else - (let ([x (E-top x)]) - (build-sequence x (E*-top (car x*) (cdr x*))))]))) - ;;; - (define E-top-level-define - (lambda (d ctxt) - (let ([def (parse-define d empty-env ctxt)]) - (let ([lhs (car def)] [rhs (cdr def)]) - (remprop lhs *keyword*) - (build-global-assignment lhs - (E-def rhs empty-env)))))) - ;;; - (define enumerate - (lambda (ls) - (let f ([ls ls] [i 0]) - (cond - [(null? ls) '()] - [else (cons i (f (cdr ls) (fxadd1 i)))])))) - (define E-top-level-define-record - (lambda (d x) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([name (car d)] [fields (cadr d)]) - (unless (symbol? name) (syntax-error x)) - (unless (and (list? fields) - (andmap symbol? fields)) - (syntax-error x)) - (let ([str (symbol->string name)]) - (let ([rtd (make-record-type str fields)]) - (let ([constructor - (string->symbol (string-append "make-" str))] - [predicate - (string->symbol (string-append str "?"))] - [accessors - (map (lambda (field) - (string->symbol - (string-append str "-" (symbol->string field)))) - fields)] - [mutators - (map (lambda (field) - (string->symbol - (string-append "set-" str "-" - (symbol->string field) - "!"))) - fields)]) - (for-each - (lambda (x) (remprop x *keyword*)) - (cons constructor - (cons predicate - (append accessors mutators)))) - (putprop name *keyword* (cons '$rtd rtd)) - (sequence - (build-global-assignment - constructor - (build-application - (build-primref 'record-constructor) - (list (build-constant rtd)))) - (build-global-assignment - predicate - (build-application - (build-primref 'record-predicate) - (list (build-constant rtd)))) - (apply sequence - (map (lambda (accessor i) - (build-global-assignment - accessor - (build-application - (build-primref 'record-field-accessor) - (list (build-constant rtd) - (build-constant i))))) - accessors - (enumerate fields))) - (apply sequence - (map (lambda (mutator i) - (build-global-assignment - mutator - (build-application - (build-primref 'record-field-mutator) - (list (build-constant rtd) - (build-constant i))))) - mutators - (enumerate fields))) - ))))))) - ;;; - (define E-top - (lambda (x) - (cond - [(self-evaluating? x) - (build-constant x)] - [(symbol? x) - (when (keyword? x) (syntax-error x)) - (build-global-reference x)] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(and (symbol? a) (keyword? a)) - (cond - [(eq? a 'begin) - (if (null? d) - (build-void) - (E*-top (car d) (cdr d)))] - [(eq? a 'define) - (E-top-level-define d x)] - [(eq? a 'define-record) - (E-top-level-define-record d x)] - [else (E x empty-env)])] - [else - (build-application - (E a empty-env) - (E* d empty-env))]))] - [else (syntax-error x)]))) - ;;; - (primitive-set! 'core-expand E-top) - ;;; - (primitive-set! 'current-expand - (make-parameter - core-expand - (lambda (x) - (unless (procedure? x) - (error 'current-expand "~s is not a procedure" x)) - x))) - ;;; - (primitive-set! 'expand - (lambda (x) - ((current-expand) x))) - ;;; - (for-each - (lambda (x) - (putprop x *keyword* x)) - '(lambda set! let let* letrec letrec* if quote when unless set! begin - case-lambda define or and cond case foreign-call $apply |#primitive| - define-record record-case - quasiquote unquote unquote-splicing let-values parameterize - ))) - diff --git a/src/libexpand-6.2.ss b/src/libexpand-6.2.ss deleted file mode 100644 index 11af1d9..0000000 --- a/src/libexpand-6.2.ss +++ /dev/null @@ -1,1099 +0,0 @@ - -;;; 6.2: internal define-record (not yet working) -;;; 6.1: case-lambda - -;;; Extended: cond case - -;;; -;;; -;;; Expand : Scheme -> Core Scheme -;;; -;;; ::= (quote datum) -;;; | -;;; | (if ) -;;; | (set! ) -;;; | (begin ...) -;;; | (letrec ([ ] ...) ...) -;;; | (lambda ...) -;;; | ( ...) -;;; | (#primitive| ) -;;; | ( ...) -;;; ::= () -;;; | -;;; | ( . ) -;;; ::= void | memv | top-level-value | set-top-level-value! -;;; | primitive-set! '| foreign-call | $apply -;;; -;;; -;;; Handled keywords: -;;; Core: case-lambda lambda set! if quote begin define -;;; Extended: let let* letrec letrec* when unless or and cond case -;;; define-record record-case - - -(let () - (define *interaction-environment* (gensym "*interaction-environment*")) - (define *scheme-environment* (gensym "*scheme-environment*")) - (define build-void - (lambda () - (build-application (build-primref 'void) '()))) - (define build-primref - (lambda (x) - (list '|#primitive| x))) - (define build-global-assignment - (lambda (x val) - (list 'set-top-level-value! - (build-constant x) val))) - (define build-foreign-call - (lambda (name rand*) - (cons 'foreign-call - (cons name rand*)))) - (define build-apply - (lambda (proc rand*) - (cons '$apply - (cons proc rand*)))) - (define build-global-reference - (lambda (x) - (list 'top-level-value (build-constant x)))) - (define build-memv - (lambda (x ls) - (list 'memv x ls))) - (define build-application - (lambda (fun arg*) - (cons fun arg*))) - (define build-sequence - (lambda (a b) - (let ([a* - (if (and (pair? a) (eq? (car a) 'begin)) - (cdr a) - (list a))] - [b* - (if (and (pair? b) (eq? (car b) 'begin)) - (cdr b) - (list b))]) - (cons 'begin (append a* b*))))) - (define sequence - (lambda args - (if (null? args) - (build-void) - (let f ([a (car args)] [args (cdr args)]) - (cond - [(null? args) a] - [else - (build-sequence a (f (car args) (cdr args)))]))))) - (define build-constant - (lambda (x) (list 'quote x))) - (define build-lexical-reference - (lambda (x) x)) - (define build-lexical-assignment - (lambda (lhs rhs) - (list 'set! lhs rhs))) - (define build-conditional - (lambda (test conseq altern) - (list 'if test conseq altern))) - (define build-function - (lambda (fml* body) - (build-case-lambda (list (list fml* body))))) - (define build-case-lambda - (lambda (cases) - (cons 'case-lambda cases))) - (define build-assignments - (lambda (lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (build-sequence - (build-lexical-assignment (car lhs*) (car rhs*)) - (build-assignments (cdr lhs*) (cdr rhs*) body))]))) - (define build-letrec - (lambda (lhs* rhs* body) - (if (null? lhs*) - body - (let ([g* (map (lambda (x) (gensym)) lhs*)]) - (build-let lhs* (map (lambda (x) (build-void)) lhs*) - (build-let g* rhs* - (build-assignments lhs* g* body))))))) - (define build-letrec* - (lambda (lhs* rhs* body) - (if (null? lhs*) - body - (build-let lhs* (map (lambda (x) (build-void)) lhs*) - (build-assignments lhs* rhs* body))))) - (define build-let - (lambda (lhs* rhs* body) - (build-application - (build-function lhs* body) - rhs*))) - (define build-let* - (lambda (lhs* rhs* body) - (cond - [(null? lhs*) body] - [else - (build-let (list (car lhs*)) (list (car rhs*)) - (build-let* (cdr lhs*) (cdr rhs*) body))]))) - ;;; builds - (define keyword? - (lambda (x) (getprop x *interaction-environment*))) - (define self-evaluating? - (lambda (x) - (or (immediate? x) (string? x)))) - (define syntax-error - (lambda (x) - (error 'expand "invalid syntax ~s" x))) - (define empty-env '()) - (define E* - (lambda (x* env) - (cond - [(null? x*) '()] - [else - (cons (E (car x*) env) (E* (cdr x*) env))]))) - (define lookup - (lambda (x env) - (cond - [(assq x env) => - (lambda (x) - (let ([d (cdr x)]) - (cond - [(symbol? d) (cons 'lexical d)] - [(and (pair? d) (eq? (car d) *interaction-environment*)) - (cons 'macro (cdr d))] - [else (error 'expand "BUG in lookup ~s" x)])))] - [(keyword? x) => (lambda (x) (cons 'macro x))] - [else (cons 'global x)]))) - (define bug - (lambda (str . args) - (error 'bug "~a ~a" str args))) - ;;; - (define E-quote - (lambda (d env x) - (unless (fx= (length d) 1) - (syntax-error x)) - (build-constant (car d)))) - ;;; - (define E-if - (lambda (d env x) - (let ([n (length d)]) - (cond - [(fx= n 2) - (build-conditional - (E (car d) env) - (E (cadr d) env) - (build-void))] - [(fx= n 3) - (build-conditional - (E (car d) env) - (E (cadr d) env) - (E (caddr d) env))] - [else (syntax-error x)])))) - ;;; - (define E-set! - (lambda (d env x) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([lhs (car d)] [rhs (cadr d)]) - (unless (symbol? lhs) (syntax-error x)) - (let ([b (lookup lhs env)]) - (case (car b) - [(lexical) - (build-lexical-assignment (cdr b) (E rhs env))] - [(global) - (build-global-assignment (cdr b) (E rhs env))] - [else (syntax-error x)]))))) - ;;; - (define E-begin - (lambda (d env x) - (unless (fx>= (length d) 1) - (syntax-error x)) - (E-begin^ (car d) (cdr d) env))) - (define E-begin^ - (lambda (a d env) - (cond - [(null? d) (E a env)] - [else - (build-sequence - (E a env) - (E-begin^ (car d) (cdr d) env))]))) - ;;; - (define E-named-let - (lambda (name d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([rator - (let ([gname (gensym)] - [nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env - (extend-env-fml* lhs* nlhs* - (cons (cons name gname) env))]) - (let ([body (E-internal body* env x)]) - (let ([fun (build-function nlhs* body)]) - (build-letrec - (list gname) - (list fun) - (build-lexical-reference gname))))))] - [rand* (map (lambda (x) (E x env)) rhs*)]) - (build-application rator rand*)))))) - ;;; - (define E-let - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (cond - [(symbol? bindings) - (E-named-let bindings body* env x)] - [else - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (build-let nlhs* nrhs* (E-internal body* env x))))))])))) - (define verify-bindings - (lambda (b* x) - (unless (list? b*) (syntax-error x)) - (for-each - (lambda (b) - (unless (and (list? b) - (fx= (length b) 2) - (symbol? (car b))) - (syntax-error x))) - b*))) - ;;; - (define E-let* - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let f ([lhs* lhs*] [nlhs* nlhs*] [rhs* rhs*] [env env]) - (cond - [(null? lhs*) (E-internal body* env x)] - [else - (build-let (list (car nlhs*)) - (list (E (car rhs*) env)) - (f (cdr lhs*) (cdr nlhs*) (cdr rhs*) - (cons (cons (car lhs*) (car nlhs*)) env)))]))))))) - ;;; - (define E-letrec - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (build-letrec nlhs* nrhs* (E-internal body* env x))))))))) - ;;; - (define E-letrec* - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (verify-bindings bindings x) - (let ([lhs* (map car bindings)] - [rhs* (map cadr bindings)]) - (verify-fml* lhs* x) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (extend-env-fml* lhs* nlhs* env)]) - (let ([nrhs* (map (lambda (x) (E x env)) rhs*)]) - (build-letrec* nlhs* nrhs* (E-internal body* env x))))))))) - ;;; - (define E-let-values - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (unless (list? bindings) (syntax-error x)) - (let f ([bindings bindings] [nenv env]) - (cond - [(null? bindings) (E-internal body* nenv x)] - [else - (let ([b (car bindings)]) - (unless (and (list? b) (fx= (length b) 2)) - (syntax-error x)) - (let ([fml* (car b)] [rhs (cadr b)]) - (verify-fml* fml* x) - (let ([nfml* (gen-fml* fml*)]) - (let ([nenv (extend-env-fml* fml* nfml* nenv)]) - (build-application - (build-primref 'call-with-values) - (list (build-function '() - (E rhs env)) - (build-function nfml* - (f (cdr bindings) nenv))))))))]))))) - ;;; - (define E-parameterize - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([bindings (car d)] [body* (cdr d)]) - (cond - [(null? bindings) - (E-internal body* env x)] - [else - (unless (and (list? bindings) - (andmap (lambda (b) - (and (list? b) (fx= (length b) 2))) - bindings)) - (syntax-error x)) - (let ([lhs* (map car bindings)] [rhs* (map cadr bindings)]) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)] - [nrhs* (map (lambda (x) (gensym)) lhs*)] - [swap (gensym)] - [t* (map (lambda (x) (gensym)) lhs*)]) - (build-let - (append nlhs* nrhs*) - (map (lambda (x) (E x env)) - (append lhs* rhs*)) - (build-let - (list swap) - (list - (build-function '() - (apply sequence - (map (lambda (t lhs/rhs) - ;;; FIXME: vararg map - (define nlhs (car lhs/rhs)) - (define nrhs (cdr lhs/rhs)) - (build-let - (list t) - (list (build-application - (build-lexical-reference nlhs) - '())) - (build-sequence - (build-application - (build-lexical-reference nlhs) - (list (build-lexical-reference nrhs))) - (build-lexical-assignment - nrhs - (build-lexical-reference t))))) - t* (map cons nlhs* nrhs*))))) - (build-application - (build-primref 'dynamic-wind) - (list - (build-lexical-reference swap) - (build-function - '() - (E-internal body* env x)) - (build-lexical-reference swap)))))))])))) - ;;; - (define E-lambda - (lambda (d env x) - (build-case-lambda - (list ((lambda-clause env x) d))))) - (define (lambda-clause env x) - (lambda (d) - (unless (and (list? d) (fx>= (length d) 2)) (syntax-error x)) - (let ([fml* (car d)] [body* (cdr d)]) - (verify-fml* fml* x) - (let ([nfml* (gen-fml* fml*)]) - (let ([env (extend-env-fml* fml* nfml* env)]) - (list nfml* (E-internal body* env x))))))) - (define E-case-lambda - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-case-lambda - (map (lambda-clause env x) d)))) - (define verify-fml* - (lambda (fml* x) - (let ([g (gensym)]) - (let f ([fml* fml*]) - (cond - [(pair? fml*) - (let ([a (car fml*)]) - (unless (symbol? a) (syntax-error x)) - (when (getprop a g) (syntax-error x)) - (putprop a g a) - (f (cdr fml*)) - (remprop a g))] - [(symbol? fml*) - (when (getprop fml* g) (syntax-error x))] - [(null? fml*) (void)] - [else (syntax-error x)]))))) - (define gen-fml* - (lambda (fml*) - (cond - [(pair? fml*) - (cons (gensym) (gen-fml* (cdr fml*)))] - [(symbol? fml*) (gensym)] - [else '()]))) - (define extend-env-fml* - (lambda (fml* nfml* env) - (cond - [(pair? fml*) - (cons (cons (car fml*) (car nfml*)) - (extend-env-fml* (cdr fml*) (cdr nfml*) env))] - [(symbol? fml*) - (cons (cons fml* nfml*) env)] - [else env]))) - ;;; - (define E-internal - (lambda (body* env x) - (let f ([a (car body*)] [body* (cdr body*)] [lhs* '()] [rhs* '()]) - (cond - [(and (pair? a) (symbol? (car a))) - (let ([fst (car a)]) - (if (memq fst lhs*) - (E-internal-done a body* lhs* rhs* env) - (let ([b (lookup fst env)]) - (case (car b) - [(lexical global) - (E-internal-done a body* lhs* rhs* env)] - [(macro) - (case fst - [(begin) - (let ([d (cdr a)]) - (unless (list? d) (syntax-error x)) - (let ([body* (append d body*)]) - (if (null? body*) - (syntax-error x) - (f (car body*) (cdr body*) lhs* rhs*))))] - [(define) - (let ([def (parse-define (cdr a) env fst)]) - (f (car body*) (cdr body*) - (cons (car def) lhs*) - (cons (cdr def) rhs*)))] - [else - (E-internal-done a body* lhs* rhs* env)])] - [else (syntax-error x)]))))] - [else (E-internal-done a body* lhs* rhs* env)])))) - (define parse-define - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([fst (car d)] [rest (cdr d)]) - (cond - [(symbol? fst) - (unless (fx= (length rest) 1) (syntax-error x)) - (list fst 'expr (car rest))] - [(pair? fst) - (unless (symbol? (car fst)) (syntax-error x)) - (verify-fml* (cdr fst) x) - (list (car fst) 'defun (cdr fst) rest)] - [else (syntax-error x)])))) - (define E-def - (lambda (x env) - (let ([type (car x)]) - (cond - [(eq? type 'expr) (E (cadr x) env)] - [(eq? type 'defun) - (let ([fml* (cadr x)] [body* (caddr x)]) - (let ([nfml* (gen-fml* fml*)]) - (let ([env (extend-env-fml* fml* nfml* env)]) - (build-function nfml* - (E-internal body* env x)))))] - [else (bug "invalid type" x)])))) - (define E-internal-done - (lambda (a d lhs* rhs* env) - (if (null? lhs*) - (E-begin^ a d env) - (let ([nlhs* (map (lambda (x) (gensym)) lhs*)]) - (let ([env (append (map cons lhs* nlhs*) env)]) - (let ([nrhs* (map (lambda (x) (E-def x env)) rhs*)]) - (build-letrec* nlhs* nrhs* (E-begin^ a d env)))))))) - ;;; - (define E-when - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([test (car d)] [body* (cdr d)]) - (build-conditional - (E test env) - (E-begin^ (car body*) (cdr body*) env) - (build-void))))) - ;;; - (define E-unless - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([test (car d)] [body* (cdr d)]) - (build-conditional - (E test env) - (build-void) - (E-begin^ (car body*) (cdr body*) env))))) - ;;; - (define E-or - (lambda (d env x) - (cond - [(null? d) (build-constant #f)] - [(null? (cdr d)) (E (car d) env)] - [else - (let ([t (gensym)]) - (build-let (list t) (list (E (car d) env)) - (build-conditional - (build-lexical-reference t) - (build-lexical-reference t) - (E-or (cdr d) env x))))]))) - ;;; - (define E-and - (lambda (d env x) - (cond - [(null? d) (build-constant #t)] - [(null? (cdr d)) (E (car d) env)] - [else - (build-conditional - (E (car d) env) - (E-and (cdr d) env x) - (build-constant #f))]))) - ;;; - (define E-case - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([val (car d)] [cls* (cdr d)]) - (let ([g (gensym)]) - (build-let (list g) - (list (E val env)) - (E-case-cls* g (car cls*) (cdr cls*) env x)))))) - (define E-case-cls* - (lambda (g cls cls* env x) - (cond - [(null? cls*) (E-case-cls-last g cls env x)] - [else - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([ls (car cls)] [b* (cdr cls)]) - (unless (list? ls) (syntax-error x)) - (build-conditional - (build-memv (build-lexical-reference g) - (build-constant ls)) - (E-begin^ (car b*) (cdr b*) env) - (E-case-cls* g (car cls*) (cdr cls*) env x)))]))) - (define E-case-cls-last - (lambda (g cls env x) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([fst (car cls)] [b* (cdr cls)]) - (cond - [(and (eq? fst 'else) - (eq? (car (lookup 'else env)) 'global)) - (E-begin^ (car b*) (cdr b*) env)] - [(list? fst) - (build-conditional - (build-memv (build-lexical-reference g) - (build-constant fst)) - (E-begin^ (car b*) (cdr b*) env) - (build-void))] - [else (syntax-error x)])))) - ;;; - (define E-cond - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (E-cond-cls* (car d) (cdr d) env x))) - (define E-cond-cls* - (lambda (cls cls* env x) - (cond - [(null? cls*) (E-cond-cls-last cls env x)] - [else - (E-cond-cls cls env x - (E-cond-cls* (car cls*) (cdr cls*) env x))]))) - (define E-cond-cls - (lambda (cls env x k) - (unless (list? cls) (syntax-error x)) - (let ([n (length cls)]) - (unless (fx>= n 1) (syntax-error x)) - (cond - [(fx= n 1) - (let ([g (gensym)]) - (build-let (list g) - (list (E (car cls) env)) - (build-conditional - (build-lexical-reference g) - (build-lexical-reference g) - k)))] - [(and (fx= n 3) - (eq? (cadr cls) '=>) - (eq? (car (lookup '=> env)) 'global)) - (let ([g (gensym)]) - (build-let (list g) - (list (E (car cls) env)) - (build-conditional - (build-lexical-reference g) - (build-application - (E (caddr cls) env) - (list (build-lexical-reference g))) - k)))] - [else - (let ([test (car cls)] [body* (cdr cls)]) - (build-conditional - (E test env) - (E-begin^ (car body*) (cdr body*) env) - k))])))) - (define E-cond-cls-last - (lambda (cls env x) - (unless (list? cls) (syntax-error x)) - (cond - [(and (fx>= (length cls) 2) - (eq? (car cls) 'else) - (eq? (car (lookup 'else env)) 'global)) - (let ([body* (cdr cls)]) - (E-begin^ (car body*) (cdr body*) env))] - [else (E-cond-cls cls env x (build-void))]))) - ;;; - (define E-quasiquote - (lambda (d env x) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([expr (car d)]) - (Eqq expr 0 env x - (lambda (what expr^) - (case what - [(splice) (syntax-error x)] - [(unquot) expr^] - [(quoted) expr^] - [else (error 'quasiquote "what ~s" what)])))))) - (define qqmacro? - (lambda (sym expr env) - (and (pair? expr) - (eq? (car expr) sym) - (let ([d (cdr expr)]) - (and (pair? d) (null? (cdr d)))) - (memq (car (lookup sym env)) '(global macro))))) - (define Eqq - (lambda (x depth env orig k) - (cond - [(qqmacro? 'unquote x env) - (if (fx= depth 0) - (k 'unquot (E (cadr x) env)) - (Eqq (cadr x) (fx- depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'unquot (qqbuild 'cons (build-constant 'unquote) v))] - [(unquot) - (k 'unquot (qqbuild 'list (build-constant 'unquote) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)]))))] - [(qqmacro? 'unquote-splicing x env) - (if (fx= depth 0) - (k 'splice (E (cadr x) env)) - (Eqq (cadr x) (fx- depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'splice - (qqbuild 'cons (build-constant 'unquote-splicing) v))] - [(unquot) - (k 'splice - (qqbuild 'list (build-constant 'unquote-splicing) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)]))))] - [(qqmacro? 'quasiquote x env) - (Eqq (cadr x) (fx+ depth 1) env orig - (lambda (what v) - (case what - [(splice) - (k 'unquot - (qqbuild 'cons (build-constant 'quasiquote) v))] - [(unquot) - (k 'unquot - (qqbuild 'list (build-constant 'quasiquote) v))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what)])))] - [(pair? x) - (Eqq (car x) depth env orig - (lambda (what-a v-a) - (Eqq (cdr x) depth env orig - (lambda (what-d v-d) - (case what-a - [(splice) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'append v-a v-d))] - [(quoted) - (k 'unquot (qqbuild 'append v-a v-d))] - [else (error 'quasiquote "what ~s" what-d)])] - [(unquot) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'cons v-a v-d))] - [(quoted) - (k 'unquot (qqbuild 'cons v-a v-d))] - [else (error 'quasiquote "what ~s" what-d)])] - [(quoted) - (case what-d - [(splice) (syntax-error x)] - [(unquot) - (k 'unquot (qqbuild 'cons v-a v-d))] - [(quoted) - (k 'quoted (build-constant x))] - [else (error 'quasiquote "what ~s" what-d)])] - [else (error 'quasiquote "what ~s" what-a)])))))] - [(vector? x) - (let () - (define vmap-list - (lambda (i ac) - (cond - [(fx= i -1) - (k 'unquot (qqbuild 'list->vector ac))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (vmap-list (fx- i 1) - (qqbuild 'append vi ac))] - [(unquot) - (vmap-list (fx- i 1) (qqbuild 'cons vi ac))] - [(quoted) - (vmap-list (fx- i 1) (qqbuild 'cons vi ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (define vmap-vec - (lambda (i ac) - (cond - [(fx= i -1) - (k 'unquot - (build-application - (build-primref 'vector) - ac))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (vmap-list (fx- i 1) - (qqbuild 'append vi - (build-application - (build-primref 'list) - ac)))] - [(unquot) - (vmap-vec (fx- i 1) (cons vi ac))] - [(quoted) - (vmap-vec (fx- i 1) (cons vi ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (define vmap-const - (lambda (i ac) - (cond - [(fx= i -1) (k 'quoted (build-constant x))] - [else - (Eqq (vector-ref x i) depth env orig - (lambda (what vi) - (case what - [(splice) - (if (null? ac) - (vmap-list (fx- i 1) vi) - (vmap-list (fx- i 1) - (qqbuild 'append vi (build-constant ac))))] - [(unquot) - (vmap-vec (fx- i 1) - (cons vi (map build-constant ac)))] - [(quoted) - (vmap-const (fx- i 1) - (cons (vector-ref x i) ac))] - [else (error 'quasiquote "what ~s" what)])))]))) - (vmap-const (fx- (vector-length x) 1) '()))] - [else (k 'quoted (build-constant x))]))) - (define qqbuild - (lambda (prim . args) - (build-application - (build-primref prim) - args))) - ;;; - (define E-record-case - (lambda (d env x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([val (car d)] [cls* (cdr d)]) - (let ([g (gensym)]) - (build-let - (list g) - (list (E val env)) - (E-record-case-cls* (car cls*) (cdr cls*) g env x)))))) - (define E-record-case-cls* - (lambda (cls cls* v env x) - (cond - [(null? cls*) (E-record-case-last-cls cls v env x)] - [else - (E-record-case-cls cls v env x - (E-record-case-cls* (car cls*) (cdr cls*) v env x))]))) - (define E-record-case-cls - (lambda (cls v env x k) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([pat (car cls)] [body* (cdr cls)]) - (unless (and (list? pat) (andmap symbol? pat) (fx>= (length pat) 1)) - (syntax-error x)) - (let ([rtd-name (car pat)] [vars (cdr pat)]) - (let ([b (lookup rtd-name env)]) - (case (car b) - [(macro) - (unless (and (pair? (cdr b)) (eq? '$rtd (cadr b))) - (syntax-error x)) - (let ([rtd (cddr b)] - [lhs* (map (lambda (x) (gensym)) vars)]) - (build-conditional - (build-application - (build-application - (build-primref 'record-predicate) - (list (build-constant rtd))) - (list (build-lexical-reference v))) - (build-let - lhs* - (map (lambda (i) - (build-application - (build-application - (build-primref 'record-field-accessor) - (list (build-constant rtd) - (build-constant i))) - (list (build-lexical-reference v)))) - (enumerate lhs*)) - (E-begin^ (car body*) (cdr body*) - (extend-env-fml* vars lhs* env))) - k))] - [else (syntax-error x)])))))) - (define E-record-case-last-cls - (lambda (cls v env x) - (unless (and (list? cls) (fx>= (length cls) 2)) - (syntax-error x)) - (let ([pat (car cls)] [body* (cdr cls)]) - (cond - [(and (eq? pat 'else) - (eq? (car (lookup 'else env)) 'global)) - (E-begin^ (car body*) (cdr body*) env)] - [else - (E-record-case-cls cls v env x - (build-application - (build-primref 'error) - (list - (build-constant 'record-case) - (build-constant "unmatched ~s in ~s") - (build-lexical-reference v) - (build-constant x))))])))) - ;;; - (define E-foreign-call - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-foreign-call - (E (car d) env) - (map (lambda (x) (E x env)) (cdr d))))) - ;;; - (define E-primref - (lambda (d env x) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([sym (car d)]) - (unless (symbol? sym) (syntax-error x)) - (cond - [(primitive? sym) (build-primref sym)] - [else (syntax-error x)])))) - ;;; - (define E-apply - (lambda (d env x) - (unless (fx>= (length d) 1) (syntax-error x)) - (build-apply - (E (car d) env) - (map (lambda (x) (E x env)) (cdr d))))) - ;;; - (define E-define-record - (lambda (d env x) - (error 'E-define-record "not yet"))) - - (define E-macro-call - (lambda (a d env x) - (case a - [(quote) (E-quote d env x)] - [(if) (E-if d env x)] - [(set!) (E-set! d env x)] - [(begin) (E-begin d env x)] - [(lambda) (E-lambda d env x)] - [(case-lambda) (E-case-lambda d env x)] - [(let) (E-let d env x)] - [(letrec) (E-letrec d env x)] - [(let*) (E-let* d env x)] - [(letrec*) (E-letrec* d env x)] - [(when) (E-when d env x)] - [(unless) (E-unless d env x)] - [(or) (E-or d env x)] - [(and) (E-and d env x)] - [(case) (E-case d env x)] - [(cond) (E-cond d env x)] - [(let-values) (E-let-values d env x)] - [(quasiquote) (E-quasiquote d env x)] - [(parameterize) (E-parameterize d env x)] - [(define-record) (E-define-record d env x)] - [(record-case) (E-record-case d env x)] - [(foreign-call) (E-foreign-call d env x)] - [(|#primitive|) (E-primref d env x)] - [($apply) (E-apply d env x)] - [else (syntax-error x)]))) - ;;; - (define E - (lambda (x env) - (cond - [(self-evaluating? x) (build-constant x)] - [(symbol? x) - (let ([b (lookup x env)]) - (case (car b) - [(lexical) - (build-lexical-reference (cdr b))] - [(global) - (build-global-reference (cdr b))] - [else (syntax-error x)]))] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(symbol? a) - (let ([b (lookup a env)]) - (case (car b) - [(lexical) - (build-application - (build-lexical-reference (cdr b)) - (E* d env))] - [(global) - (build-application - (build-global-reference (cdr b)) - (E* d env))] - [(macro) - (E-macro-call a d env x)] - [else (syntax-error x)]))] - [else - (build-application - (E a env) - (E* d env))]))] - [else (syntax-error x)]))) - ;;; - (define E*-top - (lambda (x x*) - (cond - [(null? x*) (E-top x)] - [else - (let ([x (E-top x)]) - (build-sequence x (E*-top (car x*) (cdr x*))))]))) - ;;; - (define E-top-level-define - (lambda (d ctxt) - (let ([def (parse-define d empty-env ctxt)]) - (let ([lhs (car def)] [rhs (cdr def)]) - (remprop lhs *interaction-environment*) - (build-global-assignment lhs - (E-def rhs empty-env)))))) - ;;; - (define enumerate - (lambda (ls) - (let f ([ls ls] [i 0]) - (cond - [(null? ls) '()] - [else (cons i (f (cdr ls) (fxadd1 i)))])))) - (define E-top-level-define-record - (lambda (d x) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([name (car d)] [fields (cadr d)]) - (unless (symbol? name) (syntax-error x)) - (unless (and (list? fields) - (andmap symbol? fields)) - (syntax-error x)) - (let ([str (symbol->string name)]) - (let ([rtd (make-record-type str fields)]) - (let ([constructor - (string->symbol (string-append "make-" str))] - [predicate - (string->symbol (string-append str "?"))] - [accessors - (map (lambda (field) - (string->symbol - (string-append str "-" (symbol->string field)))) - fields)] - [mutators - (map (lambda (field) - (string->symbol - (string-append "set-" str "-" - (symbol->string field) - "!"))) - fields)]) - (for-each - (lambda (x) (remprop x *interaction-environment*)) - (cons constructor - (cons predicate - (append accessors mutators)))) - (putprop name *interaction-environment* (cons '$rtd rtd)) - (sequence - (build-global-assignment - constructor - (build-application - (build-primref 'record-constructor) - (list (build-constant rtd)))) - (build-global-assignment - predicate - (build-application - (build-primref 'record-predicate) - (list (build-constant rtd)))) - (apply sequence - (map (lambda (accessor i) - (build-global-assignment - accessor - (build-application - (build-primref 'record-field-accessor) - (list (build-constant rtd) - (build-constant i))))) - accessors - (enumerate fields))) - (apply sequence - (map (lambda (mutator i) - (build-global-assignment - mutator - (build-application - (build-primref 'record-field-mutator) - (list (build-constant rtd) - (build-constant i))))) - mutators - (enumerate fields))) - ))))))) - ;;; - (define E-top - (lambda (x) - (cond - [(self-evaluating? x) - (build-constant x)] - [(symbol? x) - (when (keyword? x) (syntax-error x)) - (build-global-reference x)] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(and (symbol? a) (keyword? a)) - (cond - [(eq? a 'begin) - (if (null? d) - (build-void) - (E*-top (car d) (cdr d)))] - [(eq? a 'define) - (E-top-level-define d x)] - [(eq? a 'define-record) - (E-top-level-define-record d x)] - [else (E x empty-env)])] - [else - (build-application - (E a empty-env) - (E* d empty-env))]))] - [else (syntax-error x)]))) - ;;; - (primitive-set! 'core-expand E-top) - ;;; - (primitive-set! 'current-expand - (make-parameter - core-expand - (lambda (x) - (unless (procedure? x) - (error 'current-expand "~s is not a procedure" x)) - x))) - ;;; - (primitive-set! 'expand - (lambda (x) - ((current-expand) x))) - ;;; - (for-each - (lambda (x) - (putprop x *interaction-environment* x)) - '(lambda set! let let* letrec letrec* if quote when unless set! begin - case-lambda define or and cond case foreign-call $apply |#primitive| - define-record record-case - quasiquote unquote unquote-splicing let-values parameterize - ))) - - - diff --git a/src/libfasl-6.0.ss b/src/libfasl-6.0.ss deleted file mode 100644 index 3ed6c7d..0000000 --- a/src/libfasl-6.0.ss +++ /dev/null @@ -1,261 +0,0 @@ - -;;; FASL -;;; -;;; A fasl object is a header followed by one or more objects followed by an -;;; end-of-fasl marker -;;; -;;; The header is the string "#@IK01" -;;; The end of fasl marker is "@" -;;; -;;; An object is either: -;;; "N" : denoting the empty list -;;; "T" : denoting #t -;;; "F" : denoting #f -;;; "E" : denoting the end of file object -;;; "U" : denoting the unspecified value -;;; "I" + 4-bytes : denoting a fixnum (in host byte order) -;;; "C" + 1-byte : denoting a character -;;; "P" + object1 + object2 : a pair -;;; "V" + 4-bytes(n) + object ... : a vector of length n followed by n -;;; objects -;;; "S" + 4-bytes(n) + char ... : a string -;;; "M" + symbol-name : a symbol -;;; "G" + pretty-name + unique-name : a gensym -;;; "R" + rtd-name + rtd-symbol + field-count + field-names -;;; "{" + field-count + rtd + fields -;;; ">" + 4-bytes(i) : mark the next object with index i -;;; "<" + 4-bytes(i) : dereference the object marked with index i -;;; - - -(let () - (define write-fixnum - (lambda (x p) - (unless (fixnum? x) (error 'write-fixnum "not a fixnum ~s" x)) - (write-char (integer->char (fxsll (fxlogand x #x3F) 2)) p) - (write-char (integer->char (fxlogand (fxsra x 6) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 14) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 22) #xFF)) p))) - (define write-int - (lambda (x p) - (unless (fixnum? x) (error 'write-int "not a fixnum ~s" x)) - (write-char (integer->char (fxlogand x #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 8) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 16) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 24) #xFF)) p))) - - (define fasl-write-immediate - (lambda (x p) - (cond - [(null? x) (write-char #\N p)] - [(fixnum? x) - (write-char #\I p) - (write-fixnum x p)] - [(char? x) - (write-char #\C p) - (write-char x p)] - [(boolean? x) - (write-char (if x #\T #\F) p)] - [(eof-object? x) (write-char #\E p)] - [(eq? x (void)) (write-char #\U p)] - [else (error 'fasl-write "~s is not a fasl-writable immediate" x)]))) - - (define do-write - (lambda (x p h m) - (cond - [(pair? x) - (write-char #\P p) - (fasl-write (cdr x) p h - (fasl-write (car x) p h m))] - [(vector? x) - (write-char #\V p) - (write-int (vector-length x) p) - (let f ([x x] [i 0] [n (vector-length x)] [m m]) - (cond - [(fx= i n) m] - [else - (f x (fxadd1 i) n - (fasl-write (vector-ref x i) p h m))]))] - [(string? x) - (write-char #\S p) - (write-int (string-length x) p) - (let f ([x x] [i 0] [n (string-length x)]) - (cond - [(fx= i n) m] - [else - (write-char (string-ref x i) p) - (f x (fxadd1 i) n)]))] - [(gensym? x) - (write-char #\G p) - (fasl-write (gensym->unique-string x) p h - (fasl-write (symbol->string x) p h m))] - [(symbol? x) - (write-char #\M p) - (fasl-write (symbol->string x) p h m)] - [(code? x) - (write-char #\X p) - (let ([code-vec (code-code-vec x)] - [reloc-vec (code-reloc-vec x)] - [closure-size (code-closure-size x)]) - (write-int (string-length code-vec) p) - (write-int (fx* (vector-length reloc-vec) 4) p) - (write-int closure-size p) - (let f ([i 0] [n (string-length code-vec)]) - (unless (fx= i n) - (write-char (string-ref code-vec i) p) - (f (fxadd1 i) n))) - (let f ([i 0] [n (vector-length reloc-vec)] [m m]) - (if (fx= i n) - m - (let ([b (vector-ref reloc-vec i)]) - (case (car b) - [(object) - (let ([code-idx (cadr b)] [object (caddr b)]) - (write-char #\O p) - (write-int code-idx p) - (let ([m (fasl-write object p h m)]) - (f (fxadd1 i) n m)))] - [(foreign) - (let ([code-idx (cadr b)] [object (caddr b)]) - (write-char #\F p) - (write-int code-idx p) - (let ([m (fasl-write object p h m)]) - (f (fx+ i 2) n m)))] - [(object+off/rel object+off) - (let ([code-idx (cadr b)] - [object (caddr b)] - [object-off (cadddr b)]) - (if (eq? (car b) 'object+off/rel) - (write-char #\J p) - (write-char #\D p)) - (write-int code-idx p) - (write-int object-off p) - (let ([m (fasl-write object p h m)]) - (f (fx+ i 2) n m)))] - [else (error 'fasl-write "invalid reloc byte ~s" b)])))))] - [(record? x) - (let ([rtd (record-type-descriptor x)]) - (cond - [(eq? rtd #%$base-rtd) - ;;; rtd record - (write-char #\R p) - (let ([names (record-type-field-names x)] - [m - (fasl-write (record-type-symbol x) p h - (fasl-write (record-type-name x) p h m))]) - (write-int (length names) p) - (let f ([names names] [m m]) - (cond - [(null? names) m] - [else - (f (cdr names) - (fasl-write (car names) p h m))])))] - [else - ;;; non-rtd record - (write-char #\{ p) - (write-int (length (record-type-field-names rtd)) p) - (let f ([names (record-type-field-names rtd)] - [m (fasl-write rtd p h m)]) - (cond - [(null? names) m] - [else - (f (cdr names) - (fasl-write - ((record-field-accessor rtd (car names)) x) - p h m))]))]))] - [else (error 'fasl-write "~s is not fasl-writable" x)]))) - (define fasl-write - (lambda (x p h m) - (cond - [(immediate? x) (fasl-write-immediate x p) m] - [(get-hash-table h x #f) => - (lambda (mark) - (unless (fixnum? mark) - (error 'fasl-write "BUG: invalid mark ~s" mark)) - (cond - [(fx= mark 0) ; singly referenced - (do-write x p h m)] - [(fx> mark 0) ; marked but not written - (put-hash-table! h x (fx- 0 m)) - (write-char #\> p) - (write-int m p) - (do-write x p h (fxadd1 m))] - [else - (write-char #\< p) - (write-int (fx- 0 mark) p) - m]))] - [else (error 'fasl-write "BUG: not in hash table ~s" x)]))) - (define make-graph - (lambda (x h) - (unless (immediate? x) - (cond - [(get-hash-table h x #f) => - (lambda (i) - (put-hash-table! h x (fxadd1 i)))] - [else - (put-hash-table! h x 0) - (cond - [(pair? x) - (make-graph (car x) h) - (make-graph (cdr x) h)] - [(vector? x) - (let f ([x x] [i 0] [n (vector-length x)]) - (unless (fx= i n) - (make-graph (vector-ref x i) h) - (f x (fxadd1 i) n)))] - [(symbol? x) - (make-graph (symbol->string x) h) - (when (gensym? x) (make-graph (gensym->unique-string x) h))] - [(string? x) (void)] - [(code? x) - (let ([x (code-reloc-vec x)]) - (let f ([i 0] [n (vector-length x)]) - (unless (fx= i n) - (let ([b (vector-ref x i)]) - (case (car b) - [(object) - (make-graph (caddr b) h) - (f (fxadd1 i) n)] - [(object+off/rel object+off foreign) - (make-graph (caddr b) h) - (f (fx+ i 2) n)] - [else (error 'fasl-write "unrecognized reloc ~s" b)] - )))))] - [(record? x) - (when (eq? x #%$base-rtd) - (error 'fasl-write "$base-rtd is not writable")) - (let ([rtd (record-type-descriptor x)]) - (cond - [(eq? rtd #%$base-rtd) - ;;; this is an rtd - (make-graph (record-type-name x) h) - (make-graph (record-type-symbol x) h) - (for-each (lambda (x) (make-graph x h)) - (record-type-field-names x))] - [else - ;;; this is a record - (make-graph rtd h) - (for-each - (lambda (name) - (make-graph ((record-field-accessor rtd name) x) h)) - (record-type-field-names rtd))]))] - [else (error 'fasl-write "~s is not fasl-writable" x)])])))) - (define do-fasl-write - (lambda (x port) - (let ([h (make-hash-table)]) - (make-graph x h) - (write-char #\# port) - (write-char #\@ port) - (write-char #\I port) - (write-char #\K port) - (write-char #\0 port) - (write-char #\1 port) - (fasl-write x port h 1)))) - (primitive-set! 'fasl-write - (case-lambda - [(x) (do-fasl-write x (current-output-port))] - [(x port) - (unless (output-port? port) - (error 'fasl-write "~s is not an output port" port)) - (do-fasl-write x port)]))) - diff --git a/src/libfasl-6.6.ss b/src/libfasl-6.6.ss deleted file mode 100644 index 2cab6ef..0000000 --- a/src/libfasl-6.6.ss +++ /dev/null @@ -1,217 +0,0 @@ - -;;; FASL -;;; -;;; A fasl object is a header followed by one or more objects followed by an -;;; end-of-fasl marker -;;; -;;; The header is the string "#@IK01" -;;; The end of fasl marker is "@" -;;; -;;; An object is either: -;;; "N" : denoting the empty list -;;; "T" : denoting #t -;;; "F" : denoting #f -;;; "E" : denoting the end of file object -;;; "U" : denoting the unspecified value -;;; "I" + 4-bytes : denoting a fixnum (in host byte order) -;;; "C" + 1-byte : denoting a character -;;; "P" + object1 + object2 : a pair -;;; "V" + 4-bytes(n) + object ... : a vector of length n followed by n -;;; objects -;;; "S" + 4-bytes(n) + char ... : a string -;;; "M" + symbol-name : a symbol -;;; "G" + pretty-name + unique-name : a gensym -;;; "R" + rtd-name + rtd-symbol + field-count + field-names -;;; "{" + field-count + rtd + fields -;;; ">" + 4-bytes(i) : mark the next object with index i -;;; "<" + 4-bytes(i) : dereference the object marked with index i -;;; - - -(let () - (define write-fixnum - (lambda (x p) - (unless (fixnum? x) (error 'write-fixnum "not a fixnum ~s" x)) - (write-char (integer->char (fxsll (fxlogand x #x3F) 2)) p) - (write-char (integer->char (fxlogand (fxsra x 6) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 14) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 22) #xFF)) p))) - (define write-int - (lambda (x p) - (unless (fixnum? x) (error 'write-int "not a fixnum ~s" x)) - (write-char (integer->char (fxlogand x #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 8) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 16) #xFF)) p) - (write-char (integer->char (fxlogand (fxsra x 24) #xFF)) p))) - - (define fasl-write-immediate - (lambda (x p) - (cond - [(null? x) (write-char #\N p)] - [(fixnum? x) - (write-char #\I p) - (write-fixnum x p)] - [(char? x) - (write-char #\C p) - (write-char x p)] - [(boolean? x) - (write-char (if x #\T #\F) p)] - [(eof-object? x) (write-char #\E p)] - [(eq? x (void)) (write-char #\U p)] - [else (error 'fasl-write "~s is not a fasl-writable immediate" x)]))) - - (define do-write - (lambda (x p h m) - (cond - [(pair? x) - (write-char #\P p) - (fasl-write (cdr x) p h - (fasl-write (car x) p h m))] - [(vector? x) - (write-char #\V p) - (write-int (vector-length x) p) - (let f ([x x] [i 0] [n (vector-length x)] [m m]) - (cond - [(fx= i n) m] - [else - (f x (fxadd1 i) n - (fasl-write (vector-ref x i) p h m))]))] - [(string? x) - (write-char #\S p) - (write-int (string-length x) p) - (let f ([x x] [i 0] [n (string-length x)]) - (cond - [(fx= i n) m] - [else - (write-char (string-ref x i) p) - (f x (fxadd1 i) n)]))] - [(gensym? x) - (write-char #\G p) - (fasl-write (gensym->unique-string x) p h - (fasl-write (symbol->string x) p h m))] - [(symbol? x) - (write-char #\M p) - (fasl-write (symbol->string x) p h m)] - [(code? x) - (write-char #\x p) - (write-int (code-size x) p) - (write-int (code-closure-size x) p) - (let f ([i 0] [n (code-size x)]) - (unless (fx= i n) - (write-char (integer->char (code-ref x i)) p) - (f (fxadd1 i) n))) - (fasl-write (code-reloc-vector x) p h m)] - [(record? x) - (let ([rtd (record-type-descriptor x)]) - (cond - [(eq? rtd #%$base-rtd) - ;;; rtd record - (write-char #\R p) - (let ([names (record-type-field-names x)] - [m - (fasl-write (record-type-symbol x) p h - (fasl-write (record-type-name x) p h m))]) - (write-int (length names) p) - (let f ([names names] [m m]) - (cond - [(null? names) m] - [else - (f (cdr names) - (fasl-write (car names) p h m))])))] - [else - ;;; non-rtd record - (write-char #\{ p) - (write-int (length (record-type-field-names rtd)) p) - (let f ([names (record-type-field-names rtd)] - [m (fasl-write rtd p h m)]) - (cond - [(null? names) m] - [else - (f (cdr names) - (fasl-write - ((record-field-accessor rtd (car names)) x) - p h m))]))]))] - [else (error 'fasl-write "~s is not fasl-writable" x)]))) - (define fasl-write - (lambda (x p h m) - (cond - [(immediate? x) (fasl-write-immediate x p) m] - [(get-hash-table h x #f) => - (lambda (mark) - (unless (fixnum? mark) - (error 'fasl-write "BUG: invalid mark ~s" mark)) - (cond - [(fx= mark 0) ; singly referenced - (do-write x p h m)] - [(fx> mark 0) ; marked but not written - (put-hash-table! h x (fx- 0 m)) - (write-char #\> p) - (write-int m p) - (do-write x p h (fxadd1 m))] - [else - (write-char #\< p) - (write-int (fx- 0 mark) p) - m]))] - [else (error 'fasl-write "BUG: not in hash table ~s" x)]))) - (define make-graph - (lambda (x h) - (unless (immediate? x) - (cond - [(get-hash-table h x #f) => - (lambda (i) - (put-hash-table! h x (fxadd1 i)))] - [else - (put-hash-table! h x 0) - (cond - [(pair? x) - (make-graph (car x) h) - (make-graph (cdr x) h)] - [(vector? x) - (let f ([x x] [i 0] [n (vector-length x)]) - (unless (fx= i n) - (make-graph (vector-ref x i) h) - (f x (fxadd1 i) n)))] - [(symbol? x) - (make-graph (symbol->string x) h) - (when (gensym? x) (make-graph (gensym->unique-string x) h))] - [(string? x) (void)] - [(code? x) - (make-graph (code-reloc-vector x) h)] - [(record? x) - (when (eq? x #%$base-rtd) - (error 'fasl-write "$base-rtd is not writable")) - (let ([rtd (record-type-descriptor x)]) - (cond - [(eq? rtd #%$base-rtd) - ;;; this is an rtd - (make-graph (record-type-name x) h) - (make-graph (record-type-symbol x) h) - (for-each (lambda (x) (make-graph x h)) - (record-type-field-names x))] - [else - ;;; this is a record - (make-graph rtd h) - (for-each - (lambda (name) - (make-graph ((record-field-accessor rtd name) x) h)) - (record-type-field-names rtd))]))] - [else (error 'fasl-write "~s is not fasl-writable" x)])])))) - (define do-fasl-write - (lambda (x port) - (let ([h (make-hash-table)]) - (make-graph x h) - (write-char #\# port) - (write-char #\@ port) - (write-char #\I port) - (write-char #\K port) - (write-char #\0 port) - (write-char #\1 port) - (fasl-write x port h 1)))) - (primitive-set! 'fasl-write - (case-lambda - [(x) (do-fasl-write x (current-output-port))] - [(x port) - (unless (output-port? port) - (error 'fasl-write "~s is not an output port" port)) - (do-fasl-write x port)]))) - diff --git a/src/libhandlers-6.0.ss b/src/libhandlers-6.0.ss deleted file mode 100644 index f4a50a0..0000000 --- a/src/libhandlers-6.0.ss +++ /dev/null @@ -1,28 +0,0 @@ - -(primitive-set! 'error - (lambda args - (foreign-call "ik_error" args))) - -(primitive-set! '$apply-nonprocedure-error-handler - (lambda (x) - (error 'apply "~s is not a procedure" x))) - -(primitive-set! '$incorrect-args-error-handler - (lambda (p n) - (error 'apply "incorrect number of argument (~s) to ~s" n p))) - -(primitive-set! '$multiple-values-error - (lambda args - (error 'apply - "incorrect number of values ~s returned to single value context" - args))) - -(primitive-set! '$debug - (lambda (x) - (foreign-call "ik_error" (cons "DEBUG" x)))) - -(primitive-set! '$underflow-misaligned-error - (lambda () - (foreign-call "ik_error" "misaligned"))) - - diff --git a/src/libhandlers.fasl b/src/libhandlers.fasl index 768f16c322270568af382a1fac034d41a7596d28..61b65e17ca1f1c1d1ba8cd1a8b4017fe3ac18826 100644 GIT binary patch delta 1303 zcmZ3jy;^&Msz<>M7LLy2%}4(1`1Ak&|J?@;uyDK-U|?Wi;s6q7fLMUx!ZINB|8jSY z3PbaoKgV4e1R7eGb-rjm%F%p)xzk1E&yGm}%O>XfGxd8-+-JcQxNPDNf0cj*5OaT^ znajolG;9YG(A*E_CucKi0+mlbz-2J`7-J!bIg#6Sa=xg@WIjGS@|>1{=Cq<9pwo0G zyE5A;toLH*2D%pL;t$=n3j&rcKMv%53IfwVmi;(A`M!|MnJnC#D1ph8SMP4rY`mI4Mp(7#u? zq$m5cOEA5MM~RmxrajY+oSDqTaTLwNMAG-;iO_^z2aU%g~eWaf$h`>K=2!bIO2C9Ot>oKl$&1JOaw49D;QaKe%51Sd0iea4sayE(;z-=B!w#U1|#b*zCC#3$aH||2)tho5>$V%#rK@ E04Z-2*Z=?k delta 1304 zcmZ3jy;^&Ms>-QTEF7K3n~(h2@#p{l|GR%2X5n}#z`(%3!~rDE0I>kW#mSG^6qzR- zm^(4opXt5##C;Y_2j@=w;jglH5k&6~G`(y*Kz%!yfOSd$1p&;)QAF@dI$ zsa()BavtKlX5xZSPDGKJ>jc>8?7V|~M*8c4fu1J7-){i) zJt%CtZ39lvUEX};#}1$X!%KLefViMcr^K(rbb9XO0Deiv3zM_>6@{QFJ?RuArK>3) zo;;Ud23`1?Dpuh%&BK#_^4|q{5|kA=1nVIFb(?%nFpNCEI-vPg=nUAe`68^7=Lsn) zoX3_;o6bNSf9~aBU^XpAggH2ilIIQuG> 10); ; key += (key << 3); diff --git a/src/libhash-9.2.ss b/src/libhash-9.2.ss new file mode 100644 index 0000000..09e103d --- /dev/null +++ b/src/libhash-9.2.ss @@ -0,0 +1,244 @@ + +(let ([hash-rtd (make-record-type '"hash-table" '(hash-vec count tc dlink))]) + ;;; accessors + (define get-vec (record-field-accessor hash-rtd 0)) + (define set-vec! (record-field-mutator hash-rtd 0)) + (define get-count (record-field-accessor hash-rtd 1)) + (define set-count! (record-field-mutator hash-rtd 1)) + (define get-tc (record-field-accessor hash-rtd 2)) + (define get-dlink (record-field-accessor hash-rtd 3)) + ;;; implementation + + ;;; directly from Dybvig's paper + (define tc-pop + (lambda (tc) + (let ([x ($car tc)]) + (if (eq? x ($cdr tc)) + #f + (let ([v ($car x)]) + ($set-car! tc ($cdr x)) + ($set-car! x #f) + ($set-cdr! x #f) + v))))) + + (define inthash + (lambda (key) + ;static int inthash(int key) { /* from Bob Jenkin's */ + ; key += ~(key << 15); + ; key ^= (key >> 10); + ; key += (key << 3); + ; key ^= (key >> 6); + ; key += ~(key << 11); + ; key ^= (key >> 16); + ; return key; + ;} + (let* ([key ($fx+ key ($fxlognot ($fxsll key 15)))] + [key ($fxlogxor key ($fxsra key 10))] + [key ($fx+ key ($fxsll key 3))] + [key ($fxlogxor key ($fxsra key 6))] + [key ($fx+ key ($fxlognot ($fxsll key 11)))] + [key ($fxlogxor key ($fxsra key 16))]) + key))) + + ;;; assq-like lookup + (define direct-lookup + (lambda (x b) + (if (fixnum? b) + #f + (if (eq? x ($tcbucket-key b)) + b + (direct-lookup x ($tcbucket-next b)))))) + + (define rehash-lookup + (lambda (h tc x) + (cond + [(tc-pop tc) => + (lambda (b) + (if (eq? ($tcbucket-next b) #f) + (rehash-lookup h tc x) + (begin + (re-add! h b) + (if (eq? x ($tcbucket-key b)) + b + (rehash-lookup h tc x)))))] + [else #f]))) + + (define get-bucket-index + (lambda (b) + (let ([next ($tcbucket-next b)]) + (if (fixnum? next) + next + (get-bucket-index next))))) + + (define replace! + (lambda (lb x y) + (let ([n ($tcbucket-next lb)]) + (cond + [(eq? n x) + ($set-tcbucket-next! lb y) + (void)] + [else + (replace! n x y)])))) + + (define re-add! + (lambda (h b) + (let ([vec (get-vec h)] + [next ($tcbucket-next b)]) + ;;; first remove it from its old place + (let ([idx + (if (fixnum? next) + next + (get-bucket-index next))]) + (let ([fst ($vector-ref vec idx)]) + (cond + [(eq? fst b) + ($vector-set! vec idx next)] + [else + (replace! fst b next)]))) + ;;; reset the tcbucket-tconc FIRST + ($set-tcbucket-tconc! b (get-tc h)) + ;;; then add it to the new place + (let ([k ($tcbucket-key b)]) + (let ([ih (inthash (pointer-value k))]) + (let ([idx ($fxlogand ih ($fx- ($vector-length vec) 1))]) + (let ([n ($vector-ref vec idx)]) + ($set-tcbucket-next! b n) + ($vector-set! vec idx b) + (void)))))))) + + + ;(define hash-remove! + ; (lambda (h x) + ; (let ([vec (get-vec h)] + ; [next ($tcbucket-next b)]) + ; ;;; first remove it from its old place + ; (let ([idx + ; (if (fixnum? next) + ; next + ; (get-bucket-index next))]) + ; (let ([fst ($vector-ref vec idx)]) + ; (cond + ; [(eq? fst b) + ; ($vector-set! vec idx next)] + ; [else + ; (replace! fst b next)])))) + ; (let ([b1 ($tcbucket-dlink-next b)] + ; [b2 ($tcbucket-dlink-prev b)]) + ; ($set-tcbucket-dlink-next! b2 b1) + ; ($set-tcbucket-dlink-prev! b1 b2) + ; (void)))) + + (define get-hash + (lambda (h x v) + (let ([pv (pointer-value x)] + [vec (get-vec h)]) + (let ([ih (inthash pv)]) + (let ([idx ($fxlogand ih ($fx- ($vector-length vec) 1))]) + (let ([b ($vector-ref vec idx)]) + (cond + [(or (direct-lookup x b) (rehash-lookup h (get-tc h) x)) + => + (lambda (b) + ($tcbucket-val b))] + [else v]))))))) + + + (define put-hash! + (lambda (h x v) + (let ([pv (pointer-value x)] + [vec (get-vec h)]) + (let ([ih (inthash pv)]) + (let ([idx ($fxlogand ih ($fx- ($vector-length vec) 1))]) + (let ([b ($vector-ref vec idx)]) + (cond + [(or (direct-lookup x b) (rehash-lookup h (get-tc h) x)) + => + (lambda (b) + ($set-tcbucket-val! b v) + (void))] + [else + (let ([bucket + ($make-tcbucket (get-tc h) x v ($vector-ref vec idx))]) + (if ($fx= (pointer-value x) pv) + ($vector-set! vec idx bucket) + (let* ([ih (inthash (pointer-value x))] + [idx + ($fxlogand ih ($fx- ($vector-length vec) 1))]) + ($set-tcbucket-next! bucket ($vector-ref vec idx)) + ($vector-set! vec idx bucket))) + (let ([b1 (get-dlink h)]) + (let ([b2 ($tcbucket-dlink-next b1)]) + ($set-tcbucket-dlink-next! bucket b2) + ($set-tcbucket-dlink-prev! bucket b1) + ($set-tcbucket-dlink-next! b1 bucket) + ($set-tcbucket-dlink-prev! b2 bucket)))) + (let ([ct (get-count h)]) + (set-count! h ($fxadd1 ct)) + (when ($fx> ct ($vector-length vec)) + (enlarge-table h)))]))))))) + + (define insert-b + (lambda (b vec mask) + (let* ([x ($tcbucket-key b)] + [pv (pointer-value x)] + [ih (inthash pv)] + [idx ($fxlogand ih mask)] + [next ($tcbucket-next b)]) + ($set-tcbucket-next! b ($vector-ref vec idx)) + ($vector-set! vec idx b) + (unless (fixnum? next) + (insert-b next vec mask))))) + + (define move-all + (lambda (vec1 i n vec2 mask) + (unless ($fx= i n) + (let ([b ($vector-ref vec1 i)]) + (unless (fixnum? b) + (insert-b b vec2 mask)) + (move-all vec1 ($fxadd1 i) n vec2 mask))))) + + (define enlarge-table + (lambda (h) + (let* ([vec1 (get-vec h)] + [n1 ($vector-length vec1)] + [n2 ($fxsll n1 1)] + [vec2 (make-base-vec n2)]) + (move-all vec1 0 n1 vec2 ($fx- n2 1)) + (set-vec! h vec2)))) + + + + (define init-vec + (lambda (v i n) + (if ($fx= i n) + v + (begin + ($vector-set! v i i) + (init-vec v ($fxadd1 i) n))))) + + (define make-base-vec + (lambda (n) + (init-vec (make-vector n) 0 n))) + + ;;; public interface + (primitive-set! 'hash-table? (record-predicate hash-rtd)) + (primitive-set! 'make-hash-table + (let ([make (record-constructor hash-rtd)]) + (lambda () + (let ([x (cons #f #f)]) + (let ([tc (cons x x)]) + (make (make-base-vec 32) 0 tc + (let ([b ($make-tcbucket tc #f #f #f)]) + ($set-tcbucket-dlink-next! b b) + ($set-tcbucket-dlink-prev! b b) + b))))))) + (primitive-set! 'get-hash-table + (lambda (h x v) + (if (hash-table? h) + (get-hash h x v) + (error 'get-hash-table "~s is not a hash table" h)))) + (primitive-set! 'put-hash-table! + (lambda (h x v) + (if (hash-table? h) + (put-hash! h x v) + (error 'put-hash-table! "~s is not a hash table" h))))) diff --git a/src/libintelasm-6.0.ss b/src/libintelasm-6.0.ss deleted file mode 100644 index 38900da..0000000 --- a/src/libintelasm-6.0.ss +++ /dev/null @@ -1,921 +0,0 @@ - -;;; -;;; assuming the existence of a code manager, this file defines an assember -;;; that takes lists of assembly code and produces a list of code objects -;;; - - ;;; add - ;;; and - ;;; cmp - ;;; call - ;;; cltd - ;;; idiv - ;;; imull - ;;; ja - ;;; jae - ;;; jb - ;;; jbe - ;;; je - ;;; jg - ;;; jge - ;;; jl - ;;; jle - ;;; jne - ;;; jmp - ;;; movb - ;;; movl - ;;; negl - ;;; notl - ;;; orl - ;;; popl - ;;; pushl - ;;; ret - ;;; sall - ;;; sarl - ;;; shrl - ;;; sete - ;;; setg - - -(let () - -(define fold - (lambda (f init ls) - (cond - [(null? ls) init] - [else - (f (car ls) (fold f init (cdr ls)))]))) - -(define convert-instructions - (lambda (ls) - (fold convert-instruction '() ls))) - -(define register-mapping - '([%eax 32 0] - [%ecx 32 1] - [%edx 32 2] - [%ebx 32 3] - [%esp 32 4] - [%ebp 32 5] - [%esi 32 6] - [%edi 32 7] - [%al 8 0] - [%cl 8 1] - [%dl 8 2] - [%bl 8 3] - [%ah 8 4] - [%ch 8 5] - [%dh 8 6] - [%bh 8 7] - [/0 0 0] - [/1 0 1] - [/2 0 2] - [/3 0 3] - [/4 0 4] - [/5 0 5] - [/6 0 6] - [/7 0 7] - )) - -(define register-index - (lambda (x) - (cond - [(assq x register-mapping) => caddr] - [else (error 'register-index "not a register ~s" x)]))) - -(define reg32? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 32))] - [else #f]))) - -(define reg8? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 8))] - [else #f]))) - -(define reg? - (lambda (x) - (assq x register-mapping))) - -(define check-len - (lambda (x) - (define instr-len - '([ret] - [movl s d] - [movb s d] - [addl s d] - [subl s d] - [sall s d] - [sarl s d] - [shrl s d] - [andl s d] - [xorl s d] - [orl s d] - [cmpl s d] - [imull s d] - [notl d] - [negl d] - [idivl d] - [pushl d] - [popl d] - [jmp d] - [call d] - [ja d] - [jae d] - [jb d] - [jbe d] - [je d] - [jg d] - [jge d] - [jl d] - [jle d] - [jna d] - [jnae d] - [jnb d] - [jnbe d] - [jne d] - [jng d] - [jnge d] - [jnl d] - [jnle d] - [seta d] - [setae d] - [setb d] - [setbe d] - [sete d] - [setg d] - [setge d] - [setl d] - [setle d] - [setna d] - [setnae d] - [setnb d] - [setnbe d] - [setne d] - [setng d] - [setnge d] - [setnl d] - [setnle d] - [cltd] - [nop] - [byte x] - [byte-vector x] - [int x] - [label x] - [label-address x] - [current-frame-offset] - )) - (cond - [(assq (car x) instr-len) => - (lambda (p) - (unless (fx= (length x) (length p)) - (error 'assembler "invalid instruction format ~s" x)))] - [else (error 'assembler "unknown instruction ~s" x)]))) - -(define with-args - (lambda (ls f) - (apply f (cdr ls)))) - -(define byte - (lambda (x) - (cons 'byte (fxlogand x 255)))) - - -(define word - (lambda (x) - (cons 'word x))) - -(define reloc-word - (lambda (x) - (cons 'reloc-word x))) - -(define reloc-word+ - (lambda (x d) - (list* 'reloc-word+ x d))) - -(define list*-aux - (lambda (ls ls*) - (cond - [(null? ls*) ls] - [else (cons ls (list*-aux (car ls*) (cdr ls*)))]))) - -(define list* - (lambda (ls . ls*) - (list*-aux ls ls*))) - -(define byte? - (lambda (x) - (and (fixnum? x) - (fx<= x 127) - (fx<= -128 x)))) - -(define mem? - (lambda (x) - (and (list? x) - (fx= (length x) 3) - (eq? (car x) 'disp) - (or (imm? (cadr x)) - (reg? (cadr x))) - (or (imm? (caddr x)) - (reg? (caddr x)))))) - -(define small-disp? - (lambda (x) - (and (mem? x) - (byte? (cadr x))))) - - -(define CODE - (lambda (n ac) - (cons (byte n) ac))) - -(define CODE+r - (lambda (n r ac) - (cons (byte (fxlogor n (register-index r))) ac))) - -(define ModRM - (lambda (mod reg r/m ac) - (cons (byte (fxlogor - (register-index r/m) - (fxlogor - (fxsll (register-index reg) 3) - (fxsll mod 6)))) - (if (and (not (fx= mod 3)) (eq? r/m '%esp)) - (cons (byte #x24) ac) - ac)))) - -(define IMM32 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) - (byte (fxsra n 8)) - (byte (fxsra n 16)) - (byte (fxsra n 24)) - ac))] - [(obj? n) - (let ([v (cadr n)]) - (if (immediate? v) - (cons (word v) ac) - (cons (reloc-word v) ac)))] - [(obj+? n) - (let ([v (cadr n)] [d (caddr n)]) - (cons (reloc-word+ v d) ac))] - [(label-address? n) - (cons (cons 'label-addr (label-name n)) ac)] - [(foreign? n) - (cons (cons 'foreign-label (label-name n)) ac)] - [else (error 'IMM32 "invalid ~s" n)]))) - - -(define IMM8 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) ac))] - [else (error 'IMM8 "invalid ~s" n)]))) - - -(define imm? - (lambda (x) - (or (int? x) - (obj? x) - (obj+? x) - (label-address? x) - (foreign? x)))) - -(define foreign? - (lambda (x) - (and (pair? x) (eq? (car x) 'foreign-label)))) - - -(define imm8? - (lambda (x) - (and (int? x) (byte? (cadr x))))) - -(define label? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (symbol? (car d))) - (error 'assemble "invalid label ~s" x))) - #t] - [else #f]))) - -(define label-address? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label-address)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (or (symbol? (car d)) - (string? (car d)))) - (error 'assemble "invalid label-address ~s" x))) - #t] - [else #f]))) - -(define label-name - (lambda (x) (cadr x))) - -(define int? - (lambda (x) - (and (pair? x) (eq? (car x) 'int)))) - -(define obj? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj)))) - -(define obj+? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj+)))) - -(define CODErri - (lambda (c d s i ac) - (cond - [(imm8? i) - (CODE c (ModRM 1 d s (IMM8 i ac)))] - [(reg? i) - (CODE c (ModRM i d s ac))] - [else - (CODE c (ModRM 2 d s (IMM32 i ac)))]))) - -(define CODErr - (lambda (c d s ac) - (CODE c (ModRM 3 d s ac)))) - -(define CODEri - (lambda (c d i ac) - (CODE+r c d (IMM32 i ac)))) - - -(define RegReg - (lambda (r1 r2 r3 ac) - (cond - [(eq? r3 '%esp) (error 'assembler "BUG: invalid src %esp")] - [(eq? r1 '%ebp) (error 'assembler "BUG: invalid src %ebp")] - [else -;;; (parameterize ([print-radix 16]) -;;; (printf "REGREG ~s ~s ~s\n" r1 r2 r3) -;;; (printf "REGREG ~s ~s\n" -;;; (byte (fxlogor 4 (fxsll (register-index r1) 3))) -;;; (byte (fxlogor (register-index r2) -;;; (fxsll (register-index r3) 3))))) - (list* - (byte (fxlogor 4 (fxsll (register-index r1) 3))) - (byte (fxlogor (register-index r2) - (fxsll (register-index r3) 3))) - ac)]))) - - -;;(define CODErd -;; (lambda (c r1 disp ac) -;; (with-args disp -;; (lambda (i/r r2) -;; (if (reg? i/r) -;; (CODE c (RegReg r1 i/r r2 ac)) -;; (CODErri c r1 r2 i/r ac)))))) - - -(define IMM32*2 - (lambda (i1 i2 ac) - (cond - [(and (int? i1) (obj? i2)) - (let ([d (cadr i1)] [v (cadr i2)]) - (cons (reloc-word+ v d) ac))] - [else (error 'assemble "IMM32*2 ~s ~s" i1 i2)]))) - - -(define CODErd - (lambda (c r1 disp ac) - (with-args disp - (lambda (a1 a2) - (cond - [(and (reg? a1) (reg? a2)) - (CODE c (RegReg r1 a1 a2 ac))] - [(and (imm? a1) (reg? a2)) - (CODErri c r1 a2 a1 ac)] - [(and (imm? a1) (imm? a2)) - (CODE c - (ModRM 0 r1 '/5 - (IMM32*2 a1 a2 ac)))] - [else (error 'CODErd "unhandled ~s" disp)]))))) - -(define CODEdi - (lambda (c disp n ac) - (with-args disp - (lambda (i r) - (CODErri c '/0 r i (IMM32 n ac)))))) - -(define CODEdi8 - (lambda (c disp n ac) - (with-args disp - (lambda (i r) - (CODErri c '/0 r i (IMM8 n ac)))))) - - - - -(define convert-instruction - (lambda (a ac) - (define who 'assemble) - (check-len a) - (case (car a) - [(ret) (CODE #xC3 ac)] - [(cltd) (CODE #x99 ac)] - [(movl) - (with-args a - (lambda (src dst) - (cond - [(and (imm? src) (reg? dst)) (CODEri #xB8 dst src ac)] - [(and (imm? src) (mem? dst)) (CODEdi #xC7 dst src ac)] - [(and (reg? src) (reg? dst)) (CODErr #x89 src dst ac)] - [(and (reg? src) (mem? dst)) (CODErd #x89 src dst ac)] - [(and (mem? src) (reg? dst)) (CODErd #x8B dst src ac)] - [else (error who "invalid ~s" a)])))] - [(movb) - (with-args a - (lambda (src dst) - (cond - ;[(and (imm8? src) (reg8? dst)) (CODEri #xB0 dst src ac)] - [(and (imm8? src) (mem? dst)) (CODEdi8 #xC6 dst src ac)] - ;[(and (reg8? src) (reg8? dst)) (CODErr #x88 src dst ac)] - [(and (reg8? src) (mem? dst)) (CODErd #x88 src dst ac)] - [(and (mem? src) (reg8? dst)) (CODErd #x8A dst src ac)] - [else (error who "invalid ~s" a)])))] - [(addl) - (with-args a - (lambda (src dst) - (cond - ;;; add imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/0 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x05 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/0 dst (IMM32 src ac)))] - ;;; add reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x01 (ModRM 3 src dst ac))] - ;;; add mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x03 dst src ac)] - ;;; add imm -> mem (not needed) - ;;; add reg -> mem (not needed) - [else (error who "invalid ~s" a)])))] - [(subl) - (with-args a - (lambda (src dst) - (cond - ;;; imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/5 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x2D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/5 dst (IMM32 src ac)))] - ;;; reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x29 (ModRM 3 src dst ac))] - ;;; mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x2B dst src ac)] - ;;; imm -> mem (not needed) - ;;; reg -> mem (not needed) - [else (error who "invalid ~s" a)])))] - [(sall) - (with-args a - (lambda (src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/4 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/4 dst ac))] - [else (error who "invalid ~s" a)])))] - [(shrl) - (with-args a - (lambda (src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/5 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/5 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/5 dst ac))] - [else (error who "invalid ~s" a)])))] - [(sarl) - (with-args a - (lambda (src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/7 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/7 dst ac))] - [else (error who "invalid ~s" a)])))] - [(andl) ; similar to add - (with-args a - (lambda (src dst) - (cond - ;;; and imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x25 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/4 dst (IMM32 src ac)))] - ;;; and reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x21 (ModRM 3 src dst ac))] - ;;; and mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x23 dst src ac)] - [else (error who "invalid ~s" a)])))] - [(orl) ; similar to add - (with-args a - (lambda (src dst) - (cond - ;;; or imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/1 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x0D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/1 dst (IMM32 src ac)))] - ;;; or reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x09 (ModRM 3 src dst ac))] - ;;; or mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x0B dst src ac)] - [else (error who "invalid ~s" a)])))] - [(xorl) ; similar to add - (with-args a - (lambda (src dst) - (cond - ;;; or imm -> reg - ;[(and (imm8? src) (reg? dst)) - ; (CODE #x83 (ModRM 3 '/1 dst (IMM8 src ac)))] - ;[(and (imm? src) (eq? dst '%eax)) - ; (CODE #x0D (IMM32 src ac))] - ;[(and (imm? src) (reg? dst)) - ; (CODE #x81 (ModRM 3 '/1 dst (IMM32 src ac)))] - ;;; or reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x31 (ModRM 3 src dst ac))] - ;;; or mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x33 dst src ac)] - [else (error who "invalid ~s" a)])))] - [(cmpl) - (with-args a - (lambda (src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x3D (IMM32 src ac))] - [(and (reg? src) (reg? dst)) - (CODE #x39 (ModRM 3 src dst ac))] - [(and (mem? src) (reg? dst)) - (CODErd #x3B dst src ac)] - [(and (imm8? src) (mem? dst)) - (CODErd #x83 '/7 dst (IMM8 src ac))] - [(and (imm? src) (mem? dst)) - (CODErd #x81 '/7 dst (IMM32 src ac))] - [else (error who "invalid ~s" a)])))] - [(imull) - (with-args a - (lambda (src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x6B (ModRM 3 dst dst (IMM8 src ac)))] - [(and (imm? src) (reg? dst)) - (CODE #x69 (ModRM 3 dst dst (IMM32 src ac)))] - [(and (reg? src) (reg? dst)) - (CODE #x0F (CODE #xAF (ModRM 3 dst src ac)))] - [(and (mem? src) (reg? dst)) - (CODE #x0F (CODErd #xAF dst src ac))] - [else (error who "invalid ~s" a)])))] - [(idivl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODErr #xF7 '/7 dst ac)] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" a)])))] - [(pushl) - (with-args a - (lambda (dst) - (cond - [(imm8? dst) - (CODE #x6A (IMM8 dst ac))] - [(imm? dst) - (CODE #x68 (IMM32 dst ac))] - [(reg? dst) - (CODE+r #x50 dst ac)] - [(mem? dst) - (CODErd #xFF '/6 dst ac)] - [else (error who "invalid ~s" a)])))] - [(popl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODE+r #x58 dst ac)] - [(mem? dst) - (CODErd #x8F '/0 dst ac)] - [else (error who "invalid ~s" a)])))] - [(notl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/2 dst ac))] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" a)])))] - [(negl) - (with-args a - (lambda (dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/3 dst ac))] - [else (error who "invalid ~s" a)])))] - [(jmp) - (with-args a - (lambda (dst) - (cond - [(label? dst) - (CODE #xE9 (cons (cons 'relative (label-name dst)) ac))] - [(imm? dst) - (CODE #xE9 (IMM32 dst ac))] - [(mem? dst) - (CODErd #xFF '/4 dst ac)] - [else (error who "invalid jmp in ~s" a)])))] - [(call) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #xE8 (IMM32 dst ac))] - [(label? dst) - (CODE #xE8 (cons (cons 'relative (label-name dst)) ac))] - [(mem? dst) - (CODErd #xFF '/2 dst ac)] - [(reg? dst) - (CODE #xFF (ModRM 3 '/2 dst ac))] - [else (error who "invalid jmp in ~s" a)])))] - [(seta setae setb setbe sete setg setge setl setle - setna setnae setnb setnbe setne setng setnge setnl setnle) - (let* ([table - '([seta #x97] [setna #x96] - [setae #x93] [setnae #x92] - [setb #x92] [setnb #x93] - [setbe #x96] [setnbe #x97] - [setg #x9F] [setng #x9E] - [setge #x9D] [setnge #x9C] - [setl #x9C] [setnl #x9D] - [setle #x9E] [setnle #x9F] - [sete #x94] [setne #x95])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cset ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(reg8? dst) - (CODE #x0F - (CODE (lookup (car a)) - (ModRM 3 '/0 dst ac)))] - [else (error who "invalid ~s" a)]))))] - [(ja jae jb jbe je jg jge jl jle - jna jnae jnb jnbe jne jng jnge jnl jnle) - (let* ([table - '([je #x84] [jne #x85] - [ja #x87] [jna #x86] - [jae #x83] [jnae #x82] - [jb #x82] [jnb #x83] - [jbe #x86] [jnbe #x87] - [jg #x8F] [jng #x8E] - [jge #x8D] [jnge #x8C] - [jl #x8C] [jnl #x8D] - [jle #x8E] [jnle #x8F])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cmp ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #x0F (CODE (lookup (car a)) (IMM32 dst ac)))] - [(label? dst) - (CODE #x0F - (CODE (lookup (car a)) - (cons (cons 'relative (label-name dst)) ac)))] - [else (error who "invalid ~s" a)]))))] - [(byte) - (with-args a - (lambda (x) - (unless (byte? x) (error who "invalid instruction ~s" a)) - (cons (byte x) ac)))] - [(byte-vector) - (with-args a - (lambda (x) (append (map byte (vector->list x)) ac)))] - [(int) (IMM32 a ac)] - [(label) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label L) ac)))] - [(label-address) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label-addr L) ac)))] - [(current-frame-offset) - (cons '(current-frame-offset) ac)] - [(nop) ac] - [else - (error who "unknown instruction ~s" a)]))) - -(define diff - (lambda (ls x) - (cond - [(eq? ls x) '()] - [else (cons (car ls) (diff (cdr ls) x))]))) - -(define hex-table - '#(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 - #\8 #\9 #\A #\B #\C #\D #\E #\F)) - -(define write/x - (lambda (x) - (case (car x) - [(byte) - (display "0x") - (display (vector-ref hex-table (fxsra (cdr x) 4))) - (display (vector-ref hex-table (fxlogand (cdr x) 15))) - (display " ")] - [else (write x)]))) - - -(define compute-code-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(byte) (fx+ ac 1)] - [(word reloc-word reloc-word+ label-addr foreign-label - relative current-frame-offset) - (fx+ ac 4)] - [(label) ac] - [else (error 'compute-code-size "unknown instr ~s" x)])) - 0 - ls))) - - -(define compute-reloc-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(reloc-word ) (fx+ ac 4)] - [(reloc-word+) (fx+ ac 8)] - [(relative label-addr foreign-label) (fx+ ac 8)] - [(word byte label current-frame-offset) ac] - [else (error 'compute-reloc-size "unknown instr ~s" x)])) - 0 - ls))) - -(define set-label-loc! - (lambda (x loc) - (when (getprop x '*label-loc*) - (error 'compile "label ~s is already defined" x)) - (putprop x '*label-loc* loc))) - -(define label-loc - (lambda (x) - (or (getprop x '*label-loc*) - (error 'compile "undefined label ~s" x)))) - - -(define unset-label-loc! - (lambda (x) - (remprop x '*label-loc*))) - - -(define whack-instructions - (lambda (x ls) - (define f - (lambda (ls idx reloc) - (cond - [(null? ls) reloc] - [else - (let ([a (car ls)]) - (case (car a) - [(byte) - (set-code-byte! x idx (cdr a)) - (f (cdr ls) (fx+ idx 1) reloc)] - [(reloc-word reloc-word+) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(relative label-addr foreign-label) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(word) - (let ([v (cdr a)]) - (set-code-word! x idx v) - (f (cdr ls) (fx+ idx 4) reloc))] - [(current-frame-offset) - (set-code-word! x idx idx) - (f (cdr ls) (fx+ idx 4) reloc)] - [(label) - (set-label-loc! (cdr a) (cons x idx)) - (f (cdr ls) idx reloc)] - [else - (error 'whack-instructions "unknown instr ~s" a)]))]))) - (f ls 0 '()))) - -(define wordsize 4) - -(define whack-reloc - (lambda (code) - (define reloc-idx 0) - (lambda (r) - (let ([idx (car r)] [type (cadr r)] [v (cddr r)]) - (case type - [(reloc-word) - (set-code-object! code v idx reloc-idx) - (set! reloc-idx (fxadd1 reloc-idx))] - [(foreign-label) - (set-code-foreign-object! code v idx reloc-idx) - (set! reloc-idx (fx+ reloc-idx 2))] - [(reloc-word+) - (let ([obj (car v)] [disp (cdr v)]) - (set-code-object+offset! code obj idx disp reloc-idx) - (set! reloc-idx (fx+ reloc-idx 2)))] - [(label-addr) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [off (cdr loc)]) - (set-code-object+offset! - code obj idx (fx+ off 11) reloc-idx))) - (set! reloc-idx (fx+ reloc-idx 2))] - [(relative) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [off (cdr loc)]) - (set-code-object+offset/rel! - code obj idx (fx+ off 11) reloc-idx))) - (set! reloc-idx (fx+ reloc-idx 2))] - [else (error 'whack-reloc "invalid reloc type ~s" type)])) - ))) - - -;;; (define list->code -;;; (lambda (ls) -;;; (let ([ls (convert-instructions ls)]) -;;; (let ([n (compute-code-size ls)] -;;; [m (compute-reloc-size ls)]) -;;; (let ([x (make-code n m 1)]) -;;; (let ([reloc* (whack-instructions x ls)]) -;;; (for-each (whack-reloc x) reloc*)) -;;; (make-code-executable! x) -;;; x))))) - -(define list*->code* - (lambda (ls*) - (let ([closure-size* (map car ls*)] - [ls* (map cdr ls*)]) - (let ([ls* (map convert-instructions ls*)]) - (let ([n* (map compute-code-size ls*)] - [m* (map compute-reloc-size ls*)]) - (let ([code* (map (lambda (n m c) (make-code n m c)) - n* - m* - closure-size*)]) - (let ([reloc** (map whack-instructions code* ls*)]) - (for-each - (lambda (code reloc*) - (for-each (whack-reloc code) reloc*)) - code* reloc**) - (for-each make-code-executable! code*) - code*))))))) - -(define list->code - (lambda (ls) - (car (list*->code* (list ls))))) - -(primitive-set! 'list*->code* list*->code*) -) diff --git a/src/libintelasm-6.4.ss b/src/libintelasm-6.4.ss deleted file mode 100644 index e1094b5..0000000 --- a/src/libintelasm-6.4.ss +++ /dev/null @@ -1,920 +0,0 @@ - -;;; -;;; assuming the existence of a code manager, this file defines an assember -;;; that takes lists of assembly code and produces a list of code objects -;;; - - ;;; add - ;;; and - ;;; cmp - ;;; call - ;;; cltd - ;;; idiv - ;;; imull - ;;; ja - ;;; jae - ;;; jb - ;;; jbe - ;;; je - ;;; jg - ;;; jge - ;;; jl - ;;; jle - ;;; jne - ;;; jmp - ;;; movb - ;;; movl - ;;; negl - ;;; notl - ;;; orl - ;;; popl - ;;; pushl - ;;; ret - ;;; sall - ;;; sarl - ;;; shrl - ;;; sete - ;;; setg - - -(let () - -(define fold - (lambda (f init ls) - (cond - [(null? ls) init] - [else - (f (car ls) (fold f init (cdr ls)))]))) - -(define convert-instructions - (lambda (ls) - (fold convert-instruction '() ls))) - -(define register-mapping - '([%eax 32 0] - [%ecx 32 1] - [%edx 32 2] - [%ebx 32 3] - [%esp 32 4] - [%ebp 32 5] - [%esi 32 6] - [%edi 32 7] - [%al 8 0] - [%cl 8 1] - [%dl 8 2] - [%bl 8 3] - [%ah 8 4] - [%ch 8 5] - [%dh 8 6] - [%bh 8 7] - [/0 0 0] - [/1 0 1] - [/2 0 2] - [/3 0 3] - [/4 0 4] - [/5 0 5] - [/6 0 6] - [/7 0 7] - )) - -(define register-index - (lambda (x) - (cond - [(assq x register-mapping) => caddr] - [else (error 'register-index "not a register ~s" x)]))) - -(define reg32? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 32))] - [else #f]))) - -(define reg8? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 8))] - [else #f]))) - -(define reg? - (lambda (x) - (assq x register-mapping))) - -(define check-len - (lambda (x) - (define instr-len - '([ret] - [movl s d] - [movb s d] - [addl s d] - [subl s d] - [sall s d] - [sarl s d] - [shrl s d] - [andl s d] - [xorl s d] - [orl s d] - [cmpl s d] - [imull s d] - [notl d] - [negl d] - [idivl d] - [pushl d] - [popl d] - [jmp d] - [call d] - [ja d] - [jae d] - [jb d] - [jbe d] - [je d] - [jg d] - [jge d] - [jl d] - [jle d] - [jna d] - [jnae d] - [jnb d] - [jnbe d] - [jne d] - [jng d] - [jnge d] - [jnl d] - [jnle d] - [seta d] - [setae d] - [setb d] - [setbe d] - [sete d] - [setg d] - [setge d] - [setl d] - [setle d] - [setna d] - [setnae d] - [setnb d] - [setnbe d] - [setne d] - [setng d] - [setnge d] - [setnl d] - [setnle d] - [cltd] - [nop] - [byte x] - [byte-vector x] - [int x] - [label x] - [label-address x] - [current-frame-offset] - )) - (cond - [(assq (car x) instr-len) => - (lambda (p) - (unless (fx= (length x) (length p)) - (error 'assembler "invalid instruction format ~s" x)))] - [else (error 'assembler "unknown instruction ~s" x)]))) - -(define with-args - (lambda (ls f) - (apply f (cdr ls)))) - -(define byte - (lambda (x) - (cons 'byte (fxlogand x 255)))) - - -(define word - (lambda (x) - (cons 'word x))) - -(define reloc-word - (lambda (x) - (cons 'reloc-word x))) - -(define reloc-word+ - (lambda (x d) - (list* 'reloc-word+ x d))) - -(define list*-aux - (lambda (ls ls*) - (cond - [(null? ls*) ls] - [else (cons ls (list*-aux (car ls*) (cdr ls*)))]))) - -(define list* - (lambda (ls . ls*) - (list*-aux ls ls*))) - -(define byte? - (lambda (x) - (and (fixnum? x) - (fx<= x 127) - (fx<= -128 x)))) - -(define mem? - (lambda (x) - (and (list? x) - (fx= (length x) 3) - (eq? (car x) 'disp) - (or (imm? (cadr x)) - (reg? (cadr x))) - (or (imm? (caddr x)) - (reg? (caddr x)))))) - -(define small-disp? - (lambda (x) - (and (mem? x) - (byte? (cadr x))))) - - -(define CODE - (lambda (n ac) - (cons (byte n) ac))) - -(define CODE+r - (lambda (n r ac) - (cons (byte (fxlogor n (register-index r))) ac))) - -(define ModRM - (lambda (mod reg r/m ac) - (cons (byte (fxlogor - (register-index r/m) - (fxlogor - (fxsll (register-index reg) 3) - (fxsll mod 6)))) - (if (and (not (fx= mod 3)) (eq? r/m '%esp)) - (cons (byte #x24) ac) - ac)))) - -(define IMM32 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) - (byte (fxsra n 8)) - (byte (fxsra n 16)) - (byte (fxsra n 24)) - ac))] - [(obj? n) - (let ([v (cadr n)]) - (if (immediate? v) - (cons (word v) ac) - (cons (reloc-word v) ac)))] - [(obj+? n) - (let ([v (cadr n)] [d (caddr n)]) - (cons (reloc-word+ v d) ac))] - [(label-address? n) - (cons (cons 'label-addr (label-name n)) ac)] - [(foreign? n) - (cons (cons 'foreign-label (label-name n)) ac)] - [else (error 'IMM32 "invalid ~s" n)]))) - - -(define IMM8 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) ac))] - [else (error 'IMM8 "invalid ~s" n)]))) - - -(define imm? - (lambda (x) - (or (int? x) - (obj? x) - (obj+? x) - (label-address? x) - (foreign? x)))) - -(define foreign? - (lambda (x) - (and (pair? x) (eq? (car x) 'foreign-label)))) - - -(define imm8? - (lambda (x) - (and (int? x) (byte? (cadr x))))) - -(define label? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (symbol? (car d))) - (error 'assemble "invalid label ~s" x))) - #t] - [else #f]))) - -(define label-address? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label-address)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (or (symbol? (car d)) - (string? (car d)))) - (error 'assemble "invalid label-address ~s" x))) - #t] - [else #f]))) - -(define label-name - (lambda (x) (cadr x))) - -(define int? - (lambda (x) - (and (pair? x) (eq? (car x) 'int)))) - -(define obj? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj)))) - -(define obj+? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj+)))) - -(define CODErri - (lambda (c d s i ac) - (cond - [(imm8? i) - (CODE c (ModRM 1 d s (IMM8 i ac)))] - [(reg? i) - (CODE c (ModRM i d s ac))] - [else - (CODE c (ModRM 2 d s (IMM32 i ac)))]))) - -(define CODErr - (lambda (c d s ac) - (CODE c (ModRM 3 d s ac)))) - -(define CODEri - (lambda (c d i ac) - (CODE+r c d (IMM32 i ac)))) - - -(define RegReg - (lambda (r1 r2 r3 ac) - (cond - [(eq? r3 '%esp) (error 'assembler "BUG: invalid src %esp")] - [(eq? r1 '%ebp) (error 'assembler "BUG: invalid src %ebp")] - [else -;;; (parameterize ([print-radix 16]) -;;; (printf "REGREG ~s ~s ~s\n" r1 r2 r3) -;;; (printf "REGREG ~s ~s\n" -;;; (byte (fxlogor 4 (fxsll (register-index r1) 3))) -;;; (byte (fxlogor (register-index r2) -;;; (fxsll (register-index r3) 3))))) - (list* - (byte (fxlogor 4 (fxsll (register-index r1) 3))) - (byte (fxlogor (register-index r2) - (fxsll (register-index r3) 3))) - ac)]))) - - -;;(define CODErd -;; (lambda (c r1 disp ac) -;; (with-args disp -;; (lambda (i/r r2) -;; (if (reg? i/r) -;; (CODE c (RegReg r1 i/r r2 ac)) -;; (CODErri c r1 r2 i/r ac)))))) - - -(define IMM32*2 - (lambda (i1 i2 ac) - (cond - [(and (int? i1) (obj? i2)) - (let ([d (cadr i1)] [v (cadr i2)]) - (cons (reloc-word+ v d) ac))] - [else (error 'assemble "IMM32*2 ~s ~s" i1 i2)]))) - - -(define CODErd - (lambda (c r1 disp ac) - (with-args disp - (lambda (a1 a2) - (cond - [(and (reg? a1) (reg? a2)) - (CODE c (RegReg r1 a1 a2 ac))] - [(and (imm? a1) (reg? a2)) - (CODErri c r1 a2 a1 ac)] - [(and (imm? a1) (imm? a2)) - (CODE c - (ModRM 0 r1 '/5 - (IMM32*2 a1 a2 ac)))] - [else (error 'CODErd "unhandled ~s" disp)]))))) - -(define CODEdi - (lambda (c disp n ac) - (with-args disp - (lambda (i r) - (CODErri c '/0 r i (IMM32 n ac)))))) - -(define CODEdi8 - (lambda (c disp n ac) - (with-args disp - (lambda (i r) - (CODErri c '/0 r i (IMM8 n ac)))))) - -(define *cogen* (gensym "*cogen*")) - -(define-syntax add-instruction - (syntax-rules () - [(_ (name instr ac args ...) b b* ...) - (putprop 'name *cogen* - (cons (length '(args ...)) - (lambda (instr ac args ...) b b* ...)))])) - -(define-syntax add-instructions - (syntax-rules () - [(_ instr ac [(name* arg** ...) b* b** ...] ...) - (begin - (add-instruction (name* instr ac arg** ...) b* b** ...) ...)])) - -(define (convert-instruction a ac) - (cond - [(getprop (car a) *cogen*) => - (lambda (p) - (let ([n (car p)] [proc (cdr p)] [args (cdr a)]) - (cond - [(fx= n (length args)) - (apply proc a ac args)] - [else - (error 'convert-instruction "incorrect args in ~s" a)])))] - [else (old-convert-instruction a ac)] - ;[else (error 'convert-instruction "unknown instruction in ~s" a)] - )) - -(module () -(define who 'assembler) -(add-instructions instr ac - [(ret) (CODE #xC3 ac)] - [(cltd) (CODE #x99 ac)] - [(movl src dst) - (cond - [(and (imm? src) (reg? dst)) (CODEri #xB8 dst src ac)] - [(and (imm? src) (mem? dst)) (CODEdi #xC7 dst src ac)] - [(and (reg? src) (reg? dst)) (CODErr #x89 src dst ac)] - [(and (reg? src) (mem? dst)) (CODErd #x89 src dst ac)] - [(and (mem? src) (reg? dst)) (CODErd #x8B dst src ac)] - [else (error who "invalid ~s" instr)])] - [(movb src dst) - (cond - ;[(and (imm8? src) (reg8? dst)) (CODEri #xB0 dst src ac)] - [(and (imm8? src) (mem? dst)) (CODEdi8 #xC6 dst src ac)] - ;[(and (reg8? src) (reg8? dst)) (CODErr #x88 src dst ac)] - [(and (reg8? src) (mem? dst)) (CODErd #x88 src dst ac)] - [(and (mem? src) (reg8? dst)) (CODErd #x8A dst src ac)] - [else (error who "invalid ~s" instr)])] - [(addl src dst) - (cond - ;;; add imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/0 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x05 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/0 dst (IMM32 src ac)))] - ;;; add reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x01 (ModRM 3 src dst ac))] - ;;; add mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x03 dst src ac)] - ;;; add imm -> mem (not needed) - ;;; add reg -> mem (not needed) - [else (error who "invalid ~s" instr)])] - [(subl src dst) - (cond - ;;; imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/5 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x2D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/5 dst (IMM32 src ac)))] - ;;; reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x29 (ModRM 3 src dst ac))] - ;;; mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x2B dst src ac)] - ;;; imm -> mem (not needed) - ;;; reg -> mem (not needed) - [else (error who "invalid ~s" instr)])] - [(sall src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/4 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/4 dst ac))] - [else (error who "invalid ~s" instr)])] - [(shrl src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/5 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/5 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/5 dst ac))] - [else (error who "invalid ~s" instr)])] - [(sarl src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/7 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/7 dst ac))] - [else (error who "invalid ~s" instr)])] - [(andl src dst) - (cond - ;;; and imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x25 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/4 dst (IMM32 src ac)))] - ;;; and reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x21 (ModRM 3 src dst ac))] - ;;; and mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x23 dst src ac)] - [else (error who "invalid ~s" instr)])] - [(orl src dst) - (cond - ;;; or imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/1 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x0D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/1 dst (IMM32 src ac)))] - ;;; or reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x09 (ModRM 3 src dst ac))] - ;;; or mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x0B dst src ac)] - [else (error who "invalid ~s" instr)])] - [(xorl src dst) - (cond - ;;; or imm -> reg - ;[(and (imm8? src) (reg? dst)) - ; (CODE #x83 (ModRM 3 '/1 dst (IMM8 src ac)))] - ;[(and (imm? src) (eq? dst '%eax)) - ; (CODE #x0D (IMM32 src ac))] - ;[(and (imm? src) (reg? dst)) - ; (CODE #x81 (ModRM 3 '/1 dst (IMM32 src ac)))] - ;;; or reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x31 (ModRM 3 src dst ac))] - ;;; or mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x33 dst src ac)] - [else (error who "invalid ~s" instr)])] - [(cmpl src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x3D (IMM32 src ac))] - [(and (reg? src) (reg? dst)) - (CODE #x39 (ModRM 3 src dst ac))] - [(and (mem? src) (reg? dst)) - (CODErd #x3B dst src ac)] - [(and (imm8? src) (mem? dst)) - (CODErd #x83 '/7 dst (IMM8 src ac))] - [(and (imm? src) (mem? dst)) - (CODErd #x81 '/7 dst (IMM32 src ac))] - [else (error who "invalid ~s" instr)])] - [(imull src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x6B (ModRM 3 dst dst (IMM8 src ac)))] - [(and (imm? src) (reg? dst)) - (CODE #x69 (ModRM 3 dst dst (IMM32 src ac)))] - [(and (reg? src) (reg? dst)) - (CODE #x0F (CODE #xAF (ModRM 3 dst src ac)))] - [(and (mem? src) (reg? dst)) - (CODE #x0F (CODErd #xAF dst src ac))] - [else (error who "invalid ~s" instr)])] - [(idivl dst) - (cond - [(reg? dst) - (CODErr #xF7 '/7 dst ac)] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" instr)])] - [(pushl dst) - (cond - [(imm8? dst) - (CODE #x6A (IMM8 dst ac))] - [(imm? dst) - (CODE #x68 (IMM32 dst ac))] - [(reg? dst) - (CODE+r #x50 dst ac)] - [(mem? dst) - (CODErd #xFF '/6 dst ac)] - [else (error who "invalid ~s" instr)])] - [(popl dst) - (cond - [(reg? dst) - (CODE+r #x58 dst ac)] - [(mem? dst) - (CODErd #x8F '/0 dst ac)] - [else (error who "invalid ~s" instr)])] - [(notl dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/2 dst ac))] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" instr)])] - [(negl dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/3 dst ac))] - [else (error who "invalid ~s" instr)])] - -)) - -(define old-convert-instruction - (lambda (a ac) - (define who 'assemble) - (check-len a) - (case (car a) - - [(jmp) - (with-args a - (lambda (dst) - (cond - [(label? dst) - (CODE #xE9 (cons (cons 'relative (label-name dst)) ac))] - [(imm? dst) - (CODE #xE9 (IMM32 dst ac))] - [(mem? dst) - (CODErd #xFF '/4 dst ac)] - [else (error who "invalid jmp in ~s" a)])))] - [(call) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #xE8 (IMM32 dst ac))] - [(label? dst) - (CODE #xE8 (cons (cons 'relative (label-name dst)) ac))] - [(mem? dst) - (CODErd #xFF '/2 dst ac)] - [(reg? dst) - (CODE #xFF (ModRM 3 '/2 dst ac))] - [else (error who "invalid jmp in ~s" a)])))] - [(seta setae setb setbe sete setg setge setl setle - setna setnae setnb setnbe setne setng setnge setnl setnle) - (let* ([table - '([seta #x97] [setna #x96] - [setae #x93] [setnae #x92] - [setb #x92] [setnb #x93] - [setbe #x96] [setnbe #x97] - [setg #x9F] [setng #x9E] - [setge #x9D] [setnge #x9C] - [setl #x9C] [setnl #x9D] - [setle #x9E] [setnle #x9F] - [sete #x94] [setne #x95])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cset ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(reg8? dst) - (CODE #x0F - (CODE (lookup (car a)) - (ModRM 3 '/0 dst ac)))] - [else (error who "invalid ~s" a)]))))] - [(ja jae jb jbe je jg jge jl jle - jna jnae jnb jnbe jne jng jnge jnl jnle) - (let* ([table - '([je #x84] [jne #x85] - [ja #x87] [jna #x86] - [jae #x83] [jnae #x82] - [jb #x82] [jnb #x83] - [jbe #x86] [jnbe #x87] - [jg #x8F] [jng #x8E] - [jge #x8D] [jnge #x8C] - [jl #x8C] [jnl #x8D] - [jle #x8E] [jnle #x8F])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cmp ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #x0F (CODE (lookup (car a)) (IMM32 dst ac)))] - [(label? dst) - (CODE #x0F - (CODE (lookup (car a)) - (cons (cons 'relative (label-name dst)) ac)))] - [else (error who "invalid ~s" a)]))))] - [(byte) - (with-args a - (lambda (x) - (unless (byte? x) (error who "invalid instruction ~s" a)) - (cons (byte x) ac)))] - [(byte-vector) - (with-args a - (lambda (x) (append (map byte (vector->list x)) ac)))] - [(int) (IMM32 a ac)] - [(label) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label L) ac)))] - [(label-address) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label-addr L) ac)))] - [(current-frame-offset) - (cons '(current-frame-offset) ac)] - [(nop) ac] - [else - (error who "unknown instruction ~s" a)]))) - -(define diff - (lambda (ls x) - (cond - [(eq? ls x) '()] - [else (cons (car ls) (diff (cdr ls) x))]))) - -(define hex-table - '#(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 - #\8 #\9 #\A #\B #\C #\D #\E #\F)) - -(define write/x - (lambda (x) - (case (car x) - [(byte) - (display "0x") - (display (vector-ref hex-table (fxsra (cdr x) 4))) - (display (vector-ref hex-table (fxlogand (cdr x) 15))) - (display " ")] - [else (write x)]))) - - -(define compute-code-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(byte) (fx+ ac 1)] - [(word reloc-word reloc-word+ label-addr foreign-label - relative current-frame-offset) - (fx+ ac 4)] - [(label) ac] - [else (error 'compute-code-size "unknown instr ~s" x)])) - 0 - ls))) - - -(define compute-reloc-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(reloc-word ) (fx+ ac 4)] - [(reloc-word+) (fx+ ac 8)] - [(relative label-addr foreign-label) (fx+ ac 8)] - [(word byte label current-frame-offset) ac] - [else (error 'compute-reloc-size "unknown instr ~s" x)])) - 0 - ls))) - -(define set-label-loc! - (lambda (x loc) - (when (getprop x '*label-loc*) - (error 'compile "label ~s is already defined" x)) - (putprop x '*label-loc* loc))) - -(define label-loc - (lambda (x) - (or (getprop x '*label-loc*) - (error 'compile "undefined label ~s" x)))) - - -(define unset-label-loc! - (lambda (x) - (remprop x '*label-loc*))) - - -(define whack-instructions - (lambda (x ls) - (define f - (lambda (ls idx reloc) - (cond - [(null? ls) reloc] - [else - (let ([a (car ls)]) - (case (car a) - [(byte) - (set-code-byte! x idx (cdr a)) - (f (cdr ls) (fx+ idx 1) reloc)] - [(reloc-word reloc-word+) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(relative label-addr foreign-label) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(word) - (let ([v (cdr a)]) - (set-code-word! x idx v) - (f (cdr ls) (fx+ idx 4) reloc))] - [(current-frame-offset) - (set-code-word! x idx idx) - (f (cdr ls) (fx+ idx 4) reloc)] - [(label) - (set-label-loc! (cdr a) (cons x idx)) - (f (cdr ls) idx reloc)] - [else - (error 'whack-instructions "unknown instr ~s" a)]))]))) - (f ls 0 '()))) - -(define wordsize 4) - -(define whack-reloc - (lambda (code) - (define reloc-idx 0) - (lambda (r) - (let ([idx (car r)] [type (cadr r)] [v (cddr r)]) - (case type - [(reloc-word) - (set-code-object! code v idx reloc-idx) - (set! reloc-idx (fxadd1 reloc-idx))] - [(foreign-label) - (set-code-foreign-object! code v idx reloc-idx) - (set! reloc-idx (fx+ reloc-idx 2))] - [(reloc-word+) - (let ([obj (car v)] [disp (cdr v)]) - (set-code-object+offset! code obj idx disp reloc-idx) - (set! reloc-idx (fx+ reloc-idx 2)))] - [(label-addr) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [off (cdr loc)]) - (set-code-object+offset! - code obj idx (fx+ off 11) reloc-idx))) - (set! reloc-idx (fx+ reloc-idx 2))] - [(relative) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [off (cdr loc)]) - (set-code-object+offset/rel! - code obj idx (fx+ off 11) reloc-idx))) - (set! reloc-idx (fx+ reloc-idx 2))] - [else (error 'whack-reloc "invalid reloc type ~s" type)])) - ))) - - -;;; (define list->code -;;; (lambda (ls) -;;; (let ([ls (convert-instructions ls)]) -;;; (let ([n (compute-code-size ls)] -;;; [m (compute-reloc-size ls)]) -;;; (let ([x (make-code n m 1)]) -;;; (let ([reloc* (whack-instructions x ls)]) -;;; (for-each (whack-reloc x) reloc*)) -;;; (make-code-executable! x) -;;; x))))) - -(define list*->code* - (lambda (ls*) - (let ([closure-size* (map car ls*)] - [ls* (map cdr ls*)]) - (let ([ls* (map convert-instructions ls*)]) - (let ([n* (map compute-code-size ls*)] - [m* (map compute-reloc-size ls*)]) - (let ([code* (map (lambda (n m c) (make-code n m c)) - n* - m* - closure-size*)]) - (let ([reloc** (map whack-instructions code* ls*)]) - (for-each - (lambda (code reloc*) - (for-each (whack-reloc code) reloc*)) - code* reloc**) - (for-each make-code-executable! code*) - code*))))))) - -(define list->code - (lambda (ls) - (car (list*->code* (list ls))))) - -(primitive-set! 'list*->code* list*->code*) -) diff --git a/src/libintelasm-6.6.ss b/src/libintelasm-6.6.ss deleted file mode 100644 index 7254753..0000000 --- a/src/libintelasm-6.6.ss +++ /dev/null @@ -1,932 +0,0 @@ - -;;; -;;; assuming the existence of a code manager, this file defines an assember -;;; that takes lists of assembly code and produces a list of code objects -;;; - - ;;; add - ;;; and - ;;; cmp - ;;; call - ;;; cltd - ;;; idiv - ;;; imull - ;;; ja - ;;; jae - ;;; jb - ;;; jbe - ;;; je - ;;; jg - ;;; jge - ;;; jl - ;;; jle - ;;; jne - ;;; jmp - ;;; movb - ;;; movl - ;;; negl - ;;; notl - ;;; orl - ;;; popl - ;;; pushl - ;;; ret - ;;; sall - ;;; sarl - ;;; shrl - ;;; sete - ;;; setg - - -(let () - -(define fold - (lambda (f init ls) - (cond - [(null? ls) init] - [else - (f (car ls) (fold f init (cdr ls)))]))) - -(define convert-instructions - (lambda (ls) - (fold convert-instruction '() ls))) - -(define register-mapping - '([%eax 32 0] - [%ecx 32 1] - [%edx 32 2] - [%ebx 32 3] - [%esp 32 4] - [%ebp 32 5] - [%esi 32 6] - [%edi 32 7] - [%al 8 0] - [%cl 8 1] - [%dl 8 2] - [%bl 8 3] - [%ah 8 4] - [%ch 8 5] - [%dh 8 6] - [%bh 8 7] - [/0 0 0] - [/1 0 1] - [/2 0 2] - [/3 0 3] - [/4 0 4] - [/5 0 5] - [/6 0 6] - [/7 0 7] - )) - -(define register-index - (lambda (x) - (cond - [(assq x register-mapping) => caddr] - [else (error 'register-index "not a register ~s" x)]))) - -(define reg32? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 32))] - [else #f]))) - -(define reg8? - (lambda (x) - (cond - [(assq x register-mapping) => - (lambda (x) (fx= (cadr x) 8))] - [else #f]))) - -(define reg? - (lambda (x) - (assq x register-mapping))) - -(define check-len - (lambda (x) - (define instr-len - '([ret] - [movl s d] - [movb s d] - [addl s d] - [subl s d] - [sall s d] - [sarl s d] - [shrl s d] - [andl s d] - [xorl s d] - [orl s d] - [cmpl s d] - [imull s d] - [notl d] - [negl d] - [idivl d] - [pushl d] - [popl d] - [jmp d] - [call d] - [ja d] - [jae d] - [jb d] - [jbe d] - [je d] - [jg d] - [jge d] - [jl d] - [jle d] - [jna d] - [jnae d] - [jnb d] - [jnbe d] - [jne d] - [jng d] - [jnge d] - [jnl d] - [jnle d] - [seta d] - [setae d] - [setb d] - [setbe d] - [sete d] - [setg d] - [setge d] - [setl d] - [setle d] - [setna d] - [setnae d] - [setnb d] - [setnbe d] - [setne d] - [setng d] - [setnge d] - [setnl d] - [setnle d] - [cltd] - [nop] - [byte x] - [byte-vector x] - [int x] - [label x] - [label-address x] - [current-frame-offset] - )) - (cond - [(assq (car x) instr-len) => - (lambda (p) - (unless (fx= (length x) (length p)) - (error 'assembler "invalid instruction format ~s" x)))] - [else (error 'assembler "unknown instruction ~s" x)]))) - -(define with-args - (lambda (ls f) - (apply f (cdr ls)))) - -(define byte - (lambda (x) - (cons 'byte (fxlogand x 255)))) - - -(define word - (lambda (x) - (cons 'word x))) - -(define reloc-word - (lambda (x) - (cons 'reloc-word x))) - -(define reloc-word+ - (lambda (x d) - (list* 'reloc-word+ x d))) - -(define list*-aux - (lambda (ls ls*) - (cond - [(null? ls*) ls] - [else (cons ls (list*-aux (car ls*) (cdr ls*)))]))) - -(define list* - (lambda (ls . ls*) - (list*-aux ls ls*))) - -(define byte? - (lambda (x) - (and (fixnum? x) - (fx<= x 127) - (fx<= -128 x)))) - -(define mem? - (lambda (x) - (and (list? x) - (fx= (length x) 3) - (eq? (car x) 'disp) - (or (imm? (cadr x)) - (reg? (cadr x))) - (or (imm? (caddr x)) - (reg? (caddr x)))))) - -(define small-disp? - (lambda (x) - (and (mem? x) - (byte? (cadr x))))) - - -(define CODE - (lambda (n ac) - (cons (byte n) ac))) - -(define CODE+r - (lambda (n r ac) - (cons (byte (fxlogor n (register-index r))) ac))) - -(define ModRM - (lambda (mod reg r/m ac) - (cons (byte (fxlogor - (register-index r/m) - (fxlogor - (fxsll (register-index reg) 3) - (fxsll mod 6)))) - (if (and (not (fx= mod 3)) (eq? r/m '%esp)) - (cons (byte #x24) ac) - ac)))) - -(define IMM32 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) - (byte (fxsra n 8)) - (byte (fxsra n 16)) - (byte (fxsra n 24)) - ac))] - [(obj? n) - (let ([v (cadr n)]) - (if (immediate? v) - (cons (word v) ac) - (cons (reloc-word v) ac)))] - [(obj+? n) - (let ([v (cadr n)] [d (caddr n)]) - (cons (reloc-word+ v d) ac))] - [(label-address? n) - (cons (cons 'label-addr (label-name n)) ac)] - [(foreign? n) - (cons (cons 'foreign-label (label-name n)) ac)] - [else (error 'IMM32 "invalid ~s" n)]))) - - -(define IMM8 - (lambda (n ac) - (cond - [(int? n) - (let ([n (cadr n)]) - (list* (byte n) ac))] - [else (error 'IMM8 "invalid ~s" n)]))) - - -(define imm? - (lambda (x) - (or (int? x) - (obj? x) - (obj+? x) - (label-address? x) - (foreign? x)))) - -(define foreign? - (lambda (x) - (and (pair? x) (eq? (car x) 'foreign-label)))) - - -(define imm8? - (lambda (x) - (and (int? x) (byte? (cadr x))))) - -(define label? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (symbol? (car d))) - (error 'assemble "invalid label ~s" x))) - #t] - [else #f]))) - -(define label-address? - (lambda (x) - (cond - [(and (pair? x) (eq? (car x) 'label-address)) - (let ([d (cdr x)]) - (unless (and (null? (cdr d)) - (or (symbol? (car d)) - (string? (car d)))) - (error 'assemble "invalid label-address ~s" x))) - #t] - [else #f]))) - -(define label-name - (lambda (x) (cadr x))) - -(define int? - (lambda (x) - (and (pair? x) (eq? (car x) 'int)))) - -(define obj? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj)))) - -(define obj+? - (lambda (x) - (and (pair? x) (eq? (car x) 'obj+)))) - -(define CODErri - (lambda (c d s i ac) - (cond - [(imm8? i) - (CODE c (ModRM 1 d s (IMM8 i ac)))] - [(reg? i) - (CODE c (ModRM i d s ac))] - [else - (CODE c (ModRM 2 d s (IMM32 i ac)))]))) - -(define CODErr - (lambda (c d s ac) - (CODE c (ModRM 3 d s ac)))) - -(define CODEri - (lambda (c d i ac) - (CODE+r c d (IMM32 i ac)))) - - -(define RegReg - (lambda (r1 r2 r3 ac) - (cond - [(eq? r3 '%esp) (error 'assembler "BUG: invalid src %esp")] - [(eq? r1 '%ebp) (error 'assembler "BUG: invalid src %ebp")] - [else -;;; (parameterize ([print-radix 16]) -;;; (printf "REGREG ~s ~s ~s\n" r1 r2 r3) -;;; (printf "REGREG ~s ~s\n" -;;; (byte (fxlogor 4 (fxsll (register-index r1) 3))) -;;; (byte (fxlogor (register-index r2) -;;; (fxsll (register-index r3) 3))))) - (list* - (byte (fxlogor 4 (fxsll (register-index r1) 3))) - (byte (fxlogor (register-index r2) - (fxsll (register-index r3) 3))) - ac)]))) - - -;;(define CODErd -;; (lambda (c r1 disp ac) -;; (with-args disp -;; (lambda (i/r r2) -;; (if (reg? i/r) -;; (CODE c (RegReg r1 i/r r2 ac)) -;; (CODErri c r1 r2 i/r ac)))))) - - -(define IMM32*2 - (lambda (i1 i2 ac) - (cond - [(and (int? i1) (obj? i2)) - (let ([d (cadr i1)] [v (cadr i2)]) - (cons (reloc-word+ v d) ac))] - [else (error 'assemble "IMM32*2 ~s ~s" i1 i2)]))) - - -(define CODErd - (lambda (c r1 disp ac) - (with-args disp - (lambda (a1 a2) - (cond - [(and (reg? a1) (reg? a2)) - (CODE c (RegReg r1 a1 a2 ac))] - [(and (imm? a1) (reg? a2)) - (CODErri c r1 a2 a1 ac)] - [(and (imm? a1) (imm? a2)) - (CODE c - (ModRM 0 r1 '/5 - (IMM32*2 a1 a2 ac)))] - [else (error 'CODErd "unhandled ~s" disp)]))))) - -(define CODEdi - (lambda (c disp n ac) - (with-args disp - (lambda (i r) - (CODErri c '/0 r i (IMM32 n ac)))))) - -(define CODEdi8 - (lambda (c disp n ac) - (with-args disp - (lambda (i r) - (CODErri c '/0 r i (IMM8 n ac)))))) - -(define *cogen* (gensym "*cogen*")) - -(define-syntax add-instruction - (syntax-rules () - [(_ (name instr ac args ...) b b* ...) - (putprop 'name *cogen* - (cons (length '(args ...)) - (lambda (instr ac args ...) b b* ...)))])) - -(define-syntax add-instructions - (syntax-rules () - [(_ instr ac [(name* arg** ...) b* b** ...] ...) - (begin - (add-instruction (name* instr ac arg** ...) b* b** ...) ...)])) - -(define (convert-instruction a ac) - (cond - [(getprop (car a) *cogen*) => - (lambda (p) - (let ([n (car p)] [proc (cdr p)] [args (cdr a)]) - (cond - [(fx= n (length args)) - (apply proc a ac args)] - [else - (error 'convert-instruction "incorrect args in ~s" a)])))] - [else (old-convert-instruction a ac)] - ;[else (error 'convert-instruction "unknown instruction in ~s" a)] - )) - -(module () -(define who 'assembler) -(add-instructions instr ac - [(ret) (CODE #xC3 ac)] - [(cltd) (CODE #x99 ac)] - [(movl src dst) - (cond - [(and (imm? src) (reg? dst)) (CODEri #xB8 dst src ac)] - [(and (imm? src) (mem? dst)) (CODEdi #xC7 dst src ac)] - [(and (reg? src) (reg? dst)) (CODErr #x89 src dst ac)] - [(and (reg? src) (mem? dst)) (CODErd #x89 src dst ac)] - [(and (mem? src) (reg? dst)) (CODErd #x8B dst src ac)] - [else (error who "invalid ~s" instr)])] - [(movb src dst) - (cond - ;[(and (imm8? src) (reg8? dst)) (CODEri #xB0 dst src ac)] - [(and (imm8? src) (mem? dst)) (CODEdi8 #xC6 dst src ac)] - ;[(and (reg8? src) (reg8? dst)) (CODErr #x88 src dst ac)] - [(and (reg8? src) (mem? dst)) (CODErd #x88 src dst ac)] - [(and (mem? src) (reg8? dst)) (CODErd #x8A dst src ac)] - [else (error who "invalid ~s" instr)])] - [(addl src dst) - (cond - ;;; add imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/0 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x05 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/0 dst (IMM32 src ac)))] - ;;; add reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x01 (ModRM 3 src dst ac))] - ;;; add mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x03 dst src ac)] - ;;; add imm -> mem (not needed) - ;;; add reg -> mem (not needed) - [else (error who "invalid ~s" instr)])] - [(subl src dst) - (cond - ;;; imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/5 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x2D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/5 dst (IMM32 src ac)))] - ;;; reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x29 (ModRM 3 src dst ac))] - ;;; mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x2B dst src ac)] - ;;; imm -> mem (not needed) - ;;; reg -> mem (not needed) - [else (error who "invalid ~s" instr)])] - [(sall src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/4 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/4 dst ac))] - [else (error who "invalid ~s" instr)])] - [(shrl src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/5 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/5 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/5 dst ac))] - [else (error who "invalid ~s" instr)])] - [(sarl src dst) - (cond - [(and (equal? '(int 1) src) (reg? dst)) - (CODE #xD1 (ModRM 3 '/7 dst ac))] - [(and (imm8? src) (reg? dst)) - (CODE #xC1 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (eq? src '%cl) (reg? dst)) - (CODE #xD3 (ModRM 3 '/7 dst ac))] - [else (error who "invalid ~s" instr)])] - [(andl src dst) - (cond - ;;; and imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/4 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x25 (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/4 dst (IMM32 src ac)))] - ;;; and reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x21 (ModRM 3 src dst ac))] - ;;; and mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x23 dst src ac)] - [else (error who "invalid ~s" instr)])] - [(orl src dst) - (cond - ;;; or imm -> reg - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/1 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x0D (IMM32 src ac))] - [(and (imm? src) (reg? dst)) - (CODE #x81 (ModRM 3 '/1 dst (IMM32 src ac)))] - ;;; or reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x09 (ModRM 3 src dst ac))] - ;;; or mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x0B dst src ac)] - [else (error who "invalid ~s" instr)])] - [(xorl src dst) - (cond - ;;; or imm -> reg - ;[(and (imm8? src) (reg? dst)) - ; (CODE #x83 (ModRM 3 '/1 dst (IMM8 src ac)))] - ;[(and (imm? src) (eq? dst '%eax)) - ; (CODE #x0D (IMM32 src ac))] - ;[(and (imm? src) (reg? dst)) - ; (CODE #x81 (ModRM 3 '/1 dst (IMM32 src ac)))] - ;;; or reg -> reg - [(and (reg? src) (reg? dst)) - (CODE #x31 (ModRM 3 src dst ac))] - ;;; or mem -> reg - [(and (mem? src) (reg? dst)) - (CODErd #x33 dst src ac)] - [else (error who "invalid ~s" instr)])] - [(cmpl src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x83 (ModRM 3 '/7 dst (IMM8 src ac)))] - [(and (imm? src) (eq? dst '%eax)) - (CODE #x3D (IMM32 src ac))] - [(and (reg? src) (reg? dst)) - (CODE #x39 (ModRM 3 src dst ac))] - [(and (mem? src) (reg? dst)) - (CODErd #x3B dst src ac)] - [(and (imm8? src) (mem? dst)) - (CODErd #x83 '/7 dst (IMM8 src ac))] - [(and (imm? src) (mem? dst)) - (CODErd #x81 '/7 dst (IMM32 src ac))] - [else (error who "invalid ~s" instr)])] - [(imull src dst) - (cond - [(and (imm8? src) (reg? dst)) - (CODE #x6B (ModRM 3 dst dst (IMM8 src ac)))] - [(and (imm? src) (reg? dst)) - (CODE #x69 (ModRM 3 dst dst (IMM32 src ac)))] - [(and (reg? src) (reg? dst)) - (CODE #x0F (CODE #xAF (ModRM 3 dst src ac)))] - [(and (mem? src) (reg? dst)) - (CODE #x0F (CODErd #xAF dst src ac))] - [else (error who "invalid ~s" instr)])] - [(idivl dst) - (cond - [(reg? dst) - (CODErr #xF7 '/7 dst ac)] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" instr)])] - [(pushl dst) - (cond - [(imm8? dst) - (CODE #x6A (IMM8 dst ac))] - [(imm? dst) - (CODE #x68 (IMM32 dst ac))] - [(reg? dst) - (CODE+r #x50 dst ac)] - [(mem? dst) - (CODErd #xFF '/6 dst ac)] - [else (error who "invalid ~s" instr)])] - [(popl dst) - (cond - [(reg? dst) - (CODE+r #x58 dst ac)] - [(mem? dst) - (CODErd #x8F '/0 dst ac)] - [else (error who "invalid ~s" instr)])] - [(notl dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/2 dst ac))] - [(mem? dst) - (CODErd #xF7 '/7 dst ac)] - [else (error who "invalid ~s" instr)])] - [(negl dst) - (cond - [(reg? dst) - (CODE #xF7 (ModRM 3 '/3 dst ac))] - [else (error who "invalid ~s" instr)])] -)) - -(define old-convert-instruction - (lambda (a ac) - (define who 'assemble) - (check-len a) - (case (car a) - [(jmp) - (with-args a - (lambda (dst) - (cond - [(label? dst) - (CODE #xE9 (cons (cons 'relative (label-name dst)) ac))] - [(imm? dst) - (CODE #xE9 (IMM32 dst ac))] - [(mem? dst) - (CODErd #xFF '/4 dst ac)] - [else (error who "invalid jmp in ~s" a)])))] - [(call) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #xE8 (IMM32 dst ac))] - [(label? dst) - (CODE #xE8 (cons (cons 'relative (label-name dst)) ac))] - [(mem? dst) - (CODErd #xFF '/2 dst ac)] - [(reg? dst) - (CODE #xFF (ModRM 3 '/2 dst ac))] - [else (error who "invalid jmp in ~s" a)])))] - [(seta setae setb setbe sete setg setge setl setle - setna setnae setnb setnbe setne setng setnge setnl setnle) - (let* ([table - '([seta #x97] [setna #x96] - [setae #x93] [setnae #x92] - [setb #x92] [setnb #x93] - [setbe #x96] [setnbe #x97] - [setg #x9F] [setng #x9E] - [setge #x9D] [setnge #x9C] - [setl #x9C] [setnl #x9D] - [setle #x9E] [setnle #x9F] - [sete #x94] [setne #x95])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cset ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(reg8? dst) - (CODE #x0F - (CODE (lookup (car a)) - (ModRM 3 '/0 dst ac)))] - [else (error who "invalid ~s" a)]))))] - [(ja jae jb jbe je jg jge jl jle - jna jnae jnb jnbe jne jng jnge jnl jnle) - (let* ([table - '([je #x84] [jne #x85] - [ja #x87] [jna #x86] - [jae #x83] [jnae #x82] - [jb #x82] [jnb #x83] - [jbe #x86] [jnbe #x87] - [jg #x8F] [jng #x8E] - [jge #x8D] [jnge #x8C] - [jl #x8C] [jnl #x8D] - [jle #x8E] [jnle #x8F])] - [lookup - (lambda (x) - (cond - [(assq x table) => cadr] - [else (error who "invalid cmp ~s" x)]))]) - (with-args a - (lambda (dst) - (cond - [(imm? dst) - (CODE #x0F (CODE (lookup (car a)) (IMM32 dst ac)))] - [(label? dst) - (CODE #x0F - (CODE (lookup (car a)) - (cons (cons 'relative (label-name dst)) ac)))] - [else (error who "invalid ~s" a)]))))] - [(byte) - (with-args a - (lambda (x) - (unless (byte? x) (error who "invalid instruction ~s" a)) - (cons (byte x) ac)))] - [(byte-vector) - (with-args a - (lambda (x) (append (map byte (vector->list x)) ac)))] - [(int) (IMM32 a ac)] - [(label) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label L) ac)))] - [(label-address) - (with-args a - (lambda (L) - (unless (symbol? L) (error who "invalid instruction ~s" a)) - (cons (cons 'label-addr L) ac)))] - [(current-frame-offset) - (cons '(current-frame-offset) ac)] - [(nop) ac] - [else - (error who "unknown instruction ~s" a)]))) - -(define diff - (lambda (ls x) - (cond - [(eq? ls x) '()] - [else (cons (car ls) (diff (cdr ls) x))]))) - -(define hex-table - '#(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 - #\8 #\9 #\A #\B #\C #\D #\E #\F)) - -(define write/x - (lambda (x) - (case (car x) - [(byte) - (display "0x") - (display (vector-ref hex-table (fxsra (cdr x) 4))) - (display (vector-ref hex-table (fxlogand (cdr x) 15))) - (display " ")] - [else (write x)]))) - - -(define compute-code-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(byte) (fx+ ac 1)] - [(word reloc-word reloc-word+ label-addr foreign-label - relative current-frame-offset) - (fx+ ac 4)] - [(label) ac] - [else (error 'compute-code-size "unknown instr ~s" x)])) - 0 - ls))) - - -(define set-label-loc! - (lambda (x loc) - (when (getprop x '*label-loc*) - (error 'compile "label ~s is already defined" x)) - (putprop x '*label-loc* loc))) - -(define label-loc - (lambda (x) - (or (getprop x '*label-loc*) - (error 'compile "undefined label ~s" x)))) - - -(define unset-label-loc! - (lambda (x) - (remprop x '*label-loc*))) - - -(define set-code-word! - (lambda (code idx x) - (cond - [(fixnum? x) - (code-set! code (fx+ idx 0) (fxsll (fxlogand x #x3F) 2)) - (code-set! code (fx+ idx 1) (fxlogand (fxsra x 6) #xFF)) - (code-set! code (fx+ idx 2) (fxlogand (fxsra x 14) #xFF)) - (code-set! code (fx+ idx 3) (fxlogand (fxsra x 22) #xFF))] - [else (error 'set-code-word! "unhandled ~s" x)]))) - -(define whack-instructions - (lambda (x ls) - (define f - (lambda (ls idx reloc) - (cond - [(null? ls) reloc] - [else - (let ([a (car ls)]) - (case (car a) - [(byte) - (code-set! x idx (cdr a)) - (f (cdr ls) (fx+ idx 1) reloc)] - [(reloc-word reloc-word+) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(relative label-addr foreign-label) - (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] - [(word) - (let ([v (cdr a)]) - (set-code-word! x idx v) - (f (cdr ls) (fx+ idx 4) reloc))] - [(current-frame-offset) - (set-code-word! x idx idx) - (f (cdr ls) (fx+ idx 4) reloc)] - [(label) - (set-label-loc! (cdr a) (cons x idx)) - (f (cdr ls) idx reloc)] - [else - (error 'whack-instructions "unknown instr ~s" a)]))]))) - (f ls 0 '()))) - -(define wordsize 4) - - -(define compute-reloc-size - (lambda (ls) - (fold (lambda (x ac) - (case (car x) - [(reloc-word foreign-label) (fx+ ac 2)] - [(relative reloc-word+ label-addr) (fx+ ac 3)] - [(word byte label current-frame-offset) ac] - [else (error 'compute-reloc-size "unknown instr ~s" x)])) - 0 - ls))) - -(define whack-reloc - (lambda (vec) - (define reloc-idx 0) - (lambda (r) - (let ([idx (car r)] [type (cadr r)] [v (cddr r)]) - (case type - [(reloc-word) - (vector-set! vec reloc-idx (fxsll idx 2)) - (vector-set! vec (fx+ reloc-idx 1) v) - (set! reloc-idx (fx+ reloc-idx 2))] - [(foreign-label) - (vector-set! vec reloc-idx (fxlogor 1 (fxsll idx 2))) - (vector-set! vec (fx+ reloc-idx 1) v) - (set! reloc-idx (fx+ reloc-idx 2))] - [(reloc-word+) - (let ([obj (car v)] [disp (cdr v)]) - (vector-set! vec reloc-idx (fxlogor 2 (fxsll idx 2))) - (vector-set! vec (fx+ reloc-idx 1) disp) - (vector-set! vec (fx+ reloc-idx 2) obj) - (set! reloc-idx (fx+ reloc-idx 3)))] - [(label-addr) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [disp (cdr loc)]) - (vector-set! vec reloc-idx (fxlogor 2 (fxsll idx 2))) - (vector-set! vec (fx+ reloc-idx 1) (fx+ disp 11)) - (vector-set! vec (fx+ reloc-idx 2) obj))) - (set! reloc-idx (fx+ reloc-idx 3))] - [(relative) - (let ([loc (label-loc v)]) - (let ([obj (car loc)] [disp (cdr loc)]) - (vector-set! vec reloc-idx (fxlogor 3 (fxsll idx 2))) - (vector-set! vec (fx+ reloc-idx 1) (fx+ disp 11)) - (vector-set! vec (fx+ reloc-idx 2) obj))) - (set! reloc-idx (fx+ reloc-idx 3))] - [else (error 'whack-reloc "invalid reloc type ~s" type)])) - ))) - - -;;; (define list->code -;;; (lambda (ls) -;;; (let ([ls (convert-instructions ls)]) -;;; (let ([n (compute-code-size ls)] -;;; [m (compute-reloc-size ls)]) -;;; (let ([x (make-code n m 1)]) -;;; (let ([reloc* (whack-instructions x ls)]) -;;; (for-each (whack-reloc x) reloc*)) -;;; (make-code-executable! x) -;;; x))))) - -(define list*->code* - (lambda (ls*) - (let ([closure-size* (map car ls*)] - [ls* (map cdr ls*)]) - (let ([ls* (map convert-instructions ls*)]) - (let ([n* (map compute-code-size ls*)] - [m* (map compute-reloc-size ls*)]) - (let ([code* (map make-code n* closure-size*)] - [relv* (map make-vector m*)]) - (let ([reloc** (map whack-instructions code* ls*)]) - (for-each - (lambda (relv reloc*) - (for-each (whack-reloc relv) reloc*)) - relv* reloc**) - (for-each set-code-reloc-vector! code* relv*) - code*))))))) - -(define list->code - (lambda (ls) - (car (list*->code* (list ls))))) - -(primitive-set! 'list*->code* list*->code*) -) diff --git a/src/libintelasm-6.9.ss b/src/libintelasm-6.9.ss index 74ccc3c..497384a 100644 --- a/src/libintelasm-6.9.ss +++ b/src/libintelasm-6.9.ss @@ -558,6 +558,8 @@ (CODE #x83 (ModRM 3 '/7 dst (IMM8 src ac)))] [(and (imm? src) (eq? dst '%eax)) (CODE #x3D (IMM32 src ac))] + [(and (imm? src) (reg? dst)) + (CODE #x81 (ModRM 3 '/7 dst (IMM32 src ac)))] [(and (reg? src) (reg? dst)) (CODE #x39 (ModRM 3 src dst ac))] [(and (mem? src) (reg? dst)) diff --git a/src/libinterpret-6.0.ss b/src/libinterpret-6.0.ss deleted file mode 100644 index 41ddfa2..0000000 --- a/src/libinterpret-6.0.ss +++ /dev/null @@ -1,277 +0,0 @@ - -;;; Expand : Scheme -> Core Scheme -;;; -;;; ::= (quote datum) -;;; | -;;; | (if ) -;;; | (set! ) -;;; | (begin ...) -;;; | (lambda ...) -;;; | ( ...) -;;; | (primref ) -;;; | ( ...) -;;; ::= () -;;; | -;;; | ( . ) -;;; ::= void | memv | top-level-value | set-top-level-value! -;;; - - -(let () - (define syntax-error - (lambda (x) - (error 'interpret "invalid syntax ~s" x))) - ;;; - (define C*->last - (lambda (a d env) - (cond - [(null? d) (C a env)] - [else - (let ([a (C a env)] - [d (C*->last (car d) (cdr d) env)]) - (lambda (renv) - (a renv) - (d renv)))]))) - ;;; - (define C*->list - (lambda (a d env) - (cond - [(null? d) - (let ([a (C a env)]) - (lambda (renv) - (list (a renv))))] - [else - (let ([a (C a env)] - [d (C*->list (car d) (cdr d) env)]) - (lambda (renv) - (cons (a renv) (d renv))))]))) - ;;; - (define extend-env - (lambda (fml* env) - (cons fml* env))) - ;;; - (define fml-length - (lambda (fml* x) - (cond - [(pair? fml*) (fxadd1 (fml-length (cdr fml*) x))] - [(null? fml*) 0] - [(symbol? fml*) 1] - [else (syntax-error x)]))) - ;;; - (define whack-proper - (lambda (v ls i j) - (cond - [(null? ls) - (if (fx= i j) - v - (error 'apply1 "incorrect number of arguments to procedure"))] - [(fx= i j) - (error 'apply2 "incorrect number of arguments to procedure")] - [else - (vector-set! v i (car ls)) - (whack-proper v (cdr ls) (fxadd1 i) j)]))) - ;;; - (define whack-improper - (lambda (v ls i j) - (cond - [(fx= i j) (vector-set! v i ls) v] - [(null? ls) - (error 'apply3 "incorrect number of arguments to procedure")] - [else - (vector-set! v i (car ls)) - (whack-improper v (cdr ls) (fxadd1 i) j)]))) - ;;; - (define lookup - (lambda (x env) - (define Lj - (lambda (x fml* j) - (cond - [(pair? fml*) - (if (eq? (car fml*) x) - j - (Lj x (cdr fml*) (fxadd1 j)))] - [(eq? x fml*) j] - [else #f]))) - (define Li - (lambda (x env i) - (cond - [(null? env) #f] - [(Lj x (car env) 0) => - (lambda (j) - (cons i j))] - [else (Li x (cdr env) (fxadd1 i))]))) - (Li x env 0))) - ;;; - (define C - (lambda (x env) - (cond - [(gensym? x) - (cond - [(lookup x env) => - (lambda (b) - (let ([i (car b)] [j (cdr b)]) - (lambda (renv) - (vector-ref (list-ref renv i) j))))] - [else (syntax-error x)])] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(eq? a 'quote) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([v (car d)]) - (lambda (renv) v))] - [(eq? a 'if) - (unless (fx= (length d) 3) (syntax-error x)) - (let ([test (C (car d) env)] - [conseq (C (cadr d) env)] - [altern (C (caddr d) env)]) - (lambda (renv) - (if (test renv) - (conseq renv) - (altern renv))))] - [(eq? a 'set!) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([var (car d)] [val (C (cadr d) env)]) - (cond - [(lookup var env) => - (lambda (b) - (let ([i (car b)] [j (cdr b)]) - (lambda (renv) - (vector-set! (list-ref renv i) j (val renv)))))] - [else (syntax-error x)]))] - [(eq? a 'begin) - (unless (fx>= (length d) 1) (syntax-error x)) - (C*->last (car d) (cdr d) env)] - [(eq? a 'lambda) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([fml* (car d)] [body* (cdr d)]) - (let ([env (extend-env fml* env)] - [n (fml-length fml* x)]) - (let ([body* (C*->last (car body*) (cdr body*) env)]) - (if (list? fml*) - (lambda (renv) - (lambda args - (body* - (cons (whack-proper (make-vector n) args 0 n) - renv)))) - (lambda (renv) - (lambda args - (body* - (cons - (whack-improper - (make-vector n) args 0 (fxsub1 n)) - renv))))))))] - [(eq? a 'void) - (unless (fx= (length d) 0) (syntax-error x)) - (lambda (renv) (void))] - [(eq? a 'memv) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([val (C (car d) env)] [list (C (cadr d) env)]) - (lambda (renv) - (memq (val renv) (list renv))))] - [(eq? a 'top-level-value) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([qsym (car d)]) - (unless (and (pair? qsym) - (fx= (length qsym) 2) - (eq? (car qsym) 'quote) - (symbol? (cadr qsym))) - (syntax-error x)) - (let ([sym (cadr qsym)]) - (if (top-level-bound? sym) - (lambda (renv) - (top-level-value sym)) - (lambda (renv) - (if (top-level-bound? sym) - (top-level-value sym) - (error #f "~s is unbound" sym))))))] - [(memq a '(set-top-level-value!)) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([qsym (car d)] [val (C (cadr d) env)]) - (unless (and (pair? qsym) - (fx= (length qsym) 2) - (eq? (car qsym) 'quote) - (symbol? (cadr qsym))) - (syntax-error x)) - (let ([sym (cadr qsym)]) - (lambda (renv) - (set-top-level-value! sym (val renv)))))] - ;;; [(eq? a '$pcb-set!) - ;;; (unless (fx= (length d) 2) (syntax-error x)) - ;;; (let ([sym (car d)] [val (C (cadr d) env)]) - ;;; (unless (symbol? sym) (syntax-error x)) - ;;; (lambda (renv) - ;;; (set-top-level-value! sym (val renv))))] - [(eq? a '|#primitive|) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([sym (car d)]) - (let ([prim (primitive-ref sym)]) - (if (procedure? prim) - (lambda (renv) prim) - (syntax-error x))))] - [(memq a '(foreign-call $apply)) - (error 'interpret "~a form is not supported" a)] - ;;; [else - ;;; (let ([rator (C a env)] [n (length d)]) - ;;; (cond - ;;; [(fx= n 0) - ;;; (lambda (renv) - ;;; (let ([p (rator renv)]) - ;;; (p)))] - ;;; [(fx= n 1) - ;;; (let ([arg1 (C (car d) env)]) - ;;; (lambda (renv) - ;;; (let ([p (rator renv)]) - ;;; (p (arg1 renv)))))] - ;;; [(fx= n 2) - ;;; (let ([arg1 (C (car d) env)] - ;;; [arg2 (C (cadr d) env)]) - ;;; (lambda (renv) - ;;; (let ([p (rator renv)]) - ;;; (p (arg1 renv) (arg2 renv)))))] - ;;; [else - ;;; (let ([arg* (C*->list (car d) (cdr d) env)]) - ;;; (lambda (renv) - ;;; (apply (rator renv) (arg* renv))))]))] - [else - (let ([rator (C a env)] [n (length d)]) - (cond - [(fx= n 0) - (lambda (renv) - (apply (rator renv) '()))] - ;[(fx= n 1) - ; (let ([arg1 (C (car d) env)]) - ; (lambda (renv) - ; ((rator renv) (arg1 renv))))] - ;[(fx= n 2) - ; (let ([arg1 (C (car d) env)] - ; [arg2 (C (cadr d) env)]) - ; (lambda (renv) - ; ((rator renv) (arg1 renv) (arg2 renv))))] - [else - (let ([arg* (C*->list (car d) (cdr d) env)]) - (lambda (renv) - (apply (rator renv) (arg* renv))))]))] - - ))] - [else (syntax-error x)]))) - ;;; - (primitive-set! 'interpret - (lambda (x) - (let ([x (expand x)]) - (let ([p (C x '())]) - (p '()))))) - ;;; - (primitive-set! 'current-eval - (make-parameter - interpret - (lambda (f) - (unless (procedure? f) - (error 'current-eval "~s is not a procedure" f)) - f))) - ;;; - (primitive-set! 'eval - (lambda (x) - ((current-eval) x)))) - diff --git a/src/libinterpret-6.1.ss b/src/libinterpret-6.1.ss deleted file mode 100644 index f4172f2..0000000 --- a/src/libinterpret-6.1.ss +++ /dev/null @@ -1,324 +0,0 @@ - -;;; Changes: -;;; 6.1: adding case-lambda, dropping lambda -;;; 6.0: basic version working -;;; - -;;; Expand : Scheme -> Core Scheme -;;; -;;; ::= (quote datum) -;;; | -;;; | (if ) -;;; | (set! ) -;;; | (begin ...) -;;; | (case-lambda ( ) ( ) ...) -;;; | ( ...) -;;; | (primref ) -;;; | ( ...) -;;; ::= () -;;; | -;;; | ( . ) -;;; ::= void | memv | top-level-value | set-top-level-value! -;;; - - -(let () - (define syntax-error - (lambda (x) - (error 'interpret "invalid syntax ~s" x))) - ;;; - (define C*->last - (lambda (a d env) - (cond - [(null? d) (C a env)] - [else - (let ([a (C a env)] - [d (C*->last (car d) (cdr d) env)]) - (lambda (renv) - (a renv) - (d renv)))]))) - ;;; - (define C*->list - (lambda (a d env) - (cond - [(null? d) - (let ([a (C a env)]) - (lambda (renv) - (list (a renv))))] - [else - (let ([a (C a env)] - [d (C*->list (car d) (cdr d) env)]) - (lambda (renv) - (cons (a renv) (d renv))))]))) - ;;; - (define extend-env - (lambda (fml* env) - (cons fml* env))) - ;;; - (define fml-length - (lambda (fml* x) - (cond - [(pair? fml*) (fxadd1 (fml-length (cdr fml*) x))] - [(null? fml*) 0] - [(symbol? fml*) 1] - [else (syntax-error x)]))) - ;;; - (define whack-proper - (lambda (v ls i j) - (cond - [(null? ls) - (if (fx= i j) - v - (error 'apply1 "incorrect number of arguments to procedure"))] - [(fx= i j) - (error 'apply2 "incorrect number of arguments to procedure")] - [else - (vector-set! v i (car ls)) - (whack-proper v (cdr ls) (fxadd1 i) j)]))) - ;;; - (define whack-improper - (lambda (v ls i j) - (cond - [(fx= i j) (vector-set! v i ls) v] - [(null? ls) - (error 'apply3 "incorrect number of arguments to procedure")] - [else - (vector-set! v i (car ls)) - (whack-improper v (cdr ls) (fxadd1 i) j)]))) - ;;; - (define lookup - (lambda (x env) - (define Lj - (lambda (x fml* j) - (cond - [(pair? fml*) - (if (eq? (car fml*) x) - j - (Lj x (cdr fml*) (fxadd1 j)))] - [(eq? x fml*) j] - [else #f]))) - (define Li - (lambda (x env i) - (cond - [(null? env) #f] - [(Lj x (car env) 0) => - (lambda (j) - (cons i j))] - [else (Li x (cdr env) (fxadd1 i))]))) - (Li x env 0))) - ;;; - (define C - (lambda (x env) - (cond - [(gensym? x) - (cond - [(lookup x env) => - (lambda (b) - (let ([i (car b)] [j (cdr b)]) - (lambda (renv) - (vector-ref (list-ref renv i) j))))] - [else (syntax-error x)])] - [(pair? x) - (let ([a (car x)] [d (cdr x)]) - (unless (list? d) (syntax-error x)) - (cond - [(eq? a 'quote) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([v (car d)]) - (lambda (renv) v))] - [(eq? a 'if) - (unless (fx= (length d) 3) (syntax-error x)) - (let ([test (C (car d) env)] - [conseq (C (cadr d) env)] - [altern (C (caddr d) env)]) - (lambda (renv) - (if (test renv) - (conseq renv) - (altern renv))))] - [(eq? a 'set!) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([var (car d)] [val (C (cadr d) env)]) - (cond - [(lookup var env) => - (lambda (b) - (let ([i (car b)] [j (cdr b)]) - (lambda (renv) - (vector-set! (list-ref renv i) j (val renv)))))] - [else (syntax-error x)]))] - [(eq? a 'begin) - (unless (fx>= (length d) 1) (syntax-error x)) - (C*->last (car d) (cdr d) env)] - [(eq? a 'case-lambda) - (unless (fx>= (length d) 1) (syntax-error x)) - (let () - (define generate - (lambda (d) - (cond - [(null? d) - (lambda (n args renv) - (error 'apply - "incorrect number of arguments ~s to procedure" - n))] - [else - (let ([k (generate (cdr d))] - [a (car d)]) - (let ([fml (car a)] [body* (cdr a)]) - (let ([env (extend-env fml env)] - [n (fml-length fml x)]) - (let ([body* - (C*->last (car body*) (cdr body*) env)]) - (if (list? fml) - (lambda (m args renv) - (if (fx= n m) - (body* (cons (list->vector args) renv)) - (k m args renv))) - (let ([q (fxsub1 n)]) - (lambda (m args renv) - (if (fx>= m q) - (let ([v (make-vector n)]) - (let f ([i 0] [args args]) - (cond - [(fx= i q) - (vector-set! v q args)] - [else - (vector-set! v i (car args)) - (f (fxadd1 i) (cdr args))])) - (body* (cons v renv))) - (k m args renv)))))))))]))) - (let ([dispatch (generate d)]) - (lambda (renv) - (lambda args - (dispatch (length args) args renv)))))] - [(eq? a 'lambda) - (syntax-error x) - (unless (fx>= (length d) 2) (syntax-error x)) - (let ([fml* (car d)] [body* (cdr d)]) - (let ([env (extend-env fml* env)] - [n (fml-length fml* x)]) - (let ([body* (C*->last (car body*) (cdr body*) env)]) - (if (list? fml*) - (lambda (renv) - (lambda args - (body* - (cons (whack-proper (make-vector n) args 0 n) - renv)))) - (lambda (renv) - (lambda args - (body* - (cons - (whack-improper - (make-vector n) args 0 (fxsub1 n)) - renv))))))))] - [(eq? a 'void) - (unless (fx= (length d) 0) (syntax-error x)) - (lambda (renv) (void))] - [(eq? a 'memv) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([val (C (car d) env)] [list (C (cadr d) env)]) - (lambda (renv) - (memq (val renv) (list renv))))] - [(eq? a 'top-level-value) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([qsym (car d)]) - (unless (and (pair? qsym) - (fx= (length qsym) 2) - (eq? (car qsym) 'quote) - (symbol? (cadr qsym))) - (syntax-error x)) - (let ([sym (cadr qsym)]) - (if (top-level-bound? sym) - (lambda (renv) - (top-level-value sym)) - (lambda (renv) - (if (top-level-bound? sym) - (top-level-value sym) - (error #f "~s is unbound" sym))))))] - [(memq a '(set-top-level-value!)) - (unless (fx= (length d) 2) (syntax-error x)) - (let ([qsym (car d)] [val (C (cadr d) env)]) - (unless (and (pair? qsym) - (fx= (length qsym) 2) - (eq? (car qsym) 'quote) - (symbol? (cadr qsym))) - (syntax-error x)) - (let ([sym (cadr qsym)]) - (lambda (renv) - (set-top-level-value! sym (val renv)))))] - ;;; [(eq? a '$pcb-set!) - ;;; (unless (fx= (length d) 2) (syntax-error x)) - ;;; (let ([sym (car d)] [val (C (cadr d) env)]) - ;;; (unless (symbol? sym) (syntax-error x)) - ;;; (lambda (renv) - ;;; (set-top-level-value! sym (val renv))))] - [(eq? a '|#primitive|) - (unless (fx= (length d) 1) (syntax-error x)) - (let ([sym (car d)]) - (let ([prim (primitive-ref sym)]) - (if (procedure? prim) - (lambda (renv) prim) - (syntax-error x))))] - [(memq a '(foreign-call $apply)) - (error 'interpret "~a form is not supported" a)] - ;;; [else - ;;; (let ([rator (C a env)] [n (length d)]) - ;;; (cond - ;;; [(fx= n 0) - ;;; (lambda (renv) - ;;; (let ([p (rator renv)]) - ;;; (p)))] - ;;; [(fx= n 1) - ;;; (let ([arg1 (C (car d) env)]) - ;;; (lambda (renv) - ;;; (let ([p (rator renv)]) - ;;; (p (arg1 renv)))))] - ;;; [(fx= n 2) - ;;; (let ([arg1 (C (car d) env)] - ;;; [arg2 (C (cadr d) env)]) - ;;; (lambda (renv) - ;;; (let ([p (rator renv)]) - ;;; (p (arg1 renv) (arg2 renv)))))] - ;;; [else - ;;; (let ([arg* (C*->list (car d) (cdr d) env)]) - ;;; (lambda (renv) - ;;; (apply (rator renv) (arg* renv))))]))] - [else - (let ([rator (C a env)] [n (length d)]) - (cond - [(fx= n 0) - (lambda (renv) - (apply (rator renv) '()))] - ;[(fx= n 1) - ; (let ([arg1 (C (car d) env)]) - ; (lambda (renv) - ; ((rator renv) (arg1 renv))))] - ;[(fx= n 2) - ; (let ([arg1 (C (car d) env)] - ; [arg2 (C (cadr d) env)]) - ; (lambda (renv) - ; ((rator renv) (arg1 renv) (arg2 renv))))] - [else - (let ([arg* (C*->list (car d) (cdr d) env)]) - (lambda (renv) - (apply (rator renv) (arg* renv))))]))] - - ))] - [else (syntax-error x)]))) - ;;; - (primitive-set! 'interpret - (lambda (x) - (let ([x (expand x)]) - (let ([p (C x '())]) - (p '()))))) - ;;; - (primitive-set! 'current-eval - (make-parameter - interpret - (lambda (f) - (unless (procedure? f) - (error 'current-eval "~s is not a procedure" f)) - f))) - ;;; - (primitive-set! 'eval - (lambda (x) - ((current-eval) x)))) - diff --git a/src/libinterpret.fasl b/src/libinterpret.fasl index d167d417c5e5094ecfe845623ba38cf5bbd49889..ea77e6256de22b2053f697689fe805622300dce3 100644 GIT binary patch literal 28266 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 literal 31688 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 Z?GXfT#g8pRXP*uB3DPbVOZ-Pq|1XaQu$=$^ diff --git a/src/libio-6.0.ss b/src/libio-6.0.ss deleted file mode 100644 index bbbe610..0000000 --- a/src/libio-6.0.ss +++ /dev/null @@ -1,510 +0,0 @@ - -;;; OUTPUT PORTS - -(let () - ;;; only file-based ports are supported at this point - ;;; - ;;; an output port is a vector with the following fields: - ;;; 0. id - ;;; 1. file-name - ;;; 2. file-descriptor - ;;; 3. open? - ;;; 4. buffer - ;;; 5. buffer-size - ;;; 6. index - ;;; 7. flush-proc - ;;; 8. close-proc - (define output-port-id (gensym "output-port")) - (define output-port? - (lambda (x) - (and (vector? x) - (fx= (vector-length x) 9) - (eq? (vector-ref x 0) output-port-id)))) - (define output-port-name - (lambda (p) (vector-ref p 1))) - (define output-port-fd - (lambda (p) (vector-ref p 2))) - (define set-output-port-fd! - (lambda (p x) (vector-set! p 2 x))) - (define output-port-open? - (lambda (p) (vector-ref p 3))) - (define set-output-port-open?! - (lambda (p b) (vector-set! p 3 b))) - (define output-port-buffer - (lambda (p) (vector-ref p 4))) - (define set-output-port-buffer! - (lambda (p b) (vector-set! p 4 b))) - (define output-port-size - (lambda (p) (vector-ref p 5))) - (define output-port-index - (lambda (p) (vector-ref p 6))) - (define output-port-flush-proc - (lambda (p) (vector-ref p 7))) - (define output-port-close-proc - (lambda (p) (vector-ref p 8))) - (define set-output-port-index! - (lambda (p i) (vector-set! p 6 i))) - (define fd->port - (lambda (fd filename) - (vector output-port-id ; id - filename - fd - #t - (make-string 4096) - 4096 - 0 - fd-flush-proc - fd-close-proc))) - (define open-output-string - (lambda () - (vector output-port-id - '*string-port* - '() - #t - (make-string 4096) - 4096 - 0 - str-flush-proc - (lambda (port) (void))))) - (define get-output-string - (lambda (p) - (define fill - (lambda (dst src di si sj) - (cond - [(fx= si sj) dst] - [else - (string-set! dst di (string-ref src si)) - (fill dst src (fxadd1 di) (fxadd1 si) sj)]))) - (unless (output-port? p) - (error 'get-output-string "~s is not an output port" p)) - (let ([ls (output-port-fd p)]) - (unless (list? ls) - (error 'get-output-string "~s is not an output port" p)) - (let f ([ls (reverse ls)] [n 0]) - (cond - [(null? ls) - (let ([idx (output-port-index p)] - [buf (output-port-buffer p)]) - (let ([str (make-string (fx+ n idx))]) - (fill str buf n 0 idx)))] - [else - (let ([buf (car ls)]) - (let ([idx (string-length buf)]) - (let ([str (f (cdr ls) (fx+ n idx))]) - (fill str buf n 0 idx))))]))))) - - (define open-output-file - (lambda (filename . rest) - (unless (string? filename) - (error 'open-output-file "invalid filename ~s" filename)) - (let ([mode - (let ([fst - (cond - [(null? rest) 'error] - [(null? (cdr rest)) (car rest)] - [else - (error 'open-output-file "too many arguments")])] - [mode-map - '([error . 0] [append . 1] [replace . 2] [truncate . 3])]) - (cond - [(assq fst mode-map) => cdr] - [else (error 'open-output-file "invalid mode ~s" fst)]))]) - (let ([fh (foreign-call "ik_open_file" filename mode)]) - (fd->port fh filename))))) - (define write-char - (lambda (c . port) - (let ([port - (cond - [(null? port) (current-output-port)] - [(null? (cdr port)) - (let ([p (car port)]) - (if (output-port? p) - p - (error 'write-char "not a port: ~s" p)))] - [else - (error 'write-char "too many arguments")])]) - (unless (char? c) - (error 'write-char "not a char: ~s" c)) - (unless (output-port-open? port) - (error 'write-char "port ~s closed" port)) - (let ([idx (output-port-index port)] [size (output-port-size port)]) - (if (fx< idx size) - (begin - (string-set! (output-port-buffer port) idx c) - (set-output-port-index! port (fxadd1 idx)) - (when (char= c #\newline) - (flush-output-port port))) - (begin - (flush-output-port port) - (write-char c port))))))) - (define fd-flush-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (foreign-call "ik_write" - (output-port-fd port) - idx - (output-port-buffer port)))) - (set-output-port-index! port 0))) - (define str-flush-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (let ([str (output-port-buffer port)]) - (when (fx= idx (string-length str)) - (set-output-port-fd! port - (cons str (output-port-fd port))) - (set-output-port-buffer! port - (make-string (string-length str))) - (set-output-port-index! port 0))))))) - (define fd-close-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (foreign-call "ik_write" - (output-port-fd port) - idx - (output-port-buffer port)))) - (foreign-call "ik_close" (output-port-fd port)))) - - (define flush-output-port - (lambda port - (let ([port - (cond - [(null? port) (current-output-port)] - [(null? (cdr port)) - (let ([p (car port)]) - (if (output-port? p) - p - (error 'flush-output-port "not a port: ~s" p)))] - [else - (error 'flush-output-port "too many arguments")])]) - (unless (output-port-open? port) - (error 'flush-output-port "port ~s closed" port)) - ((output-port-flush-proc port) port)))) - (define close-output-port - (lambda (port) - (unless (output-port? port) - (error 'close-output-port "not a port ~s" port)) - (when (output-port-open? port) - ((output-port-close-proc port) port) - (set-output-port-open?! port #f)))) - - ;;; init section - (primitive-set! 'close-output-port close-output-port) - (primitive-set! 'output-port? output-port?) - (primitive-set! 'open-output-file open-output-file) - (primitive-set! 'write-char write-char) - (primitive-set! 'flush-output-port flush-output-port) - (primitive-set! 'standard-output-port - (let ([p (fd->port 1 '*stdout*)]) - (lambda () p))) - (primitive-set! 'standard-error-port - (let ([p (fd->port 2 '*stderr*)]) - (lambda () p))) - (primitive-set! 'current-output-port - (make-parameter (standard-output-port) - (lambda (p) - (unless (output-port? p) - (error 'current-output-port "not a port ~s" p)) - p))) - (primitive-set! 'console-output-port - (make-parameter (standard-output-port) - (lambda (p) - (unless (output-port? p) - (error 'console-output-port "not a port ~s" p)) - p))) - (primitive-set! 'newline - (lambda args - (if (null? args) - (write-char #\newline (current-output-port)) - (if (null? (cdr args)) - (let ([p (car args)]) - (if (output-port? p) - (write-char #\newline p) - (error 'newline "not an output port ~s" p))) - (error 'newline "too many arguments"))))) - (primitive-set! 'open-output-string open-output-string) - (primitive-set! 'get-output-string get-output-string) - (primitive-set! 'output-port-name - (lambda (x) - (if (output-port? x) - (output-port-name x) - (error 'output-port-name "~s is not an output port" x))))) - -;;; INPUT PORTS - -(let () - ;;; input ports are similar to output ports, with the exception of - ;;; the ungetchar buffer - ;;; Fields: - ;;; 0. id - ;;; 1. file-name - ;;; 2. file-descriptor - ;;; 3. open? - ;;; 4. buffer - ;;; 5. buffer-size - ;;; 6. index - ;;; 7. unget - (define input-port-id (gensym "input-port")) - (define input-port? - (lambda (x) - (and (vector? x) - (fx= (vector-length x) 8) - (eq? (vector-ref x 0) input-port-id)))) - (define input-port-name - (lambda (x) - (vector-ref x 1))) - (define input-port-fd - (lambda (x) - (vector-ref x 2))) - (define input-port-open? - (lambda (x) - (vector-ref x 3))) - (define input-port-buffer - (lambda (x) - (vector-ref x 4))) - (define input-port-size - (lambda (x) - (vector-ref x 5))) - (define set-input-port-size! - (lambda (x i) - (vector-set! x 5 i))) - (define input-port-index - (lambda (x) - (vector-ref x 6))) - (define set-input-port-index! - (lambda (x i) - (vector-set! x 6 i))) - (define set-input-port-returned-char! - (lambda (x i) - (vector-set! x 7 i))) - (define input-port-returned-char - (lambda (x) - (vector-ref x 7))) - (define fd->port - (lambda (fd filename) - (vector input-port-id - filename - fd - #t - (make-string 4096) - 0 - 0 - #f))) - (define open-input-file - (lambda (filename) - (unless (string? filename) - (error 'open-input-file "not a string: ~s" filename)) - (let ([fd (foreign-call "ik_open_file" filename 4)]) - (fd->port fd filename)))) - (define close-input-port - (lambda port - (let ([port - (if (null? port) - (current-input-port) - (if (null? ($cdr port)) - (let ([p ($car port)]) - (if (input-port? p) - p - (error 'close-input-port "not an input port: ~s" p))) - (error 'close-input-port "too many arguments")))]) - (foreign-call "ik_close" (input-port-fd port)) - (void)))) - (define read-char - (lambda port - (let ([port - (if (null? port) - (current-input-port) - (if (null? ($cdr port)) - (let ([p ($car port)]) - (if (input-port? p) - p - (error 'read-char "not an input port: ~s" p))) - (error 'read-char "too many arguments")))]) - (unless (input-port-open? port) - (error 'read-char "port closed")) - (cond - [(input-port-returned-char port) => - (lambda (c) - (set-input-port-returned-char! port #f) - c)] - [else - (let ([idx (input-port-index port)] - [size (input-port-size port)] - [buf (input-port-buffer port)]) - (if ($fx< idx size) - (let ([c ($string-ref buf idx)]) - (set-input-port-index! port ($fxadd1 idx)) - c) - (let ([bytes - (foreign-call "ik_read" - (input-port-fd port) - buf - ($string-length buf))]) - (set-input-port-size! port bytes) - (if ($fxzero? bytes) - (begin - (set-input-port-index! port 0) - (eof-object)) - (begin - (let ([c ($string-ref buf 0)]) - (set-input-port-index! port 1) - c))))))])))) - (define peek-char - (lambda port - (let ([port - (if (null? port) - (current-input-port) - (if (null? (cdr port)) - (let ([p (car port)]) - (if (input-port? p) - p - (error 'peek-char "not an input port: ~s" p))) - (error 'peek-char "too many arguments")))]) - (unless (input-port-open? port) - (error 'peek-char "port closed")) - (cond - [(input-port-returned-char port) => - (lambda (c) c)] - [else - (let ([idx (input-port-index port)] - [size (input-port-size port)] - [buf (input-port-buffer port)]) - (if (fx< idx size) - (string-ref buf idx) - (let ([bytes - (foreign-call "ik_read" - (input-port-fd port) - buf - ($string-length buf))]) - (set-input-port-size! port bytes) - (set-input-port-index! port 0) - (if (fxzero? bytes) - (eof-object) - (string-ref buf 0)))))])))) - (define reset-input-port! - (lambda (p) - (unless (input-port? p) - (error 'reset-input-port! "~s is not an input port" p)) - (set-input-port-index! p 0) - (set-input-port-size! p 0) - (set-input-port-returned-char! p #f))) - (define unread-char - (lambda (c . port) - (let ([port - (if (null? port) - (current-input-port) - (if (null? (cdr port)) - (let ([p (car port)]) - (if (input-port? p) - p - (error 'unread-char "not an input port: ~s" p))) - (error 'unread-char "too many arguments")))]) - (unless (char? c) - (error 'unread-char "not a character ~s" c)) - (unless (input-port-open? port) - (error 'unread-char "port closed")) - (when (input-port-returned-char port) - (error 'unread-char "cannot unread twice")) - (set-input-port-returned-char! port c)))) - (primitive-set! 'open-input-file open-input-file) - (primitive-set! 'close-input-port close-input-port) - (primitive-set! 'input-port? input-port?) - (primitive-set! 'read-char read-char) - (primitive-set! 'unread-char unread-char) - (primitive-set! 'peek-char peek-char) - (primitive-set! 'standard-input-port - (let ([p (fd->port 0 '*stdin*)]) - (lambda () p))) - (primitive-set! 'current-input-port - (make-parameter (standard-input-port) - (lambda (x) - (unless (input-port? x) - (error 'current-input-port "not an input port ~s" x)) - x))) - (primitive-set! 'console-input-port - (make-parameter (standard-input-port) - (lambda (x) - (unless (input-port? x) - (error 'console-input-port "not an input port ~s" x)) - x))) - (primitive-set! 'input-port-name - (lambda (x) - (if (input-port? x) - (input-port-name x) - (error 'input-port-name "~s is not an input port" x)))) - (primitive-set! 'reset-input-port! reset-input-port!)) - -(primitive-set! 'with-output-to-file - (lambda (name proc . args) - (unless (string? name) - (error 'with-output-to-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'with-output-to-file "~s is not a procedure" proc)) - (let ([p (apply open-output-file name args)] - [shot #f]) - (parameterize ([current-output-port p]) - (dynamic-wind - (lambda () - (when shot - (error 'with-output-to-file - "cannot reenter"))) - proc - (lambda () - (close-output-port p) - (set! shot #t))))))) - -(primitive-set! 'call-with-output-file - (lambda (name proc . args) - (unless (string? name) - (error 'call-with-output-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'call-with-output-file "~s is not a procedure" proc)) - (let ([p (apply open-output-file name args)] - [shot #f]) - (dynamic-wind - (lambda () - (when shot - (error 'call-with-output-file "cannot reenter"))) - (lambda () (proc p)) - (lambda () - (close-output-port p) - (set! shot #t)))))) - -(primitive-set! 'with-input-from-file - (lambda (name proc . args) - (unless (string? name) - (error 'with-input-from-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'with-input-from-file "~s is not a procedure" proc)) - (let ([p (apply open-input-file name args)] - [shot #f]) - (parameterize ([current-input-port p]) - (dynamic-wind - (lambda () - (when shot - (error 'with-input-from-file - "cannot reenter"))) - proc - (lambda () - (close-input-port p) - (set! shot #t))))))) - -(primitive-set! 'call-with-input-file - (lambda (name proc . args) - (unless (string? name) - (error 'call-with-input-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'call-with-input-file "~s is not a procedure" proc)) - (let ([p (apply open-input-file name args)] - [shot #f]) - (dynamic-wind - (lambda () - (when shot - (error 'call-with-input-file "cannot reenter"))) - (lambda () (proc p)) - (lambda () - (close-input-port p) - (set! shot #t)))))) - diff --git a/src/libio-6.1.ss b/src/libio-6.1.ss deleted file mode 100644 index b66ce45..0000000 --- a/src/libio-6.1.ss +++ /dev/null @@ -1,497 +0,0 @@ - -;;; OUTPUT PORTS - -(let () - ;;; only file-based ports are supported at this point - ;;; - ;;; an output port is a vector with the following fields: - ;;; 0. id - ;;; 1. file-name - ;;; 2. file-descriptor - ;;; 3. open? - ;;; 4. buffer - ;;; 5. buffer-size - ;;; 6. index - ;;; 7. flush-proc - ;;; 8. close-proc - (define output-port-id (gensym "output-port")) - (define output-port? - (lambda (x) - (and (vector? x) - (fx= (vector-length x) 9) - (eq? (vector-ref x 0) output-port-id)))) - (define output-port-name - (lambda (p) (vector-ref p 1))) - (define output-port-fd - (lambda (p) (vector-ref p 2))) - (define set-output-port-fd! - (lambda (p x) (vector-set! p 2 x))) - (define output-port-open? - (lambda (p) (vector-ref p 3))) - (define set-output-port-open?! - (lambda (p b) (vector-set! p 3 b))) - (define output-port-buffer - (lambda (p) (vector-ref p 4))) - (define set-output-port-buffer! - (lambda (p b) (vector-set! p 4 b))) - (define output-port-size - (lambda (p) (vector-ref p 5))) - (define output-port-index - (lambda (p) (vector-ref p 6))) - (define output-port-flush-proc - (lambda (p) (vector-ref p 7))) - (define output-port-close-proc - (lambda (p) (vector-ref p 8))) - (define set-output-port-index! - (lambda (p i) (vector-set! p 6 i))) - (define fd->port - (lambda (fd filename) - (vector output-port-id ; id - filename - fd - #t - (make-string 4096) - 4096 - 0 - fd-flush-proc - fd-close-proc))) - (define open-output-string - (lambda () - (vector output-port-id - '*string-port* - '() - #t - (make-string 4096) - 4096 - 0 - str-flush-proc - (lambda (port) (void))))) - (define get-output-string - (lambda (p) - (define fill - (lambda (dst src di si sj) - (cond - [(fx= si sj) dst] - [else - (string-set! dst di (string-ref src si)) - (fill dst src (fxadd1 di) (fxadd1 si) sj)]))) - (unless (output-port? p) - (error 'get-output-string "~s is not an output port" p)) - (let ([ls (output-port-fd p)]) - (unless (list? ls) - (error 'get-output-string "~s is not an output port" p)) - (let f ([ls (reverse ls)] [n 0]) - (cond - [(null? ls) - (let ([idx (output-port-index p)] - [buf (output-port-buffer p)]) - (let ([str (make-string (fx+ n idx))]) - (fill str buf n 0 idx)))] - [else - (let ([buf (car ls)]) - (let ([idx (string-length buf)]) - (let ([str (f (cdr ls) (fx+ n idx))]) - (fill str buf n 0 idx))))]))))) - (define open-output-file - (lambda (name mode) - (unless (string? name) - (error 'open-output-file "~s is not a valid file name" name)) - (let ([mode - (cond - [(assq mode '([error 0] [append 1] [replace 2] [truncate 3])) - => cadr] - [else - (error 'open-output-file "~s is not a valid mode" mode)])]) - (let ([fh (foreign-call "ik_open_file" name mode)]) - (fd->port fh name))))) - (define write-char - (lambda (c port) - (unless (char? c) - (error 'write-char "not a char: ~s" c)) - (unless (output-port-open? port) - (error 'write-char "port ~s closed" port)) - (let ([idx (output-port-index port)] [size (output-port-size port)]) - (if (fx< idx size) - (begin - (string-set! (output-port-buffer port) idx c) - (set-output-port-index! port (fxadd1 idx)) - (when ($char= c #\newline) - (flush-output-port port))) - (begin - (flush-output-port port) - (write-char c port)))))) - (define fd-flush-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (foreign-call "ik_write" - (output-port-fd port) - idx - (output-port-buffer port)))) - (set-output-port-index! port 0))) - (define str-flush-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (let ([str (output-port-buffer port)]) - (when (fx= idx (string-length str)) - (set-output-port-fd! port - (cons str (output-port-fd port))) - (set-output-port-buffer! port - (make-string (string-length str))) - (set-output-port-index! port 0))))))) - (define fd-close-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (foreign-call "ik_write" - (output-port-fd port) - idx - (output-port-buffer port)))) - (foreign-call "ik_close" (output-port-fd port)))) - - (define flush-output-port - (lambda (port) - (unless (output-port-open? port) - (error 'flush-output-port "port ~s closed" port)) - ((output-port-flush-proc port) port))) - (define close-output-port - (lambda (port) - (when (output-port-open? port) - ((output-port-close-proc port) port) - (set-output-port-open?! port #f)))) - - ;;; init section - (primitive-set! 'close-output-port - (case-lambda - [() (close-output-port (current-output-port))] - [(p) - (unless (output-port? p) - (error 'close-output-port "~s is not an output port" p)) - (close-output-port p)])) - (primitive-set! 'output-port? output-port?) - (primitive-set! 'open-output-file - (case-lambda - [(filename) (open-output-file filename 'error)] - [(filename mode) (open-output-file filename mode)])) - (primitive-set! 'write-char - (case-lambda - [(c) (write-char c (current-output-port))] - [(c p) - (unless (output-port? p) - (error 'write-char "~s is not an output port" p)) - (write-char c p)])) - (primitive-set! 'flush-output-port - (case-lambda - [() (flush-output-port (current-output-port))] - [(p) - (unless (output-port? p) - (error 'flush-output-port "~s is not an output port" p)) - (flush-output-port p)])) - (primitive-set! 'standard-output-port - (let ([p (fd->port 1 '*stdout*)]) - (lambda () p))) - (primitive-set! 'standard-error-port - (let ([p (fd->port 2 '*stderr*)]) - (lambda () p))) - (primitive-set! 'current-output-port - (make-parameter (standard-output-port) - (lambda (p) - (unless (output-port? p) - (error 'current-output-port "not a port ~s" p)) - p))) - (primitive-set! 'console-output-port - (make-parameter (standard-output-port) - (lambda (p) - (unless (output-port? p) - (error 'console-output-port "not a port ~s" p)) - p))) - (primitive-set! 'newline - (case-lambda - [() (write-char #\newline (current-output-port))] - [(p) - (unless (output-port? p) - (error 'newline "~s is not an output port" p)) - (write-char #\newline p)])) - - (primitive-set! 'open-output-string open-output-string) - (primitive-set! 'get-output-string get-output-string) - (primitive-set! 'output-port-name - (lambda (x) - (if (output-port? x) - (output-port-name x) - (error 'output-port-name "~s is not an output port" x))))) - -;;; INPUT PORTS - -(let () - ;;; input ports are similar to output ports, with the exception of - ;;; the ungetchar buffer - ;;; Fields: - ;;; 0. id - ;;; 1. file-name - ;;; 2. file-descriptor - ;;; 3. open? - ;;; 4. buffer - ;;; 5. buffer-size - ;;; 6. index - ;;; 7. unget - (define input-port-id (gensym "input-port")) - (define input-port? - (lambda (x) - (and (vector? x) - (fx= (vector-length x) 8) - (eq? (vector-ref x 0) input-port-id)))) - (define input-port-name - (lambda (x) - (vector-ref x 1))) - (define input-port-fd - (lambda (x) - (vector-ref x 2))) - (define input-port-open? - (lambda (x) - (vector-ref x 3))) - (define input-port-buffer - (lambda (x) - (vector-ref x 4))) - (define input-port-size - (lambda (x) - (vector-ref x 5))) - (define set-input-port-size! - (lambda (x i) - (vector-set! x 5 i))) - (define input-port-index - (lambda (x) - (vector-ref x 6))) - (define set-input-port-index! - (lambda (x i) - (vector-set! x 6 i))) - (define set-input-port-returned-char! - (lambda (x i) - (vector-set! x 7 i))) - (define input-port-returned-char - (lambda (x) - (vector-ref x 7))) - (define fd->port - (lambda (fd filename) - (vector input-port-id - filename - fd - #t - (make-string 4096) - 0 - 0 - #f))) - (define open-input-file - (lambda (filename) - (unless (string? filename) - (error 'open-input-file "not a string: ~s" filename)) - (let ([fd (foreign-call "ik_open_file" filename 4)]) - (fd->port fd filename)))) - (define close-input-port - (lambda port - (let ([port - (if (null? port) - (current-input-port) - (if (null? ($cdr port)) - (let ([p ($car port)]) - (if (input-port? p) - p - (error 'close-input-port "not an input port: ~s" p))) - (error 'close-input-port "too many arguments")))]) - (foreign-call "ik_close" (input-port-fd port)) - (void)))) - (define read-char - (lambda (port) - (unless (input-port-open? port) - (error 'read-char "port closed")) - (cond - [(input-port-returned-char port) => - (lambda (c) - (set-input-port-returned-char! port #f) - c)] - [else - (let ([idx (input-port-index port)] - [size (input-port-size port)] - [buf (input-port-buffer port)]) - (if ($fx< idx size) - (let ([c ($string-ref buf idx)]) - (set-input-port-index! port ($fxadd1 idx)) - c) - (let ([bytes - (foreign-call "ik_read" - (input-port-fd port) - buf - ($string-length buf))]) - (set-input-port-size! port bytes) - (if ($fxzero? bytes) - (begin - (set-input-port-index! port 0) - (eof-object)) - (begin - (let ([c ($string-ref buf 0)]) - (set-input-port-index! port 1) - c))))))]))) - (define peek-char - (lambda (port) - (unless (input-port-open? port) - (error 'peek-char "port closed")) - (cond - [(input-port-returned-char port) => - (lambda (c) c)] - [else - (let ([idx (input-port-index port)] - [size (input-port-size port)] - [buf (input-port-buffer port)]) - (if (fx< idx size) - (string-ref buf idx) - (let ([bytes - (foreign-call "ik_read" - (input-port-fd port) - buf - ($string-length buf))]) - (set-input-port-size! port bytes) - (set-input-port-index! port 0) - (if (fxzero? bytes) - (eof-object) - (string-ref buf 0)))))]))) - (define reset-input-port! - (lambda (p) - (unless (input-port? p) - (error 'reset-input-port! "~s is not an input port" p)) - (set-input-port-index! p 0) - (set-input-port-size! p 0) - (set-input-port-returned-char! p #f))) - (define unread-char - (lambda (c port) - (unless (char? c) - (error 'unread-char "not a character ~s" c)) - (unless (input-port-open? port) - (error 'unread-char "port closed")) - (when (input-port-returned-char port) - (error 'unread-char "cannot unread twice")) - (set-input-port-returned-char! port c))) - (primitive-set! 'open-input-file open-input-file) - (primitive-set! 'close-input-port - (case-lambda - [() (close-input-port (current-input-port))] - [(p) - (unless (input-port? p) - (error 'close-input-port "~s is not an input port" p)) - (close-input-port p)])) - (primitive-set! 'input-port? input-port?) - (primitive-set! 'read-char - (case-lambda - [() (read-char (current-input-port))] - [(p) - (unless (input-port? p) - (error 'read-char "~s is not an input port" p)) - (read-char p)])) - (primitive-set! 'peek-char - (case-lambda - [() (peek-char (current-input-port))] - [(p) - (unless (input-port? p) - (error 'peek-char "~s is not an input port" p)) - (peek-char p)])) - (primitive-set! 'unread-char - (case-lambda - [(c) (unread-char c (current-input-port))] - [(c p) - (unless (input-port? p) - (error 'unread-char "~s is not an input port" p)) - (unread-char c p)])) - (primitive-set! 'standard-input-port - (let ([p (fd->port 0 '*stdin*)]) - (lambda () p))) - (primitive-set! 'current-input-port - (make-parameter (standard-input-port) - (lambda (x) - (unless (input-port? x) - (error 'current-input-port "not an input port ~s" x)) - x))) - (primitive-set! 'console-input-port - (make-parameter (standard-input-port) - (lambda (x) - (unless (input-port? x) - (error 'console-input-port "not an input port ~s" x)) - x))) - (primitive-set! 'input-port-name - (lambda (x) - (if (input-port? x) - (input-port-name x) - (error 'input-port-name "~s is not an input port" x)))) - (primitive-set! 'reset-input-port! reset-input-port!)) - -(primitive-set! 'with-output-to-file - (lambda (name proc . args) - (unless (string? name) - (error 'with-output-to-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'with-output-to-file "~s is not a procedure" proc)) - (let ([p (apply open-output-file name args)] - [shot #f]) - (parameterize ([current-output-port p]) - (dynamic-wind - (lambda () - (when shot - (error 'with-output-to-file - "cannot reenter"))) - proc - (lambda () - (close-output-port p) - (set! shot #t))))))) - -(primitive-set! 'call-with-output-file - (lambda (name proc . args) - (unless (string? name) - (error 'call-with-output-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'call-with-output-file "~s is not a procedure" proc)) - (let ([p (apply open-output-file name args)] - [shot #f]) - (dynamic-wind - (lambda () - (when shot - (error 'call-with-output-file "cannot reenter"))) - (lambda () (proc p)) - (lambda () - (close-output-port p) - (set! shot #t)))))) - -(primitive-set! 'with-input-from-file - (lambda (name proc . args) - (unless (string? name) - (error 'with-input-from-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'with-input-from-file "~s is not a procedure" proc)) - (let ([p (apply open-input-file name args)] - [shot #f]) - (parameterize ([current-input-port p]) - (dynamic-wind - (lambda () - (when shot - (error 'with-input-from-file - "cannot reenter"))) - proc - (lambda () - (close-input-port p) - (set! shot #t))))))) - -(primitive-set! 'call-with-input-file - (lambda (name proc . args) - (unless (string? name) - (error 'call-with-input-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'call-with-input-file "~s is not a procedure" proc)) - (let ([p (apply open-input-file name args)] - [shot #f]) - (dynamic-wind - (lambda () - (when shot - (error 'call-with-input-file "cannot reenter"))) - (lambda () (proc p)) - (lambda () - (close-input-port p) - (set! shot #t)))))) - diff --git a/src/libio-6.9.ss b/src/libio-6.9.ss deleted file mode 100644 index 216fb60..0000000 --- a/src/libio-6.9.ss +++ /dev/null @@ -1,407 +0,0 @@ - -;;; OUTPUT PORTS - -(let () - ;;; only file-based ports are supported at this point - ;;; - ;;; an output port is a vector with the following fields: - ;;; 0. id - ;;; 1. file-name - ;;; 2. file-descriptor - ;;; 3. open? - ;;; 4. buffer - ;;; 5. buffer-size - ;;; 6. index - ;;; 7. flush-proc - ;;; 8. close-proc - (define-record output-port - (name fd open? - buffer size index flush-proc close-proc)) - (define fd->port - (lambda (fd filename) - (make-output-port filename fd #t - (make-string 4096) 4096 0 - fd-flush-proc fd-close-proc))) - (define open-output-string - (lambda () - (make-output-port '*string-port* '() #t - (make-string 4096) 4096 0 - str-flush-proc (lambda (port) (void))))) - (define get-output-string - (lambda (p) - (define fill - (lambda (dst src di si sj) - (cond - [(fx= si sj) dst] - [else - (string-set! dst di (string-ref src si)) - (fill dst src (fxadd1 di) (fxadd1 si) sj)]))) - (unless (output-port? p) - (error 'get-output-string "~s is not an output port" p)) - (let ([ls (output-port-fd p)]) - (unless (list? ls) - (error 'get-output-string "~s is not an output port" p)) - (let f ([ls (reverse ls)] [n 0]) - (cond - [(null? ls) - (let ([idx (output-port-index p)] - [buf (output-port-buffer p)]) - (let ([str (make-string (fx+ n idx))]) - (fill str buf n 0 idx)))] - [else - (let ([buf (car ls)]) - (let ([idx (string-length buf)]) - (let ([str (f (cdr ls) (fx+ n idx))]) - (fill str buf n 0 idx))))]))))) - (define open-output-file - (lambda (name mode) - (unless (string? name) - (error 'open-output-file "~s is not a valid file name" name)) - (let ([mode - (cond - [(assq mode '([error 0] [append 1] [replace 2] [truncate 3])) - => cadr] - [else - (error 'open-output-file "~s is not a valid mode" mode)])]) - (let ([fh (foreign-call "ik_open_file" name mode)]) - (fd->port fh name))))) - (define write-char - (lambda (c port) - (unless (char? c) - (error 'write-char "not a char: ~s" c)) - (unless (output-port-open? port) - (error 'write-char "port ~s closed" port)) - (let ([idx (output-port-index port)] [size (output-port-size port)]) - (if (fx< idx size) - (begin - (string-set! (output-port-buffer port) idx c) - (set-output-port-index! port (fxadd1 idx)) - (when ($char= c #\newline) - (flush-output-port port))) - (begin - (flush-output-port port) - (write-char c port)))))) - (define fd-flush-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (foreign-call "ik_write" - (output-port-fd port) - idx - (output-port-buffer port)))) - (set-output-port-index! port 0))) - (define str-flush-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (let ([str (output-port-buffer port)]) - (when (fx= idx (string-length str)) - (set-output-port-fd! port - (cons str (output-port-fd port))) - (set-output-port-buffer! port - (make-string (string-length str))) - (set-output-port-index! port 0))))))) - (define fd-close-proc - (lambda (port) - (let ([idx (output-port-index port)]) - (when (fx> idx 0) - (foreign-call "ik_write" - (output-port-fd port) - idx - (output-port-buffer port)))) - (foreign-call "ik_close" (output-port-fd port)))) - - (define flush-output-port - (lambda (port) - (unless (output-port-open? port) - (error 'flush-output-port "port ~s closed" port)) - ((output-port-flush-proc port) port))) - (define close-output-port - (lambda (port) - (when (output-port-open? port) - ((output-port-close-proc port) port) - (set-output-port-open?! port #f)))) - - ;;; init section - (primitive-set! 'close-output-port - (case-lambda - [() (close-output-port (current-output-port))] - [(p) - (unless (output-port? p) - (error 'close-output-port "~s is not an output port" p)) - (close-output-port p)])) - (primitive-set! 'output-port? output-port?) - (primitive-set! 'open-output-file - (case-lambda - [(filename) (open-output-file filename 'error)] - [(filename mode) (open-output-file filename mode)])) - (primitive-set! 'write-char - (case-lambda - [(c) (write-char c (current-output-port))] - [(c p) - (unless (output-port? p) - (error 'write-char "~s is not an output port" p)) - (write-char c p)])) - (primitive-set! 'flush-output-port - (case-lambda - [() (flush-output-port (current-output-port))] - [(p) - (unless (output-port? p) - (error 'flush-output-port "~s is not an output port" p)) - (flush-output-port p)])) - (primitive-set! 'standard-output-port - (let ([p (fd->port 1 '*stdout*)]) - (lambda () p))) - (primitive-set! 'standard-error-port - (let ([p (fd->port 2 '*stderr*)]) - (lambda () p))) - (primitive-set! 'current-output-port - (make-parameter (standard-output-port) - (lambda (p) - (unless (output-port? p) - (error 'current-output-port "not a port ~s" p)) - p))) - (primitive-set! 'console-output-port - (make-parameter (standard-output-port) - (lambda (p) - (unless (output-port? p) - (error 'console-output-port "not a port ~s" p)) - p))) - (primitive-set! 'newline - (case-lambda - [() (write-char #\newline (current-output-port))] - [(p) - (unless (output-port? p) - (error 'newline "~s is not an output port" p)) - (write-char #\newline p)])) - - (primitive-set! 'open-output-string open-output-string) - (primitive-set! 'get-output-string get-output-string) - (primitive-set! 'output-port-name - (lambda (x) - (if (output-port? x) - (output-port-name x) - (error 'output-port-name "~s is not an output port" x))))) - -;;; INPUT PORTS - -(let () - ;;; input ports are similar to output ports, with the exception of - ;;; the ungetchar buffer - ;;; Fields: - ;;; 0. id - ;;; 1. file-name - ;;; 2. file-descriptor - ;;; 3. open? - ;;; 4. buffer - ;;; 5. buffer-size - ;;; 6. index - ;;; 7. unget - (define-record input-port - (name fd open? buffer size index returned-char)) - (define fd->port - (lambda (fd filename) - (make-input-port filename fd #t (make-string 4096) 0 0 #f))) - (define open-input-file - (lambda (filename) - (unless (string? filename) - (error 'open-input-file "not a string: ~s" filename)) - (let ([fd (foreign-call "ik_open_file" filename 4)]) - (fd->port fd filename)))) - (define close-input-port - (lambda (port) - (foreign-call "ik_close" (input-port-fd port)) - (set-input-port-open?! port #f) - (set-input-port-returned-char! port #f) - (set-input-port-index! port (input-port-size port)))) - (define read-char - (lambda (port) - (if (input-port-returned-char port) - (let ([c (input-port-returned-char port)]) - (set-input-port-returned-char! port #f) - c) - (let ([index (input-port-index port)]) - (if ($fx< index (input-port-size port)) - (begin - (set-input-port-index! port ($fxadd1 index)) - ($string-ref (input-port-buffer port) index)) - (if (input-port-open? port) - (let* ([buffer (input-port-buffer port)] - [bytes - (foreign-call "ik_read" - (input-port-fd port) - buffer - ($string-length buffer))]) - (set-input-port-size! port bytes) - (if ($fxzero? bytes) - (begin - (set-input-port-index! port 0) - (eof-object)) - (let ([c ($string-ref buffer 0)]) - (set-input-port-index! port 1) - c))) - (error 'read-char "input port ~s is not open" port))))))) - (define peek-char - (lambda (port) - (unless (input-port-open? port) - (error 'peek-char "port closed")) - (cond - [(input-port-returned-char port) => - (lambda (c) c)] - [else - (let ([idx (input-port-index port)] - [size (input-port-size port)] - [buf (input-port-buffer port)]) - (if (fx< idx size) - (string-ref buf idx) - (let ([bytes - (foreign-call "ik_read" - (input-port-fd port) - buf - ($string-length buf))]) - (set-input-port-size! port bytes) - (set-input-port-index! port 0) - (if (fxzero? bytes) - (eof-object) - (string-ref buf 0)))))]))) - (define reset-input-port! - (lambda (p) - (unless (input-port? p) - (error 'reset-input-port! "~s is not an input port" p)) - (set-input-port-index! p 0) - (set-input-port-size! p 0) - (set-input-port-returned-char! p #f))) - (define unread-char - (lambda (c port) - (unless (char? c) - (error 'unread-char "not a character ~s" c)) - (unless (input-port-open? port) - (error 'unread-char "port closed")) - (when (input-port-returned-char port) - (error 'unread-char "cannot unread twice")) - (set-input-port-returned-char! port c))) - (define *current-input-port* #f) - (primitive-set! 'open-input-file open-input-file) - (primitive-set! 'close-input-port - (case-lambda - [() (close-input-port *current-input-port*)] - [(p) - (unless (input-port? p) - (error 'close-input-port "~s is not an input port" p)) - (close-input-port p)])) - (primitive-set! 'input-port? input-port?) - (primitive-set! 'read-char - (case-lambda - [() (read-char *current-input-port*)] - [(p) (if (input-port? p) - (read-char p) - (error 'read-char "~s is not an input-port" p))])) - (primitive-set! 'peek-char - (case-lambda - [() (peek-char *current-input-port*)] - [(p) - (unless (input-port? p) - (error 'peek-char "~s is not an input port" p)) - (peek-char p)])) - (primitive-set! 'unread-char - (case-lambda - [(c) (unread-char c *current-input-port*)] - [(c p) - (unless (input-port? p) - (error 'unread-char "~s is not an input port" p)) - (unread-char c p)])) - (primitive-set! 'standard-input-port - (let ([p (fd->port 0 '*stdin*)]) - (lambda () p))) - (set! *current-input-port* (standard-input-port)) - (primitive-set! 'current-input-port - (case-lambda - [() *current-input-port*] - [(x) (if (input-port? x) - (set! *current-input-port* x) - (error 'current-input-port "~s is not an input port" x))])) - (primitive-set! 'console-input-port - (make-parameter (standard-input-port) - (lambda (x) - (unless (input-port? x) - (error 'console-input-port "not an input port ~s" x)) - x))) - (primitive-set! 'input-port-name - (lambda (x) - (if (input-port? x) - (input-port-name x) - (error 'input-port-name "~s is not an input port" x)))) - (primitive-set! 'reset-input-port! reset-input-port!)) - -(primitive-set! 'with-output-to-file - (lambda (name proc . args) - (unless (string? name) - (error 'with-output-to-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'with-output-to-file "~s is not a procedure" proc)) - (let ([p (apply open-output-file name args)] - [shot #f]) - (parameterize ([current-output-port p]) - (dynamic-wind - (lambda () - (when shot - (error 'with-output-to-file - "cannot reenter"))) - proc - (lambda () - (close-output-port p) - (set! shot #t))))))) - -(primitive-set! 'call-with-output-file - (lambda (name proc . args) - (unless (string? name) - (error 'call-with-output-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'call-with-output-file "~s is not a procedure" proc)) - (let ([p (apply open-output-file name args)] - [shot #f]) - (dynamic-wind - (lambda () - (when shot - (error 'call-with-output-file "cannot reenter"))) - (lambda () (proc p)) - (lambda () - (close-output-port p) - (set! shot #t)))))) - -(primitive-set! 'with-input-from-file - (lambda (name proc . args) - (unless (string? name) - (error 'with-input-from-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'with-input-from-file "~s is not a procedure" proc)) - (let ([p (apply open-input-file name args)] - [shot #f]) - (parameterize ([current-input-port p]) - (dynamic-wind - (lambda () - (when shot - (error 'with-input-from-file - "cannot reenter"))) - proc - (lambda () - (close-input-port p) - (set! shot #t))))))) - -(primitive-set! 'call-with-input-file - (lambda (name proc . args) - (unless (string? name) - (error 'call-with-input-file "~s is not a string" name)) - (unless (procedure? proc) - (error 'call-with-input-file "~s is not a procedure" proc)) - (let ([p (apply open-input-file name args)] - [shot #f]) - (dynamic-wind - (lambda () - (when shot - (error 'call-with-input-file "cannot reenter"))) - (lambda () (proc p)) - (lambda () - (close-input-port p) - (set! shot #t)))))) - diff --git a/src/libio.fasl b/src/libio.fasl deleted file mode 100644 index da3608072db0ba4eb9f944b790f37523c1e4469d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53124 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 diff --git a/src/libnumerics-7.1.ss b/src/libnumerics-7.1.ss deleted file mode 100644 index 26d081c..0000000 --- a/src/libnumerics-7.1.ss +++ /dev/null @@ -1,53 +0,0 @@ - -(let () - (define (generic+ a b) - (cond - [(fixnum? a) - (cond - [(fixnum? b) (foreign-call "iknum_add_fx_fx" a b)] - [(bignum? b) (foreign-call "iknum_add_fx_bn" a b)] - [else (error '+ "~s is not a number" b)])] - [(bignum? a) - (cond - [(fixnum? b) (foreign-call "iknum_add_fx_bn" b a)] - [(bignum? b) (foreign-call "iknum_add_bn_bn" a b)] - [else (error '+ "~s is not a number" b)])] - [else (error '+ "~s is not a number" a)])) - - (primitive-set! '+ - (case-lambda - [(a b) (generic+ a b)] - [(a b c) (generic+ a (generic+ b c))] - [(a) (if (number? a) a (error '+ "~s is not a number" a))] - [() 0] - [(a b . rest) - (let f ([a a] [b b] [rest rest]) - (generic+ a - (if (null? rest) - b - (f b ($car rest) ($cdr rest)))))])) - - (primitive-set! 'add1 - (lambda (a) - (cond - [(fixnum? a) - (if ($fx< a (most-positive-fixnum)) - ($fxadd1 a) - (foreign-call "iknum_add_fx_fx" a 1))] - [(bignum? a) - (foreign-call "iknum_add_fx_bn" 1 a)] - [else (error 'add1 "~s is not a number" a)]))) - - (primitive-set! 'sub1 - (lambda (a) - (cond - [(fixnum? a) - (if ($fx> a (most-negative-fixnum)) - ($fxsub1 a) - (foreign-call "iknum_add_fx_fx" a -1))] - [(bignum? a) - (foreign-call "iknum_add_fx_bn" -1 a)] - [else (error 'add1 "~s is not a number" a)]))) - - ) - diff --git a/src/libnumerics-9.1.ss b/src/libnumerics-9.1.ss new file mode 100644 index 0000000..a728a4e --- /dev/null +++ b/src/libnumerics-9.1.ss @@ -0,0 +1,376 @@ + +(let () + + (define bignum? + ; FIXME: temporary definition. Compiler should be made aware + ; of numeric representation once it's stable enough. + (lambda (x) + (foreign-call "ikrt_isbignum" x))) + + (define binary+ + (lambda (x y) + (cond + [(fixnum? x) + (cond + [(fixnum? y) + (foreign-call "ikrt_fxfxplus" x y)] + [(bignum? y) + (foreign-call "ikrt_fxbnplus" x y)] + [else + (error '+ "~s is not a number" y)])] + [(bignum? x) + (cond + [(fixnum? y) + (foreign-call "ikrt_fxbnplus" y x)] + [(bignum? y) + (foreign-call "ikrt_bnbnplus" x y)] + [else + (error '+ "~s is not a number" y)])] + [else (error '+ "~s is not a number" x)]))) + + (define binary-logand + (lambda (x y) + (cond + [(fixnum? x) + (cond + [(fixnum? y) (#%$fxlogand x y)] + [(bignum? y) + (foreign-call "ikrt_fxbnlogand" x y)] + [else + (error 'logand "~s is not a number" y)])] + [(bignum? x) + (cond + [(fixnum? y) + (foreign-call "ikrt_fxbnlogand" y x)] + [(bignum? y) + (foreign-call "ikrt_bnbnlogand" x y)] + [else + (error 'logand "~s is not a number" y)])] + [else (error 'logand "~s is not a number" x)]))) + + + (define binary- + (lambda (x y) + (cond + [(fixnum? x) + (cond + [(fixnum? y) + (foreign-call "ikrt_fxfxminus" x y)] + [(bignum? y) + (foreign-call "ikrt_fxbnminus" x y)] + [else + (error '- "~s is not a number" y)])] + [(bignum? x) + (cond + [(fixnum? y) + (foreign-call "ikrt_bnfxminus" x y)] + [(bignum? y) + (foreign-call "ikrt_bnbnminus" x y)] + [else + (error '- "~s is not a number" y)])] + [else (error '- "~s is not a number" x)]))) + + (define binary* + (lambda (x y) + (cond + [(fixnum? x) + (cond + [(fixnum? y) + (foreign-call "ikrt_fxfxmult" x y)] + [(bignum? y) + (foreign-call "ikrt_fxbnmult" x y)] + [else + (error '* "~s is not a number" y)])] + [(bignum? x) + (cond + [(fixnum? y) + (foreign-call "ikrt_fxbnmult" y x)] + [(bignum? y) + (foreign-call "ikrt_bnbnmult" x y)] + [else + (error '* "~s is not a number" y)])] + [else (error '* "~s is not a number" x)]))) + + (define + + (case-lambda + [(x y) (binary+ x y)] + [(x y z) (binary+ (binary+ x y) z)] + [(a) + (cond + [(fixnum? a) a] + [(bignum? a) a] + [else (error '+ "~s is not a number" a)])] + [() 0] + [(a b c d . e*) + (let f ([ac (binary+ (binary+ (binary+ a b) c) d)] + [e* e*]) + (cond + [(null? e*) ac] + [else (f (binary+ ac (car e*)) (cdr e*))]))])) + + (define logand + (case-lambda + [(x y) (binary-logand x y)] + [(x y z) (binary-logand (binary-logand x y) z)] + [(a) + (cond + [(fixnum? a) a] + [(bignum? a) a] + [else (error 'logand "~s is not a number" a)])] + [() -1] + [(a b c d . e*) + (let f ([ac (binary-logand (binary-logand (binary-logand a b) c) d)] + [e* e*]) + (cond + [(null? e*) ac] + [else (f (binary-logand ac (car e*)) (cdr e*))]))])) + + (define - + (case-lambda + [(x y) (binary- x y)] + [(x y z) (binary- (binary- x y) z)] + [(a) (binary- 0 a)] + [(a b c d . e*) + (let f ([ac (binary- (binary- (binary- a b) c) d)] + [e* e*]) + (cond + [(null? e*) ac] + [else (f (binary- ac (car e*)) (cdr e*))]))])) + + (define * + (case-lambda + [(x y) (binary* x y)] + [(x y z) (binary* (binary* x y) z)] + [(a) + (cond + [(fixnum? a) a] + [(bignum? a) a] + [else (error '* "~s is not a number" a)])] + [() 1] + [(a b c d . e*) + (let f ([ac (binary* (binary* (binary* a b) c) d)] + [e* e*]) + (cond + [(null? e*) ac] + [else (f (binary* ac (car e*)) (cdr e*))]))])) + + (define expt + (lambda (n m) + (cond + [(#%$fxzero? m) 1] + [(#%$fxzero? (#%$fxlogand m 1)) + (expt (binary* n n) (#%$fxsra m 1))] + [else + (binary* n (expt (binary* n n) (#%$fxsra m 1)))]))) + + + (define number? + (lambda (x) + (or (fixnum? x) + (bignum? x)))) + + (define positive-bignum? + (lambda (x) + (foreign-call "ikrt_positive_bn" x))) + + + (define even-bignum? + (lambda (x) (error 'even-bignum? "not implemented"))) + + (define number->string + (lambda (x) + (cond + [(fixnum? x) (fixnum->string x)] + [(bignum? x) (foreign-call "ikrt_bntostring" x)] + [else (error 'number->string "~s is not a number" x)]))) + + (define-syntax mk< + (syntax-rules () + [(_ name fxfx< fxbn< bnfx< bnbn<) + (let () + (define err + (lambda (x) (error 'name "~s is not a number" x))) + (define fxloopt + (lambda (x y ls) + (cond + [(fixnum? y) + (if (null? ls) + (fxfx< x y) + (if (fxfx< x y) + (fxloopt y (car ls) (cdr ls)) + (loopf (car ls) (cdr ls))))] + [(bignum? y) + (if (null? ls) + (fxbn< x y) + (if (fxbn< x y) + (bnloopt y (car ls) (cdr ls)) + (loopf (car ls) (cdr ls))))] + [else (err y)]))) + (define bnloopt + (lambda (x y ls) + (cond + [(fixnum? y) + (if (null? ls) + (bnfx< x y) + (if (bnfx< x y) + (fxloopt y (car ls) (cdr ls)) + (loopf (car ls) (cdr ls))))] + [(bignum? y) + (if (null? ls) + (bnbn< x y) + (if (bnbn< x y) + (bnloopt y (car ls) (cdr ls)) + (loopf (car ls) (cdr ls))))] + [else (err y)]))) + (define loopf + (lambda (x ls) + (cond + [(number? x) + (or (null? ls) (loopf (car ls) (cdr ls)))] + [else (err x)]))) + (case-lambda + [(x y) + (cond + [(fixnum? x) + (cond + [(fixnum? y) (fxfx< x y)] + [(bignum? y) (fxbn< x y)] + [else (err y)])] + [(bignum? x) + (cond + [(fixnum? y) (bnfx< x y)] + [(bignum? y) (bnbn< x y)] + [else (err y)])] + [else (err x)])] + [(x y z) + (cond + [(fixnum? x) + (cond + [(fixnum? y) + (cond + [(fixnum? z) (and (fxfx< x y) (fxfx< y z))] + [(bignum? z) + (and (fxfx< x y) (fxbn< y z))] + [else (err z)])] + [(bignum? y) + (cond + [(fixnum? z) #f] + [(bignum? z) + (and (fxbn< x y) (bnbn< y z))] + [else (err z)])] + [else (err y)])] + [(bignum? x) + (cond + [(fixnum? y) + (cond + [(fixnum? z) (and (fxfx< y z) (bnfx< x y))] + [(bignum? z) + (and (bnfx< x y) (bnfx< y z))] + [else (err z)])] + [(bignum? y) + (cond + [(fixnum? z) (and (bnfx< y z) (bnbn< x y))] + [(bignum? z) (and (bnbn< x y) (bnbn< y z))] + [else (err z)])] + [else (err y)])] + [else (err x)])] + [(x) (if (number? x) #t (err x))] + [(x y . ls) + (cond + [(fixnum? x) (fxloopt x y ls)] + [(bignum? x) (bnloopt x y ls)] + [else (err x)])]))])) + + (define-syntax false (syntax-rules () [(_ x y) #f])) + (define-syntax bnbncmp + (syntax-rules () + [(_ x y cmp) + (cmp (foreign-call "ikrt_bnbncomp" x y) 0)])) + (define-syntax bnbn= (syntax-rules () [(_ x y) (bnbncmp x y #%$fx=)])) + (define-syntax bnbn< (syntax-rules () [(_ x y) (bnbncmp x y #%$fx<)])) + (define-syntax bnbn> (syntax-rules () [(_ x y) (bnbncmp x y #%$fx>)])) + (define-syntax bnbn<= (syntax-rules () [(_ x y) (bnbncmp x y #%$fx<=)])) + (define-syntax bnbn>= (syntax-rules () [(_ x y) (bnbncmp x y #%$fx>=)])) + (define-syntax fxbn< (syntax-rules () [(_ x y) (positive-bignum? y)])) + (define-syntax bnfx< (syntax-rules () [(_ x y) (not (positive-bignum? x))])) + (define-syntax fxbn> (syntax-rules () [(_ x y) (not (positive-bignum? y))])) + (define-syntax bnfx> (syntax-rules () [(_ x y) (positive-bignum? x)])) + + + + (primitive-set! '+ +) + (primitive-set! '- -) + (primitive-set! '* *) + (primitive-set! '= (mk< = #%$fx= false false bnbn=)) + (primitive-set! '< (mk< < #%$fx< fxbn< bnfx< bnbn<)) + (primitive-set! '> (mk< > #%$fx> fxbn> bnfx> bnbn>)) + (primitive-set! '<= (mk< <= #%$fx<= fxbn< bnfx< bnbn<=)) + (primitive-set! '>= (mk< >= #%$fx>= fxbn> bnfx> bnbn>=)) + (primitive-set! 'logand logand) + (primitive-set! 'number? number?) + (primitive-set! 'number->string number->string) + + (primitive-set! 'add1 + (lambda (x) + (cond + [(fixnum? x) + (foreign-call "ikrt_fxfxplus" x 1)] + [(bignum? x) + (foreign-call "ikrt_fxbnplus" 1 x)] + [else (error 'add1 "~s is not a number" x)]))) + + (primitive-set! 'sub1 + (lambda (x) + (cond + [(fixnum? x) + (foreign-call "ikrt_fxfxplus" x -1)] + [(bignum? x) + (foreign-call "ikrt_fxbnplus" -1 x)] + [else (error 'sub1 "~s is not a number" x)]))) + + (primitive-set! 'zero? + (lambda (x) + (cond + [(fixnum? x) (eq? x 0)] + [(bignum? x) #f] + [else (error 'zero? "~s is not a number" x)]))) + + (primitive-set! 'expt + (lambda (n m) + (unless (number? n) + (error 'expt "~s is not a numebr" n)) + (cond + [(fixnum? m) + (if (#%$fx>= m 0) + (expt n m) + (error 'expt "power should be positive, got ~s" m))] + [(bignum? m) + (cond + [(eq? n 0) 0] + [(eq? n 1) 1] + [(eq? n -1) + (if (positive-bignum? m) + (if (even-bignum? m) + 1 + -1) + (error 'expt "power should be positive, got ~s" m))] + [else + (if (positive-bignum? m) + (error 'expt "(expt ~s ~s) is too big to compute" n m) + (error 'expt "power should be positive, got ~s" m))])] + [else (error 'expt "~s is not a number" m)]))) + + (primitive-set! 'positive? + (lambda (x) + (cond + [(fixnum? x) (#%$fx> x 0)] + [(bignum? x) (positive-bignum? x)] + [else (error 'positive? "~s is not a number" x)]))) + + (primitive-set! 'negative? + (lambda (x) + (cond + [(fixnum? x) (#%$fx< x 0)] + [(bignum? x) (not (positive-bignum? x))] + [else (error 'negative? "~s is not a number" x)]))) + ) diff --git a/src/librecord-6.0.ss b/src/librecord-6.0.ss deleted file mode 100644 index d3e3e71..0000000 --- a/src/librecord-6.0.ss +++ /dev/null @@ -1,228 +0,0 @@ - - - -(let () - (define record-type-rtd - (let ([rtd ($make-record #f 4)]) - ($record-set! rtd -1 rtd) - ($record-set! rtd 0 "record-type") - ($record-set! rtd 1 4) - ($record-set! rtd 2 '(name length fields printer)) - ($record-set! rtd 3 #f) - rtd)) - - (define rtd? - (lambda (x) - (and ($record? x) - (eq? ($record-rtd x) record-type-rtd)))) - - (define rtd-name - (lambda (rtd) - ($record-ref rtd 0))) - - (define rtd-length - (lambda (rtd) - ($record-ref rtd 1))) - - (define rtd-fields - (lambda (rtd) - ($record-ref rtd 2))) - - (define rtd-printer - (lambda (rtd) - ($record-ref rtd 3))) - - (define set-rtd-name! - (lambda (rtd name) - ($record-set! rtd 0 name))) - - (define set-rtd-length! - (lambda (rtd n) - ($record-set! rtd 1 n))) - - (define set-rtd-fields! - (lambda (rtd fields) - ($record-set! rtd 2 fields))) - - (define set-rtd-printer! - (lambda (rtd printer) - ($record-set! rtd 3 printer))) - - (define make-rtd - (lambda (name fields printer) - (let ([rtd ($make-record record-type-rtd 4)]) - ($record-set! rtd 0 name) - ($record-set! rtd 1 (length fields)) - ($record-set! rtd 2 fields) - ($record-set! rtd 3 printer) - rtd))) - - (define verify-field - (lambda (x) - (unless (symbol? x) - (error 'make-record-type "~s is not a valid field name" x)))) - - (define set-fields - (lambda (r f* i n) - (cond - [(null? f*) - (if ($fx= i n) - r - #f)] - [($fx< i n) - (if (null? f*) - #f - (begin - ($record-set! r i ($car f*)) - (set-fields r ($cdr f*) ($fxadd1 i) n)))] - [else #f]))) - - (define make-record-type - (lambda (name fields) - (unless (string? name) - (error 'make-record-type "name must be a string, got ~s" name)) - (unless (list? fields) - (error 'make-record-type "fields must be a list, got ~s" fields)) - (for-each verify-field fields) - (make-rtd name fields #f))) - - (define record-constructor - (lambda (rtd) - (unless (rtd? rtd) - (error 'record-constructor "~s is not an rtd")) - (lambda args - (let ([n (rtd-length rtd)]) - (let ([r ($make-record rtd n)]) - (or (set-fields r args 0 n) - (error 'record-constructor - "incorrect number of arguments to the constructor of ~s" - rtd))))))) - - (define record-predicate - (lambda (rtd) - (unless (rtd? rtd) - (error 'record-predicate "~s is not an rtd")) - (lambda (x) - (and ($record? x) - (eq? ($record-rtd x) rtd))))) - - (define field-index - (lambda (i rtd who) - (cond - [(fixnum? i) - (unless (and ($fx>= i 0) ($fx< i (rtd-length rtd))) - (error who "~s is out of range for rtd ~s" rtd)) - i] - [(symbol? i) - (letrec ([lookup - (lambda (n ls) - (cond - [(null? ls) - (error who "~s is not a field in ~s" rtd)] - [(eq? i ($car ls)) n] - [else (lookup ($fx+ n 1) ($cdr ls))]))]) - (lookup 0 (rtd-fields rtd)))] - [else (error who "~s is not a valid index" i)]))) - - (define record-field-accessor - (lambda (rtd i) - (unless (rtd? rtd) - (error 'record-field-accessor "~s is not an rtd" rtd)) - (let ([i (field-index i rtd 'record-field-accessor)]) - (lambda (x) - (unless (and ($record? x) - (eq? ($record-rtd x) rtd)) - (error 'record-field-accessor "~s is not of type ~s" x rtd)) - ($record-ref x i))))) - - (define record-field-mutator - (lambda (rtd i) - (unless (rtd? rtd) - (error 'record-field-mutator "~s is not an rtd" rtd)) - (let ([i (field-index i rtd 'record-field-mutator)]) - (lambda (x v) - (unless (and ($record? x) - (eq? ($record-rtd x) rtd)) - (error 'record-field-mutator "~s is not of type ~s" x rtd)) - ($record-set! x i v))))) - - (define record? - (lambda (x . rest) - (if (null? rest) - ($record? x) - (let ([rtd ($car rest)]) - (unless (null? ($cdr rest)) - (error 'record? "too many arguments")) - (unless (rtd? rtd) - (error 'record? "~s is not an rtd")) - (and ($record? x) - (eq? ($record-rtd x) rtd)))))) - - (define record-rtd - (lambda (x) - (if ($record? x) - ($record-rtd x) - (error 'record-rtd "~s is not a record" x)))) - - (define record-length - (lambda (x) - (if ($record? x) - (rtd-length ($record-rtd x)) - (error 'record-length "~s is not a record" x)))) - - (define record-name - (lambda (x) - (if ($record? x) - (rtd-name ($record-rtd x)) - (error 'record-name "~s is not a record" x)))) - - (define record-printer - (lambda (x) - (if ($record? x) - (rtd-printer ($record-rtd x)) - (error 'record-printer "~s is not a record" x)))) - - - - (define record-ref - (lambda (x i) - (unless ($record? x) (error 'record-ref "~s is not a record" x)) - (unless (fixnum? i) (error 'record-ref "~s is not a valid index" i)) - (let ([n (rtd-length ($record-rtd x))]) - (unless (and ($fx>= i 0) ($fx< i n)) - (error 'record-ref "index ~s is out of range for ~s" i x)) - ($record-ref x i)))) - - (define record-set! - (lambda (x i v) - (unless ($record? x) (error 'record-set! "~s is not a record" x)) - (unless (fixnum? i) (error 'record-set! "~s is not a valid index" i)) - (let ([n (rtd-length ($record-rtd x))]) - (unless (and ($fx>= i 0) ($fx< i n)) - (error 'record-set! "index ~s is out of range for ~s" i x)) - ($record-set! x i v)))) - - (primitive-set! 'make-record-type make-record-type) - (primitive-set! 'record-constructor record-constructor) - (primitive-set! 'record-predicate record-predicate) - (primitive-set! 'record-field-accessor record-field-accessor) - (primitive-set! 'record-field-mutator record-field-mutator) - - (primitive-set! 'record? record?) - (primitive-set! 'record-rtd record-rtd) - (primitive-set! 'record-name record-name) - (primitive-set! 'record-printer record-printer) - (primitive-set! 'record-length record-length) - (primitive-set! 'record-ref record-ref) - (primitive-set! 'record-set! record-set!) - - (set-rtd-printer! record-type-rtd - (lambda (x p) - (unless (rtd? x) - (error 'record-type-printer "not an rtd")) - (display "#<" p) - (display (rtd-name x) p) - (display " rtd>" p))) - - ) - diff --git a/src/librecord-6.1.ss b/src/librecord-6.1.ss deleted file mode 100644 index f843013..0000000 --- a/src/librecord-6.1.ss +++ /dev/null @@ -1,222 +0,0 @@ - - - -(let () - - (define rtd? - (lambda (x) - (and ($record? x) - (eq? ($record-rtd x) $base-rtd)))) - - (define rtd-name - (lambda (rtd) - ($record-ref rtd 0))) - - (define rtd-length - (lambda (rtd) - ($record-ref rtd 1))) - - (define rtd-fields - (lambda (rtd) - ($record-ref rtd 2))) - - (define rtd-printer - (lambda (rtd) - ($record-ref rtd 3))) - - (define set-rtd-name! - (lambda (rtd name) - ($record-set! rtd 0 name))) - - (define set-rtd-length! - (lambda (rtd n) - ($record-set! rtd 1 n))) - - (define set-rtd-fields! - (lambda (rtd fields) - ($record-set! rtd 2 fields))) - - (define set-rtd-printer! - (lambda (rtd printer) - ($record-set! rtd 3 printer))) - - (define make-rtd - (lambda (name fields printer) - (let ([rtd ($make-record $base-rtd 4)]) - ($record-set! rtd 0 name) - ($record-set! rtd 1 (length fields)) - ($record-set! rtd 2 fields) - ($record-set! rtd 3 printer) - rtd))) - - (define verify-field - (lambda (x) - (unless (symbol? x) - (error 'make-record-type "~s is not a valid field name" x)))) - - (define set-fields - (lambda (r f* i n) - (cond - [(null? f*) - (if ($fx= i n) - r - #f)] - [($fx< i n) - (if (null? f*) - #f - (begin - ($record-set! r i ($car f*)) - (set-fields r ($cdr f*) ($fxadd1 i) n)))] - [else #f]))) - - (define make-record-type - (lambda (name fields) - (unless (string? name) - (error 'make-record-type "name must be a string, got ~s" name)) - (unless (list? fields) - (error 'make-record-type "fields must be a list, got ~s" fields)) - (for-each verify-field fields) - (make-rtd name fields #f))) - - (define record-constructor - (lambda (rtd) - (unless (rtd? rtd) - (error 'record-constructor "~s is not an rtd")) - (lambda args - (let ([n (rtd-length rtd)]) - (let ([r ($make-record rtd n)]) - (or (set-fields r args 0 n) - (error 'record-constructor - "incorrect number of arguments to the constructor of ~s" - rtd))))))) - - (define record-predicate - (lambda (rtd) - (unless (rtd? rtd) - (error 'record-predicate "~s is not an rtd")) - (lambda (x) - (and ($record? x) - (eq? ($record-rtd x) rtd))))) - - (define field-index - (lambda (i rtd who) - (cond - [(fixnum? i) - (unless (and ($fx>= i 0) ($fx< i (rtd-length rtd))) - (error who "~s is out of range for rtd ~s" rtd)) - i] - [(symbol? i) - (letrec ([lookup - (lambda (n ls) - (cond - [(null? ls) - (error who "~s is not a field in ~s" rtd)] - [(eq? i ($car ls)) n] - [else (lookup ($fx+ n 1) ($cdr ls))]))]) - (lookup 0 (rtd-fields rtd)))] - [else (error who "~s is not a valid index" i)]))) - - (define record-field-accessor - (lambda (rtd i) - (unless (rtd? rtd) - (error 'record-field-accessor "~s is not an rtd" rtd)) - (let ([i (field-index i rtd 'record-field-accessor)]) - (lambda (x) - (unless (and ($record? x) - (eq? ($record-rtd x) rtd)) - (error 'record-field-accessor "~s is not of type ~s" x rtd)) - ($record-ref x i))))) - - (define record-field-mutator - (lambda (rtd i) - (unless (rtd? rtd) - (error 'record-field-mutator "~s is not an rtd" rtd)) - (let ([i (field-index i rtd 'record-field-mutator)]) - (lambda (x v) - (unless (and ($record? x) - (eq? ($record-rtd x) rtd)) - (error 'record-field-mutator "~s is not of type ~s" x rtd)) - ($record-set! x i v))))) - - (define record? - (lambda (x . rest) - (if (null? rest) - ($record? x) - (let ([rtd ($car rest)]) - (unless (null? ($cdr rest)) - (error 'record? "too many arguments")) - (unless (rtd? rtd) - (error 'record? "~s is not an rtd")) - (and ($record? x) - (eq? ($record-rtd x) rtd)))))) - - (define record-rtd - (lambda (x) - (if ($record? x) - ($record-rtd x) - (error 'record-rtd "~s is not a record" x)))) - - (define record-length - (lambda (x) - (if ($record? x) - (rtd-length ($record-rtd x)) - (error 'record-length "~s is not a record" x)))) - - (define record-name - (lambda (x) - (if ($record? x) - (rtd-name ($record-rtd x)) - (error 'record-name "~s is not a record" x)))) - - (define record-printer - (lambda (x) - (if ($record? x) - (rtd-printer ($record-rtd x)) - (error 'record-printer "~s is not a record" x)))) - - - - (define record-ref - (lambda (x i) - (unless ($record? x) (error 'record-ref "~s is not a record" x)) - (unless (fixnum? i) (error 'record-ref "~s is not a valid index" i)) - (let ([n (rtd-length ($record-rtd x))]) - (unless (and ($fx>= i 0) ($fx< i n)) - (error 'record-ref "index ~s is out of range for ~s" i x)) - ($record-ref x i)))) - - (define record-set! - (lambda (x i v) - (unless ($record? x) (error 'record-set! "~s is not a record" x)) - (unless (fixnum? i) (error 'record-set! "~s is not a valid index" i)) - (let ([n (rtd-length ($record-rtd x))]) - (unless (and ($fx>= i 0) ($fx< i n)) - (error 'record-set! "index ~s is out of range for ~s" i x)) - ($record-set! x i v)))) - - (primitive-set! 'make-record-type make-record-type) - (primitive-set! 'record-constructor record-constructor) - (primitive-set! 'record-predicate record-predicate) - (primitive-set! 'record-field-accessor record-field-accessor) - (primitive-set! 'record-field-mutator record-field-mutator) - - (primitive-set! 'record? record?) - (primitive-set! 'record-rtd record-rtd) - (primitive-set! 'record-name record-name) - (primitive-set! 'record-printer record-printer) - (primitive-set! 'record-length record-length) - (primitive-set! 'record-ref record-ref) - (primitive-set! 'record-set! record-set!) - - (set-rtd-fields! $base-rtd '(name fields length printer)) - (set-rtd-name! $base-rtd "base-rtd") - (set-rtd-printer! $base-rtd - (lambda (x p) - (unless (rtd? x) - (error 'record-type-printer "not an rtd")) - (display "#<" p) - (display (rtd-name x) p) - (display " rtd>" p))) - - ) - diff --git a/src/librecord.fasl b/src/librecord.fasl index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d5bb18971a4f3ca880c1a4e3cad77446ac2fe51d 100644 GIT binary patch literal 15860 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 c) p))] [(initial? c) diff --git a/src/libtokenizer-6.0.ss b/src/libtokenizer-9.0.ss similarity index 59% rename from src/libtokenizer-6.0.ss rename to src/libtokenizer-9.0.ss index 3eaa65c..b4da506 100644 --- a/src/libtokenizer-6.0.ss +++ b/src/libtokenizer-9.0.ss @@ -1,7 +1,7 @@ (let () (define char-whitespace? (lambda (c) - (or (char= #\space c) + (or ($char= #\space c) (memq ($char->fixnum c) '(9 10 11 12 13))))) (define delimiter? (lambda (c) @@ -9,7 +9,7 @@ (memq c '(#\( #\) #\[ #\] #\' #\` #\, #\"))))) (define digit? (lambda (c) - (and (char<= #\0 c) (char<= c #\9)))) + (and ($char<= #\0 c) ($char<= c #\9)))) (define char->num (lambda (c) (fx- ($char->fixnum c) ($char->fixnum #\0)))) @@ -18,15 +18,15 @@ (or (letter? c) (special-initial? c)))) (define letter? (lambda (c) - (or (and (char<= #\a c) (char<= c #\z)) - (and (char<= #\A c) (char<= c #\Z))))) + (or (and ($char<= #\a c) ($char<= c #\z)) + (and ($char<= #\A c) ($char<= c #\Z))))) (define af? (lambda (c) - (or (and (char<= #\a c) (char<= c #\f)) - (and (char<= #\A c) (char<= c #\F))))) + (or (and ($char<= #\a c) ($char<= c #\f)) + (and ($char<= #\A c) ($char<= c #\F))))) (define af->num (lambda (c) - (if (and (char<= #\a c) (char<= c #\f)) + (if (and ($char<= #\a c) ($char<= c #\f)) (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\a))) (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\A)))))) (define special-initial? @@ -77,9 +77,9 @@ (cons 'datum (tokenize-hex (char->num c) p))] [(af? c) (cons 'datum (tokenize-hex (af->num c) p))] - [(char= c #\-) + [($char= c #\-) (cons 'datum (fx- 0 (tokenize-hex 0 p)))] - [(char= c #\+) + [($char= c #\+) (cons 'datum (tokenize-hex 0 p))] [else (unread-char c p) @@ -104,14 +104,14 @@ (cond [(eof-object? c) (error 'tokenize "end-of-file while inside a string")] - [(char= #\" c) ls] - [(char= #\\ c) + [($char= #\" c) ls] + [($char= #\\ c) (let ([c (read-char p)]) (cond - [(char= #\" c) (tokenize-string (cons #\" ls) p)] - [(char= #\\ c) (tokenize-string (cons #\\ ls) p)] - [(char= #\n c) (tokenize-string (cons #\newline ls) p)] - [(char= #\t c) (tokenize-string (cons #\tab ls) p)] + [($char= #\" c) (tokenize-string (cons #\" ls) p)] + [($char= #\\ c) (tokenize-string (cons #\\ ls) p)] + [($char= #\n c) (tokenize-string (cons #\newline ls) p)] + [($char= #\t c) (tokenize-string (cons #\tab ls) p)] [else (error 'tokenize "invalid string escape \\~a" c)]))] [else (tokenize-string (cons c ls) p)])))) @@ -148,13 +148,13 @@ (cond [(eof-object? c) 'dot] [(delimiter? c) 'dot] - [(char= c #\.) ; this is second dot + [($char= c #\.) ; this is second dot (read-char p) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid syntax .. near end of file")] - [(char= c #\.) ; this is the third + [($char= c #\.) ; this is the third (let ([c (peek-char p)]) (cond [(eof-object? c) '(datum . ...)] @@ -180,7 +180,7 @@ (cond [(eof-object? c) (error 'tokenize "invalid eof in the middle of #\\~a" str)] - [(char= c (string-ref str i)) + [($char= c (string-ref str i)) (tokenize-char* (fxadd1 i) str p d)] [else (error 'tokenize @@ -191,7 +191,7 @@ (cond [(eof-object? c) (cons 'datum (string-ref str 0))] [(delimiter? c) (cons 'datum (string-ref str 0))] - [(char= (string-ref str 1) c) + [($char= (string-ref str 1) c) (read-char p) (tokenize-char* 2 str p d)] [else (error 'tokenize "invalid syntax near #\\~a~a" @@ -202,13 +202,13 @@ (cond [(eof-object? c) (error 'tokenize "invalid #\\ near end of file")] - [(char= #\s c) + [($char= #\s c) (tokenize-char-seq p "space" '(datum . #\space))] - [(char= #\n c) + [($char= #\n c) (tokenize-char-seq p "newline" '(datum . #\newline))] - [(char= #\t c) + [($char= #\t c) (tokenize-char-seq p "tab" '(datum . #\tab))] - [(char= #\r c) + [($char= #\r c) (tokenize-char-seq p "return" '(datum . #\return))] [else (let ([n (peek-char p)]) @@ -226,17 +226,17 @@ (let ([c (read-char p)]) (cond [(eof-object? c) (multiline-error)] - [(char= #\| c) + [($char= #\| c) (let ([c (read-char p)]) (cond [(eof-object? c) (multiline-error)] - [(char= #\# c) (void)] + [($char= #\# c) (void)] [else (multiline-comment p)]))] - [(char= #\# c) + [($char= #\# c) (let ([c (read-char p)]) (cond [(eof-object? c) (multiline-error)] - [(char= #\| c) + [($char= #\| c) (multiline-comment p) (multiline-comment p)] [else @@ -247,8 +247,8 @@ (let ([c (read-char p)]) (cond [(eof-object? c) ac] - [(char= #\0 c) (read-binary (fxsll ac 1) (cons c chars) p)] - [(char= #\1 c) (read-binary (fx+ (fxsll ac 1) 1) (cons c chars) p)] + [($char= #\0 c) (read-binary (fxsll ac 1) (cons c chars) p)] + [($char= #\1 c) (read-binary (fx+ (fxsll ac 1) 1) (cons c chars) p)] [(delimiter? c) (unread-char c p) ac] [else (unread-char c) @@ -259,85 +259,99 @@ (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid # near end of file")] - [(char= c #\t) + [($char= c #\t) (let ([c (peek-char p)]) (cond [(eof-object? c) '(datum . #t)] [(delimiter? c) '(datum . #t)] [else (error 'tokenize "invalid syntax near #t")]))] - [(char= c #\f) + [($char= c #\f) (let ([c (peek-char p)]) (cond [(eof-object? c) '(datum . #f)] [(delimiter? c) '(datum . #f)] [else (error 'tokenize "invalid syntax near #f")]))] - [(char= #\\ c) (tokenize-char p)] - [(char= #\( c) 'vparen] - [(char= #\x c) (tokenize-hex-init p)] - [(char= #\' c) '(macro . syntax)] - [(char= #\; c) 'hash-semi] - [(char= #\% c) '(macro . |#primitive|)] - [(char= #\| c) (multiline-comment p) (tokenize p)] - [(char= #\b c) + [($char= #\\ c) (tokenize-char p)] + [($char= #\( c) 'vparen] + [($char= #\x c) (tokenize-hex-init p)] + [($char= #\' c) '(macro . syntax)] + [($char= #\; c) 'hash-semi] + [($char= #\% c) '(macro . |#primitive|)] + [($char= #\| c) (multiline-comment p) (tokenize p)] + [($char= #\b c) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid eof while reading #b")] - [(char= #\- c) + [($char= #\- c) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "invalid eof while reading #b-")] - [(char= #\0 c) + [($char= #\0 c) (cons 'datum (fx- 0 (read-binary 0 '(#\0 #\-) p)))] - [(char= #\1 c) + [($char= #\1 c) (cons 'datum (fx- 0 (read-binary 1 '(#\1 #\-) p)))] [else (unread-char c p) (error 'tokenize "invalid binary syntax #b-~a" c)]))] - [(char= #\0 c) + [($char= #\0 c) (cons 'datum (read-binary 0 '(#\0) p))] - [(char= #\1 c) + [($char= #\1 c) (cons 'datum (read-binary 1 '(#\1) p))] [else (unread-char c p) (error 'tokenize "invalid syntax #b~a" c)] ))] - [(char= #\! c) + [($char= #\! c) (let ([e (read-char p)]) (when (eof-object? e) (error 'tokenize "invalid eof near #!")) - (unless (char= #\e e) + (unless ($char= #\e e) (error 'tokenize "invalid syntax near #!~a" e)) (let ([o (read-char p)]) (when (eof-object? o) (error 'tokenize "invalid eof near #!e")) - (unless (char= #\o o) + (unless ($char= #\o o) (error 'tokenize "invalid syntax near #!e~a" o)) (let ([f (read-char p)]) (when (eof-object? f) (error 'tokenize "invalid syntax near #!eo")) - (unless (char= #\f f) + (unless ($char= #\f f) (error 'tokenize "invalid syntax near #!eo~a" f)) (cons 'datum (eof-object)))))] + [(digit? c) + (tokenize-hashnum p (char->num c))] [else (unread-char c p) (error 'tokenize "invalid syntax #~a" c)])))) + (define (tokenize-hashnum p n) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid eof inside #n mark/ref")] + [($char= #\= c) (cons 'mark n)] + [($char= #\# c) (cons 'ref n)] + [(digit? c) + (tokenize-hashnum p (fx+ (fx* n 10) (char->num c)))] + [else + (unread-char c p) + (error 'tokenize "invalid char ~a while inside a #n mark/ref" c)]))) (define tokenize-bar (lambda (p ac) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "unexpected eof while reading symbol")] - [(char= #\\ c) + [($char= #\\ c) (let ([c (read-char p)]) (cond [(eof-object? c) (error 'tokenize "unexpected eof while reading symbol")] [else (tokenize-bar p (cons c ac))]))] - [(char= #\| c) ac] + [($char= #\| c) ac] [else (tokenize-bar p (cons c ac))])))) (define tokenize (lambda (p) @@ -345,39 +359,39 @@ (cond [(eof-object? c) (eof-object)] [(char-whitespace? c) (tokenize p)] - [(char= #\( c) 'lparen] - [(char= #\) c) 'rparen] - [(char= #\[ c) 'lbrack] - [(char= #\] c) 'rbrack] - [(char= #\' c) '(macro . quote)] - [(char= #\` c) '(macro . quasiquote)] - [(char= #\, c) + [($char= #\( c) 'lparen] + [($char= #\) c) 'rparen] + [($char= #\[ c) 'lbrack] + [($char= #\] c) 'rbrack] + [($char= #\' c) '(macro . quote)] + [($char= #\` c) '(macro . quasiquote)] + [($char= #\, c) (let ([c (peek-char p)]) (cond [(eof-object? c) '(macro . unquote)] - [(char= c #\@) + [($char= c #\@) (read-char p) '(macro . unquote-splicing)] [else '(macro . unquote)]))] - [(char= #\# c) (tokenize-hash p)] + [($char= #\# c) (tokenize-hash p)] [(digit? c) (cons 'datum (tokenize-number (char->num c) p))] [(initial? c) (let ([ls (reverse (tokenize-identifier (cons c '()) p))]) (cons 'datum (string->symbol (list->string ls))))] - [(char= #\" c) + [($char= #\" c) (let ([ls (tokenize-string '() p)]) (cons 'datum (list->string (reverse ls))))] - [(char= #\; c) + [($char= #\; c) (skip-comment p) (tokenize p)] - [(char= #\+ c) + [($char= #\+ c) (tokenize-plus p)] - [(char= #\- c) + [($char= #\- c) (tokenize-minus p)] - [(char= #\. c) + [($char= #\. c) (tokenize-dot p)] - [(char= #\| c) + [($char= #\| c) (let ([ls (reverse (tokenize-bar p '()))]) (cons 'datum (string->symbol (list->string ls))))] [else @@ -388,122 +402,212 @@ ;;;--------------------------------------------------------------* READ *--- ;;; (define read-list-rest - (lambda (p end mis) + (lambda (p locs k end mis) (let ([t (read-token p)]) (cond [(eof-object? t) (error 'read "end of file encountered while reading list")] - [(eq? t end) '()] + [(eq? t end) (values '() locs k)] [(eq? t mis) (error 'read "paren mismatch")] [(eq? t 'dot) - (let ([d (read p)]) + (let-values ([(d locs k) (read-expr p locs k)]) (let ([t (read-token p)]) (cond - [(eq? t end) d] - [(eq? t mis) + [(eq? t end) (values d locs k)] + [(eq? t mis) (error 'read "paren mismatch")] [(eq? t 'dot) (error 'read "cannot have two dots in a list")] [else (error 'read "expecting ~a, got ~a" end t)])))] [(eq? t 'hash-semi) - (read p) - (read-list-rest p end mis)] + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-list-rest p locs k end mis))] [else - (let ([a (parse-token p t)]) - (let ([d (read-list-rest p end mis)]) - (cons a d)))])))) + (let-values ([(a locs k) (parse-token p locs k t)]) + (let-values ([(d locs k) (read-list-rest p locs k end mis)]) + (let ([x (cons a d)]) + (values x locs + (if (or (loc? a) (loc? d)) + (extend-k-pair x k) + k)))))])))) (define read-list-init - (lambda (p end mis) + (lambda (p locs k end mis) (let ([t (read-token p)]) (cond [(eof-object? t) (error 'read "end of file encountered while reading list")] - [(eq? t end) '()] + [(eq? t end) (values '() locs k)] [(eq? t mis) (error 'read "paren mismatch")] [(eq? t 'dot) (error 'read "invalid dot while reading list")] [(eq? t 'hash-semi) - (read p) - (read-list-init p end mis)] + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-list-init p locs k end mis))] [else - (let ([a (parse-token p t)]) - (cons a (read-list-rest p end mis)))])))) - (define vector-put! - (lambda (v i ls) + (let-values ([(a locs k) (parse-token p locs k t)]) + (let-values ([(d locs k) (read-list-rest p locs k end mis)]) + (let ([x (cons a d)]) + (values x locs + (if (or (loc? a) (loc? d)) + (extend-k-pair x k) + k)))))])))) + (define extend-k-pair + (lambda (x k) + (lambda () + (let ([a (car x)]) + (when (loc? a) + (set-car! x (loc-value a)))) + (let ([d (cdr x)]) + (when (loc? d) + (set-cdr! x (loc-value d)))) + (k)))) + (define vector-put + (lambda (v k i ls) (cond - [(null? ls) v] + [(null? ls) k] [else - (vector-set! v i (car ls)) - (vector-put! v (fxsub1 i) (cdr ls))]))) + (let ([a (car ls)]) + (vector-set! v i a) + (vector-put v + (if (loc? a) + (lambda () + (vector-set! v i (loc-value (vector-ref v i))) + (k)) + k) + (fxsub1 i) (cdr ls)))]))) (define read-vector - (lambda (p count ls) + (lambda (p locs k count ls) (let ([t (read-token p)]) (cond - [(eof-object? t) - (error 'read "end of file encountered while reading a vector")] - [(eq? t 'rparen) - (let ([v (make-vector count)]) - (vector-put! v (fxsub1 count) ls))] - [(eq? t 'rbrack) - (error 'read "unexpected ] while reading a vector")] - [(eq? t 'dot) - (error 'read "unexpected . while reading a vector")] - [(eq? t 'hash-semi) - (read p) - (read-vector p count ls)] - [else - (let ([a (parse-token p t)]) - (read-vector p (fxadd1 count) (cons a ls)))])))) + [(eof-object? t) + (error 'read "end of file encountered while reading a vector")] + [(eq? t 'rparen) + (let ([v (make-vector count)]) + (let ([k (vector-put v k (fxsub1 count) ls)]) + (values v locs k)))] + [(eq? t 'rbrack) + (error 'read "unexpected ] while reading a vector")] + [(eq? t 'dot) + (error 'read "unexpected . while reading a vector")] + [(eq? t 'hash-semi) + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-vector p locs k count ls))] + [else + (let-values ([(a locs k) (parse-token p locs k t)]) + (read-vector p locs k (fxadd1 count) (cons a ls)))])))) + (define-record loc (value set?)) (define parse-token - (lambda (p t) + (lambda (p locs k t) (cond - [(eof-object? t) (eof-object)] - [(eq? t 'lparen) (read-list-init p 'rparen 'rbrack)] - [(eq? t 'lbrack) (read-list-init p 'rbrack 'rparen)] - [(eq? t 'vparen) (read-vector p 0 '())] - [(eq? t 'hash-semi) - (read p) ; ignored expression - (read p)] + [(eof-object? t) (values (eof-object) locs k)] + [(eq? t 'lparen) (read-list-init p locs k 'rparen 'rbrack)] + [(eq? t 'lbrack) (read-list-init p locs k 'rbrack 'rparen)] + [(eq? t 'vparen) (read-vector p locs k 0 '())] + [(eq? t 'hash-semi) + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-expr p locs k))] [(pair? t) (cond - [(eq? (car t) 'datum) (cdr t)] + [(eq? (car t) 'datum) (values (cdr t) locs k)] [(eq? (car t) 'macro) - (cons (cdr t) (cons (read p) '()))] + (let-values ([(expr locs k) (read-expr p locs k)]) + (let ([x (list expr)]) + (values (cons (cdr t) x) locs + (if (loc? expr) + (lambda () + (set-car! x (loc-value expr)) + (k)) + k))))] + [(eq? (car t) 'mark) + (let ([n (cdr t)]) + (let-values ([(expr locs k) (read-expr p locs k)]) + (cond + [(assq n locs) => + (lambda (x) + (let ([loc (cdr x)]) + (when (loc-set? loc) + (error 'read "duplicate mark ~s" n)) + (set-loc-value! loc expr) + (set-loc-set?! loc #t) + (values expr locs k)))] + [else + (let ([loc (make-loc expr #t)]) + (let ([locs (cons (cons n loc) locs)]) + (values expr locs k)))])))] + [(eq? (car t) 'ref) + (let ([n (cdr t)]) + (cond + [(assq n locs) => + (lambda (x) + (values (cdr x) locs k))] + [else + (let ([loc (make-loc #f #f)]) + (let ([locs (cons (cons n loc) locs)]) + (values loc locs k)))]))] [else (error 'read "invalid token! ~s" t)])] [else (error 'read "unexpected ~s found" t)]))) - (define read - (lambda (p) (parse-token p (read-token p)))) + (define read-expr + (lambda (p locs k) + (parse-token p locs k (read-token p)))) + (define reduce-loc! + (lambda (x) + (let ([loc (cdr x)]) + (unless (loc-set? loc) + (error 'read "referenced mark ~s not set" (car x))) + (when (loc? (loc-value loc)) + (let f ([h loc] [t loc]) + (if (loc? h) + (let ([h1 (loc-value h)]) + (if (loc? h1) + (begin + (when (eq? h1 t) + (error 'read "circular marks")) + (let ([v (f (loc-value h1) (loc-value t))]) + (set-loc-value! h1 v) + (set-loc-value! h v) + v)) + (begin + (set-loc-value! h h1) + h1))) + h)))))) + + (define read + (lambda (p) + (let-values ([(expr locs k) (read-expr p '() void)]) + (cond + [(null? locs) expr] + [else + (for-each reduce-loc! locs) + (k) + (if (loc? expr) + (loc-value expr) + expr)])))) + + + + ;;; ;;;--------------------------------------------------------------* INIT *--- ;;; (primitive-set! 'read-token - (lambda p - (if (null? p) - (tokenize (current-input-port)) - (if (null? (cdr p)) - (let ([a (car p)]) - (if (input-port? a) - (tokenize a) - (error 'read-token - "not an input port: ~s ~s ~s" - (vector? a) (vector-length a) a))) - (error 'read-token "too many arguments"))))) + (case-lambda + [() (tokenize (current-input-port))] + [(p) + (if (input-port? p) + (tokenize p) + (error 'read-token "~s is not an input port" p))])) (primitive-set! 'read - (lambda p - (if (null? p) - (read (current-input-port)) - (if (null? (cdr p)) - (let ([a (car p)]) - (if (input-port? a) - (read a) - (error 'read "not an input port: ~s" a))) - (error 'read "too many arguments"))))) - + (case-lambda + [() (read (current-input-port))] + [(p) + (if (input-port? p) + (read p) + (error 'read "~s is not an input port" p))])) (let () (define read-and-eval (lambda (p) diff --git a/src/libtokenizer-9.1.ss b/src/libtokenizer-9.1.ss new file mode 100644 index 0000000..b578587 --- /dev/null +++ b/src/libtokenizer-9.1.ss @@ -0,0 +1,630 @@ + +;;; 9.1: bignum reader +;;; 9.0: graph marks/refs +;;; +(let () + (define char-whitespace? + (lambda (c) + (or ($char= #\space c) + (memq ($char->fixnum c) '(9 10 11 12 13))))) + (define delimiter? + (lambda (c) + (or (char-whitespace? c) + (memq c '(#\( #\) #\[ #\] #\' #\` #\, #\"))))) + (define digit? + (lambda (c) + (and ($char<= #\0 c) ($char<= c #\9)))) + (define char->num + (lambda (c) + (fx- ($char->fixnum c) ($char->fixnum #\0)))) + (define initial? + (lambda (c) + (or (letter? c) (special-initial? c)))) + (define letter? + (lambda (c) + (or (and ($char<= #\a c) ($char<= c #\z)) + (and ($char<= #\A c) ($char<= c #\Z))))) + (define af? + (lambda (c) + (or (and ($char<= #\a c) ($char<= c #\f)) + (and ($char<= #\A c) ($char<= c #\F))))) + (define af->num + (lambda (c) + (if (and ($char<= #\a c) ($char<= c #\f)) + (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\a))) + (fx+ 10 (fx- ($char->fixnum c) ($char->fixnum #\A)))))) + (define special-initial? + (lambda (c) + (memq c '(#\! #\$ #\% #\& #\* #\/ #\: #\< #\= #\> #\? #\^ #\_ #\~)))) + (define subsequent? + (lambda (c) + (or (initial? c) (digit? c) (special-subsequent? c)))) + (define special-subsequent? + (lambda (c) + (memq c '(#\+ #\- #\. #\@)))) + (define tokenize-number + (lambda (n p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) n] + [(digit? c) + (tokenize-number (+ (* n 10) (char->num c)) p)] + [(delimiter? c) + (unread-char c p) + n] + [else + (unread-char c p) + (error 'tokenize "invalid number syntax: ~a~a" n c)])))) + (define tokenize-hex + (lambda (n p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) n] + [(digit? c) + (tokenize-hex (+ (* n 16) (char->num c)) p)] + [(af? c) + (tokenize-hex (+ (* n 16) (af->num c)) p)] + [(delimiter? c) + (unread-char c p) + n] + [else + (unread-char c p) + (error 'tokenize "invalid hex number sequence: ~a~a" n c)])))) + (define tokenize-hex-init + (lambda (p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (unread-char c p) + (error 'tokenize "invalid #x near end of file")] + [(digit? c) + (cons 'datum (tokenize-hex (char->num c) p))] + [(af? c) + (cons 'datum (tokenize-hex (af->num c) p))] + [($char= c #\-) + (cons 'datum (* -1 (tokenize-hex 0 p)))] + [($char= c #\+) + (cons 'datum (tokenize-hex 0 p))] + [else + (unread-char c p) + (error 'tokenize "invalid number syntax: #x~a" c)])))) + (define tokenize-identifier + (lambda (ls p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) ls] + [(subsequent? c) + (tokenize-identifier (cons c ls) p)] + [(delimiter? c) + (unread-char c p) + ls] + [else + (unread-char c p) + (error 'tokenize "invalid identifier syntax: ~a" + (list->string (reverse (cons c ls))))])))) + (define tokenize-string + (lambda (ls p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "end-of-file while inside a string")] + [($char= #\" c) ls] + [($char= #\\ c) + (let ([c (read-char p)]) + (cond + [($char= #\" c) (tokenize-string (cons #\" ls) p)] + [($char= #\\ c) (tokenize-string (cons #\\ ls) p)] + [($char= #\n c) (tokenize-string (cons #\newline ls) p)] + [($char= #\t c) (tokenize-string (cons #\tab ls) p)] + [else (error 'tokenize "invalid string escape \\~a" c)]))] + [else + (tokenize-string (cons c ls) p)])))) + (define skip-comment + (lambda (p) + (let ([c (read-char p)]) + (unless (eof-object? c) + (let ([i ($char->fixnum c)]) + (unless (or (fx= i 10) (fx= i 13)) + (skip-comment p))))))) + (define tokenize-plus + (lambda (p) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) '(datum . +)] + [(delimiter? c) '(datum . +)] + [(digit? c) + (read-char p) + (cons 'datum (tokenize-number (char->num c) p))] + [else (error 'tokenize "invalid sequence +~a" c)])))) + (define tokenize-minus + (lambda (p) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) '(datum . -)] + [(delimiter? c) '(datum . -)] + [(digit? c) + (read-char p) + (cons 'datum (* -1 (tokenize-number (char->num c) p)))] + [else (error 'tokenize "invalid sequence -~a" c)])))) + (define tokenize-dot + (lambda (p) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) 'dot] + [(delimiter? c) 'dot] + [($char= c #\.) ; this is second dot + (read-char p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid syntax .. near end of file")] + [($char= c #\.) ; this is the third + (let ([c (peek-char p)]) + (cond + [(eof-object? c) '(datum . ...)] + [(delimiter? c) '(datum . ...)] + [else + (error 'tokenize "invalid syntax ...~a" c)]))] + [else + (unread-char c) + (error 'tokenize "invalid syntax ..~a" c)]))] + [else + (error 'tokenize "invalid syntax .~a" c)])))) + (define tokenize-char* + (lambda (i str p d) + (cond + [(fx= i (string-length str)) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) d] + [(delimiter? c) d] + [else (error 'tokenize "invalid character after #\\~a" str)]))] + [else + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid eof in the middle of #\\~a" str)] + [($char= c (string-ref str i)) + (tokenize-char* (fxadd1 i) str p d)] + [else + (error 'tokenize + "invalid char ~a while scanning #\\~a" c str)]))]))) + (define tokenize-char-seq + (lambda (p str d) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) (cons 'datum (string-ref str 0))] + [(delimiter? c) (cons 'datum (string-ref str 0))] + [($char= (string-ref str 1) c) + (read-char p) + (tokenize-char* 2 str p d)] + [else (error 'tokenize "invalid syntax near #\\~a~a" + (string-ref str 0) c)])))) + (define tokenize-char + (lambda (p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid #\\ near end of file")] + [($char= #\s c) + (tokenize-char-seq p "space" '(datum . #\space))] + [($char= #\n c) + (tokenize-char-seq p "newline" '(datum . #\newline))] + [($char= #\t c) + (tokenize-char-seq p "tab" '(datum . #\tab))] + [($char= #\r c) + (tokenize-char-seq p "return" '(datum . #\return))] + [else + (let ([n (peek-char p)]) + (cond + [(eof-object? n) (cons 'datum c)] + [(delimiter? n) (cons 'datum c)] + [else + (error 'tokenize "invalid syntax #\\~a~a" c n)]))])))) + (define multiline-error + (lambda () + (error 'tokenize + "end of file encountered while inside a #|-style comment"))) + (define multiline-comment + (lambda (p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) (multiline-error)] + [($char= #\| c) + (let ([c (read-char p)]) + (cond + [(eof-object? c) (multiline-error)] + [($char= #\# c) (void)] + [else (multiline-comment p)]))] + [($char= #\# c) + (let ([c (read-char p)]) + (cond + [(eof-object? c) (multiline-error)] + [($char= #\| c) + (multiline-comment p) + (multiline-comment p)] + [else + (multiline-comment p)]))] + [else (multiline-comment p)])))) + (define read-binary + (lambda (ac chars p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) ac] + [($char= #\0 c) (read-binary (* ac 2) (cons c chars) p)] + [($char= #\1 c) (read-binary (+ (* ac 2) 1) (cons c chars) p)] + [(delimiter? c) (unread-char c p) ac] + [else + (unread-char c) + (error 'tokenize "invalid syntax #b~a" + (list->string (reverse (cons c chars))))])))) + (define tokenize-hash + (lambda (p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) (error 'tokenize "invalid # near end of file")] + [($char= c #\t) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) '(datum . #t)] + [(delimiter? c) '(datum . #t)] + [else (error 'tokenize "invalid syntax near #t")]))] + [($char= c #\f) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) '(datum . #f)] + [(delimiter? c) '(datum . #f)] + [else (error 'tokenize "invalid syntax near #f")]))] + [($char= #\\ c) (tokenize-char p)] + [($char= #\( c) 'vparen] + [($char= #\x c) (tokenize-hex-init p)] + [($char= #\' c) '(macro . syntax)] + [($char= #\; c) 'hash-semi] + [($char= #\% c) '(macro . |#primitive|)] + [($char= #\| c) (multiline-comment p) (tokenize p)] + [($char= #\b c) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid eof while reading #b")] + [($char= #\- c) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid eof while reading #b-")] + [($char= #\0 c) + (cons 'datum + (* -1 (read-binary 0 '(#\0 #\-) p)))] + [($char= #\1 c) + (cons 'datum + (* -1 (read-binary 1 '(#\1 #\-) p)))] + [else + (unread-char c p) + (error 'tokenize "invalid binary syntax #b-~a" c)]))] + [($char= #\0 c) + (cons 'datum (read-binary 0 '(#\0) p))] + [($char= #\1 c) + (cons 'datum (read-binary 1 '(#\1) p))] + [else + (unread-char c p) + (error 'tokenize "invalid syntax #b~a" c)] + ))] + [($char= #\! c) + (let ([e (read-char p)]) + (when (eof-object? e) + (error 'tokenize "invalid eof near #!")) + (unless ($char= #\e e) + (error 'tokenize "invalid syntax near #!~a" e)) + (let ([o (read-char p)]) + (when (eof-object? o) + (error 'tokenize "invalid eof near #!e")) + (unless ($char= #\o o) + (error 'tokenize "invalid syntax near #!e~a" o)) + (let ([f (read-char p)]) + (when (eof-object? f) + (error 'tokenize "invalid syntax near #!eo")) + (unless ($char= #\f f) + (error 'tokenize "invalid syntax near #!eo~a" f)) + (cons 'datum (eof-object)))))] + [(digit? c) + (tokenize-hashnum p (char->num c))] + [else + (unread-char c p) + (error 'tokenize "invalid syntax #~a" c)])))) + (define (tokenize-hashnum p n) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "invalid eof inside #n mark/ref")] + [($char= #\= c) (cons 'mark n)] + [($char= #\# c) (cons 'ref n)] + [(digit? c) + (tokenize-hashnum p (fx+ (fx* n 10) (char->num c)))] + [else + (unread-char c p) + (error 'tokenize "invalid char ~a while inside a #n mark/ref" c)]))) + (define tokenize-bar + (lambda (p ac) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "unexpected eof while reading symbol")] + [($char= #\\ c) + (let ([c (read-char p)]) + (cond + [(eof-object? c) + (error 'tokenize "unexpected eof while reading symbol")] + [else (tokenize-bar p (cons c ac))]))] + [($char= #\| c) ac] + [else (tokenize-bar p (cons c ac))])))) + (define tokenize + (lambda (p) + (let ([c (read-char p)]) + (cond + [(eof-object? c) (eof-object)] + [(char-whitespace? c) (tokenize p)] + [($char= #\( c) 'lparen] + [($char= #\) c) 'rparen] + [($char= #\[ c) 'lbrack] + [($char= #\] c) 'rbrack] + [($char= #\' c) '(macro . quote)] + [($char= #\` c) '(macro . quasiquote)] + [($char= #\, c) + (let ([c (peek-char p)]) + (cond + [(eof-object? c) '(macro . unquote)] + [($char= c #\@) + (read-char p) + '(macro . unquote-splicing)] + [else '(macro . unquote)]))] + [($char= #\# c) (tokenize-hash p)] + [(digit? c) + (cons 'datum (tokenize-number (char->num c) p))] + [(initial? c) + (let ([ls (reverse (tokenize-identifier (cons c '()) p))]) + (cons 'datum (string->symbol (list->string ls))))] + [($char= #\" c) + (let ([ls (tokenize-string '() p)]) + (cons 'datum (list->string (reverse ls))))] + [($char= #\; c) + (skip-comment p) + (tokenize p)] + [($char= #\+ c) + (tokenize-plus p)] + [($char= #\- c) + (tokenize-minus p)] + [($char= #\. c) + (tokenize-dot p)] + [($char= #\| c) + (let ([ls (reverse (tokenize-bar p '()))]) + (cons 'datum (string->symbol (list->string ls))))] + [else + (unread-char c p) + (error 'tokenize "invalid syntax ~a" c)])))) + + ;;; + ;;;--------------------------------------------------------------* READ *--- + ;;; + (define read-list-rest + (lambda (p locs k end mis) + (let ([t (read-token p)]) + (cond + [(eof-object? t) + (error 'read "end of file encountered while reading list")] + [(eq? t end) (values '() locs k)] + [(eq? t mis) + (error 'read "paren mismatch")] + [(eq? t 'dot) + (let-values ([(d locs k) (read-expr p locs k)]) + (let ([t (read-token p)]) + (cond + [(eq? t end) (values d locs k)] + [(eq? t mis) + (error 'read "paren mismatch")] + [(eq? t 'dot) + (error 'read "cannot have two dots in a list")] + [else + (error 'read "expecting ~a, got ~a" end t)])))] + [(eq? t 'hash-semi) + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-list-rest p locs k end mis))] + [else + (let-values ([(a locs k) (parse-token p locs k t)]) + (let-values ([(d locs k) (read-list-rest p locs k end mis)]) + (let ([x (cons a d)]) + (values x locs + (if (or (loc? a) (loc? d)) + (extend-k-pair x k) + k)))))])))) + (define read-list-init + (lambda (p locs k end mis) + (let ([t (read-token p)]) + (cond + [(eof-object? t) + (error 'read "end of file encountered while reading list")] + [(eq? t end) (values '() locs k)] + [(eq? t mis) + (error 'read "paren mismatch")] + [(eq? t 'dot) + (error 'read "invalid dot while reading list")] + [(eq? t 'hash-semi) + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-list-init p locs k end mis))] + [else + (let-values ([(a locs k) (parse-token p locs k t)]) + (let-values ([(d locs k) (read-list-rest p locs k end mis)]) + (let ([x (cons a d)]) + (values x locs + (if (or (loc? a) (loc? d)) + (extend-k-pair x k) + k)))))])))) + (define extend-k-pair + (lambda (x k) + (lambda () + (let ([a (car x)]) + (when (loc? a) + (set-car! x (loc-value a)))) + (let ([d (cdr x)]) + (when (loc? d) + (set-cdr! x (loc-value d)))) + (k)))) + (define vector-put + (lambda (v k i ls) + (cond + [(null? ls) k] + [else + (let ([a (car ls)]) + (vector-set! v i a) + (vector-put v + (if (loc? a) + (lambda () + (vector-set! v i (loc-value (vector-ref v i))) + (k)) + k) + (fxsub1 i) (cdr ls)))]))) + (define read-vector + (lambda (p locs k count ls) + (let ([t (read-token p)]) + (cond + [(eof-object? t) + (error 'read "end of file encountered while reading a vector")] + [(eq? t 'rparen) + (let ([v (make-vector count)]) + (let ([k (vector-put v k (fxsub1 count) ls)]) + (values v locs k)))] + [(eq? t 'rbrack) + (error 'read "unexpected ] while reading a vector")] + [(eq? t 'dot) + (error 'read "unexpected . while reading a vector")] + [(eq? t 'hash-semi) + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-vector p locs k count ls))] + [else + (let-values ([(a locs k) (parse-token p locs k t)]) + (read-vector p locs k (fxadd1 count) (cons a ls)))])))) + (define-record loc (value set?)) + (define parse-token + (lambda (p locs k t) + (cond + [(eof-object? t) (values (eof-object) locs k)] + [(eq? t 'lparen) (read-list-init p locs k 'rparen 'rbrack)] + [(eq? t 'lbrack) (read-list-init p locs k 'rbrack 'rparen)] + [(eq? t 'vparen) (read-vector p locs k 0 '())] + [(eq? t 'hash-semi) + (let-values ([(ignored locs k) (read-expr p locs k)]) + (read-expr p locs k))] + [(pair? t) + (cond + [(eq? (car t) 'datum) (values (cdr t) locs k)] + [(eq? (car t) 'macro) + (let-values ([(expr locs k) (read-expr p locs k)]) + (let ([x (list expr)]) + (values (cons (cdr t) x) locs + (if (loc? expr) + (lambda () + (set-car! x (loc-value expr)) + (k)) + k))))] + [(eq? (car t) 'mark) + (let ([n (cdr t)]) + (let-values ([(expr locs k) (read-expr p locs k)]) + (cond + [(assq n locs) => + (lambda (x) + (let ([loc (cdr x)]) + (when (loc-set? loc) + (error 'read "duplicate mark ~s" n)) + (set-loc-value! loc expr) + (set-loc-set?! loc #t) + (values expr locs k)))] + [else + (let ([loc (make-loc expr #t)]) + (let ([locs (cons (cons n loc) locs)]) + (values expr locs k)))])))] + [(eq? (car t) 'ref) + (let ([n (cdr t)]) + (cond + [(assq n locs) => + (lambda (x) + (values (cdr x) locs k))] + [else + (let ([loc (make-loc #f #f)]) + (let ([locs (cons (cons n loc) locs)]) + (values loc locs k)))]))] + [else (error 'read "invalid token! ~s" t)])] + [else + (error 'read "unexpected ~s found" t)]))) + (define read-expr + (lambda (p locs k) + (parse-token p locs k (read-token p)))) + + (define reduce-loc! + (lambda (x) + (let ([loc (cdr x)]) + (unless (loc-set? loc) + (error 'read "referenced mark ~s not set" (car x))) + (when (loc? (loc-value loc)) + (let f ([h loc] [t loc]) + (if (loc? h) + (let ([h1 (loc-value h)]) + (if (loc? h1) + (begin + (when (eq? h1 t) + (error 'read "circular marks")) + (let ([v (f (loc-value h1) (loc-value t))]) + (set-loc-value! h1 v) + (set-loc-value! h v) + v)) + (begin + (set-loc-value! h h1) + h1))) + h)))))) + + (define read + (lambda (p) + (let-values ([(expr locs k) (read-expr p '() void)]) + (cond + [(null? locs) expr] + [else + (for-each reduce-loc! locs) + (k) + (if (loc? expr) + (loc-value expr) + expr)])))) + + + + + ;;; + ;;;--------------------------------------------------------------* INIT *--- + ;;; + (primitive-set! 'read-token + (case-lambda + [() (tokenize (current-input-port))] + [(p) + (if (input-port? p) + (tokenize p) + (error 'read-token "~s is not an input port" p))])) + (primitive-set! 'read + (case-lambda + [() (read (current-input-port))] + [(p) + (if (input-port? p) + (read p) + (error 'read "~s is not an input port" p))])) + (let () + (define read-and-eval + (lambda (p) + (let ([x (read p)]) + (unless (eof-object? x) + (eval x) + (read-and-eval p))))) + (primitive-set! 'load + (lambda (x) + (unless (string? x) + (error 'load "~s is not a string" x)) + (let ([p (open-input-file x)]) + (read-and-eval p) + (close-input-port p))))) + ) + diff --git a/src/libtokenizer.fasl b/src/libtokenizer.fasl index 6060fa1329d6239cc3adf6b636ca5c238c0f92dd..bf05eab30ddd9a6b1b94f0d119433de0778022ce 100644 GIT binary patch literal 56971 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 literal 46490 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 MNz)=+(Z0?91$f1le*gdg diff --git a/src/libtoplevel-6.0.ss b/src/libtoplevel-6.0.ss deleted file mode 100644 index d2fa9fa..0000000 --- a/src/libtoplevel-6.0.ss +++ /dev/null @@ -1,8 +0,0 @@ - -(for-each - (lambda (x) - (let ([v (primitive-ref x)]) - (when (procedure? v) - (set-top-level-value! x v)))) - (oblist)) - diff --git a/src/libtoplevel.fasl b/src/libtoplevel.fasl index c93904fc62dbf1764163ac505d1fd862e7f017d5..072360aa527d38596fd415e863ecf31b6994e12d 100644 GIT binary patch literal 27546 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 fgMO literal 28177 zcmeHQZ;V{kbzkrrHsIP$LV}aJWWWPi3=f;6L>8=vP0EtK0A^Dh;#N-J?aZ6q7tcSx znX$(d(Mn4cT%*<>^1&bYkPi`dXw+I&g;otJM#i#{y=iT=_4kp1=6=MnW?z!ild+xdC-h1vj=Z-gw`VVcsyYtL|`g31xaLw}te4l(E zzmyvt7})=GetG7{KOP*~e{%Zu<(cIR7cTs$dwg){&9y+fdI*1=#(xL@;lacB--W+B z@N|A)dSUtG*udJg41_^!1pmHYK~BZy-2U7QN!8<+#-s8efKS;JCu zUv;7`ZCIKNYXI1~RvgtPO=(Y9Y}GBrO4Mwzh9jD&*DGOAWAQo^8*#lDmfCShzzP6r z^_H#*>t(M#@hwmS;CfUg03s7IvA3a72pI%qPdzH(la$Jxt@dj~SC=~@39w*+1p;Nf zou|UMZg?qo?ywX*`?V2Y*9iTfRJz+1n(YY|IH+=Gce~z-!kXc{+=;_#5Y1o? z+^N<}?MfX*&PBP?tW=WkIIw7y`lJ$xVh_c7LIb6s#_=kWD0ZawH$XC~wZh3T_6nR& zpb*ASub^uH<1h%@$`PBw2n+0uH6y92f?HLPDhj<=uQkzzLN7{R@>Mc?Hp7+&_{~5e zpHeJIQ5px*M14vd`79;Sl0Ye@VxW-qw*yz`3hv;S9Q;y{;FlcylERnagTC}@3erLs zR1;HhYIG;6M)#r%ZX35BG)ekFA)$u$ZjHkmcy?;sen8o+QEeziE<8w`V&Nw>_apeO z2D?H}*OAdmSetB3>FFWdi^DRCtP2{AP*jZTO&Y4TjcTg8DrkJ7XaFXe^G&7G5Zei< zS{kct!7FHv2ofd=7R&bClwC&mtqM-x8sPM;A*sGCjie(BqR`rH*+R&=Zf<2j;bEOy zbWvwvN!CJAlr<#SQma-`QZ4H!sa7kAOAgxvcEkn-$Wo)-a!Qk-DUmf+gmG)1nMcks z_^j+hTQ0w9&=@aVg%7fQ$#oH59+9Y-Z ziDCQ5)KIl}Mke5idb?IKoT-xuIGkZs@QOg-TA=JSr~xgHIvTBkU)S6PPa{Cj#Cf_Vj3bI-nK^#=WmTdfFr?jsYRHGu=%Btctm!f8) z5^&-;iF@Oy#i7eV5;W0^29UmRX_jW06K9SX#eW#basaS#90nx_ZdX_XHBKl2x)Xy( zaM+1RM0R|PYE!X@631U`$1%<@PmsMSoHP{~hBU$q0gWTFXbMEN<_Qx+yq0dg+K4I~ zl{8Q#udF~^7PW9Mj)*cbNWD@QPC4S{zGf?|0?tC%X{hr~)=ts0Ws2MKVUW0MC=3sW zt?50i?TO-gt%{LRUv31Fup1OxQN89l)u<(js07rg9ED=fd=!v!9EM&3mbFjoN|Z2L zK^3lGO5>o?tEv>V+EpxyeYIB5N$ed_d>7^w1QR?_gc{vUqXRO#C<#ED(QPaAAi+jG z4&q33Q*AWGdMpcuLySX~JiT!$~%sECn+8Yf1B zX{WT}HceB_q^^(==-wTC0oy%{n&RRs-q?x@p2L_5np0jYn5c*~%N;j_DHevfmtfLG$wiH8?7={& zF^ZxES$-pniQeo~I@kbn`h^EU-juE+adzbF8Dv^OiugpkT$b4EEP*#R~Ryux`t~yR4|?@*^Vi6S$OF>wqg~>Y@4|~u`)%|>5g^Wt)wrl zVjNu}WKToMtZwKcb2Z8l;Aumi)MRhhWlnCp=0c>uFx+KYaKU4Ttwc3Sk-~zCV2lY5 zz9BiHWez0^-2YVHz@ba$2E!j%4^sB8Qn7?;gzReay=@q{`XrK z=%ZmLZ*u)++%p%x{tNA%`4zl8^WdPDmuK-IdU=$K2hJYK9@1NcXJ>()9q`%BdVX#c zKD#1X;qw}9#ubQ5bzu3tsO3K`DWB2)|GF)incL9VZ(!YE#c?Bws#TnqaXIDN zHD&cEPYuDe7V?n&UM}ZGOROfjvDC%RvbMdz;;0(6qCKI$#qo56X`o@+9-&2;SKb`` zNp}vjx{1cTSXDtDiNZ{N4a&>r}!#_L7pMnv6GaQXGer1214o*pV!U+WmgK4 zhUmGb0vIG~YbM0(7A(`DN?LUUNkd#>8f1yd=qw%SPnmeh1&_OUUIVk2KhbVoXKtxH z5Aqa7iV)A#PiJaU)QG@c-EAr)S>cRX?#(@L8@xIb*X2oofGGhLJsN#QF@#0MlmW|S zDjlfernn_n0S9F60zyVxy=u}@kQOhL39AYbAQ7@HiE>N?uprP8YL&L(N=80J0!0)s zkCl4Sv-%=aBNe=F?FnL<+1!Nk0@Svg(ALd)F?JA?3o0Q~pt%C;7+7SP(%XpDgRWDK zF#>?Xjf9`%(O7=EpM*_HUksrh{Bu^Mfx|wz6`1CpbE1io`J`I$PP-sqrUQX|;uczK z2fU>MRi>fb@Pd{{$pWGVstqh@1fWo8hPZnwGT2VAWX0E_*QW1t0xXSQa$&xoLS6;DC*-lv^z#7Q9Zy@@hQKicY*BUb<^3z{mZ<|u9O^2(~< zf}XjiiFoCzk@$9GH4031kh)^!oeKAg<-)aM%QOkP=ExFCdeAk7k_^IaqDhGYa(B)4 z&goHGb-I%6SSO>m4c*>YnXTCfw7Bem+T)4}|zs}CvpXE2u-8F&1C zP!xioomcMkgQ5@xO%<_{X$Ht?(GQ9y!Ab-!lfWYiPK_I^1eROlw&@2&Rpga=W-VWy zB-#)#?tEjgdLQDTXo35ZT7|gPFaWC8{dj&R@C%Nr)~2N(-2@RU(TqP{I&(ST@y zilw$O8{4EV=@4i?Dk`pYXac9jgwv>J{itX^D%y{Vh9)@0`-gS|^`oNws3@F@=BmsK z=p`@NyntpaO+z}na>2JEJf9DpvWQZ(VSsc!+VOqj)d> zE2DVbB#I}|u|+82MbR-8Ynw-mZSla$wP){jva1_HWl_Sf5@Y)qeIi3JDUV31wvDkZ zGFqpibf;c+Dcq&`V8(Y6rCSTnMTSDx#9ZCO3>i>T0FvqljvSOSu?R(LWf9yAD zywXp(v1zis!g!;98gUiJoiqO_6zLcmq2=c1z@xIT5kU^&o7M3|e;qu6su_Jm{t|Yl z0`K%a1IB}_rGH)pK5f+4AI4eePmv%?|Q&SZ0D;pxaZ$JmB|-i?F!MdjI_^8uFjVOgRj`j?s*8 z^8B;le}og|+pK^Q8N)d;eJ3iE)2~Yukq*b8ga23HZN?di+F$x@#wXsEw;8+t!-=!g zyfSYyggdLW`jT1+suQIE1$w5745e8JbslFdecGH!MyO5vY9gGB7%ZYXl#uKy`9Hk+ zMhtflS_xY)>rmjOP$x{701@j|8VTyj6%u}%NQG7ODf@QKl(@_2l80>8sEEfPXvL+g zIz~u^8IFL_&z~euCUEuub`k&^EB+D~`+*xgDj`wWLFK@MN)#|eNO>URmcpXmBXWow z+9}C`B}J8jQxzWRS*Jh+W*KD2M~vK5P9yPj+9lB6~LBu28hWrbnd{=$$;NpL1aNqim1WZ@-J}vGVQrW_w7U z56?zrK^zL*bAC!wV+vJbK@5YVUKYeOGKDs+dG;o3i00VG|CvlQ2jcTt1Lt}nKA#vk z+ty>4FJPuK#OFaln@DK`=Z!%Q)-jQ8qKWiFm`IwJ^DqYHw1GqTIq-Io@lY4a z3yFbKz-d3Q3JRAoa27z7R4$_6fdcAiZdmg}$l>tSoLEy!nOJGj|7-=vwv?n;iHUUs z)?{XEG;o$6`Xz||Pr)RJ6SSxqli}+51(WGco|8@%l1^lpN3fw~I^i%lRQ`W1YiWH6 zR2&Oyjtpgnipd{6>e{BORh#8a;FxXqeCjx@GfuT_`}hPZ{W%ZD5qI-vnz^W%!!xy9 zkgEp8xb83D*maKHAr^V`I({}kx6wxOxWS|?ydU14B5-P06DV-IN%?^N`P($A_=kTz zgX-a1Q{7JGO}E^cRJYpM>>t|z!-6}2e<)`faR>C5Z!$&RP5gB%irGOLegnyk+9}KJ z&{&0wuyhr*<+N?PjzwwCk^3EJy9ibc*KC;c9Bf5L>|L0!PTMnBgCpFT{aI_m3dbXu zM5oyfTC{4mh^<`3{tPTxg(Pj(W6qp5Td+avHq3uWySDv#EDopb!x*{Kb_%^HHbp|m z@V630Vv|x-{-tcv{}XdGu{DLaUnTF9!o?r=#)_A`=^N{-U*l$TIeDj8t4l9lbAqP@ zsif|k`!p4M-<0gt^U%-CZo(sho8scOA)&+@bc)g@q0~)|2Dw46f^KFg$<5WhTP}=_ z%H49w-Yu6hcT3qvw?MlxcgrQdc>dl)hfj_Ttv#Bg#4b%AaCmnpsfB*^#FF zQK3Aa9L~?saCjC5Y=*KJ4xq&I@T@*v&Vb^%11rz`xy$RTzefq2Q|BO!|7WhoQ7~`@ z+f9b#IZh3jouwjx)OnCyOrFH=5klva1NEI8=qzFv%g{LwI&4eU&fxzP!fDW(&9ask zin9r8?+oIY8yLa$AwzN&Bxb?dSCD7CD>xHf z93>fLJO?sV>9b()jCSsjb4n2toOW3K^SGK|aaeJJ71`}Lt9p>-s&>h8vU-yJPH(bD zaUy2Pa$@x6VYs~{+0DJlu7YDJOBO=lpwDIp{If^JCR^4!i}8M)1#V(r{S<=m7oUKs zKpUc$3#`FPnjh*O-z-jr)zDx5raoE4PPzgqSfo$W;Nn=k-+}u_PIU=!XHApSf1qoX zZ)X1YH6i6DJGKK0N6e*BeD$!8hQ4l^i;b}JYo@5IqU|Yafw9rATEvB5Ie!Rux>->FdLkP+LrPyHE1|)#G}o?q8WTxe={Fy{nHW;v}m184&Wnhb>*4qiXc9 z-Kl;X{W}3ymYqoIcX6gT0=8!0`{4RaY)I+J+K}2oNu$hK>NF^6Y&lL&nb*Xi6dH+> zlOC6MwJHlZg9d1i%OA|b`}Mf#xd)99h0E<@kTq{eJ>Ar$2T)6sJL{%C^+iL4UNC?C zs42==j}{;k*b$hXt)@cop1;o&1@FkcL;+p_#~NfpAhKorA;8o`ORLHkOi@}5++!sE z+~-Y&;GMhM6a}w~vq|X(srx(bGPQ#I3XW4pnP%_M$ORq~YTHx4%-|ozRT54jXj}h< zQvZcgvHwEJyj~K=E>?zpHPL^e#NRd0?&ZAoW^=#E_g^SME|f(7g%Z`lz831gQ1bdO zluYDOy>)V)3t`Pjgx;n(sW&n5s);dK+&I+>Pv`lPNrCFWP@;4`xED&BX(!56V4FV! z?}cN*uK%nliel!|D{po#o*7HIuGPNbdT!fjKvb6+f5#~+m~?k=;)Vl$*)gn zfX;cNXG}xvZ+y_%XKBz)rxDa^x&pK9lHY*%Fh8ji$M^UM#SHmVlzdj#`*%ed*n;)M zQxmup@dx{I?gM-@M|X)DV*k+`bwhslp#M{%{PEHLPl+;zwf|G1{ht!0Kg0Zxl=HhI z1o5P}_*ZIplNP9h4P<&x66DNp)bQ{Y$4T-NHN3nzz7+ezG9>T7&Ckk^7Y9t&3p%9< zAW+SVrDCb;3PZ+H*KkdT{)SL6oH2QI%RTLI~$oefOS)BR#vq)_l8=U#+OUTX~ z;}3!^?H^ku=~iQF`BR}Qnbd`$OrKaMNgIDvMS|f@V!4mzMkBbPgmC zj2F0HsR%!QSAUzI15m|-^nW$Fs>Wn+^ zh;P0>s@Um5aWhg))tpFE40=?%wX4=R@44qX7YMD$MP3`g?Vx$sc zb?)A~B*bpNSP|6Q&9Ol<<8&>lx0cT>JFdPBCF`Paa%{z;!pyZ$zwXT6>=u2Mg(T|Qg}NH9If=;KJ^nac z?F0T=>B`2!<6`H^4AaTy?;yLJ_Xc;l|}`g)haKaQgOGdecsY8E$gr#bgYr}+--&rb8B&=qlfn}-KU9=mMh$(u=8u3dI1`!H9a zelvN$UT(iUaXsWJyWGU}ZU6QLQsvD${j^p0UX;$r)6cdgdS6@V6MflqAw@w&n{^PNhVgYxVX+ z5#g#ezy8OkmHsT3ovNd2sHpyN4}Zogwb%>mp+646E!6R(k^UD@{DV|(ZU?_pZ|sYs z$*ERuxOjW+bDKARA@{`z{Cio!Q_)koFHhkg&T3b$yUyQ%3^qkoI(fyazHmKjRA0Gr z5Vxzf%Km0RB~y%4y}LJipS# n 0) - (writer (vector-ref x 0) p m) - (letrec ([f - (lambda (i) - (unless (fx= i n) - (write-char #\space p) - (writer (vector-ref x i) p m) - (f (fxadd1 i))))]) - (f 1)))) - (write-char #\) p))) + (let ([i + (cond + [(fx> n 0) + (let f ([idx 1] [i (writer (vector-ref x 0) p m h i)]) + (cond + [(fx= idx n) + i] + [else + (write-char #\space p) + (f (fxadd1 idx) + (writer (vector-ref x idx) p m h i))]))] + [else i])]) + (write-char #\) p) + i)))) (define write-record - (lambda (x p m) + (lambda (x p m h i) (write-char #\# p) (write-char #\[ p) - (writer (record-name x) p m) - (let ([n (record-length x)]) - (letrec ([f - (lambda (i) - (unless (fx= i n) - (write-char #\space p) - (writer (record-ref x i) p m) - (f (fxadd1 i))))]) - (f 0))) - (write-char #\] p))) + (let ([i (writer (record-name x) p m h i)]) + (let ([n (record-length x)]) + (let f ([idx 0] [i i]) + (cond + [(fx= idx n) + (write-char #\] p) + i] + [else + (write-char #\space p) + (f (fxadd1 idx) + (writer (record-ref x idx) p m h i))])))))) (define initial? (lambda (c) (or (letter? c) (special-initial? c)))) @@ -123,7 +133,7 @@ (write-symbol-esc str p)) (write-char* str p))))) (define write-gensym - (lambda (x p m) + (lambda (x p m h i) (cond [(and m (print-gensym)) (let ([str (symbol->string x)]) @@ -134,8 +144,11 @@ (write-symbol-esc str p)) (write-char #\space p) (write-symbol-esc (gensym->unique-string x) p) - (write-char #\} p))] - [else (write-symbol x p m)]))) + (write-char #\} p)) + i] + [else + (write-symbol x p m) + i]))) (define write-string-escape (lambda (x p) (define loop @@ -201,70 +214,183 @@ (and (pair? d) (null? ($cdr d)))) (assq ($car x) macro-forms)))) - (define writer - (lambda (x p m) + (define write-pair + (lambda (x p m h i) + (write-char #\( p) + (let ([i (writer (car x) p m h i)]) + (let ([i (write-list (cdr x) p m h i)]) + (write-char #\) p) + i)))) + (define write-ref + (lambda (n p) + (write-char #\# p) + (write-fixnum (fx- -1 n) p) + (write-char #\# p))) + (define write-mark + (lambda (n p) + (write-char #\# p) + (write-fixnum (fx- -1 n) p) + (write-char #\= p))) + (define write-shareable + (lambda (x p m h i k) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (cond + [(fx< n 0) + (write-ref n p) + i] + [(fx= n 0) + (k x p m h i)] + [else + (let ([i (fx- i 1)]) + (put-hash-table! h x i) + (write-mark i p) + (k x p m h i))]))] + [else (k x p m h i)]))) + (define writer + (lambda (x p m h i) (cond - [(macro x) => - (lambda (y) - (write-char* (cdr y) p) - (writer (cadr x) p m))] [(pair? x) - (write-char #\( p) - (writer (car x) p m) - (write-list (cdr x) p m) - (write-char #\) p)] - [(symbol? x) + (write-shareable x p m h i write-pair)] + [(symbol? x) (if (gensym? x) - (write-gensym x p m) - (write-symbol x p m))] + (write-gensym x p m h i) + (begin (write-symbol x p m) i))] [(fixnum? x) - (write-fixnum x p)] + (write-fixnum x p) + i] [(string? x) - (write-string x p m)] + (write-string x p m) + i] [(boolean? x) - (write-char* (if x "#t" "#f") p)] + (write-char* (if x "#t" "#f") p) + i] [(char? x) - (write-character x p m)] + (write-character x p m) + i] [(procedure? x) - (write-char* "#" p)] + (write-char* "#" p) + i] [(output-port? x) (write-char* "# p)] + (let ([i (writer (output-port-name x) p #t h i)]) + (write-char #\> p) + i)] [(input-port? x) (write-char* "# p)] + (let ([i (writer (input-port-name x) p #t h i)]) + (write-char #\> p) + i)] [(vector? x) - (write-vector x p m)] + (write-shareable x p m h i write-vector)] [(null? x) (write-char #\( p) - (write-char #\) p)] + (write-char #\) p) + i] [(eq? x (void)) - (write-char* "#" p)] + (write-char* "#" p) + i] [(eof-object? x) - (write-char* "#!eof" p)] + (write-char* "#!eof" p) + i] + [(bwp-object? x) + (write-char* "#!bwp" p) + i] [(record? x) (let ([printer (record-printer x)]) (if (procedure? printer) - (printer x p) - (write-record x p m)))] + (begin (printer x p) i) + (write-shareable x p m h i write-record)))] ;[(code? x) ; (write-char* "#" p)] [(hash-table? x) - (write-char* "#" p)] + (write-char* "#" p) + i] [($unbound-object? x) - (write-char* "#" p)] + (write-char* "#" p) + i] [($forward-ptr? x) - (write-char* "#" p)] + (write-char* "#" p) + i] [else - (write-char* "#" p)]))) + (write-char* "#" p) + i]))) + + (define print-graph (make-parameter #f)) + + (define (hasher x h) + (define (vec-graph x i j h) + (unless (fx= i j) + (graph (vector-ref x i) h) + (vec-graph x (fxadd1 i) j h))) + (define (vec-dynamic x i j h) + (unless (fx= i j) + (dynamic (vector-ref x i) h) + (vec-dynamic x (fxadd1 i) j h))) + (define (graph x h) + (cond + [(pair? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (graph (car x) h) + (graph (cdr x) h)])] + [(vector? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (vec-graph x 0 (vector-length x) h)])] + [(gensym? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))])])) + (define (dynamic x h) + (cond + [(pair? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (dynamic (car x) h) + (dynamic (cdr x) h) + (when (and (get-hash-table h x #f) + (fxzero? (get-hash-table h x #f))) + (put-hash-table! h x #f))])] + [(vector? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (vec-dynamic x 0 (vector-length x) h) + (when (and (get-hash-table h x #f) + (fxzero? (get-hash-table h x #f))) + (put-hash-table! h x #f))])])) + (if (print-graph) + (graph x h) + (dynamic x h))) (define (write x p) - (writer x p #t) + (let ([h (make-hash-table)]) + (hasher x h) + (writer x p #t h 0)) (flush-output-port p)) + ;;; (define (display x p) - (writer x p #f) + (let ([h (make-hash-table)]) + (hasher x h) + (writer x p #f h 0)) (flush-output-port p)) ;;; (define formatter @@ -337,6 +463,7 @@ (primitive-set! 'format format) (primitive-set! 'printf printf) (primitive-set! 'fprintf fprintf) + (primitive-set! 'print-graph print-graph) (primitive-set! 'write (case-lambda [(x) (write x (current-output-port))] diff --git a/src/libwriter-6.0.ss b/src/libwriter-9.1.ss similarity index 56% rename from src/libwriter-6.0.ss rename to src/libwriter-9.1.ss index 2a3fbc8..4f8f010 100644 --- a/src/libwriter-6.0.ss +++ b/src/libwriter-9.1.ss @@ -1,4 +1,6 @@ +;;; 6.2: * added a printer for bwp-objects + ;;; WRITER provides display and write. (let () @@ -26,46 +28,54 @@ (write-fixnum i p)])) (write-char x p)))) (define write-list - (lambda (x p m) + (lambda (x p m h i) (cond - [(pair? x) + [(and (pair? x) + (or (not (get-hash-table h x #f)) + (fxzero? (get-hash-table h x 0)))) (write-char #\space p) - (writer (car x) p m) - (write-list (cdr x) p m)] - [(not (null? x)) + (write-list (cdr x) p m h + (writer (car x) p m h i))] + [(null? x) i] + [else (write-char #\space p) (write-char #\. p) (write-char #\space p) - (writer x p m)]))) + (writer x p m h i)]))) (define write-vector - (lambda (x p m) + (lambda (x p m h i) (write-char #\# p) (write-char #\( p) (let ([n (vector-length x)]) - (when (fx> n 0) - (writer (vector-ref x 0) p m) - (letrec ([f - (lambda (i) - (unless (fx= i n) - (write-char #\space p) - (writer (vector-ref x i) p m) - (f (fxadd1 i))))]) - (f 1)))) - (write-char #\) p))) + (let ([i + (cond + [(fx> n 0) + (let f ([idx 1] [i (writer (vector-ref x 0) p m h i)]) + (cond + [(fx= idx n) + i] + [else + (write-char #\space p) + (f (fxadd1 idx) + (writer (vector-ref x idx) p m h i))]))] + [else i])]) + (write-char #\) p) + i)))) (define write-record - (lambda (x p m) + (lambda (x p m h i) (write-char #\# p) (write-char #\[ p) - (writer (record-name x) p m) - (let ([n (record-length x)]) - (letrec ([f - (lambda (i) - (unless (fx= i n) - (write-char #\space p) - (writer (record-ref x i) p m) - (f (fxadd1 i))))]) - (f 0))) - (write-char #\] p))) + (let ([i (writer (record-name x) p m h i)]) + (let ([n (record-length x)]) + (let f ([idx 0] [i i]) + (cond + [(fx= idx n) + (write-char #\] p) + i] + [else + (write-char #\space p) + (f (fxadd1 idx) + (writer (record-ref x idx) p m h i))])))))) (define initial? (lambda (c) (or (letter? c) (special-initial? c)))) @@ -123,7 +133,7 @@ (write-symbol-esc str p)) (write-char* str p))))) (define write-gensym - (lambda (x p m) + (lambda (x p m h i) (cond [(and m (print-gensym)) (let ([str (symbol->string x)]) @@ -134,8 +144,11 @@ (write-symbol-esc str p)) (write-char #\space p) (write-symbol-esc (gensym->unique-string x) p) - (write-char #\} p))] - [else (write-symbol x p m)]))) + (write-char #\} p)) + i] + [else + (write-symbol x p m) + i]))) (define write-string-escape (lambda (x p) (define loop @@ -143,10 +156,10 @@ (unless (fx= i n) (let ([c (string-ref x i)]) (cond - [(or (char= #\" c) (char= #\\ c)) + [(or ($char= #\" c) ($char= #\\ c)) (write-char #\\ p) (write-char c p)] - [(char= #\tab c) + [($char= #\tab c) (write-char #\\ p) (write-char #\t p)] [else @@ -201,78 +214,187 @@ (and (pair? d) (null? ($cdr d)))) (assq ($car x) macro-forms)))) - (define writer - (lambda (x p m) + (define write-pair + (lambda (x p m h i) + (write-char #\( p) + (let ([i (writer (car x) p m h i)]) + (let ([i (write-list (cdr x) p m h i)]) + (write-char #\) p) + i)))) + (define write-ref + (lambda (n p) + (write-char #\# p) + (write-fixnum (fx- -1 n) p) + (write-char #\# p))) + (define write-mark + (lambda (n p) + (write-char #\# p) + (write-fixnum (fx- -1 n) p) + (write-char #\= p))) + (define write-shareable + (lambda (x p m h i k) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (cond + [(fx< n 0) + (write-ref n p) + i] + [(fx= n 0) + (k x p m h i)] + [else + (let ([i (fx- i 1)]) + (put-hash-table! h x i) + (write-mark i p) + (k x p m h i))]))] + [else (k x p m h i)]))) + (define writer + (lambda (x p m h i) (cond - [(macro x) => - (lambda (y) - (write-char* (cdr y) p) - (writer (cadr x) p m))] [(pair? x) - (write-char #\( p) - (writer (car x) p m) - (write-list (cdr x) p m) - (write-char #\) p)] - [(symbol? x) + (write-shareable x p m h i write-pair)] + [(symbol? x) (if (gensym? x) - (write-gensym x p m) - (write-symbol x p m))] + (write-gensym x p m h i) + (begin (write-symbol x p m) i))] [(fixnum? x) - (write-fixnum x p)] + (write-fixnum x p) + i] [(string? x) - (write-string x p m)] + (write-string x p m) + i] [(boolean? x) - (write-char* (if x "#t" "#f") p)] + (write-char* (if x "#t" "#f") p) + i] [(char? x) - (write-character x p m)] + (write-character x p m) + i] [(procedure? x) - (write-char* "#" p)] + (write-char* "#" p) + i] [(output-port? x) (write-char* "# p)] + (let ([i (writer (output-port-name x) p #t h i)]) + (write-char #\> p) + i)] [(input-port? x) (write-char* "# p)] + (let ([i (writer (input-port-name x) p #t h i)]) + (write-char #\> p) + i)] [(vector? x) - (write-vector x p m)] + (write-shareable x p m h i write-vector)] [(null? x) (write-char #\( p) - (write-char #\) p)] + (write-char #\) p) + i] [(eq? x (void)) - (write-char* "#" p)] + (write-char* "#" p) + i] [(eof-object? x) - (write-char* "#!eof" p)] + (write-char* "#!eof" p) + i] + [(bwp-object? x) + (write-char* "#!bwp" p) + i] [(record? x) (let ([printer (record-printer x)]) (if (procedure? printer) - (printer x p) - (write-record x p m)))] + (begin (printer x p) i) + (write-shareable x p m h i write-record)))] ;[(code? x) ; (write-char* "#" p)] [(hash-table? x) - (write-char* "#" p)] + (write-char* "#" p) + i] [($unbound-object? x) - (write-char* "#" p)] + (write-char* "#" p) + i] [($forward-ptr? x) - (write-char* "#" p)] + (write-char* "#" p) + i] + [(number? x) + (write-char* (number->string x) p) + i] [else - (write-char* "#" p)]))) - (define generic-writer - (lambda (who) - (lambda (x . p) - (let ([port - (if (null? p) - (current-output-port) - (if (null? (cdr p)) - (let ([p (car p)]) - (if (output-port? p) - p - (error who "not an output port ~s" p))) - (error who "too many arguments")))]) - (writer x port (eq? who 'write)) - (flush-output-port port))))) + (write-char* "#" p) + i]))) + + (define print-graph (make-parameter #f)) + + (define (hasher x h) + (define (vec-graph x i j h) + (unless (fx= i j) + (graph (vector-ref x i) h) + (vec-graph x (fxadd1 i) j h))) + (define (vec-dynamic x i j h) + (unless (fx= i j) + (dynamic (vector-ref x i) h) + (vec-dynamic x (fxadd1 i) j h))) + (define (graph x h) + (cond + [(pair? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (graph (car x) h) + (graph (cdr x) h)])] + [(vector? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (vec-graph x 0 (vector-length x) h)])] + [(gensym? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))])])) + (define (dynamic x h) + (cond + [(pair? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (dynamic (car x) h) + (dynamic (cdr x) h) + (when (and (get-hash-table h x #f) + (fxzero? (get-hash-table h x #f))) + (put-hash-table! h x #f))])] + [(vector? x) + (cond + [(get-hash-table h x #f) => + (lambda (n) + (put-hash-table! h x (fxadd1 n)))] + [else + (put-hash-table! h x 0) + (vec-dynamic x 0 (vector-length x) h) + (when (and (get-hash-table h x #f) + (fxzero? (get-hash-table h x #f))) + (put-hash-table! h x #f))])])) + (if (print-graph) + (graph x h) + (dynamic x h))) + + (define (write x p) + (let ([h (make-hash-table)]) + (hasher x h) + (writer x p #t h 0)) + (flush-output-port p)) + ;;; + (define (display x p) + (let ([h (make-hash-table)]) + (hasher x h) + (writer x p #f h 0)) + (flush-output-port p)) ;;; (define formatter (lambda (who p fmt args) @@ -280,21 +402,21 @@ (unless (fx= i (string-length fmt)) (let ([c (string-ref fmt i)]) (cond - [(char= c #\~) + [($char= c #\~) (let ([i (fxadd1 i)]) (when (fx= i (string-length fmt)) (error who "invalid ~~ at end of format string ~s" fmt)) (let ([c (string-ref fmt i)]) (cond - [(char= c #\~) + [($char= c #\~) (write-char #\~ p) (f (fxadd1 i) args)] - [(char= c #\a) + [($char= c #\a) (when (null? args) (error who "insufficient arguments")) (display (car args) p) (f (fxadd1 i) (cdr args))] - [(char= c #\s) + [($char= c #\s) (when (null? args) (error who "insufficient arguments")) (write (car args) p) @@ -344,15 +466,28 @@ (primitive-set! 'format format) (primitive-set! 'printf printf) (primitive-set! 'fprintf fprintf) - (primitive-set! 'display (generic-writer 'display)) - (primitive-set! 'write (generic-writer 'write)) + (primitive-set! 'print-graph print-graph) + (primitive-set! 'write + (case-lambda + [(x) (write x (current-output-port))] + [(x p) + (unless (output-port? p) + (error 'write "~s is not an output port" p)) + (write x p)])) + (primitive-set! 'display + (case-lambda + [(x) (display x (current-output-port))] + [(x p) + (unless (output-port? p) + (error 'display "~s is not an output port" p)) + (display x p)])) (primitive-set! 'print-error print-error) (primitive-set! 'current-error-handler (make-parameter (lambda args (apply print-error args) - (display "exiting\n") - (flush-output-port) + (display "exiting\n" (console-output-port)) + (flush-output-port (console-output-port)) (exit -100)) (lambda (x) (if (procedure? x) diff --git a/src/libwriter.fasl b/src/libwriter.fasl index c6f70d2742490145570dd95f544c02d3aba4674e..18b4f9e0ff0210460e9296b741d6665e6aae6db3 100644 GIT binary patch literal 41270 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 QQ(UCA95E0~Q6lz#0SE0Y761SM literal 36251 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 F`oAz*G&cYM diff --git a/src/makepp.ss b/src/makepp.ss deleted file mode 100644 index 69ac05b..0000000 --- a/src/makepp.ss +++ /dev/null @@ -1,34 +0,0 @@ -(define primitive-set! set-top-level-value!) -(define chez-expand sc-expand) -(define-syntax |#primitive| - (lambda (x) - (syntax-case x () - [(_ n) #'n]))) - -(printf "loading psyntax.pp ...\n") -(load "psyntax-7.1.pp") - -(current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - -(printf "loading psyntax.ss ...\n") -(load "psyntax-7.1.ss") -(current-expand - (lambda (x . args) - (apply chez-expand (sc-expand x) args))) - -(printf "making xpsyntax.pp ...\n") - -(with-output-to-file "xpsyntax.pp" - (lambda () - (load "psyntax-7.1.ss" - (lambda (x) - (parameterize ([print-gensym #f] - [print-graph #f] - [expand-mode 'bootstrap] - [print-vector-length #f]) - (pretty-print (sc-expand x)) - (newline))))) - 'replace) - diff --git a/src/psyntax-7.1-6.9.ss b/src/psyntax-7.1-6.9.ss index 9fe5ef9..e50e456 100644 --- a/src/psyntax-7.1-6.9.ss +++ b/src/psyntax-7.1-6.9.ss @@ -4637,6 +4637,7 @@ "~s is not a record of type ~s" x 'rtd)))) ... )))]))) + (define-syntax $define-record-syntax (lambda (x) (syntax-case x () @@ -4688,7 +4689,6 @@ [(_ x v) ($record-set! x i v)])) ... )))]))) - (define-syntax trace (lambda (x) (syntax-case x () diff --git a/src/psyntax-7.1-6.8.ss b/src/psyntax-7.1-9.0.ss similarity index 97% rename from src/psyntax-7.1-6.8.ss rename to src/psyntax-7.1-9.0.ss index 9a57d6c..b403dd7 100644 --- a/src/psyntax-7.1-6.8.ss +++ b/src/psyntax-7.1-9.0.ss @@ -663,7 +663,7 @@ ;;; AZIZ (define generate-id (lambda (name) - (if name (gensym (symbol->string name)) (gensym)))) + (if name (gensym name) (gensym)))) ) @@ -768,8 +768,9 @@ ;;; ((_ ae level name) name))) (define-syntax build-primref (syntax-rules () - [(_ ae name) `(|#primitive| ,name)] - [(_ ae level name) `(|#primitive| ,name)])) + [(_ ae name) (build-primref ae 1 name)] + [(_ ae level name) + `(|#primitive| ,name)])) ;;; AZIZ @@ -3110,8 +3111,12 @@ (global-extend 'core '|#primitive| (lambda (e r mr w ae m?) (syntax-case e () - ((_ e) (id? #'e) - (build-primref ae (strip (syntax e) w))) + ((_ name) (id? #'name) + (let ([name (strip (syntax name) w)]) + (if (or (memq name (public-primitives)) + (memq name (system-primitives))) + (build-primref ae name) + (syntax-error (source-wrap e w ae))))) (_ (syntax-error (source-wrap e w ae)))))) (global-extend 'core 'syntax @@ -4576,7 +4581,6 @@ - (define-syntax define-record (lambda (x) (syntax-case x () @@ -4593,6 +4597,12 @@ (datum->syntax-object #'name (string->symbol (string-append namestr "?")))] + [(i ...) + (datum->syntax-object #'name + (let f ([i 0] [f* fieldstr*]) + (cond + [(null? f*) '()] + [else (cons i (f (fxadd1 i) (cdr f*)))])))] [(getters ...) (datum->syntax-object #'name (map (lambda (x) @@ -4608,9 +4618,94 @@ [rtd rtd]) #'(begin (define-syntax name (cons '$rtd 'rtd)) - (define constr (record-constructor 'rtd)) - (define pred (record-predicate 'rtd)) - (define getters (record-field-accessor 'rtd 'field*)) ... - (define setters (record-field-mutator 'rtd 'field*)) ... + (define constr + (lambda (field* ...) + ($record 'rtd field* ...))) + (define pred + (lambda (x) ($record/rtd? x 'rtd))) + (define getters + (lambda (x) + (if ($record/rtd? x 'rtd) + ($record-ref x i) + (error 'getters + "~s is not a record of type ~s" x 'rtd)))) ... + (define setters + (lambda (x v) + (if ($record/rtd? x 'rtd) + ($record-set! x i v) + (error 'setters + "~s is not a record of type ~s" x 'rtd)))) ... )))]))) + +(define-syntax $define-record-syntax + (lambda (x) + (syntax-case x () + [(_ name (field* ...)) + (let* ([namestr (symbol->string (syntax-object->datum #'name))] + [fields (syntax-object->datum #'(field* ...))] + [fieldstr* (map symbol->string fields)] + [rtd (make-record-type namestr fields)]) + (with-syntax ([constr + (datum->syntax-object #'name + (string->symbol + (string-append "make-" namestr)))] + [pred + (datum->syntax-object #'name + (string->symbol + (string-append namestr "?")))] + [(i ...) + (datum->syntax-object #'name + (let f ([i 0] [f* fieldstr*]) + (cond + [(null? f*) '()] + [else (cons i (f (fxadd1 i) (cdr f*)))])))] + [(getters ...) + (datum->syntax-object #'name + (map (lambda (x) + (string->symbol + (string-append namestr "-" x))) + fieldstr*))] + [(setters ...) + (datum->syntax-object #'name + (map (lambda (x) + (string->symbol + (string-append "set-" namestr "-" x "!"))) + fieldstr*))] + [rtd rtd]) + #'(begin + (define-syntax name (cons '$rtd 'rtd)) + (define-syntax constr + (syntax-rules () + [(_ field* ...) ($record 'rtd field* ...)])) + (define-syntax pred + (syntax-rules () + [(_ x) ($record/rtd? x 'rtd)])) + (define-syntax getters + (syntax-rules () + [(_ x) ($record-ref x i)])) ... + (define-syntax setters + (syntax-rules () + [(_ x v) ($record-set! x i v)])) ... + )))]))) + +(define-syntax trace + (lambda (x) + (syntax-case x () + [(_ id) (identifier? #'id) + #'(trace-symbol! 'id)]))) + + +(define-syntax untrace + (lambda (x) + (syntax-case x () + [(_ id) (identifier? #'id) + #'(untrace-symbol! 'id)]))) + + +(define-syntax trace-lambda + (lambda (x) + (syntax-case x () + [(_ name args body body* ...) + #'(make-traced-procedure 'name (lambda args body body* ...))]))) + diff --git a/src/psyntax-7.1-6.5.ss b/src/psyntax-7.1-9.1.ss similarity index 97% rename from src/psyntax-7.1-6.5.ss rename to src/psyntax-7.1-9.1.ss index d45f439..a05d33e 100644 --- a/src/psyntax-7.1-6.5.ss +++ b/src/psyntax-7.1-9.1.ss @@ -663,7 +663,7 @@ ;;; AZIZ (define generate-id (lambda (name) - (if name (gensym (symbol->string name)) (gensym)))) + (if name (gensym name) (gensym)))) ) @@ -768,8 +768,9 @@ ;;; ((_ ae level name) name))) (define-syntax build-primref (syntax-rules () - [(_ ae name) `(|#primitive| ,name)] - [(_ ae level name) `(|#primitive| ,name)])) + [(_ ae name) (build-primref ae 1 name)] + [(_ ae level name) + `(|#primitive| ,name)])) ;;; AZIZ @@ -790,7 +791,7 @@ (if (null? (cdr exps)) (car exps) ; weed out leading void calls, assuming ordinary list representation - (if (equal? (car exps) '(void)) + (if (equal? (car exps) '(#%void)) (loop (cdr exps)) `(begin ,@exps)))))) @@ -846,7 +847,7 @@ (syntax-rules () ((_ e) (let ((x e)) - (or (boolean? x) (fixnum? x) (string? x) (char? x) (null? x)))))) + (or (boolean? x) (fixnum? x) (string? x) (char? x) (null? x) (number? x)))))) ) (define-syntax unannotate @@ -2458,6 +2459,9 @@ (case type ((lexical) (build-lexical-reference 'value ae value)) + ;;; AZIZ + ((core-primitive) + (build-primref ae value)) ((core) (value e r mr w ae m?)) ((lexical-call) (chi-application @@ -3107,8 +3111,12 @@ (global-extend 'core '|#primitive| (lambda (e r mr w ae m?) (syntax-case e () - ((_ e) (id? #'e) - (build-primref ae (strip (syntax e) w))) + ((_ name) (id? #'name) + (let ([name (strip (syntax name) w)]) + (if (or (memq name (public-primitives)) + (memq name (system-primitives))) + (build-primref ae name) + (syntax-error (source-wrap e w ae))))) (_ (syntax-error (source-wrap e w ae)))))) (global-extend 'core 'syntax @@ -4573,7 +4581,6 @@ - (define-syntax define-record (lambda (x) (syntax-case x () @@ -4590,6 +4597,12 @@ (datum->syntax-object #'name (string->symbol (string-append namestr "?")))] + [(i ...) + (datum->syntax-object #'name + (let f ([i 0] [f* fieldstr*]) + (cond + [(null? f*) '()] + [else (cons i (f (fxadd1 i) (cdr f*)))])))] [(getters ...) (datum->syntax-object #'name (map (lambda (x) @@ -4605,9 +4618,94 @@ [rtd rtd]) #'(begin (define-syntax name (cons '$rtd 'rtd)) - (define constr (record-constructor 'rtd)) - (define pred (record-predicate 'rtd)) - (define getters (record-field-accessor 'rtd 'field*)) ... - (define setters (record-field-mutator 'rtd 'field*)) ... + (define constr + (lambda (field* ...) + ($record 'rtd field* ...))) + (define pred + (lambda (x) ($record/rtd? x 'rtd))) + (define getters + (lambda (x) + (if ($record/rtd? x 'rtd) + ($record-ref x i) + (error 'getters + "~s is not a record of type ~s" x 'rtd)))) ... + (define setters + (lambda (x v) + (if ($record/rtd? x 'rtd) + ($record-set! x i v) + (error 'setters + "~s is not a record of type ~s" x 'rtd)))) ... )))]))) + +(define-syntax $define-record-syntax + (lambda (x) + (syntax-case x () + [(_ name (field* ...)) + (let* ([namestr (symbol->string (syntax-object->datum #'name))] + [fields (syntax-object->datum #'(field* ...))] + [fieldstr* (map symbol->string fields)] + [rtd (make-record-type namestr fields)]) + (with-syntax ([constr + (datum->syntax-object #'name + (string->symbol + (string-append "make-" namestr)))] + [pred + (datum->syntax-object #'name + (string->symbol + (string-append namestr "?")))] + [(i ...) + (datum->syntax-object #'name + (let f ([i 0] [f* fieldstr*]) + (cond + [(null? f*) '()] + [else (cons i (f (fxadd1 i) (cdr f*)))])))] + [(getters ...) + (datum->syntax-object #'name + (map (lambda (x) + (string->symbol + (string-append namestr "-" x))) + fieldstr*))] + [(setters ...) + (datum->syntax-object #'name + (map (lambda (x) + (string->symbol + (string-append "set-" namestr "-" x "!"))) + fieldstr*))] + [rtd rtd]) + #'(begin + (define-syntax name (cons '$rtd 'rtd)) + (define-syntax constr + (syntax-rules () + [(_ field* ...) ($record 'rtd field* ...)])) + (define-syntax pred + (syntax-rules () + [(_ x) ($record/rtd? x 'rtd)])) + (define-syntax getters + (syntax-rules () + [(_ x) ($record-ref x i)])) ... + (define-syntax setters + (syntax-rules () + [(_ x v) ($record-set! x i v)])) ... + )))]))) + +(define-syntax trace + (lambda (x) + (syntax-case x () + [(_ id) (identifier? #'id) + #'(trace-symbol! 'id)]))) + + +(define-syntax untrace + (lambda (x) + (syntax-case x () + [(_ id) (identifier? #'id) + #'(untrace-symbol! 'id)]))) + + +(define-syntax trace-lambda + (lambda (x) + (syntax-case x () + [(_ name args body body* ...) + #'(make-traced-procedure 'name (lambda args body body* ...))]))) + diff --git a/src/psyntax-7.1.ss b/src/psyntax-7.1.ss deleted file mode 100644 index f128c8c..0000000 --- a/src/psyntax-7.1.ss +++ /dev/null @@ -1,4608 +0,0 @@ -;;; Portable implementation of syntax-case -;;; Extracted from Chez Scheme Version 7.1 (Aug 01, 2006) -;;; Authors: R. Kent Dybvig, Oscar Waddell, Bob Hieb, Carl Bruggeman - -;;; Copyright (c) 1992-2002 Cadence Research Systems -;;; Permission to copy this software, in whole or in part, to use this -;;; software for any lawful purpose, and to redistribute this software -;;; is granted subject to the restriction that all copies made of this -;;; software must include this copyright notice in full. This software -;;; is provided AS IS, with NO WARRANTY, EITHER EXPRESS OR IMPLIED, -;;; INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY -;;; OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT SHALL THE -;;; AUTHORS BE LIABLE FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES OF ANY -;;; NATURE WHATSOEVER. - -;;; Before attempting to port this code to a new implementation of -;;; Scheme, please read the notes below carefully. - -;;; This file defines the syntax-case expander, sc-expand, and a set -;;; of associated syntactic forms and procedures. Of these, the -;;; following are documented in The Scheme Programming Language, -;;; Third Edition (R. Kent Dybvig, MIT Press, 2003), which can be -;;; found online at http://www.scheme.com/tspl3/. Most are also documented -;;; in the R4RS and draft R5RS. -;;; -;;; bound-identifier=? -;;; datum->syntax-object -;;; define-syntax -;;; fluid-let-syntax -;;; free-identifier=? -;;; generate-temporaries -;;; identifier? -;;; identifier-syntax -;;; let-syntax -;;; letrec-syntax -;;; syntax -;;; syntax-case -;;; syntax-object->datum -;;; syntax-rules -;;; with-syntax -;;; -;;; All standard Scheme syntactic forms are supported by the expander -;;; or syntactic abstractions defined in this file. Only the R4RS -;;; delay is omitted, since its expansion is implementation-dependent. - -;;; Also defined are three forms that support modules: module, import, -;;; and import-only. These are documented in the Chez Scheme User's -;;; Guide (R. Kent Dybvig, Cadence Research Systems, 1998), which can -;;; also be found online at http://www.scheme.com/csug/. They are -;;; described briefly here as well. - -;;; All are definitions and may appear where and only where other -;;; definitions may appear. modules may be named: -;;; -;;; (module id (ex ...) defn ... init ...) -;;; -;;; or anonymous: -;;; -;;; (module (ex ...) defn ... init ...) -;;; -;;; The latter form is semantically equivalent to: -;;; -;;; (module T (ex ...) defn ... init ...) -;;; (import T) -;;; -;;; where T is a fresh identifier. -;;; -;;; In either form, each of the exports in (ex ...) is either an -;;; identifier or of the form (id ex ...). In the former case, the -;;; single identifier ex is exported. In the latter, the identifier -;;; id is exported and the exports ex ... are "implicitly" exported. -;;; This listing of implicit exports is useful only when id is a -;;; keyword bound to a transformer that expands into references to -;;; the listed implicit exports. In the present implementation, -;;; listing of implicit exports is necessary only for top-level -;;; modules and allows the implementation to avoid placing all -;;; identifiers into the top-level environment where subsequent passes -;;; of the compiler will be unable to deal effectively with them. -;;; -;;; Named modules may be referenced in import statements, which -;;; always take one of the forms: -;;; -;;; (import id) -;;; (import-only id) -;;; -;;; id must name a module. Each exported identifier becomes visible -;;; within the scope of the import form. In the case of import-only, -;;; all other identifiers become invisible in the scope of the -;;; import-only form, except for those established by definitions -;;; that appear textually after the import-only form. - -;;; import and import-only also support a variety of identifier -;;; selection and renaming forms: only, except, add-prefix, -;;; drop-prefix, rename, and alias. -;;; -;;; (import (only m x y)) -;;; -;;; imports x and y (and nothing else) from m. -;;; -;;; (import (except m x y)) -;;; -;;; imports all of m's imports except for x and y. -;;; -;;; (import (add-prefix (only m x y) m:)) -;;; -;;; imports x and y as m:x and m:y. -;;; -;;; (import (drop-prefix m foo:)) -;;; -;;; imports all of m's imports, dropping the common foo: prefix -;;; (which must appear on all of m's exports). -;;; -;;; (import (rename (except m a b) (m-c c) (m-d d))) -;;; -;;; imports all of m's imports except for x and y, renaming c -;;; m-c and d m-d. -;;; -;;; (import (alias (except m a b) (m-c c) (m-d d))) -;;; -;;; imports all of m's imports except for x and y, with additional -;;; aliases m-c for c and m-d for d. -;;; -;;; multiple imports may be specified with one import form: -;;; -;;; (import (except m1 x) (only m2 x)) -;;; -;;; imports all of m1's exports except for x plus x from m2. - -;;; Another form, meta, may be used as a prefix for any definition and -;;; causes any resulting variable bindings to be created at expansion -;;; time. Meta variables (variables defined using meta) are available -;;; only at expansion time. Meta definitions are often used to create -;;; data and helpers that can be shared by multiple macros, for example: - -;;; (module (alpha beta) -;;; (meta define key-error -;;; (lambda (key) -;;; (syntax-error key "invalid key"))) -;;; (meta define parse-keys -;;; (lambda (keys) -;;; (let f ((keys keys) (c #'white) (s 10)) -;;; (syntax-case keys (color size) -;;; (() (list c s)) -;;; (((color c) . keys) (f #'keys #'c s)) -;;; (((size s) . keys) (f #'keys c #'s)) -;;; ((k . keys) (key-error #'k)))))) -;;; (define-syntax alpha -;;; (lambda (x) -;;; (syntax-case x () -;;; ((_ (k ...) ) -;;; (with-syntax (((c s) (parse-keys (syntax (k ...))))) -;;; ---))))) -;;; (define-syntax beta -;;; (lambda (x) -;;; (syntax-case x () -;;; ((_ (k ...) ) -;;; (with-syntax (((c s) (parse-keys (syntax (k ...))))) -;;; ---)))))) - -;;; As with define-syntax rhs expressions, meta expressions can evaluate -;;; references only to identifiers whose values are (already) available -;;; in the compile-time environment, e.g., macros and meta variables. -;;; They can, however, like define-syntax rhs expressions, build syntax -;;; objects containing occurrences of any identifiers in their scope. - -;;; meta definitions propagate through macro expansion, so one can write, -;;; for example: -;;; -;;; (module (a) -;;; (meta define-structure (foo x)) -;;; (define-syntax a -;;; (let ((q (make-foo (syntax 'q)))) -;;; (lambda (x) -;;; (foo-x q))))) -;;; a -> q -;;; -;;; where define-record is a macro that expands into a set of defines. -;;; -;;; It is also sometimes convenient to write -;;; -;;; (meta begin defn ...) -;;; -;;; or -;;; -;;; (meta module {exports} defn ...) -;;; -;;; to create groups of meta bindings. - -;;; Another form, alias, is used to create aliases from one identifier -;;; to another. This is used primarily to support the extended import -;;; syntaxes (add-prefix, drop-prefix, rename, and alias). - -;;; (let ((x 3)) (alias y x) y) -> 3 - -;;; The remaining exports are listed below. sc-expand, eval-when, and -;;; syntax-error are described in the Chez Scheme User's Guide. -;;; -;;; (sc-expand datum) -;;; if datum represents a valid expression, sc-expand returns an -;;; expanded version of datum in a core language that includes no -;;; syntactic abstractions. The core language includes begin, -;;; define, if, lambda, letrec, quote, and set!. -;;; (eval-when situations expr ...) -;;; conditionally evaluates expr ... at compile-time or run-time -;;; depending upon situations -;;; (syntax-error object message) -;;; used to report errors found during expansion -;;; ($syntax-dispatch e p) -;;; used by expanded code to handle syntax-case matching -;;; ($sc-put-cte symbol val top-token) -;;; used to establish top-level compile-time (expand-time) bindings. - -;;; The following nonstandard procedures must be provided by the -;;; implementation for this code to run. -;;; -;;; (void) -;;; returns the implementation's cannonical "unspecified value". The -;;; following usually works: -;;; -;;; (define void (lambda () (if #f #f))). -;;; -;;; (andmap proc list1 list2 ...) -;;; returns true if proc returns true when applied to each element of list1 -;;; along with the corresponding elements of list2 .... The following -;;; definition works but does no error checking: -;;; -;;; (define andmap -;;; (lambda (f first . rest) -;;; (or (null? first) -;;; (if (null? rest) -;;; (let andmap ((first first)) -;;; (let ((x (car first)) (first (cdr first))) -;;; (if (null? first) -;;; (f x) -;;; (and (f x) (andmap first))))) -;;; (let andmap ((first first) (rest rest)) -;;; (let ((x (car first)) -;;; (xr (map car rest)) -;;; (first (cdr first)) -;;; (rest (map cdr rest))) -;;; (if (null? first) -;;; (apply f (cons x xr)) -;;; (and (apply f (cons x xr)) (andmap first rest))))))))) -;;; -;;; (ormap proc list1) -;;; returns the first non-false return result of proc applied to -;;; the elements of list1 or false if none. The following definition -;;; works but does no error checking: -;;; -;;; (define ormap -;;; (lambda (proc list1) -;;; (and (not (null? list1)) -;;; (or (proc (car list1)) (ormap proc (cdr list1)))))) -;;; -;;; The following nonstandard procedures must also be provided by the -;;; implementation for this code to run using the standard portable -;;; hooks and output constructors. They are not used by expanded code, -;;; and so need be present only at expansion time. -;;; -;;; (eval x) -;;; where x is always in the form ("noexpand" expr). -;;; returns the value of expr. the "noexpand" flag is used to tell the -;;; evaluator/expander that no expansion is necessary, since expr has -;;; already been fully expanded to core forms. -;;; -;;; eval will not be invoked during the loading of psyntax.pp. After -;;; psyntax.pp has been loaded, the expansion of any macro definition, -;;; whether local or global, results in a call to eval. If, however, -;;; sc-expand has already been registered as the expander to be used -;;; by eval, and eval accepts one argument, nothing special must be done -;;; to support the "noexpand" flag, since it is handled by sc-expand. -;;; -;;; (error who format-string why what) -;;; where who is either a symbol or #f, format-string is always "~a ~s", -;;; why is always a string, and what may be any object. error should -;;; signal an error with a message something like -;;; -;;; "error in : " -;;; -;;; (gensym) -;;; returns a unique symbol each time it's called. In Chez Scheme, gensym -;;; returns a symbol with a "globally" unique name so that gensyms that -;;; end up in the object code of separately compiled files cannot conflict. -;;; This is necessary only if you intend to support compiled files. -;;; -;;; (gensym? x) -;;; returns #t if x is a gensym, otherwise false. -;;; -;;; (putprop symbol key value) -;;; (getprop symbol key) -;;; (remprop symbol key) -;;; key is always a symbol; value may be any object. putprop should -;;; associate the given value with the given symbol and key in some way -;;; that it can be retrieved later with getprop. getprop should return -;;; #f if no value is associated with the given symbol and key. remprop -;;; should remove the association between the given symbol and key. - -;;; When porting to a new Scheme implementation, you should define the -;;; procedures listed above, load the expanded version of psyntax.ss -;;; (psyntax.pp, which should be available whereever you found -;;; psyntax.ss), and register sc-expand as the current expander (how -;;; you do this depends upon your implementation of Scheme). You may -;;; change the hooks and constructors defined toward the beginning of -;;; the code below, but to avoid bootstrapping problems, do so only -;;; after you have a working version of the expander. - -;;; Chez Scheme allows the syntactic form (syntax

  • 38w@a?ad~(GP`H<@Z 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 KWcX!gHvb>#37wt* literal 1764160 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 Dve1&032>p~A$>({sqReM%mpcS7NkKOsZd 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�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

    c6ESwRPXnklKnV4XJJWYBF&>CT-P) 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