diff --git a/collects/2htdp/tests/test-image.ss b/collects/2htdp/tests/test-image.ss index 64eb05ce34..3554b60c5c 100644 --- a/collects/2htdp/tests/test-image.ss +++ b/collects/2htdp/tests/test-image.ss @@ -954,3 +954,26 @@ 16) (check-equal? (image-height (bitmap icons/stop-16x16.png)) 16) + +(check-equal? (let () + (define bmp (make-object bitmap% 4 4)) + (define mask (make-object bitmap% 4 4)) + (define bdc (make-object bitmap-dc% bmp)) + (send bdc set-brush "black" 'solid) + (send bdc draw-rectangle 0 0 4 4) + (send bdc set-bitmap mask) + (send bdc set-brush "black" 'solid) + (send bdc clear) + (send bdc draw-rectangle 1 1 1 1) + (send bdc set-bitmap #f) + (let-values ([(bytes w h) (bitmap->bytes bmp mask)]) + bytes)) + (bytes-append #"\0\0\0\0" #"\0\0\0\0" #"\0\0\0\0" #"\0\0\0\0" + #"\0\0\0\0" #"\377\0\0\0" #"\0\0\0\0" #"\0\0\0\0" + #"\0\0\0\0" #"\0\0\0\0" #"\0\0\0\0" #"\0\0\0\0" + #"\0\0\0\0" #"\0\0\0\0" #"\0\0\0\0" #"\0\0\0\0")) + +;; ensure no error +(check-equal? (begin (scale 2 (make-object bitmap% 10 10)) + (void)) + (void)) diff --git a/collects/honu/private/macro.ss b/collects/honu/private/macro.ss index 934bad9a77..9003b17776 100644 --- a/collects/honu/private/macro.ss +++ b/collects/honu/private/macro.ss @@ -2,6 +2,7 @@ (require "honu.ss" (for-syntax "debug.ss" + "contexts.ss" scheme/base syntax/parse syntax/stx @@ -368,17 +369,58 @@ (#%braces (#%braces name pattern ...)) (#%braces (#%braces template ...)) . rest) - (with-syntax ([pulled (pull #'(template ...))]) + (with-syntax ([pulled (pull #'(template ...))] + [(pattern* ...) (map (lambda (stx) + (if (and (identifier? stx) + (not (ormap (lambda (f) + (free-identifier=? stx f)) + (syntax->list #'(honu-literal ...)))) + (not (free-identifier=? stx #'(... ...)))) + (with-syntax ([x stx]) + #'(~and x (~not (~or honu-literal ...)))) + stx)) + (syntax->list #'(pattern ...)))] + ) (values #'(define-honu-syntax name (lambda (stx ctx) - (syntax-case stx (honu-literal ...) - [(name pattern ... . rrest) + ;; (define-literal-set literals (honu-literal ...)) + (syntax-parse stx + ;; #:literal-sets (literals) + #:literals (honu-literal ...) + [(name pattern* ... . rrest) (with-syntax ([(out (... ...)) (unpull #'pulled)]) + (define (X) (raise-syntax-error (syntax->datum #'name) "implement for this context")) (values + ;; this is sort of ugly, is there a better way? + (cond + [(type-context? ctx) (X)] + [(type-or-expression-context? ctx) (X)] + [(expression-context? ctx) #'(honu-unparsed-expr out (... ...))] + [(expression-block-context? ctx) + #'(honu-unparsed-begin out (... ...))] + [(block-context? ctx) + #'(honu-unparsed-begin out (... ...))] + [(variable-definition-context? ctx) (X)] + [(constant-definition-context? ctx) (X)] + [(function-definition-context? ctx) (X)] + [(prototype-context? ctx) (X)] + [else #'(honu-unparsed-expr out (... ...))]) + #; + #'(honu-unparsed-begin out (... ...)) + #'rrest) + #; + #'(honu-unparsed-block + #f obj 'obj #f ctx + out (... ...)) + #; + (values + #; + #'(honu-unparsed-expr out (... ...)) #'(honu-unparsed-block #f obj 'obj #f ctx - out (... ...)) + out (... ...) rrest) + #; #'rrest))]))) #'rest))]))) diff --git a/collects/macro-debugger/syntax-browser/text.ss b/collects/macro-debugger/syntax-browser/text.ss index d492aa859d..335f1206a8 100644 --- a/collects/macro-debugger/syntax-browser/text.ss +++ b/collects/macro-debugger/syntax-browser/text.ss @@ -285,7 +285,7 @@ (send dc set-text-foreground color) (send dc draw-text "?" (+ endx dx fw) - (- endy dy fh)))))))]) + (- (+ endy dy) fh)))))))]) (add-mouse-drawing from1 from2 draw tack-box) (add-mouse-drawing to1 to2 draw tack-box)))) diff --git a/collects/mrlib/image-core.ss b/collects/mrlib/image-core.ss index 8f77c5b7b6..d216c6dfc3 100644 --- a/collects/mrlib/image-core.ss +++ b/collects/mrlib/image-core.ss @@ -626,21 +626,23 @@ the mask bitmap and the original bitmap are all together in a single bytes! [orig-h (send orig-bm get-height)] [x-scale (bitmap-x-scale bitmap)] [y-scale (bitmap-y-scale bitmap)] - [scale-w (* x-scale (send orig-bm get-width))] - [scale-h (* y-scale (send orig-bm get-height))] + [scale-w (ceiling (inexact->exact (* x-scale (send orig-bm get-width))))] + [scale-h (ceiling (inexact->exact (* y-scale (send orig-bm get-height))))] [new-bm (make-object bitmap% scale-w scale-h)] - [new-mask (make-object bitmap% scale-w scale-h)]) - (send new-bm set-loaded-mask new-mask) + [new-mask (and orig-mask (make-object bitmap% scale-w scale-h))]) + (when new-mask + (send new-bm set-loaded-mask new-mask)) (send bdc set-bitmap new-bm) (send bdc set-scale x-scale y-scale) (send bdc clear) (send bdc draw-bitmap orig-bm 0 0) - (send bdc set-bitmap new-mask) - (send bdc set-scale x-scale y-scale) - (send bdc clear) - (send bdc draw-bitmap orig-mask 0 0) + (when new-mask + (send bdc set-bitmap new-mask) + (send bdc set-scale x-scale y-scale) + (send bdc clear) + (send bdc draw-bitmap orig-mask 0 0)) (send bdc set-bitmap #f) @@ -734,6 +736,6 @@ the mask bitmap and the original bitmap are all together in a single bytes! render-image) ;; method names -(provide get-shape get-bb get-normalized?) +(provide get-shape get-bb get-normalized? get-normalized-shape) (provide np-atomic-shape? atomic-shape? simple-shape?) diff --git a/collects/mrlib/private/image-core-bitmap.ss b/collects/mrlib/private/image-core-bitmap.ss index 7491cb4f9d..112af70085 100644 --- a/collects/mrlib/private/image-core-bitmap.ss +++ b/collects/mrlib/private/image-core-bitmap.ss @@ -59,8 +59,8 @@ instead of this scaling code, we use the dc<%>'s scaling code. [h (send bm get-height)] [bytes (make-bytes (* w h NUM-CHANNELS) 0)]) (send bm get-argb-pixels 0 0 w h bytes #f) - (when (send bm get-loaded-mask) - (send (send bm get-loaded-mask) get-argb-pixels 0 0 w h bytes #t)) + (when mask + (send mask get-argb-pixels 0 0 w h bytes #t)) (values bytes w h))) (define (bytes->bitmap bytes w h) diff --git a/collects/mzlib/compile.ss b/collects/mzlib/compile.ss index 45e24bab81..db8ecc77c1 100644 --- a/collects/mzlib/compile.ss +++ b/collects/mzlib/compile.ss @@ -1,57 +1,63 @@ +#lang scheme/base +(require scheme/function + scheme/path + scheme/file) +(provide compile-file) -(module compile mzscheme - (require "file.ss" - "port.ss") - (provide compile-file) - - ;; (require compiler/src2src) - - (define compile-file - (case-lambda - [(src) - (let-values ([(base name dir?) (split-path src)]) - (let ([cdir (build-path - (if (symbol? base) - 'same - base) - "compiled")]) - (unless (directory-exists? cdir) - (make-directory cdir)) - (compile-file src (build-path cdir (path-add-suffix name #".zo")))))] - [(src dest) (compile-file src dest values)] - [(src dest filter) - (let ([in (open-input-file src)]) - (dynamic-wind - void - (lambda () - (port-count-lines! in) - (with-handlers ([void - (lambda (exn) - (with-handlers ([void void]) - (delete-file dest)) - (raise exn))]) - (let ([out (open-output-file dest 'truncate/replace)] - [ok? #f]) - (let ([dir (let-values ([(base name dir?) (split-path src)]) - (if (eq? base 'relative) - (current-directory) - (path->complete-path base (current-directory))))]) - (parameterize ([current-load-relative-directory dir] - [current-write-relative-directory dir]) - (dynamic-wind - void - (lambda () - (let loop () - (let ([r (read-syntax src in)]) - (unless (eof-object? r) - (write (compile-syntax (filter (namespace-syntax-introduce r))) out) - (loop)))) - (set! ok? #t)) - (lambda () - (close-output-port out) - (unless ok? - (with-handlers ([void void]) - (delete-file dest)))))))))) - (lambda () (close-input-port in)))) - dest]))) +(define compile-file + (case-lambda + [(src) + (define cdir (build-path (path-only src) "compiled")) + (make-directory* cdir) + (compile-file src (build-path cdir (path-add-suffix (file-name-from-path src) #".zo")))] + [(src dest) + (compile-file src dest values)] + [(src dest filter) + (define in (open-input-file src)) + (dynamic-wind + void + (lambda () + (define ok? #f) + ; This must be based on the path to dest. Renaming typically cannot be done + ; atomically across file systems, so the temporary directory is not an option + ; because it is often a ram disk. src (or dir below) couldn't be used because + ; it may be on a different filesystem. Since dest must be a file path, this + ; guarantees that the temp file is in the same directory. It would take a weird + ; filesystem configuration to break that. + (define temp-filename (make-temporary-file "tmp~a" #f (path-only dest))) + (port-count-lines! in) + (dynamic-wind + void + (lambda () + ; XXX: This seems like it should be a library function named 'relative-path-only' + (define dir + (let-values ([(base name dir?) (split-path src)]) + (if (eq? base 'relative) + (current-directory) + (path->complete-path base (current-directory))))) + (define out (open-output-file temp-filename #:exists 'truncate/replace)) + (parameterize ([current-load-relative-directory dir] + [current-write-relative-directory dir]) + ; Rather than installing a continuation barrier, we detect reinvocation. + ; The only thing that can cause reinvocation is if the filter captures the + ; continuation and communicates it externally. + (define count 0) + (dynamic-wind + (lambda () + (if (zero? count) + (set! count 1) + (error 'compile-file "filter function should not be re-entrant"))) + (lambda () + (for ([r (in-port (curry read-syntax src) in)]) + (write (compile-syntax (filter (namespace-syntax-introduce r))) out)) + (set! ok? #t)) + (lambda () + (close-output-port out))))) + (lambda () + (if ok? + (rename-file-or-directory temp-filename dest) + (with-handlers ([exn:fail:filesystem? void]) + (delete-file temp-filename)))))) + (lambda () (close-input-port in))) + dest])) diff --git a/collects/redex/private/matcher.ss b/collects/redex/private/matcher.ss index 96bd946974..6e9a2beff3 100644 --- a/collects/redex/private/matcher.ss +++ b/collects/redex/private/matcher.ss @@ -712,12 +712,6 @@ before the pattern compiler is invoked. [(has-underscore? pattern) (let*-values ([(binder before-underscore) (let ([before (split-underscore pattern)]) - (unless (or (hash-maps? clang-ht before) - (memq before underscore-allowed)) - (error 'compile-pattern "before underscore must be either a non-terminal ~a or a built-in pattern, found ~a in ~s" - before - (format "~s" (list* 'one 'of: (hash-map clang-ht (λ (x y) x)))) - pattern)) (values pattern before))] [(match-raw-name has-hole?) (compile-id-pattern before-underscore)]) diff --git a/collects/redex/private/rewrite-side-conditions.ss b/collects/redex/private/rewrite-side-conditions.ss index 4f853a95fe..e0db2ae638 100644 --- a/collects/redex/private/rewrite-side-conditions.ss +++ b/collects/redex/private/rewrite-side-conditions.ss @@ -1,4 +1,4 @@ -(module rewrite-side-conditions scheme/base +(module rewrite-side-conditions scheme (require (lib "list.ss") "underscore-allowed.ss") (require (for-template @@ -74,6 +74,20 @@ [(cross a) #`(cross #,(loop #'a))] [(cross a ...) (expected-exact 'cross 1 term)] [cross (expected-arguments 'cross term)] + [_ + (identifier? term) + (match (regexp-match #rx"^([^_]*)_.*" (symbol->string (syntax-e term))) + [(list _ (app string->symbol s)) + (if (or (memq s (cons '... underscore-allowed)) + (memq s all-nts)) + term + (raise-syntax-error + what + (format "before underscore must be either a non-terminal or a built-in pattern, found ~a in ~s" + s (syntax-e term)) + orig-stx + term))] + [_ term])] [(terms ...) (map loop (syntax->list (syntax (terms ...))))] [else diff --git a/collects/redex/private/term-test.ss b/collects/redex/private/term-test.ss index fa35933612..25059c7bbf 100644 --- a/collects/redex/private/term-test.ss +++ b/collects/redex/private/term-test.ss @@ -1,9 +1,7 @@ (module term-test scheme (require "term.ss" "matcher.ss" - "test-util.ss" - errortrace/errortrace-lib - errortrace/errortrace-key) + "test-util.ss") (reset-count) (test (term 1) 1) @@ -105,58 +103,75 @@ (define-namespace-anchor here) (define ns (namespace-anchor->namespace here)) - (define (runtime-error-source sexp src) - (let/ec return - (cadar - (continuation-mark-set->list - (exn-continuation-marks - (with-handlers ((exn:fail? values)) - (parameterize ([current-namespace ns]) - (parameterize ([current-compile (make-errortrace-compile-handler)]) - (eval (read-syntax src (open-input-string (format "~s" sexp)))))) - (return 'no-source))) - errortrace-key)))) - (let ([src 'term-template]) (test - (runtime-error-source - '(term-let ([(x ...) '(a b c)] - [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) - (term (((x y) ...) ...))) - src) + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let ([(x ...) '(a b c)] + [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) + (term (((x y) ...) ...))) + src)) src)) (let ([src 'term-template-metafunc]) (test - (runtime-error-source - '(term-let-fn ((f car)) - (term-let ([(x ...) '(a b c)] - [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) - (term ((((f x) y) ...) ...)))) - src) + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let-fn ((f car)) + (term-let ([(x ...) '(a b c)] + [((y ...) ...) '((1 2) (4 5 6) (7 8 9))]) + (term ((((f x) y) ...) ...)))) + src)) + src)) + + (let ([src 'ellipsis-args]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let-fn ((f car)) + (term-let ([(x ...) '(a b)] + [(y ...) '(c d e)]) + (term (f ((x y) ...))))) + src)) + src)) + + (let ([src 'ellipsis-args/map]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let-fn ((f car)) + (term-let ([(x ...) '(a b)] + [(y ...) '(c d e)]) + (term ((f (x y)) ...)))) + src)) + src)) + + (let ([src 'ellipsis-args/in-hole]) + (test + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let ([(x ...) '(a b)] + [(y ...) '(c d e)]) + (term ((in-hole hole (x y)) ...))) + src)) src)) (let ([src 'term-let-rhs]) (test - (runtime-error-source - '(term-let ([(x ...) 'a]) - 3) - src) + (parameterize ([current-namespace ns]) + (runtime-error-source + '(term-let ([(x ...) 'a]) + 3) + src)) src)) - (define (syntax-error-sources sexp src) - (let ([p (read-syntax src (open-input-string (format "~s" sexp)))]) - (with-handlers ((exn:srclocs? (λ (x) (map srcloc-source ((exn:srclocs-accessor x) x))))) - (parameterize ([current-namespace ns]) - (expand p)) - null))) - (let ([src 'term-template]) (test - (syntax-error-sources - '(term-let ([(x ...) '(a b c)]) - (term x)) - src) + (parameterize ([current-namespace ns]) + (syntax-error-sources + '(term-let ([(x ...) '(a b c)]) + (term x)) + src)) (list src))) (print-tests-passed 'term-test.ss)) diff --git a/collects/redex/private/term.ss b/collects/redex/private/term.ss index 04c0f32927..bda4c28747 100644 --- a/collects/redex/private/term.ss +++ b/collects/redex/private/term.ss @@ -32,11 +32,11 @@ (let ([result-id (car (generate-temporaries '(f-results)))]) (with-syntax ([fn fn]) (let loop ([func (syntax (λ (x) (fn (syntax->datum x))))] - [args rewritten] + [args-stx rewritten] [res result-id] [args-depth (min depth max-depth)]) (with-syntax ([func func] - [args args] + [args args-stx] [res res]) (if (zero? args-depth) (begin @@ -45,7 +45,7 @@ outer-bindings)) (values result-id (min depth max-depth))) (loop (syntax (λ (l) (map func (syntax->list l)))) - (syntax (args (... ...))) + (syntax/loc args-stx (args (... ...))) (syntax (res (... ...))) (sub1 args-depth))))))))) @@ -55,7 +55,7 @@ (and (identifier? (syntax metafunc-name)) (term-fn? (syntax-local-value (syntax metafunc-name) (λ () #f)))) (rewrite-application (term-fn-get-id (syntax-local-value/catch (syntax metafunc-name) (λ (x) #t))) - (syntax (arg ...)) + (syntax/loc stx (arg ...)) depth)] [f (and (identifier? (syntax f)) @@ -76,7 +76,7 @@ [(unquote-splicing . x) (raise-syntax-error 'term "malformed unquote splicing" orig-stx stx)] [(in-hole id body) - (rewrite-application (syntax (λ (x) (apply plug x))) (syntax (id body)) depth)] + (rewrite-application (syntax (λ (x) (apply plug x))) (syntax/loc stx (id body)) depth)] [(in-hole . x) (raise-syntax-error 'term "malformed in-hole" orig-stx stx)] [hole (values (syntax (unsyntax the-hole)) 0)] diff --git a/collects/redex/private/test-util.ss b/collects/redex/private/test-util.ss index e973b69762..283a6596a0 100644 --- a/collects/redex/private/test-util.ss +++ b/collects/redex/private/test-util.ss @@ -1,10 +1,13 @@ #lang scheme -(require "matcher.ss") +(require "matcher.ss" + errortrace/errortrace-lib + errortrace/errortrace-key) (provide test test-syn-err tests reset-count syn-err-test-namespace print-tests-passed - equal/bindings?) + equal/bindings? + runtime-error-source syntax-error-sources) (define syn-err-test-namespace (make-base-namespace)) (parameterize ([current-namespace syn-err-test-namespace]) @@ -108,3 +111,20 @@ ;; rib-lt : rib rib -> boolean (define (rib-lt r1 r2) (string<=? (format "~s" (bind-name r1)) (format "~s" (bind-name r2)))) + +(define (runtime-error-source sexp src) + (let/ec return + (cadar + (continuation-mark-set->list + (exn-continuation-marks + (with-handlers ((exn:fail? values)) + (parameterize ([current-compile (make-errortrace-compile-handler)]) + (eval (read-syntax src (open-input-string (format "~s" sexp))))) + (return 'no-source))) + errortrace-key)))) + +(define (syntax-error-sources sexp src) + (let ([p (read-syntax src (open-input-string (format "~s" sexp)))]) + (with-handlers ((exn:srclocs? (λ (x) (map srcloc-source ((exn:srclocs-accessor x) x))))) + (expand p) + null))) \ No newline at end of file diff --git a/collects/redex/private/tl-test.ss b/collects/redex/private/tl-test.ss index e6c82aa862..d59d570d7c 100644 --- a/collects/redex/private/tl-test.ss +++ b/collects/redex/private/tl-test.ss @@ -261,7 +261,16 @@ (term (f 1))) (test rhs-eval-count 2)) + (define-namespace-anchor here) + (define ns (namespace-anchor->namespace here)) + (let ([src 'bad-underscore]) + (test + (parameterize ([current-namespace ns]) + (syntax-error-sources + '(define-language L (n m_1)) + src)) + (list src))) ; ; diff --git a/collects/repos-time-stamp/stamp.ss b/collects/repos-time-stamp/stamp.ss index e1fea1f73c..6865e59a76 100644 --- a/collects/repos-time-stamp/stamp.ss +++ b/collects/repos-time-stamp/stamp.ss @@ -1 +1 @@ -#lang scheme/base (provide stamp) (define stamp "30nov2009") +#lang scheme/base (provide stamp) (define stamp "4dec2009") diff --git a/collects/scheme/contract/private/guts.ss b/collects/scheme/contract/private/guts.ss index 96e85aac05..cf5e50b4f6 100644 --- a/collects/scheme/contract/private/guts.ss +++ b/collects/scheme/contract/private/guts.ss @@ -66,9 +66,14 @@ (define-values (flat-prop flat-pred? flat-get) (make-struct-type-property 'contract-flat)) -(define-values (first-order-prop first-order-pred? first-order-get) +(define-values (first-order-prop first-order-pred? raw-first-order-get) (make-struct-type-property 'contract-first-order)) +(define (first-order-get stct) + (cond + [(flat-pred? stct) (flat-get stct)] + [else (raw-first-order-get stct)])) + (define (contract-first-order-passes? c v) (let ([ctc (coerce-contract 'contract-first-order-passes? c)]) (cond @@ -404,7 +409,8 @@ #:property name-prop (λ (ctc) (apply build-compound-type-name 'and/c (and/c-ctcs ctc))) #:property first-order-prop (λ (ctc) - (let ([tests (map (λ (x) ((first-order-get x) x)) (and/c-ctcs ctc))]) + (let ([tests (map (λ (x) ((first-order-get x) x)) + (and/c-ctcs ctc))]) (λ (x) (andmap (λ (f) (f x)) tests)))) #:property stronger-prop diff --git a/collects/scheme/private/at-syntax.ss b/collects/scheme/private/at-syntax.ss deleted file mode 100644 index 4753d40918..0000000000 --- a/collects/scheme/private/at-syntax.ss +++ /dev/null @@ -1,71 +0,0 @@ -#lang scheme/base - -(require (for-template scheme/base)) - -(provide at-syntax) - -;; ------------------------------------------------------------------- -;; NOTE: This library is for internal use only, it is can change -;; and/or disappear. Do not use without protective eyewear! -;; ------------------------------------------------------------------- - -#| - -The `(at-syntax expr)' form is a useful syntax-time utility that can -be used to sort of evaluate an expression at syntax time, and doing so -in a well behaved way (eg, it respects the source for-syntax bindings, -but it does have some issues). It can be used to implement an escape -to the syntax level that is not restricted like `begin-for-syntax'. - -The basic idea of the code is to plant the given expression on the -right hand side of a `let-syntax' -- inside a `(lambda (stx) ...)' to -make it a valid transformer, with a singe use of this macro so that we -get it to execute with `local-expand'. The macro returns a 3d -expression that contains the evaluated expression "somehwhere", -depending on the expansion of `let-syntax' -- so to make it easy to -find we plant it inside a thunk (so this works as long as `let-syntax' -does not include 3d procedure values in its expansion). Finally, the -constructed `let-syntax' is expanded, we search through the resulting -syntax for the thunk, then apply it to get the desired value. - -Here's a silly example to demonstrate: - - > (define-syntax (compile-time-if stx) - (syntax-case stx () - [(_ cond expr1 expr2) - (if (at-syntax #'cond) #'expr1 #'expr2)])) - > (define-for-syntax x 8) - > (define x 100) - > (compile-time-if (< x 10) (+ x 10) (- x 10)) - 110 - -And another example, creating a macro for syntax-time expressions: - - > (define-syntax (compile-time-value stx) - (syntax-case stx () - [(_ expr) #`(quote #,(at-syntax #'expr))])) - > (compile-time-value (* x 2)) - 16 - -but the `quote' here is a hint that this can get 3d values into -syntax, and all the problems that are involved. Also, note that it -breaks if you try to do something like: - - > (compile-time-value (begin (set! x 11) x)) - 8 - -(and, of course, it cannot be used to define new bindings). - -|# - -(define (at-syntax expr) - (let loop ([x (with-syntax ([e expr]) - (local-expand - #'(let-syntax ([here (lambda (stx) - (datum->syntax stx (lambda () e)))]) - here) - 'expression '()))]) - (cond [(procedure? x) (x)] - [(pair? x) (or (loop (car x)) (loop (cdr x)))] - [(syntax? x) (loop (syntax-e x))] - [else #f]))) diff --git a/collects/scheme/provide.ss b/collects/scheme/provide.ss index 9c4cd9b446..b3bdbd12f1 100644 --- a/collects/scheme/provide.ss +++ b/collects/scheme/provide.ss @@ -1,7 +1,7 @@ #lang scheme/base (require (for-syntax scheme/base scheme/provide-transform scheme/list - "private/at-syntax.ss")) + (only-in unstable/syntax syntax-local-eval))) (provide matching-identifiers-out) (define-syntax matching-identifiers-out @@ -21,7 +21,7 @@ (lambda (stx modes) (syntax-case stx () [(_ proc spec) - (let ([proc (at-syntax #'proc)]) + (let ([proc (syntax-local-eval #'proc)]) (filter-map (lambda (e) (let* ([s1 (symbol->string (export-out-sym e))] diff --git a/collects/scheme/require.ss b/collects/scheme/require.ss index 0349b3df30..b40197f910 100644 --- a/collects/scheme/require.ss +++ b/collects/scheme/require.ss @@ -1,7 +1,7 @@ #lang scheme/base (require (for-syntax scheme/base scheme/require-transform scheme/list - "private/at-syntax.ss") + (only-in unstable/syntax syntax-local-eval)) "require-syntax.ss") (provide matching-identifiers-in) @@ -43,7 +43,7 @@ (lambda (stx) (syntax-case stx () [(_ proc spec) - (let ([proc (at-syntax #'proc)]) + (let ([proc (syntax-local-eval #'proc)]) (define-values [imports sources] (expand-import #'spec)) (values (filter-map diff --git a/collects/scribblings/gui/text-class.scrbl b/collects/scribblings/gui/text-class.scrbl index c4fccef743..8e2e1cd278 100644 --- a/collects/scribblings/gui/text-class.scrbl +++ b/collects/scribblings/gui/text-class.scrbl @@ -1735,7 +1735,7 @@ If @scheme[end] is not @scheme['same] and not the same as @scheme[start], When the specified range cannot fit in the visible area, @scheme[bias] indicates which end of the range to display. When @scheme[bias] is - @scheme['same], then the start of the range is displayed. When + @scheme['start], then the start of the range is displayed. When @scheme[bias] is @scheme['end], then the end of the range is displayed. Otherwise, @scheme[bias] must be @scheme['none]. @@ -1747,7 +1747,7 @@ If the editor is scrolled, then the editor is redrawn and the return scroll-editor-to]. Scrolling is disallowed when the editor is internally locked for - reflowing (see also @|lockdiscuss|). + reflowing (see also @|lockdiscuss|). The system may scroll the editor without calling this method. For example, a canvas displaying an editor might scroll the editor to diff --git a/collects/scribblings/inside/custodians.scrbl b/collects/scribblings/inside/custodians.scrbl index e2cffb78d7..b9f5a3b269 100644 --- a/collects/scribblings/inside/custodians.scrbl +++ b/collects/scribblings/inside/custodians.scrbl @@ -36,7 +36,6 @@ Creates a new custodian as a subordinate of @var{m}. If @var{m} is Places the value @var{o} into the management of the custodian @var{m}. If @var{m} is @cpp{NULL}, the current custodian is used. - The @var{f} function is called by the custodian if it is ever asked to ``shutdown'' its values; @var{o} and @var{data} are passed on to @var{f}, which has the type @@ -52,6 +51,10 @@ be remembered until either the custodian shuts it down or zero, the value is allowed to be garbaged collected (and automatically removed from the custodian). +Independent of whether @var{strong} is zero, the value @var{o} is +initially weakly held. A value associated with a custodian can +therefore be finalized via will executors. + The return value from @cpp{scheme_add_managed} can be used to refer to the value's custodian later in a call to @cpp{scheme_remove_managed}. A value can be registered with at diff --git a/collects/scribblings/reference/numbers.scrbl b/collects/scribblings/reference/numbers.scrbl index 59acdabaac..7537bbf5c7 100644 --- a/collects/scribblings/reference/numbers.scrbl +++ b/collects/scribblings/reference/numbers.scrbl @@ -849,6 +849,58 @@ Returns @scheme[#t] if the native encoding of numbers is big-endian for the machine running Scheme, @scheme[#f] if the native encoding is little-endian.} +@; ------------------------------------------------------------------------ +@section{Inexact-Real Vectors} + +A @deftech{flvector} is like a @tech{vector}, but it holds only +inexact real numbers. This representation can be more compact, and +unsafe operations on @tech{flvector}s (see +@schememodname[scheme/unsafe/ops]) can execute more efficiently than +unsafe operations on @tech{vectors} of inexact reals. + +An f64vector as provided by @schememodname[scheme/foreign] stores the +same kinds of values as an @tech{flvector}, but with extra +indirections that make f64vectors more convenient for working with +foreign libraries. The lack of indirections make unsafe +@tech{flvector} access more efficient. + +@defproc[(flvector? [v any/c]) boolean?]{ + +Returns @scheme[#t] if @scheme[v] is a @tech{flvector}, @scheme[#f] otherwise.} + +@defproc[(flvector [x inexact-real?] ...) flvector?]{ + +Creates a @tech{flvector} containing the given inexact real numbers.} + +@defproc[(make-flvector [size exact-nonnegative-integer?] + [x inexact-real? 0.0]) + flvector?]{ + +Creates a @tech{flvector} with @scheme[size] elements, where every +slot in the @tech{flvector} is filled with @scheme[x].} + +@defproc[(flvector-length [vec flvector?]) exact-nonnegative-integer?]{ + +Returns the length of @scheme[vec] (i.e., the number of slots in the +@tech{flvector}).} + + +@defproc[(flvector-ref [vec flvector?] [pos exact-nonnegative-integer?]) + inexact-real?]{ + +Returns the inexact real number in slot @scheme[pos] of +@scheme[vec]. The first slot is position @scheme[0], and the last slot +is one less than @scheme[(flvector-length vec)].} + +@defproc[(flvector-set! [vec flvector?] [pos exact-nonnegative-integer?] + [x inexact-real?]) + inexact-real?]{ + +Sets the inexact real number in slot @scheme[pos] of @scheme[vec]. The +first slot is position @scheme[0], and the last slot is one less than +@scheme[(flvector-length vec)].} + + @; ------------------------------------------------------------------------ @section{Extra Constants and Functions} diff --git a/collects/scribblings/reference/unsafe.scrbl b/collects/scribblings/reference/unsafe.scrbl index 35202bb503..acee583bf8 100644 --- a/collects/scribblings/reference/unsafe.scrbl +++ b/collects/scribblings/reference/unsafe.scrbl @@ -169,6 +169,18 @@ Unsafe versions of @scheme[bytes-length], @scheme[bytes-ref], and fixnum).} +@deftogether[( +@defproc[(unsafe-flvector-length [v flvector?]) fixnum?] +@defproc[(unsafe-flvector-ref [v flvector?][k fixnum?]) any/c] +@defproc[(unsafe-flvector-set! [v flvector?][k fixnum?][x inexact-real?]) void?] +)]{ + +Unsafe versions of @scheme[flvector-length], @scheme[flvector-ref], and +@scheme[flvector-set!]. A @tech{flvector}'s size can never be larger than a +@tech{fixnum} (so even @scheme[flvector-length] always returns a +fixnum).} + + @deftogether[( @defproc[(unsafe-f64vector-ref [vec f64vector?][k fixnum?]) inexact-real?] @defproc[(unsafe-f64vector-set! [vec f64vector?][k fixnum?][n inexact-real?]) void?] diff --git a/collects/tests/mzscheme/contract-test.ss b/collects/tests/mzscheme/contract-test.ss index 3de105d6a2..2769651825 100644 --- a/collects/tests/mzscheme/contract-test.ss +++ b/collects/tests/mzscheme/contract-test.ss @@ -2060,6 +2060,12 @@ x) '(2)) + (test/spec-passed + 'or/c-hmm + (let ([funny/c (or/c (and/c procedure? (-> any)) (listof (-> number?)))]) + (contract (-> funny/c any) void 'pos 'neg))) + + ; ; diff --git a/collects/tests/mzscheme/optimize.ss b/collects/tests/mzscheme/optimize.ss index 1a62a69916..00b3e2ba15 100644 --- a/collects/tests/mzscheme/optimize.ss +++ b/collects/tests/mzscheme/optimize.ss @@ -413,6 +413,10 @@ (un-exact 'a 'unbox (box 'a)) (un-exact 3 'vector-length (vector 'a 'b 'c)) + (bin-exact 1.1 'flvector-ref (flvector 1.1 2.2 3.3) 0) + (bin-exact 3.3 'flvector-ref (flvector 1.1 2.2 3.3) 2) + (un-exact 3 'flvector-length (flvector 1.1 2.2 3.3)) + (bin-exact #\a 'string-ref "abc\u2001" 0) (bin-exact #\b 'string-ref "abc\u2001" 1) (bin-exact #\c 'string-ref "abc\u2001" 2) @@ -454,7 +458,8 @@ '(0 1 2))))]) (test-setter make-vector #f 7 'vector-set! vector-set! vector-ref) (test-setter make-bytes 0 7 'bytes-set! bytes-set! bytes-ref) - (test-setter make-string #\a #\7 'string-set! string-set! string-ref)) + (test-setter make-string #\a #\7 'string-set! string-set! string-ref) + (test-setter make-flvector 1.0 7.0 'flvector-set! flvector-set! flvector-ref)) )) diff --git a/collects/tests/mzscheme/unsafe.ss b/collects/tests/mzscheme/unsafe.ss index fdfd47803c..7304c90968 100644 --- a/collects/tests/mzscheme/unsafe.ss +++ b/collects/tests/mzscheme/unsafe.ss @@ -187,6 +187,14 @@ #:post (lambda (x) (list x (string-ref v 2))) #:literal-ok? #f)) + (test-bin 9.5 'unsafe-flvector-ref (flvector 1.0 9.5 18.7) 1) + (test-un 5 'unsafe-flvector-length (flvector 1.1 2.0 3.1 4.5 5.7)) + (let ([v (flvector 1.0 9.5 18.7)]) + (test-tri (list (void) 27.4) 'unsafe-flvector-set! v 2 27.4 + #:pre (lambda () (flvector-set! v 2 0.0)) + #:post (lambda (x) (list x (flvector-ref v 2))) + #:literal-ok? #f)) + (test-bin 9.5 'unsafe-f64vector-ref (f64vector 1.0 9.5 18.7) 1) (let ([v (f64vector 1.0 9.5 18.7)]) (test-tri (list (void) 27.4) 'unsafe-f64vector-set! v 2 27.4 diff --git a/collects/unstable/contract.ss b/collects/unstable/contract.ss index a7b22b9c50..f3d7d286c1 100644 --- a/collects/unstable/contract.ss +++ b/collects/unstable/contract.ss @@ -1,4 +1,5 @@ -#lang scheme +#lang scheme/base +(require scheme/contract) (define path-element? (or/c path-string? (symbols 'up 'same))) @@ -13,7 +14,45 @@ ;; Eli: If this gets in, there should also be versions for bytes, lists, and ;; vectors. +;; ryanc added: + +;; (if/c predicate then/c else/c) applies then/c to satisfying +;; predicate, else/c to those that don't. +(define (if/c predicate then/c else/c) + #| + Naive version: + (or/c (and/c predicate then/c) + (and/c (not/c predicate) else/c)) + But that applies predicate twice. + |# + (let ([then-ctc (coerce-contract 'if/c then/c)] + [else-ctc (coerce-contract 'if/c else/c)]) + (define name (build-compound-type-name 'if/c predicate then-ctc else-ctc)) + ;; Special case: if both flat contracts, make a flat contract. + (if (and (flat-contract? then-ctc) + (flat-contract? else-ctc)) + ;; flat contract + (let ([then-pred (flat-contract-predicate then-ctc)] + [else-pred (flat-contract-predicate else-ctc)]) + (define (pred x) + (if (predicate x) (then-pred x) (else-pred x))) + (flat-named-contract name pred)) + ;; ho contract + (let ([then-proj ((proj-get then-ctc) then-ctc)] + [then-fo ((first-order-get then-ctc) then-ctc)] + [else-proj ((proj-get else-ctc) else-ctc)] + [else-fo ((first-order-get else-ctc) else-ctc)]) + (define ((proj pos neg srcinfo name pos?) x) + (if (predicate x) + ((then-proj pos neg srcinfo name pos?) x) + ((else-proj pos neg srcinfo name pos?) x))) + (make-proj-contract + name + proj + (lambda (x) (if (predicate x) (then-fo x) (else-fo x)))))))) + (provide/contract [non-empty-string/c contract?] [path-element? contract?] - [port-number? contract?]) + [port-number? contract?] + [if/c (-> procedure? contract? contract? contract?)]) diff --git a/collects/unstable/list.ss b/collects/unstable/list.ss index 697f100c98..661721467a 100644 --- a/collects/unstable/list.ss +++ b/collects/unstable/list.ss @@ -1,19 +1,15 @@ -#lang scheme +#lang scheme/base +(require scheme/contract + scheme/dict) -; list-prefix : list? list? -> (or/c list? false/c) -; Is l a prefix or r?, and what is that prefix? +; list-prefix : list? list? -> boolean? +; Is l a prefix or r? (define (list-prefix? ls rs) - (match ls - [(list) - #t] - [(list-rest l0 ls) - (match rs - [(list) - #f] - [(list-rest r0 rs) - (if (equal? l0 r0) - (list-prefix? ls rs) - #f)])])) + (or (null? ls) + (and (pair? rs) + (equal? (car ls) (car rs)) + (list-prefix? (cdr ls) (cdr rs))))) + ;; Eli: Is this some `match' obsession syndrom? The simple definition: ;; (define (list-prefix? ls rs) ;; (or (null? ls) (and (pair? rs) (equal? (car ls) (car rs)) @@ -25,6 +21,7 @@ ;; (Which can be useful for things like making a path relative to ;; another path.) A nice generalization is to make it get two or more ;; lists, and return a matching number of values. +;; ryanc: changed to use Eli's version (provide/contract [list-prefix? (list? list? . -> . boolean?)]) @@ -38,4 +35,52 @@ (define (extend s t extra) (append t (build-list (- (length s) (length t)) (lambda _ extra)))) -(provide filter-multiple extend) \ No newline at end of file +(provide filter-multiple extend) + +;; ryanc added: + +(provide/contract + [check-duplicate + (->* (list?) + (#:key (-> any/c any/c) + #:same? (or/c dict? (-> any/c any/c any/c))) + any)]) + +;; check-duplicate : (listof X) +;; #:key (X -> K) +;; #:same? (or/c (K K -> bool) dict?) +;; -> X or #f +(define (check-duplicate items + #:key [key values] + #:same? [same? equal?]) + (cond [(procedure? same?) + (cond [(eq? same? equal?) + (check-duplicate/t items key (make-hash) #t)] + [(eq? same? eq?) + (check-duplicate/t items key (make-hasheq) #t)] + [(eq? same? eqv?) + (check-duplicate/t items key (make-hasheqv) #t)] + [else + (check-duplicate/list items key same?)])] + [(dict? same?) + (let ([dict same?]) + (if (dict-mutable? dict) + (check-duplicate/t items key dict #t) + (check-duplicate/t items key dict #f)))])) +(define (check-duplicate/t items key table mutating?) + (let loop ([items items] [table table]) + (and (pair? items) + (let ([key-item (key (car items))]) + (if (dict-ref table key-item #f) + (car items) + (loop (cdr items) (if mutating? + (begin (dict-set! table key-item #t) table) + (dict-set table key-item #t)))))))) +(define (check-duplicate/list items key same?) + (let loop ([items items] [sofar null]) + (and (pair? items) + (let ([key-item (key (car items))]) + (if (for/or ([prev (in-list sofar)]) + (same? key-item prev)) + (car items) + (loop (cdr items) (cons key-item sofar))))))) diff --git a/collects/unstable/mutated-vars.ss b/collects/unstable/mutated-vars.ss index efa9b39e49..a585a2c321 100644 --- a/collects/unstable/mutated-vars.ss +++ b/collects/unstable/mutated-vars.ss @@ -13,8 +13,7 @@ ;; syntax -> void (define (fmv/list lstx) (for-each find-mutated-vars (syntax->list lstx))) - ;(when (and (pair? (syntax->datum form))) (printf "called with ~a~n" (syntax->datum form))) - (kernel-syntax-case* form #f (define-type-alias-internal define-typed-struct-internal require/typed-internal) + (kernel-syntax-case* form #f () ;; what we care about: set! [(set! v e) (begin @@ -51,5 +50,8 @@ ;; less general. ;; - What's with the typed-scheme literals? If they were needed, then ;; typed-scheme is probably broken now. +;; ryanc: +;; - The for-template is needed. +;; - I've removed the bogus literals. (provide find-mutated-vars is-var-mutated?) diff --git a/collects/unstable/scribblings/contract.scrbl b/collects/unstable/scribblings/contract.scrbl index b7851a4629..a774deb59b 100644 --- a/collects/unstable/scribblings/contract.scrbl +++ b/collects/unstable/scribblings/contract.scrbl @@ -1,6 +1,7 @@ #lang scribble/doc @(require scribble/base scribble/manual + "utils.ss" (for-label unstable/contract scheme/contract scheme/base)) @@ -9,8 +10,39 @@ @defmodule[unstable/contract] -@defthing[non-empty-string/c contract?]{Contract for non-empty strings.} +@defthing[non-empty-string/c contract?]{ +Contract for non-empty strings. +} -@defthing[port-number? contract?]{Equivalent to @scheme[(between/c 1 65535)].} +@defthing[port-number? contract?]{ +Equivalent to @scheme[(between/c 1 65535)]. +} -@defthing[path-element? contract?]{Equivalent to @scheme[(or/c path-string? (symbols 'up 'same))].} +@defthing[path-element? contract?]{ +Equivalent to @scheme[(or/c path-string? (symbols 'up 'same))]. +} + +@addition{Ryan Culpepper} + +@defproc[(if/c [predicate (-> any/c any/c)] + [then-contract contract?] + [else-contract contract?]) + contract?]{ + +Produces a contract that, when applied to a value, first tests the +value with @scheme[predicate]; if @scheme[predicate] returns true, the +@scheme[then-contract] is applied; otherwise, the +@scheme[else-contract] is applied. The resulting contract is a flat +contract if both @scheme[then-contract] and @scheme[else-contract] are +flat contracts. + +For example, the following contract enforces that if a value is a +procedure, it is a thunk; otherwise it can be any (non-procedure) +value: + @schemeblock[(if/c procedure? (-> any) any/c)] +Note that the following contract is @bold{not} equivalent: + @schemeblock[(or/c (-> any) any/c) (code:comment "wrong!")] +The last contract is the same as @scheme[any/c] because +@scheme[or/c] tries flat contracts before higher-order contracts. + +} diff --git a/collects/unstable/scribblings/list.scrbl b/collects/unstable/scribblings/list.scrbl index ac5f7bf9ed..aedc04c1b5 100644 --- a/collects/unstable/scribblings/list.scrbl +++ b/collects/unstable/scribblings/list.scrbl @@ -3,9 +3,11 @@ scribble/manual scribble/eval "utils.ss" - (for-label unstable/list - scheme/contract - scheme/base)) + (for-label scheme/dict + unstable/list + syntax/id-table + scheme/contract + scheme/base)) @(define the-eval (make-base-eval)) @(the-eval '(require unstable/list)) @@ -40,4 +42,38 @@ Extends @scheme[l2] to be as long as @scheme[l1] by adding @scheme[(- @examples[#:eval the-eval] (extend '(1 2 3) '(a) 'b) -} \ No newline at end of file +} + + +@addition{Ryan Culpepper} + +@defproc[(check-duplicate [lst list?] + [#:key extract-key (-> any/c any/c) (lambda (x) x)] + [#:same? same? + (or/c (any/c any/c . -> . any/c) + dict?) + equal?]) + (or/c any/c #f)]{ + +Returns the first duplicate item in @scheme[lst]. More precisely, it +returns the first @scheme[_x] such that there was a previous +@scheme[_y] where @scheme[(same? (extract-key _x) (extract-key _y))]. + +The @scheme[same?] argument can either be an equivalence predicate +such as @scheme[equal?] or @scheme[eqv?] or a dictionary. In the +latter case, the elements of the list are mapped to @scheme[#t] in the +dictionary until an element is discovered that is already mapped to a +true value. The procedures @scheme[equal?], @scheme[eqv?], and +@scheme[eq?] automatically use a dictionary for speed. + +@(the-eval '(require syntax/id-table scheme/dict)) +@examples[#:eval the-eval +(check-duplicate '(1 2 3 4)) +(check-duplicate '(1 2 3 2 1)) +(check-duplicate '((a 1) (b 2) (a 3)) #:key car) +(define id-t (make-free-id-table)) +(check-duplicate (syntax->list #'(a b c d a b)) + #:same? id-t) +(dict-map id-t list) +] +} diff --git a/collects/unstable/struct.ss b/collects/unstable/struct.ss index 1384d643fb..9a272bddad 100644 --- a/collects/unstable/struct.ss +++ b/collects/unstable/struct.ss @@ -3,24 +3,27 @@ (require (for-syntax scheme/base scheme/struct-info)) (provide make - struct->list) + struct->list + (for-syntax get-struct-info)) + +;; get-struct-info : identifier stx -> struct-info-list +(define-for-syntax (get-struct-info id ctx) + (define (bad-struct-name x) + (raise-syntax-error #f "expected struct name" ctx x)) + (unless (identifier? id) + (bad-struct-name id)) + (let ([value (syntax-local-value id (lambda () #f))]) + (unless (struct-info? value) + (bad-struct-name id)) + (extract-struct-info value))) ;; (make struct-name field-expr ...) ;; Checks that correct number of fields given. (define-syntax (make stx) - (define (bad-struct-name x) - (raise-syntax-error #f "expected struct name" stx x)) - (define (get-struct-info id) - (unless (identifier? id) - (bad-struct-name id)) - (let ([value (syntax-local-value id (lambda () #f))]) - (unless (struct-info? value) - (bad-struct-name id)) - (extract-struct-info value))) (syntax-case stx () [(make S expr ...) (let () - (define info (get-struct-info #'S)) + (define info (get-struct-info #'S stx)) (define constructor (list-ref info 1)) (define accessors (list-ref info 3)) (unless (identifier? #'constructor) diff --git a/collects/unstable/syntax.ss b/collects/unstable/syntax.ss index 9397876fd8..0ad94ddeb0 100644 --- a/collects/unstable/syntax.ss +++ b/collects/unstable/syntax.ss @@ -4,7 +4,8 @@ syntax/stx unstable/struct (for-syntax scheme/base - scheme/private/sc)) + scheme/private/sc) + (for-template scheme/base)) (provide unwrap-syntax diff --git a/collects/web-server/scribblings/tutorial/continue.scrbl b/collects/web-server/scribblings/tutorial/continue.scrbl index b366eb8322..263236034a 100644 --- a/collects/web-server/scribblings/tutorial/continue.scrbl +++ b/collects/web-server/scribblings/tutorial/continue.scrbl @@ -100,7 +100,7 @@ responses. One basic kind of response is to show an HTML page. For example: -The HTML @tt{hello} is represented as @scheme["hello"]. +The HTML @tt{hello} is represented as @scheme["hello"]. Strings are automatically escaped when output. This guarantees valid HTML. Therefore, the value @scheme["Unfinished tag"] is rendered as @tt{<b>Unfinished tag} not @tt{Unfinished tag}. Similarly, @scheme["Finished tag"] is rendered as @tt{<i>Finished tag</i>} not @tt{Finished tag}. @tt{

This is an example

} is diff --git a/doc/release-notes/mzscheme/HISTORY.txt b/doc/release-notes/mzscheme/HISTORY.txt index fa874ddc03..ae7d173969 100644 --- a/doc/release-notes/mzscheme/HISTORY.txt +++ b/doc/release-notes/mzscheme/HISTORY.txt @@ -1,3 +1,6 @@ +Version 4.2.3.4 +Added flvectors + Version 4.2.3.3 Added unsafe-f64vector-ref and unsafe-f64vector-set! Changed JIT to inline numeric ops with more than 2 arguments diff --git a/src/mzscheme/include/scheme.h b/src/mzscheme/include/scheme.h index 53e15c63f0..7589873457 100644 --- a/src/mzscheme/include/scheme.h +++ b/src/mzscheme/include/scheme.h @@ -318,6 +318,12 @@ typedef struct Scheme_Vector { Scheme_Object *els[1]; } Scheme_Vector; +typedef struct Scheme_Double_Vector { + Scheme_Object so; + long size; + double els[1]; +} Scheme_Double_Vector; + typedef struct Scheme_Print_Params Scheme_Print_Params; typedef void (*Scheme_Type_Printer)(Scheme_Object *v, int for_display, Scheme_Print_Params *pp); @@ -435,6 +441,8 @@ typedef long (*Scheme_Secondary_Hash_Proc)(Scheme_Object *obj, void *cycle_data) #define SCHEME_MUTABLE_VECTORP(obj) (SCHEME_VECTORP(obj) && SCHEME_MUTABLEP(obj)) #define SCHEME_IMMUTABLE_VECTORP(obj) (SCHEME_VECTORP(obj) && SCHEME_IMMUTABLEP(obj)) +#define SCHEME_FLVECTORP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_flvector_type) + #define SCHEME_STRUCTP(obj) (SAME_TYPE(SCHEME_TYPE(obj), scheme_structure_type) || SAME_TYPE(SCHEME_TYPE(obj), scheme_proc_struct_type)) #define SCHEME_STRUCT_TYPEP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_struct_type_type) @@ -539,6 +547,9 @@ typedef long (*Scheme_Secondary_Hash_Proc)(Scheme_Object *obj, void *cycle_data) #define SCHEME_VEC_ELS(obj) (((Scheme_Vector *)(obj))->els) #define SCHEME_VEC_BASE(obj) SCHEME_VEC_ELS(obj) +#define SCHEME_FLVEC_SIZE(obj) (((Scheme_Double_Vector *)(obj))->size) +#define SCHEME_FLVEC_ELS(obj) (((Scheme_Double_Vector *)(obj))->els) + #define SCHEME_ENVBOX_VAL(obj) (*((Scheme_Object **)(obj))) #define SCHEME_WEAK_BOX_VAL(obj) SCHEME_BOX_VAL(obj) diff --git a/src/mzscheme/src/cstartup.inc b/src/mzscheme/src/cstartup.inc index 2173ba0593..a3bcfd6396 100644 --- a/src/mzscheme/src/cstartup.inc +++ b/src/mzscheme/src/cstartup.inc @@ -1,12 +1,12 @@ { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,51,50,0,0,0,1,0,0,3,0,12,0, -25,0,29,0,34,0,41,0,44,0,49,0,56,0,63,0,67,0,72,0,78, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,52,50,0,0,0,1,0,0,3,0,12,0, +19,0,23,0,28,0,41,0,44,0,49,0,56,0,63,0,67,0,72,0,78, 0,92,0,106,0,109,0,115,0,119,0,121,0,132,0,134,0,148,0,155,0, 177,0,179,0,193,0,4,1,33,1,44,1,55,1,65,1,101,1,134,1,167, 1,226,1,36,2,114,2,180,2,185,2,205,2,96,3,116,3,167,3,233,3, 118,4,4,5,56,5,79,5,158,5,0,0,105,7,0,0,29,11,11,68,104, -101,114,101,45,115,116,120,72,112,97,114,97,109,101,116,101,114,105,122,101,63, -97,110,100,64,108,101,116,42,66,100,101,102,105,110,101,62,111,114,64,99,111, +101,114,101,45,115,116,120,66,100,101,102,105,110,101,63,97,110,100,64,108,101, +116,42,72,112,97,114,97,109,101,116,101,114,105,122,101,62,111,114,64,99,111, 110,100,66,108,101,116,114,101,99,66,117,110,108,101,115,115,63,108,101,116,64, 119,104,101,110,65,113,117,111,116,101,29,94,2,13,68,35,37,107,101,114,110, 101,108,11,29,94,2,13,68,35,37,112,97,114,97,109,122,11,62,105,102,65, @@ -21,57 +21,57 @@ 2,161,2,1,36,2,2,2,1,2,2,96,11,11,8,240,35,79,0,0,16, 0,96,37,11,8,240,35,79,0,0,16,0,13,16,4,35,29,11,11,2,1, 11,18,16,2,99,64,104,101,114,101,8,31,8,30,8,29,8,28,8,27,93, -8,224,42,79,0,0,95,9,8,224,42,79,0,0,2,1,27,248,22,137,4, -195,249,22,130,4,80,158,38,35,251,22,77,2,16,248,22,92,199,12,249,22, -67,2,17,248,22,94,201,27,248,22,137,4,195,249,22,130,4,80,158,38,35, +8,224,42,79,0,0,95,9,8,224,42,79,0,0,2,1,27,248,22,143,4, +195,249,22,136,4,80,158,38,35,251,22,77,2,16,248,22,92,199,12,249,22, +67,2,17,248,22,94,201,27,248,22,143,4,195,249,22,136,4,80,158,38,35, 251,22,77,2,16,248,22,92,199,249,22,67,2,17,248,22,94,201,12,27,248, -22,69,248,22,137,4,196,28,248,22,75,193,20,15,159,36,35,36,28,248,22, -75,248,22,69,194,248,22,68,193,249,22,130,4,80,158,38,35,251,22,77,2, +22,69,248,22,143,4,196,28,248,22,75,193,20,15,159,36,35,36,28,248,22, +75,248,22,69,194,248,22,68,193,249,22,136,4,80,158,38,35,251,22,77,2, 16,248,22,68,199,249,22,67,2,4,248,22,69,201,11,18,16,2,101,10,8, 31,8,30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118, 49,50,57,54,48,16,4,11,11,2,19,3,1,8,101,110,118,49,50,57,54, 49,93,8,224,43,79,0,0,95,9,8,224,43,79,0,0,2,1,27,248,22, -69,248,22,137,4,196,28,248,22,75,193,20,15,159,36,35,36,28,248,22,75, -248,22,69,194,248,22,68,193,249,22,130,4,80,158,38,35,250,22,77,2,20, +69,248,22,143,4,196,28,248,22,75,193,20,15,159,36,35,36,28,248,22,75, +248,22,69,194,248,22,68,193,249,22,136,4,80,158,38,35,250,22,77,2,20, 248,22,77,249,22,77,248,22,77,2,21,248,22,68,201,251,22,77,2,16,2, 21,2,21,249,22,67,2,7,248,22,69,204,18,16,2,101,11,8,31,8,30, 8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118,49,50,57, 54,51,16,4,11,11,2,19,3,1,8,101,110,118,49,50,57,54,52,93,8, -224,44,79,0,0,95,9,8,224,44,79,0,0,2,1,248,22,137,4,193,27, -248,22,137,4,194,249,22,67,248,22,77,248,22,68,196,248,22,69,195,27,248, -22,69,248,22,137,4,23,197,1,249,22,130,4,80,158,38,35,28,248,22,53, -248,22,131,4,248,22,68,23,198,2,27,249,22,2,32,0,89,162,8,44,36, -42,9,222,33,39,248,22,137,4,248,22,92,23,200,2,250,22,77,2,22,248, +224,44,79,0,0,95,9,8,224,44,79,0,0,2,1,248,22,143,4,193,27, +248,22,143,4,194,249,22,67,248,22,77,248,22,68,196,248,22,69,195,27,248, +22,69,248,22,143,4,23,197,1,249,22,136,4,80,158,38,35,28,248,22,53, +248,22,137,4,248,22,68,23,198,2,27,249,22,2,32,0,89,162,8,44,36, +42,9,222,33,39,248,22,143,4,248,22,92,23,200,2,250,22,77,2,22,248, 22,77,249,22,77,248,22,77,248,22,68,23,204,2,250,22,78,2,23,249,22, 2,22,68,23,204,2,248,22,94,23,206,2,249,22,67,248,22,68,23,202,1, 249,22,2,22,92,23,200,1,250,22,78,2,20,249,22,2,32,0,89,162,8, -44,36,46,9,222,33,40,248,22,137,4,248,22,68,201,248,22,69,198,27,248, -22,137,4,194,249,22,67,248,22,77,248,22,68,196,248,22,69,195,27,248,22, -69,248,22,137,4,23,197,1,249,22,130,4,80,158,38,35,250,22,78,2,22, -249,22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,137,4,248,22, -68,201,248,22,69,198,27,248,22,69,248,22,137,4,196,27,248,22,137,4,248, -22,68,195,249,22,130,4,80,158,39,35,28,248,22,75,195,250,22,78,2,20, +44,36,46,9,222,33,40,248,22,143,4,248,22,68,201,248,22,69,198,27,248, +22,143,4,194,249,22,67,248,22,77,248,22,68,196,248,22,69,195,27,248,22, +69,248,22,143,4,23,197,1,249,22,136,4,80,158,38,35,250,22,78,2,22, +249,22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,143,4,248,22, +68,201,248,22,69,198,27,248,22,69,248,22,143,4,196,27,248,22,143,4,248, +22,68,195,249,22,136,4,80,158,39,35,28,248,22,75,195,250,22,78,2,20, 9,248,22,69,199,250,22,77,2,11,248,22,77,248,22,68,199,250,22,78,2, -5,248,22,69,201,248,22,69,202,27,248,22,69,248,22,137,4,23,197,1,27, -249,22,1,22,81,249,22,2,22,137,4,248,22,137,4,248,22,68,199,249,22, -130,4,80,158,39,35,251,22,77,1,22,119,105,116,104,45,99,111,110,116,105, +5,248,22,69,201,248,22,69,202,27,248,22,69,248,22,143,4,23,197,1,27, +249,22,1,22,81,249,22,2,22,143,4,248,22,143,4,248,22,68,199,249,22, +136,4,80,158,39,35,251,22,77,1,22,119,105,116,104,45,99,111,110,116,105, 110,117,97,116,105,111,110,45,109,97,114,107,2,24,250,22,78,1,23,101,120, 116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, 21,95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107, 45,115,101,116,45,102,105,114,115,116,11,2,24,201,250,22,78,2,20,9,248, -22,69,203,27,248,22,69,248,22,137,4,196,28,248,22,75,193,20,15,159,36, -35,36,249,22,130,4,80,158,38,35,27,248,22,137,4,248,22,68,197,28,249, -22,167,8,62,61,62,248,22,131,4,248,22,92,196,250,22,77,2,20,248,22, +22,69,203,27,248,22,69,248,22,143,4,196,28,248,22,75,193,20,15,159,36, +35,36,249,22,136,4,80,158,38,35,27,248,22,143,4,248,22,68,197,28,249, +22,173,8,62,61,62,248,22,137,4,248,22,92,196,250,22,77,2,20,248,22, 77,249,22,77,21,93,2,25,248,22,68,199,250,22,78,2,8,249,22,77,2, 25,249,22,77,248,22,101,203,2,25,248,22,69,202,251,22,77,2,16,28,249, -22,167,8,248,22,131,4,248,22,68,200,64,101,108,115,101,10,248,22,68,197, +22,173,8,248,22,137,4,248,22,68,200,64,101,108,115,101,10,248,22,68,197, 250,22,78,2,20,9,248,22,69,200,249,22,67,2,8,248,22,69,202,100,8, 31,8,30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118, 49,50,57,56,54,16,4,11,11,2,19,3,1,8,101,110,118,49,50,57,56, 55,93,8,224,45,79,0,0,18,16,2,158,94,10,64,118,111,105,100,8,47, -95,9,8,224,45,79,0,0,2,1,27,248,22,69,248,22,137,4,196,249,22, -130,4,80,158,38,35,28,248,22,53,248,22,131,4,248,22,68,197,250,22,77, -2,26,248,22,77,248,22,68,199,248,22,92,198,27,248,22,131,4,248,22,68, +95,9,8,224,45,79,0,0,2,1,27,248,22,69,248,22,143,4,196,249,22, +136,4,80,158,38,35,28,248,22,53,248,22,137,4,248,22,68,197,250,22,77, +2,26,248,22,77,248,22,68,199,248,22,92,198,27,248,22,137,4,248,22,68, 197,250,22,77,2,26,248,22,77,248,22,68,197,250,22,78,2,23,248,22,69, 199,248,22,69,202,159,35,20,102,159,35,16,1,11,16,0,83,158,41,20,100, 144,69,35,37,109,105,110,45,115,116,120,2,1,11,11,11,10,35,80,158,35, @@ -90,16 +90,16 @@ 44,36,57,9,223,0,33,41,35,20,102,159,35,16,1,2,2,16,0,11,16, 5,2,9,89,162,8,44,36,52,9,223,0,33,43,35,20,102,159,35,16,1, 2,2,16,0,11,16,5,2,5,89,162,8,44,36,53,9,223,0,33,44,35, -20,102,159,35,16,1,2,2,16,0,11,16,5,2,3,89,162,8,44,36,54, +20,102,159,35,16,1,2,2,16,0,11,16,5,2,6,89,162,8,44,36,54, 9,223,0,33,45,35,20,102,159,35,16,1,2,2,16,0,11,16,5,2,8, 89,162,8,44,36,57,9,223,0,33,46,35,20,102,159,35,16,1,2,2,16, -1,33,48,11,16,5,2,6,89,162,8,44,36,53,9,223,0,33,49,35,20, +1,33,48,11,16,5,2,3,89,162,8,44,36,53,9,223,0,33,49,35,20, 102,159,35,16,1,2,2,16,0,11,16,0,94,2,14,2,15,93,2,14,9, 9,35,0}; EVAL_ONE_SIZED_STR((char *)expr, 2018); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,51,59,0,0,0,1,0,0,13,0,18,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,52,59,0,0,0,1,0,0,13,0,18,0, 35,0,50,0,68,0,84,0,94,0,112,0,132,0,148,0,166,0,197,0,226, 0,248,0,6,1,12,1,26,1,31,1,41,1,49,1,77,1,109,1,154,1, 199,1,223,1,6,2,8,2,65,2,155,3,196,3,31,5,135,5,239,5,100, @@ -131,176 +131,176 @@ 116,101,32,115,116,114,105,110,103,6,36,36,99,97,110,110,111,116,32,97,100, 100,32,97,32,115,117,102,102,105,120,32,116,111,32,97,32,114,111,111,116,32, 112,97,116,104,58,32,5,0,27,20,14,159,80,158,36,50,250,80,158,39,51, -249,22,27,11,80,158,41,50,22,189,12,10,248,22,160,5,23,196,2,28,248, -22,157,6,23,194,2,12,87,94,248,22,171,8,23,194,1,248,80,159,37,53, +249,22,27,11,80,158,41,50,22,131,13,10,248,22,166,5,23,196,2,28,248, +22,163,6,23,194,2,12,87,94,248,22,177,8,23,194,1,248,80,159,37,53, 36,195,28,248,22,75,23,195,2,9,27,248,22,68,23,196,2,27,28,248,22, -171,13,23,195,2,23,194,1,28,248,22,170,13,23,195,2,249,22,172,13,23, -196,1,250,80,158,42,48,248,22,187,13,2,19,11,10,250,80,158,40,48,248, -22,187,13,2,19,23,197,1,10,28,23,193,2,249,22,67,248,22,174,13,249, -22,172,13,23,198,1,247,22,188,13,27,248,22,69,23,200,1,28,248,22,75, -23,194,2,9,27,248,22,68,23,195,2,27,28,248,22,171,13,23,195,2,23, -194,1,28,248,22,170,13,23,195,2,249,22,172,13,23,196,1,250,80,158,47, -48,248,22,187,13,2,19,11,10,250,80,158,45,48,248,22,187,13,2,19,23, -197,1,10,28,23,193,2,249,22,67,248,22,174,13,249,22,172,13,23,198,1, -247,22,188,13,248,80,159,45,52,36,248,22,69,23,199,1,87,94,23,193,1, +177,13,23,195,2,23,194,1,28,248,22,176,13,23,195,2,249,22,178,13,23, +196,1,250,80,158,42,48,248,22,129,14,2,19,11,10,250,80,158,40,48,248, +22,129,14,2,19,23,197,1,10,28,23,193,2,249,22,67,248,22,180,13,249, +22,178,13,23,198,1,247,22,130,14,27,248,22,69,23,200,1,28,248,22,75, +23,194,2,9,27,248,22,68,23,195,2,27,28,248,22,177,13,23,195,2,23, +194,1,28,248,22,176,13,23,195,2,249,22,178,13,23,196,1,250,80,158,47, +48,248,22,129,14,2,19,11,10,250,80,158,45,48,248,22,129,14,2,19,23, +197,1,10,28,23,193,2,249,22,67,248,22,180,13,249,22,178,13,23,198,1, +247,22,130,14,248,80,159,45,52,36,248,22,69,23,199,1,87,94,23,193,1, 248,80,159,43,52,36,248,22,69,23,197,1,87,94,23,193,1,27,248,22,69, 23,198,1,28,248,22,75,23,194,2,9,27,248,22,68,23,195,2,27,28,248, -22,171,13,23,195,2,23,194,1,28,248,22,170,13,23,195,2,249,22,172,13, -23,196,1,250,80,158,45,48,248,22,187,13,2,19,11,10,250,80,158,43,48, -248,22,187,13,2,19,23,197,1,10,28,23,193,2,249,22,67,248,22,174,13, -249,22,172,13,23,198,1,247,22,188,13,248,80,159,43,52,36,248,22,69,23, -199,1,248,80,159,41,52,36,248,22,69,196,27,248,22,147,13,23,195,2,28, -23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,195,2,27,248,22,169, -13,195,28,192,192,248,22,170,13,195,11,87,94,28,28,248,22,148,13,23,195, -2,10,27,248,22,147,13,23,196,2,28,23,193,2,192,87,94,23,193,1,28, -248,22,162,6,23,196,2,27,248,22,169,13,23,197,2,28,23,193,2,192,87, -94,23,193,1,248,22,170,13,23,197,2,11,12,250,22,135,9,76,110,111,114, +22,177,13,23,195,2,23,194,1,28,248,22,176,13,23,195,2,249,22,178,13, +23,196,1,250,80,158,45,48,248,22,129,14,2,19,11,10,250,80,158,43,48, +248,22,129,14,2,19,23,197,1,10,28,23,193,2,249,22,67,248,22,180,13, +249,22,178,13,23,198,1,247,22,130,14,248,80,159,43,52,36,248,22,69,23, +199,1,248,80,159,41,52,36,248,22,69,196,27,248,22,153,13,23,195,2,28, +23,193,2,192,87,94,23,193,1,28,248,22,168,6,23,195,2,27,248,22,175, +13,195,28,192,192,248,22,176,13,195,11,87,94,28,28,248,22,154,13,23,195, +2,10,27,248,22,153,13,23,196,2,28,23,193,2,192,87,94,23,193,1,28, +248,22,168,6,23,196,2,27,248,22,175,13,23,197,2,28,23,193,2,192,87, +94,23,193,1,248,22,176,13,23,197,2,11,12,250,22,141,9,76,110,111,114, 109,97,108,45,112,97,116,104,45,99,97,115,101,6,42,42,112,97,116,104,32, 40,102,111,114,32,97,110,121,32,115,121,115,116,101,109,41,32,111,114,32,118, 97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103,23,197,2,28,28, -248,22,148,13,23,195,2,249,22,167,8,248,22,149,13,23,197,2,2,20,249, -22,167,8,247,22,181,7,2,20,27,28,248,22,162,6,23,196,2,23,195,2, -248,22,171,7,248,22,152,13,23,197,2,28,249,22,136,14,0,21,35,114,120, +248,22,154,13,23,195,2,249,22,173,8,248,22,155,13,23,197,2,2,20,249, +22,173,8,247,22,187,7,2,20,27,28,248,22,168,6,23,196,2,23,195,2, +248,22,177,7,248,22,158,13,23,197,2,28,249,22,142,14,0,21,35,114,120, 34,94,91,92,92,93,91,92,92,93,91,63,93,91,92,92,93,34,23,195,2, -28,248,22,162,6,195,248,22,155,13,195,194,27,248,22,137,7,23,195,1,249, -22,156,13,248,22,174,7,250,22,142,14,0,6,35,114,120,34,47,34,28,249, -22,136,14,0,22,35,114,120,34,91,47,92,92,93,91,46,32,93,43,91,47, -92,92,93,42,36,34,23,201,2,23,199,1,250,22,142,14,0,19,35,114,120, +28,248,22,168,6,195,248,22,161,13,195,194,27,248,22,143,7,23,195,1,249, +22,162,13,248,22,180,7,250,22,148,14,0,6,35,114,120,34,47,34,28,249, +22,142,14,0,22,35,114,120,34,91,47,92,92,93,91,46,32,93,43,91,47, +92,92,93,42,36,34,23,201,2,23,199,1,250,22,148,14,0,19,35,114,120, 34,91,32,46,93,43,40,91,47,92,92,93,42,41,36,34,23,202,1,6,2, -2,92,49,80,159,43,36,37,2,20,28,248,22,162,6,194,248,22,155,13,194, -193,87,94,28,27,248,22,147,13,23,196,2,28,23,193,2,192,87,94,23,193, -1,28,248,22,162,6,23,196,2,27,248,22,169,13,23,197,2,28,23,193,2, -192,87,94,23,193,1,248,22,170,13,23,197,2,11,12,250,22,135,9,23,196, -2,2,21,23,197,2,28,248,22,169,13,23,195,2,12,248,22,165,11,249,22, -174,10,248,22,191,6,250,22,146,7,2,22,23,200,1,23,201,1,247,22,23, -87,94,28,27,248,22,147,13,23,196,2,28,23,193,2,192,87,94,23,193,1, -28,248,22,162,6,23,196,2,27,248,22,169,13,23,197,2,28,23,193,2,192, -87,94,23,193,1,248,22,170,13,23,197,2,11,12,250,22,135,9,23,196,2, -2,21,23,197,2,28,248,22,169,13,23,195,2,12,248,22,165,11,249,22,174, -10,248,22,191,6,250,22,146,7,2,22,23,200,1,23,201,1,247,22,23,87, -94,87,94,28,27,248,22,147,13,23,196,2,28,23,193,2,192,87,94,23,193, -1,28,248,22,162,6,23,196,2,27,248,22,169,13,23,197,2,28,23,193,2, -192,87,94,23,193,1,248,22,170,13,23,197,2,11,12,250,22,135,9,195,2, -21,23,197,2,28,248,22,169,13,23,195,2,12,248,22,165,11,249,22,174,10, -248,22,191,6,250,22,146,7,2,22,199,23,201,1,247,22,23,249,22,3,89, -162,8,44,36,49,9,223,2,33,33,196,248,22,165,11,249,22,140,11,23,196, +2,92,49,80,159,43,36,37,2,20,28,248,22,168,6,194,248,22,161,13,194, +193,87,94,28,27,248,22,153,13,23,196,2,28,23,193,2,192,87,94,23,193, +1,28,248,22,168,6,23,196,2,27,248,22,175,13,23,197,2,28,23,193,2, +192,87,94,23,193,1,248,22,176,13,23,197,2,11,12,250,22,141,9,23,196, +2,2,21,23,197,2,28,248,22,175,13,23,195,2,12,248,22,171,11,249,22, +180,10,248,22,133,7,250,22,152,7,2,22,23,200,1,23,201,1,247,22,23, +87,94,28,27,248,22,153,13,23,196,2,28,23,193,2,192,87,94,23,193,1, +28,248,22,168,6,23,196,2,27,248,22,175,13,23,197,2,28,23,193,2,192, +87,94,23,193,1,248,22,176,13,23,197,2,11,12,250,22,141,9,23,196,2, +2,21,23,197,2,28,248,22,175,13,23,195,2,12,248,22,171,11,249,22,180, +10,248,22,133,7,250,22,152,7,2,22,23,200,1,23,201,1,247,22,23,87, +94,87,94,28,27,248,22,153,13,23,196,2,28,23,193,2,192,87,94,23,193, +1,28,248,22,168,6,23,196,2,27,248,22,175,13,23,197,2,28,23,193,2, +192,87,94,23,193,1,248,22,176,13,23,197,2,11,12,250,22,141,9,195,2, +21,23,197,2,28,248,22,175,13,23,195,2,12,248,22,171,11,249,22,180,10, +248,22,133,7,250,22,152,7,2,22,199,23,201,1,247,22,23,249,22,3,89, +162,8,44,36,49,9,223,2,33,33,196,248,22,171,11,249,22,146,11,23,196, 1,247,22,23,87,94,250,80,159,38,39,36,2,6,196,197,251,80,159,39,41, 36,2,6,32,0,89,162,8,44,36,44,9,222,33,35,197,198,32,37,89,162, 43,41,58,65,99,108,111,111,112,222,33,38,28,248,22,75,23,199,2,87,94, -23,198,1,248,23,196,1,251,22,146,7,2,23,23,199,1,28,248,22,75,23, -203,2,87,94,23,202,1,23,201,1,250,22,1,22,165,13,23,204,1,23,205, -1,23,198,1,27,249,22,165,13,248,22,68,23,202,2,23,199,2,28,248,22, -160,13,23,194,2,27,250,22,1,22,165,13,23,197,1,23,202,2,28,248,22, -160,13,23,194,2,192,87,94,23,193,1,27,248,22,69,23,202,1,28,248,22, -75,23,194,2,87,94,23,193,1,248,23,199,1,251,22,146,7,2,23,23,202, -1,28,248,22,75,23,206,2,87,94,23,205,1,23,204,1,250,22,1,22,165, -13,23,207,1,23,208,1,23,201,1,27,249,22,165,13,248,22,68,23,197,2, -23,202,2,28,248,22,160,13,23,194,2,27,250,22,1,22,165,13,23,197,1, -204,28,248,22,160,13,193,192,253,2,37,203,204,205,206,23,15,248,22,69,201, +23,198,1,248,23,196,1,251,22,152,7,2,23,23,199,1,28,248,22,75,23, +203,2,87,94,23,202,1,23,201,1,250,22,1,22,171,13,23,204,1,23,205, +1,23,198,1,27,249,22,171,13,248,22,68,23,202,2,23,199,2,28,248,22, +166,13,23,194,2,27,250,22,1,22,171,13,23,197,1,23,202,2,28,248,22, +166,13,23,194,2,192,87,94,23,193,1,27,248,22,69,23,202,1,28,248,22, +75,23,194,2,87,94,23,193,1,248,23,199,1,251,22,152,7,2,23,23,202, +1,28,248,22,75,23,206,2,87,94,23,205,1,23,204,1,250,22,1,22,171, +13,23,207,1,23,208,1,23,201,1,27,249,22,171,13,248,22,68,23,197,2, +23,202,2,28,248,22,166,13,23,194,2,27,250,22,1,22,171,13,23,197,1, +204,28,248,22,166,13,193,192,253,2,37,203,204,205,206,23,15,248,22,69,201, 253,2,37,202,203,204,205,206,248,22,69,200,87,94,23,193,1,27,248,22,69, 23,201,1,28,248,22,75,23,194,2,87,94,23,193,1,248,23,198,1,251,22, -146,7,2,23,23,201,1,28,248,22,75,23,205,2,87,94,23,204,1,23,203, -1,250,22,1,22,165,13,23,206,1,23,207,1,23,200,1,27,249,22,165,13, -248,22,68,23,197,2,23,201,2,28,248,22,160,13,23,194,2,27,250,22,1, -22,165,13,23,197,1,203,28,248,22,160,13,193,192,253,2,37,202,203,204,205, -206,248,22,69,201,253,2,37,201,202,203,204,205,248,22,69,200,27,247,22,189, -13,253,2,37,198,199,200,201,202,198,87,95,28,28,248,22,148,13,23,194,2, -10,27,248,22,147,13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248, -22,162,6,23,195,2,27,248,22,169,13,23,196,2,28,23,193,2,192,87,94, -23,193,1,248,22,170,13,23,196,2,11,12,252,22,135,9,23,200,2,2,24, -35,23,198,2,23,199,2,28,28,248,22,162,6,23,195,2,10,248,22,150,7, -23,195,2,87,94,23,194,1,12,252,22,135,9,23,200,2,2,25,36,23,198, -2,23,199,1,91,159,38,11,90,161,38,35,11,248,22,168,13,23,197,2,87, -94,23,195,1,87,94,28,192,12,250,22,136,9,23,201,1,2,26,23,199,1, -249,22,7,194,195,91,159,37,11,90,161,37,35,11,87,95,28,28,248,22,148, -13,23,196,2,10,27,248,22,147,13,23,197,2,28,23,193,2,192,87,94,23, -193,1,28,248,22,162,6,23,197,2,27,248,22,169,13,23,198,2,28,23,193, -2,192,87,94,23,193,1,248,22,170,13,23,198,2,11,12,252,22,135,9,2, -9,2,24,35,23,200,2,23,201,2,28,28,248,22,162,6,23,197,2,10,248, -22,150,7,23,197,2,12,252,22,135,9,2,9,2,25,36,23,200,2,23,201, -2,91,159,38,11,90,161,38,35,11,248,22,168,13,23,199,2,87,94,23,195, -1,87,94,28,192,12,250,22,136,9,2,9,2,26,23,201,2,249,22,7,194, -195,27,249,22,157,13,250,22,141,14,0,20,35,114,120,35,34,40,63,58,91, -46,93,91,94,46,93,42,124,41,36,34,248,22,153,13,23,201,1,28,248,22, -162,6,23,203,2,249,22,174,7,23,204,1,8,63,23,202,1,28,248,22,148, -13,23,199,2,248,22,149,13,23,199,1,87,94,23,198,1,247,22,150,13,28, -248,22,147,13,194,249,22,165,13,195,194,192,91,159,37,11,90,161,37,35,11, -87,95,28,28,248,22,148,13,23,196,2,10,27,248,22,147,13,23,197,2,28, -23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,197,2,27,248,22,169, -13,23,198,2,28,23,193,2,192,87,94,23,193,1,248,22,170,13,23,198,2, -11,12,252,22,135,9,2,10,2,24,35,23,200,2,23,201,2,28,28,248,22, -162,6,23,197,2,10,248,22,150,7,23,197,2,12,252,22,135,9,2,10,2, -25,36,23,200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22,168,13, -23,199,2,87,94,23,195,1,87,94,28,192,12,250,22,136,9,2,10,2,26, -23,201,2,249,22,7,194,195,27,249,22,157,13,249,22,160,7,250,22,142,14, -0,9,35,114,120,35,34,91,46,93,34,248,22,153,13,23,203,1,6,1,1, -95,28,248,22,162,6,23,202,2,249,22,174,7,23,203,1,8,63,23,201,1, -28,248,22,148,13,23,199,2,248,22,149,13,23,199,1,87,94,23,198,1,247, -22,150,13,28,248,22,147,13,194,249,22,165,13,195,194,192,249,247,22,129,5, +152,7,2,23,23,201,1,28,248,22,75,23,205,2,87,94,23,204,1,23,203, +1,250,22,1,22,171,13,23,206,1,23,207,1,23,200,1,27,249,22,171,13, +248,22,68,23,197,2,23,201,2,28,248,22,166,13,23,194,2,27,250,22,1, +22,171,13,23,197,1,203,28,248,22,166,13,193,192,253,2,37,202,203,204,205, +206,248,22,69,201,253,2,37,201,202,203,204,205,248,22,69,200,27,247,22,131, +14,253,2,37,198,199,200,201,202,198,87,95,28,28,248,22,154,13,23,194,2, +10,27,248,22,153,13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248, +22,168,6,23,195,2,27,248,22,175,13,23,196,2,28,23,193,2,192,87,94, +23,193,1,248,22,176,13,23,196,2,11,12,252,22,141,9,23,200,2,2,24, +35,23,198,2,23,199,2,28,28,248,22,168,6,23,195,2,10,248,22,156,7, +23,195,2,87,94,23,194,1,12,252,22,141,9,23,200,2,2,25,36,23,198, +2,23,199,1,91,159,38,11,90,161,38,35,11,248,22,174,13,23,197,2,87, +94,23,195,1,87,94,28,192,12,250,22,142,9,23,201,1,2,26,23,199,1, +249,22,7,194,195,91,159,37,11,90,161,37,35,11,87,95,28,28,248,22,154, +13,23,196,2,10,27,248,22,153,13,23,197,2,28,23,193,2,192,87,94,23, +193,1,28,248,22,168,6,23,197,2,27,248,22,175,13,23,198,2,28,23,193, +2,192,87,94,23,193,1,248,22,176,13,23,198,2,11,12,252,22,141,9,2, +9,2,24,35,23,200,2,23,201,2,28,28,248,22,168,6,23,197,2,10,248, +22,156,7,23,197,2,12,252,22,141,9,2,9,2,25,36,23,200,2,23,201, +2,91,159,38,11,90,161,38,35,11,248,22,174,13,23,199,2,87,94,23,195, +1,87,94,28,192,12,250,22,142,9,2,9,2,26,23,201,2,249,22,7,194, +195,27,249,22,163,13,250,22,147,14,0,20,35,114,120,35,34,40,63,58,91, +46,93,91,94,46,93,42,124,41,36,34,248,22,159,13,23,201,1,28,248,22, +168,6,23,203,2,249,22,180,7,23,204,1,8,63,23,202,1,28,248,22,154, +13,23,199,2,248,22,155,13,23,199,1,87,94,23,198,1,247,22,156,13,28, +248,22,153,13,194,249,22,171,13,195,194,192,91,159,37,11,90,161,37,35,11, +87,95,28,28,248,22,154,13,23,196,2,10,27,248,22,153,13,23,197,2,28, +23,193,2,192,87,94,23,193,1,28,248,22,168,6,23,197,2,27,248,22,175, +13,23,198,2,28,23,193,2,192,87,94,23,193,1,248,22,176,13,23,198,2, +11,12,252,22,141,9,2,10,2,24,35,23,200,2,23,201,2,28,28,248,22, +168,6,23,197,2,10,248,22,156,7,23,197,2,12,252,22,141,9,2,10,2, +25,36,23,200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22,174,13, +23,199,2,87,94,23,195,1,87,94,28,192,12,250,22,142,9,2,10,2,26, +23,201,2,249,22,7,194,195,27,249,22,163,13,249,22,166,7,250,22,148,14, +0,9,35,114,120,35,34,91,46,93,34,248,22,159,13,23,203,1,6,1,1, +95,28,248,22,168,6,23,202,2,249,22,180,7,23,203,1,8,63,23,201,1, +28,248,22,154,13,23,199,2,248,22,155,13,23,199,1,87,94,23,198,1,247, +22,156,13,28,248,22,153,13,194,249,22,171,13,195,194,192,249,247,22,135,5, 194,11,249,80,159,37,46,36,9,9,249,80,159,37,46,36,195,9,27,247,22, -191,13,249,80,158,38,47,28,23,195,2,27,248,22,179,7,6,11,11,80,76, +133,14,249,80,158,38,47,28,23,195,2,27,248,22,185,7,6,11,11,80,76, 84,67,79,76,76,69,67,84,83,28,192,192,6,0,0,6,0,0,27,28,23, -196,1,250,22,165,13,248,22,187,13,69,97,100,100,111,110,45,100,105,114,247, -22,177,7,6,8,8,99,111,108,108,101,99,116,115,11,27,248,80,159,41,52, -36,250,22,81,23,203,1,248,22,77,248,22,187,13,72,99,111,108,108,101,99, +196,1,250,22,171,13,248,22,129,14,69,97,100,100,111,110,45,100,105,114,247, +22,183,7,6,8,8,99,111,108,108,101,99,116,115,11,27,248,80,159,41,52, +36,250,22,81,23,203,1,248,22,77,248,22,129,14,72,99,111,108,108,101,99, 116,115,45,100,105,114,23,204,1,28,193,249,22,67,195,194,192,32,47,89,162, -8,44,38,54,2,18,222,33,48,27,249,22,134,14,23,197,2,23,198,2,28, +8,44,38,54,2,18,222,33,48,27,249,22,140,14,23,197,2,23,198,2,28, 23,193,2,87,94,23,196,1,27,248,22,92,23,195,2,27,27,248,22,101,23, -197,1,27,249,22,134,14,23,201,2,23,196,2,28,23,193,2,87,94,23,194, +197,1,27,249,22,140,14,23,201,2,23,196,2,28,23,193,2,87,94,23,194, 1,27,248,22,92,23,195,2,27,250,2,47,23,203,2,23,204,1,248,22,101, -23,199,1,28,249,22,156,7,23,196,2,2,27,249,22,81,23,202,2,194,249, -22,67,248,22,156,13,23,197,1,194,87,95,23,199,1,23,193,1,28,249,22, -156,7,23,196,2,2,27,249,22,81,23,200,2,9,249,22,67,248,22,156,13, -23,197,1,9,28,249,22,156,7,23,196,2,2,27,249,22,81,197,194,87,94, -23,196,1,249,22,67,248,22,156,13,23,197,1,194,87,94,23,193,1,28,249, -22,156,7,23,198,2,2,27,249,22,81,195,9,87,94,23,194,1,249,22,67, -248,22,156,13,23,199,1,9,87,95,28,28,248,22,150,7,194,10,248,22,162, -6,194,12,250,22,135,9,2,13,6,21,21,98,121,116,101,32,115,116,114,105, +23,199,1,28,249,22,162,7,23,196,2,2,27,249,22,81,23,202,2,194,249, +22,67,248,22,162,13,23,197,1,194,87,95,23,199,1,23,193,1,28,249,22, +162,7,23,196,2,2,27,249,22,81,23,200,2,9,249,22,67,248,22,162,13, +23,197,1,9,28,249,22,162,7,23,196,2,2,27,249,22,81,197,194,87,94, +23,196,1,249,22,67,248,22,162,13,23,197,1,194,87,94,23,193,1,28,249, +22,162,7,23,198,2,2,27,249,22,81,195,9,87,94,23,194,1,249,22,67, +248,22,162,13,23,199,1,9,87,95,28,28,248,22,156,7,194,10,248,22,168, +6,194,12,250,22,141,9,2,13,6,21,21,98,121,116,101,32,115,116,114,105, 110,103,32,111,114,32,115,116,114,105,110,103,196,28,28,248,22,76,195,249,22, -4,22,147,13,196,11,12,250,22,135,9,2,13,6,13,13,108,105,115,116,32, -111,102,32,112,97,116,104,115,197,250,2,47,197,195,28,248,22,162,6,197,248, -22,173,7,197,196,32,50,89,162,8,44,39,57,2,18,222,33,53,32,51,89, +4,22,153,13,196,11,12,250,22,141,9,2,13,6,13,13,108,105,115,116,32, +111,102,32,112,97,116,104,115,197,250,2,47,197,195,28,248,22,168,6,197,248, +22,179,7,197,196,32,50,89,162,8,44,39,57,2,18,222,33,53,32,51,89, 162,8,44,38,54,70,102,111,117,110,100,45,101,120,101,99,222,33,52,28,23, -193,2,91,159,38,11,90,161,38,35,11,248,22,168,13,23,199,2,87,95,23, -195,1,23,194,1,27,28,23,198,2,27,248,22,173,13,23,201,2,28,249,22, -169,8,23,195,2,23,202,2,11,28,248,22,169,13,23,194,2,250,2,51,23, -201,2,23,202,2,249,22,165,13,23,200,2,23,198,1,250,2,51,23,201,2, +193,2,91,159,38,11,90,161,38,35,11,248,22,174,13,23,199,2,87,95,23, +195,1,23,194,1,27,28,23,198,2,27,248,22,179,13,23,201,2,28,249,22, +175,8,23,195,2,23,202,2,11,28,248,22,175,13,23,194,2,250,2,51,23, +201,2,23,202,2,249,22,171,13,23,200,2,23,198,1,250,2,51,23,201,2, 23,202,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22, -147,13,23,196,2,27,249,22,165,13,23,198,2,23,201,2,28,28,248,22,160, -13,193,10,248,22,159,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1, -28,23,199,2,11,27,248,22,173,13,23,202,2,28,249,22,169,8,23,195,2, -23,203,1,11,28,248,22,169,13,23,194,2,250,2,51,23,202,1,23,203,1, -249,22,165,13,23,201,1,23,198,1,250,2,51,201,202,195,194,28,248,22,75, -23,197,2,11,27,248,22,172,13,248,22,68,23,199,2,27,249,22,165,13,23, -196,1,23,197,2,28,248,22,159,13,23,194,2,250,2,51,198,199,195,87,94, +153,13,23,196,2,27,249,22,171,13,23,198,2,23,201,2,28,28,248,22,166, +13,193,10,248,22,165,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1, +28,23,199,2,11,27,248,22,179,13,23,202,2,28,249,22,175,8,23,195,2, +23,203,1,11,28,248,22,175,13,23,194,2,250,2,51,23,202,1,23,203,1, +249,22,171,13,23,201,1,23,198,1,250,2,51,201,202,195,194,28,248,22,75, +23,197,2,11,27,248,22,178,13,248,22,68,23,199,2,27,249,22,171,13,23, +196,1,23,197,2,28,248,22,165,13,23,194,2,250,2,51,198,199,195,87,94, 23,193,1,27,248,22,69,23,200,1,28,248,22,75,23,194,2,11,27,248,22, -172,13,248,22,68,23,196,2,27,249,22,165,13,23,196,1,23,200,2,28,248, -22,159,13,23,194,2,250,2,51,201,202,195,87,94,23,193,1,27,248,22,69, -23,197,1,28,248,22,75,23,194,2,11,27,248,22,172,13,248,22,68,195,27, -249,22,165,13,23,196,1,202,28,248,22,159,13,193,250,2,51,204,205,195,251, -2,50,204,205,206,248,22,69,199,87,95,28,27,248,22,147,13,23,196,2,28, -23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,196,2,27,248,22,169, -13,23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,170,13,23,197,2, -11,12,250,22,135,9,2,14,6,25,25,112,97,116,104,32,111,114,32,115,116, +178,13,248,22,68,23,196,2,27,249,22,171,13,23,196,1,23,200,2,28,248, +22,165,13,23,194,2,250,2,51,201,202,195,87,94,23,193,1,27,248,22,69, +23,197,1,28,248,22,75,23,194,2,11,27,248,22,178,13,248,22,68,195,27, +249,22,171,13,23,196,1,202,28,248,22,165,13,193,250,2,51,204,205,195,251, +2,50,204,205,206,248,22,69,199,87,95,28,27,248,22,153,13,23,196,2,28, +23,193,2,192,87,94,23,193,1,28,248,22,168,6,23,196,2,27,248,22,175, +13,23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,176,13,23,197,2, +11,12,250,22,141,9,2,14,6,25,25,112,97,116,104,32,111,114,32,115,116, 114,105,110,103,32,40,115,97,110,115,32,110,117,108,41,23,197,2,28,28,23, -195,2,28,27,248,22,147,13,23,197,2,28,23,193,2,192,87,94,23,193,1, -28,248,22,162,6,23,197,2,27,248,22,169,13,23,198,2,28,23,193,2,192, -87,94,23,193,1,248,22,170,13,23,198,2,11,248,22,169,13,23,196,2,11, -10,12,250,22,135,9,2,14,6,29,29,35,102,32,111,114,32,114,101,108,97, +195,2,28,27,248,22,153,13,23,197,2,28,23,193,2,192,87,94,23,193,1, +28,248,22,168,6,23,197,2,27,248,22,175,13,23,198,2,28,23,193,2,192, +87,94,23,193,1,248,22,176,13,23,198,2,11,248,22,175,13,23,196,2,11, +10,12,250,22,141,9,2,14,6,29,29,35,102,32,111,114,32,114,101,108,97, 116,105,118,101,32,112,97,116,104,32,111,114,32,115,116,114,105,110,103,23,198, -2,28,28,248,22,169,13,23,195,2,91,159,38,11,90,161,38,35,11,248,22, -168,13,23,198,2,249,22,167,8,194,68,114,101,108,97,116,105,118,101,11,27, -248,22,179,7,6,4,4,80,65,84,72,251,2,50,23,199,1,23,200,1,23, -201,1,28,23,197,2,27,249,80,159,43,47,37,23,200,1,9,28,249,22,167, -8,247,22,181,7,2,20,249,22,67,248,22,156,13,5,1,46,194,192,9,27, -248,22,172,13,23,196,1,28,248,22,159,13,193,250,2,51,198,199,195,11,250, +2,28,28,248,22,175,13,23,195,2,91,159,38,11,90,161,38,35,11,248,22, +174,13,23,198,2,249,22,173,8,194,68,114,101,108,97,116,105,118,101,11,27, +248,22,185,7,6,4,4,80,65,84,72,251,2,50,23,199,1,23,200,1,23, +201,1,28,23,197,2,27,249,80,159,43,47,37,23,200,1,9,28,249,22,173, +8,247,22,187,7,2,20,249,22,67,248,22,162,13,5,1,46,194,192,9,27, +248,22,178,13,23,196,1,28,248,22,165,13,193,250,2,51,198,199,195,11,250, 80,159,38,48,36,196,197,11,250,80,159,38,48,36,196,11,11,87,94,249,22, -153,6,247,22,189,4,195,248,22,179,5,249,22,174,3,35,249,22,158,3,197, +159,6,247,22,131,5,195,248,22,185,5,249,22,180,3,35,249,22,164,3,197, 198,27,28,23,197,2,87,95,23,196,1,23,195,1,23,197,1,87,94,23,197, -1,27,248,22,187,13,2,19,27,249,80,159,40,48,36,23,196,1,11,27,27, -248,22,177,3,23,200,1,28,192,192,35,27,27,248,22,177,3,23,202,1,28, -192,192,35,249,22,156,5,23,197,1,83,158,39,20,97,95,89,162,8,44,35, -47,9,224,3,2,33,57,23,195,1,23,196,1,27,248,22,141,5,23,195,1, +1,27,248,22,129,14,2,19,27,249,80,159,40,48,36,23,196,1,11,27,27, +248,22,183,3,23,200,1,28,192,192,35,27,27,248,22,183,3,23,202,1,28, +192,192,35,249,22,162,5,23,197,1,83,158,39,20,97,95,89,162,8,44,35, +47,9,224,3,2,33,57,23,195,1,23,196,1,27,248,22,147,5,23,195,1, 248,80,159,38,53,36,193,159,35,20,102,159,35,16,1,11,16,0,83,158,41, 20,100,144,67,35,37,117,116,105,108,115,29,11,11,11,11,11,10,42,80,158, 35,35,20,102,159,37,16,17,2,1,2,2,2,3,2,4,2,5,2,6,2, @@ -316,7 +316,7 @@ 83,158,35,16,2,89,162,43,36,48,2,18,223,0,33,28,80,159,35,53,36, 83,158,35,16,2,89,162,8,44,36,55,2,18,223,0,33,29,80,159,35,52, 36,83,158,35,16,2,32,0,89,162,43,36,44,2,1,222,33,30,80,159,35, -35,36,83,158,35,16,2,249,22,164,6,7,92,7,92,80,159,35,36,36,83, +35,36,83,158,35,16,2,249,22,170,6,7,92,7,92,80,159,35,36,36,83, 158,35,16,2,89,162,43,36,53,2,3,223,0,33,31,80,159,35,37,36,83, 158,35,16,2,32,0,89,162,8,44,37,49,2,4,222,33,32,80,159,35,38, 36,83,158,35,16,2,32,0,89,162,8,44,38,50,2,5,222,33,34,80,159, @@ -329,8 +329,8 @@ 11,222,33,43,80,159,35,45,36,83,158,35,16,2,83,158,38,20,96,96,2, 12,89,162,43,35,43,9,223,0,33,44,89,162,43,36,44,9,223,0,33,45, 89,162,43,37,54,9,223,0,33,46,80,159,35,46,36,83,158,35,16,2,27, -248,22,130,14,248,22,173,7,27,28,249,22,167,8,247,22,181,7,2,20,6, -1,1,59,6,1,1,58,250,22,146,7,6,14,14,40,91,94,126,97,93,42, +248,22,136,14,248,22,179,7,27,28,249,22,173,8,247,22,187,7,2,20,6, +1,1,59,6,1,1,58,250,22,152,7,6,14,14,40,91,94,126,97,93,42, 41,126,97,40,46,42,41,23,196,2,23,196,1,89,162,8,44,37,47,2,13, 223,0,33,49,80,159,35,47,36,83,158,35,16,2,83,158,38,20,96,96,2, 14,89,162,8,44,38,53,9,223,0,33,54,89,162,43,37,46,9,223,0,33, @@ -341,7 +341,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 5006); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,51,8,0,0,0,1,0,0,6,0,19,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,52,8,0,0,0,1,0,0,6,0,19,0, 34,0,48,0,62,0,76,0,118,0,0,0,38,1,0,0,65,113,117,111,116, 101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35,37, 110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122, @@ -360,7 +360,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 331); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,51,56,0,0,0,1,0,0,11,0,38,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,52,56,0,0,0,1,0,0,11,0,38,0, 44,0,57,0,66,0,73,0,95,0,117,0,143,0,155,0,173,0,193,0,205, 0,221,0,244,0,0,1,31,1,38,1,43,1,48,1,53,1,58,1,67,1, 72,1,76,1,84,1,93,1,101,1,204,1,249,1,13,2,42,2,73,2,129, @@ -383,48 +383,48 @@ 29,94,2,3,2,5,11,64,98,111,111,116,64,115,101,97,108,64,115,97,109, 101,5,3,46,122,111,6,6,6,110,97,116,105,118,101,64,108,111,111,112,63, 108,105,98,67,105,103,110,111,114,101,100,249,22,14,195,80,159,37,45,37,249, -80,159,37,48,36,195,10,27,28,23,195,2,28,249,22,167,8,23,197,2,80, -158,38,46,87,94,23,195,1,80,158,36,47,27,248,22,176,4,23,197,2,28, -248,22,147,13,23,194,2,91,159,38,11,90,161,38,35,11,248,22,168,13,23, +80,159,37,48,36,195,10,27,28,23,195,2,28,249,22,173,8,23,197,2,80, +158,38,46,87,94,23,195,1,80,158,36,47,27,248,22,182,4,23,197,2,28, +248,22,153,13,23,194,2,91,159,38,11,90,161,38,35,11,248,22,174,13,23, 197,1,87,95,83,160,37,11,80,158,40,46,198,83,160,37,11,80,158,40,47, -192,192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,5,28,192, -192,247,22,188,13,20,14,159,80,158,35,39,250,80,158,38,40,249,22,27,11, -80,158,40,39,22,130,5,28,248,22,147,13,23,198,2,23,197,1,87,94,23, -197,1,247,22,188,13,247,194,250,22,165,13,23,197,1,23,199,1,249,80,158, -42,38,23,198,1,2,22,252,22,165,13,23,199,1,23,201,1,2,23,247,22, -182,7,249,80,158,44,38,23,200,1,80,159,44,35,37,87,94,23,194,1,27, -250,22,182,13,196,11,32,0,89,162,8,44,35,40,9,222,11,28,192,249,22, -67,195,194,11,27,252,22,165,13,23,200,1,23,202,1,2,23,247,22,182,7, -249,80,158,45,38,23,201,1,80,159,45,35,37,27,250,22,182,13,196,11,32, +192,192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,136,5,28,192, +192,247,22,130,14,20,14,159,80,158,35,39,250,80,158,38,40,249,22,27,11, +80,158,40,39,22,136,5,28,248,22,153,13,23,198,2,23,197,1,87,94,23, +197,1,247,22,130,14,247,194,250,22,171,13,23,197,1,23,199,1,249,80,158, +42,38,23,198,1,2,22,252,22,171,13,23,199,1,23,201,1,2,23,247,22, +188,7,249,80,158,44,38,23,200,1,80,159,44,35,37,87,94,23,194,1,27, +250,22,188,13,196,11,32,0,89,162,8,44,35,40,9,222,11,28,192,249,22, +67,195,194,11,27,252,22,171,13,23,200,1,23,202,1,2,23,247,22,188,7, +249,80,158,45,38,23,201,1,80,159,45,35,37,27,250,22,188,13,196,11,32, 0,89,162,8,44,35,40,9,222,11,28,192,249,22,67,195,194,11,249,247,22, -129,14,248,22,68,195,195,27,250,22,165,13,23,198,1,23,200,1,249,80,158, -43,38,23,199,1,2,22,27,250,22,182,13,196,11,32,0,89,162,8,44,35, -40,9,222,11,28,192,249,22,67,195,194,11,249,247,22,128,5,248,22,68,195, -195,249,247,22,128,5,194,195,87,94,28,248,80,158,36,37,23,195,2,12,250, -22,135,9,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100, +135,14,248,22,68,195,195,27,250,22,171,13,23,198,1,23,200,1,249,80,158, +43,38,23,199,1,2,22,27,250,22,188,13,196,11,32,0,89,162,8,44,35, +40,9,222,11,28,192,249,22,67,195,194,11,249,247,22,134,5,248,22,68,195, +195,249,247,22,134,5,194,195,87,94,28,248,80,158,36,37,23,195,2,12,250, +22,141,9,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100, 6,25,25,112,97,116,104,32,111,114,32,118,97,108,105,100,45,112,97,116,104, 32,115,116,114,105,110,103,23,197,2,91,159,41,11,90,161,36,35,11,28,248, -22,171,13,23,201,2,23,200,1,27,247,22,130,5,28,23,193,2,249,22,172, -13,23,203,1,23,195,1,200,90,161,38,36,11,248,22,168,13,23,194,2,87, -94,23,196,1,90,161,36,39,11,28,249,22,167,8,23,196,2,68,114,101,108, +22,177,13,23,201,2,23,200,1,27,247,22,136,5,28,23,193,2,249,22,178, +13,23,203,1,23,195,1,200,90,161,38,36,11,248,22,174,13,23,194,2,87, +94,23,196,1,90,161,36,39,11,28,249,22,173,8,23,196,2,68,114,101,108, 97,116,105,118,101,87,94,23,194,1,2,21,23,194,1,90,161,36,40,11,247, -22,190,13,27,89,162,43,36,49,62,122,111,225,7,5,3,33,31,27,89,162, +22,132,14,27,89,162,43,36,49,62,122,111,225,7,5,3,33,31,27,89,162, 43,36,51,9,225,8,6,4,33,32,27,249,22,5,89,162,8,44,36,46,9, 223,5,33,33,23,203,2,27,28,23,195,1,27,249,22,5,89,162,8,44,36, 52,9,225,13,11,9,33,34,23,205,2,27,28,23,196,2,11,193,28,192,192, -28,193,28,23,196,2,28,249,22,170,3,248,22,69,196,248,22,69,23,199,2, +28,193,28,23,196,2,28,249,22,176,3,248,22,69,196,248,22,69,23,199,2, 193,11,11,11,11,28,23,193,2,249,80,159,47,58,36,202,89,162,43,35,45, 9,224,14,2,33,35,87,94,23,193,1,27,28,23,197,1,27,249,22,5,83, 158,39,20,97,94,89,162,8,44,36,50,9,225,14,12,10,33,36,23,203,1, -23,206,1,27,28,196,11,193,28,192,192,28,193,28,196,28,249,22,170,3,248, +23,206,1,27,28,196,11,193,28,192,192,28,193,28,196,28,249,22,176,3,248, 22,69,196,248,22,69,199,193,11,11,11,11,28,192,249,80,159,48,58,36,203, 89,162,43,35,45,9,224,15,2,33,37,249,80,159,48,58,36,203,89,162,43, 35,44,9,224,15,7,33,38,32,40,89,162,8,44,36,54,2,24,222,33,42, 0,17,35,114,120,34,94,40,46,42,63,41,47,40,46,42,41,36,34,27,249, -22,134,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248, -22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,134,14,2,41,23,196, +22,140,14,2,41,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248, +22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,140,14,2,41,23,196, 2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,27,248, -22,101,23,197,1,27,249,22,134,14,2,41,23,196,2,28,23,193,2,87,94, +22,101,23,197,1,27,249,22,140,14,2,41,23,196,2,28,23,193,2,87,94, 23,194,1,249,22,67,248,22,92,23,196,2,248,2,40,248,22,101,23,197,1, 248,22,77,194,248,22,77,194,248,22,77,194,32,43,89,162,43,36,54,2,24, 222,33,44,28,248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195, @@ -434,95 +434,95 @@ 195,91,159,37,11,90,161,37,35,11,248,2,43,248,22,69,196,249,22,7,249, 22,67,248,22,68,199,196,195,249,22,7,249,22,67,248,22,68,199,196,195,249, 22,7,249,22,67,248,22,68,199,196,195,27,248,2,40,23,195,1,28,194,192, -248,2,43,193,87,95,28,248,22,174,4,195,12,250,22,135,9,2,17,6,20, +248,2,43,193,87,95,28,248,22,180,4,195,12,250,22,141,9,2,17,6,20, 20,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45,112,97,116,104, 197,28,24,193,2,248,24,194,1,195,87,94,23,193,1,12,27,27,250,22,141, -2,80,159,41,42,37,248,22,154,14,247,22,129,12,11,28,23,193,2,192,87, +2,80,159,41,42,37,248,22,160,14,247,22,135,12,11,28,23,193,2,192,87, 94,23,193,1,27,247,22,125,87,94,250,22,139,2,80,159,42,42,37,248,22, -154,14,247,22,129,12,195,192,250,22,139,2,195,198,66,97,116,116,97,99,104, -251,211,197,198,199,10,28,192,250,22,134,9,11,196,195,248,22,132,9,194,28, -249,22,168,6,194,6,1,1,46,2,21,28,249,22,168,6,194,6,2,2,46, -46,62,117,112,192,28,249,22,169,8,248,22,69,23,200,2,23,197,1,28,249, -22,167,8,248,22,68,23,200,2,23,196,1,251,22,132,9,2,17,6,26,26, +160,14,247,22,135,12,195,192,250,22,139,2,195,198,66,97,116,116,97,99,104, +251,211,197,198,199,10,28,192,250,22,140,9,11,196,195,248,22,138,9,194,28, +249,22,174,6,194,6,1,1,46,2,21,28,249,22,174,6,194,6,2,2,46, +46,62,117,112,192,28,249,22,175,8,248,22,69,23,200,2,23,197,1,28,249, +22,173,8,248,22,68,23,200,2,23,196,1,251,22,138,9,2,17,6,26,26, 99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,32,97,116,32,126, 101,58,32,126,101,23,200,1,249,22,2,22,69,248,22,82,249,22,67,23,206, 1,23,202,1,12,12,247,192,20,14,159,80,159,39,44,37,249,22,67,248,22, -154,14,247,22,129,12,23,197,1,20,14,159,80,158,39,39,250,80,158,42,40, -249,22,27,11,80,158,44,39,22,156,4,23,196,1,249,247,22,129,5,23,198, -1,248,22,55,248,22,151,13,23,198,1,87,94,28,28,248,22,147,13,23,196, -2,10,248,22,180,4,23,196,2,12,28,23,197,2,250,22,134,9,11,6,15, +160,14,247,22,135,12,23,197,1,20,14,159,80,158,39,39,250,80,158,42,40, +249,22,27,11,80,158,44,39,22,162,4,23,196,1,249,247,22,135,5,23,198, +1,248,22,55,248,22,157,13,23,198,1,87,94,28,28,248,22,153,13,23,196, +2,10,248,22,186,4,23,196,2,12,28,23,197,2,250,22,140,9,11,6,15, 15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23,200,2,250,22, -135,9,2,17,6,19,19,109,111,100,117,108,101,45,112,97,116,104,32,111,114, -32,112,97,116,104,23,198,2,28,28,248,22,65,23,196,2,249,22,167,8,248, -22,68,23,198,2,2,3,11,248,22,175,4,248,22,92,196,28,28,248,22,65, -23,196,2,249,22,167,8,248,22,68,23,198,2,66,112,108,97,110,101,116,11, +141,9,2,17,6,19,19,109,111,100,117,108,101,45,112,97,116,104,32,111,114, +32,112,97,116,104,23,198,2,28,28,248,22,65,23,196,2,249,22,173,8,248, +22,68,23,198,2,2,3,11,248,22,181,4,248,22,92,196,28,28,248,22,65, +23,196,2,249,22,173,8,248,22,68,23,198,2,66,112,108,97,110,101,116,11, 87,94,28,207,12,20,14,159,80,158,36,51,80,158,36,49,90,161,36,35,10, -249,22,157,4,21,94,2,25,6,18,18,112,108,97,110,101,116,47,114,101,115, +249,22,163,4,21,94,2,25,6,18,18,112,108,97,110,101,116,47,114,101,115, 111,108,118,101,114,46,115,115,1,27,112,108,97,110,101,116,45,109,111,100,117, 108,101,45,110,97,109,101,45,114,101,115,111,108,118,101,114,12,252,212,199,200, 201,202,80,158,41,49,87,94,23,193,1,27,89,162,8,44,36,45,79,115,104, 111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114,223,5,33,48, 27,28,248,22,53,23,198,2,27,250,22,141,2,80,159,42,43,37,249,22,67, -23,203,2,247,22,189,13,11,28,23,193,2,192,87,94,23,193,1,91,159,37, +23,203,2,247,22,131,14,11,28,23,193,2,192,87,94,23,193,1,91,159,37, 11,90,161,37,35,11,249,80,159,43,48,36,248,22,58,23,203,2,11,27,251, 80,158,46,52,2,17,23,202,1,28,248,22,75,23,199,2,23,199,2,248,22, -68,23,199,2,28,248,22,75,23,199,2,9,248,22,69,23,199,2,249,22,165, +68,23,199,2,28,248,22,75,23,199,2,9,248,22,69,23,199,2,249,22,171, 13,23,195,1,28,248,22,75,23,197,1,87,94,23,197,1,6,7,7,109,97, -105,110,46,115,115,249,22,185,6,23,199,1,6,3,3,46,115,115,28,248,22, -162,6,23,198,2,87,94,23,194,1,27,248,80,159,40,59,36,23,200,2,27, +105,110,46,115,115,249,22,191,6,23,199,1,6,3,3,46,115,115,28,248,22, +168,6,23,198,2,87,94,23,194,1,27,248,80,159,40,59,36,23,200,2,27, 250,22,141,2,80,159,43,43,37,249,22,67,23,204,2,23,199,2,11,28,23, 193,2,192,87,94,23,193,1,91,159,37,11,90,161,37,35,11,249,80,159,44, -48,36,23,203,2,11,250,22,1,22,165,13,23,199,1,249,22,81,249,22,2, +48,36,23,203,2,11,250,22,1,22,171,13,23,199,1,249,22,81,249,22,2, 32,0,89,162,8,44,36,43,9,222,33,49,23,200,1,248,22,77,23,200,1, -28,248,22,147,13,23,198,2,87,94,23,194,1,28,248,22,170,13,23,198,2, +28,248,22,153,13,23,198,2,87,94,23,194,1,28,248,22,176,13,23,198,2, 23,197,2,248,22,77,6,26,26,32,40,97,32,112,97,116,104,32,109,117,115, -116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22,167,8,248,22, +116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,249,22,173,8,248,22, 68,23,200,2,2,25,27,250,22,141,2,80,159,42,43,37,249,22,67,23,203, -2,247,22,189,13,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90, +2,247,22,131,14,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90, 161,37,35,11,249,80,159,44,48,36,248,22,92,23,204,2,11,90,161,36,37, -11,28,248,22,75,248,22,94,23,203,2,28,248,22,75,23,194,2,249,22,136, +11,28,248,22,75,248,22,94,23,203,2,28,248,22,75,23,194,2,249,22,142, 14,0,8,35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197, 2,249,22,81,28,248,22,75,248,22,94,23,207,2,21,93,6,5,5,109,122, 108,105,98,249,22,1,22,81,249,22,2,80,159,50,8,25,36,248,22,94,23, 210,2,23,197,2,28,248,22,75,23,196,2,248,22,77,23,197,2,23,195,2, 251,80,158,48,52,2,17,23,204,1,248,22,68,23,198,2,248,22,69,23,198, -1,249,22,165,13,23,195,1,28,23,198,1,87,94,23,196,1,23,197,1,28, +1,249,22,171,13,23,195,1,28,23,198,1,87,94,23,196,1,23,197,1,28, 248,22,75,23,197,1,87,94,23,197,1,6,7,7,109,97,105,110,46,115,115, -28,249,22,136,14,0,8,35,114,120,34,91,46,93,34,23,199,2,23,197,1, -249,22,185,6,23,199,1,6,3,3,46,115,115,28,249,22,167,8,248,22,68, -23,200,2,64,102,105,108,101,249,22,172,13,248,22,176,13,248,22,92,23,201, -2,248,80,159,41,59,36,23,201,2,12,87,94,28,28,248,22,147,13,23,194, -2,10,248,22,184,7,23,194,2,87,94,23,199,1,12,28,23,199,2,250,22, -134,9,67,114,101,113,117,105,114,101,249,22,146,7,6,17,17,98,97,100,32, +28,249,22,142,14,0,8,35,114,120,34,91,46,93,34,23,199,2,23,197,1, +249,22,191,6,23,199,1,6,3,3,46,115,115,28,249,22,173,8,248,22,68, +23,200,2,64,102,105,108,101,249,22,178,13,248,22,182,13,248,22,92,23,201, +2,248,80,159,41,59,36,23,201,2,12,87,94,28,28,248,22,153,13,23,194, +2,10,248,22,190,7,23,194,2,87,94,23,199,1,12,28,23,199,2,250,22, +140,9,67,114,101,113,117,105,114,101,249,22,152,7,6,17,17,98,97,100,32, 109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2,248,22,68,23, -199,2,6,0,0,23,202,1,87,94,23,199,1,250,22,135,9,2,17,249,22, -146,7,6,13,13,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198, -2,248,22,68,23,199,2,6,0,0,23,200,2,27,28,248,22,184,7,23,195, -2,249,22,189,7,23,196,2,35,249,22,174,13,248,22,175,13,23,197,2,11, -27,28,248,22,184,7,23,196,2,249,22,189,7,23,197,2,36,248,80,158,41, -53,23,195,2,91,159,38,11,90,161,38,35,11,28,248,22,184,7,23,199,2, -250,22,7,2,26,249,22,189,7,23,203,2,37,2,26,248,22,168,13,23,198, -2,87,95,23,195,1,23,193,1,27,28,248,22,184,7,23,200,2,249,22,189, -7,23,201,2,38,249,80,158,46,54,23,197,2,5,0,27,28,248,22,184,7, -23,201,2,249,22,189,7,23,202,2,39,248,22,175,4,23,200,2,27,27,250, -22,141,2,80,159,50,42,37,248,22,154,14,247,22,129,12,11,28,23,193,2, +199,2,6,0,0,23,202,1,87,94,23,199,1,250,22,141,9,2,17,249,22, +152,7,6,13,13,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198, +2,248,22,68,23,199,2,6,0,0,23,200,2,27,28,248,22,190,7,23,195, +2,249,22,131,8,23,196,2,35,249,22,180,13,248,22,181,13,23,197,2,11, +27,28,248,22,190,7,23,196,2,249,22,131,8,23,197,2,36,248,80,158,41, +53,23,195,2,91,159,38,11,90,161,38,35,11,28,248,22,190,7,23,199,2, +250,22,7,2,26,249,22,131,8,23,203,2,37,2,26,248,22,174,13,23,198, +2,87,95,23,195,1,23,193,1,27,28,248,22,190,7,23,200,2,249,22,131, +8,23,201,2,38,249,80,158,46,54,23,197,2,5,0,27,28,248,22,190,7, +23,201,2,249,22,131,8,23,202,2,39,248,22,181,4,23,200,2,27,27,250, +22,141,2,80,159,50,42,37,248,22,160,14,247,22,135,12,11,28,23,193,2, 192,87,94,23,193,1,27,247,22,125,87,94,250,22,139,2,80,159,51,42,37, -248,22,154,14,247,22,129,12,195,192,87,95,28,23,208,1,27,250,22,141,2, +248,22,160,14,247,22,135,12,195,192,87,95,28,23,208,1,27,250,22,141,2, 23,197,2,197,11,28,23,193,1,12,87,95,27,27,28,248,22,17,80,159,50, 45,37,80,159,49,45,37,247,22,19,250,22,25,248,22,23,23,197,2,80,159, -52,44,37,23,196,1,27,248,22,154,14,247,22,129,12,249,22,3,83,158,39, +52,44,37,23,196,1,27,248,22,160,14,247,22,135,12,249,22,3,83,158,39, 20,97,94,89,162,8,44,36,54,9,226,12,11,2,3,33,50,23,195,1,23, 196,1,248,28,248,22,17,80,159,49,45,37,32,0,89,162,43,36,41,9,222, 33,51,80,159,48,8,26,36,89,162,43,35,50,9,227,13,9,8,4,3,33, -52,250,22,139,2,23,197,1,197,10,12,28,28,248,22,184,7,23,202,1,11, -27,248,22,162,6,23,207,2,28,192,192,27,248,22,53,23,208,2,28,192,192, -28,248,22,65,23,208,2,249,22,167,8,248,22,68,23,210,2,2,25,11,250, -22,139,2,80,159,49,43,37,28,248,22,162,6,23,209,2,249,22,67,23,210, +52,250,22,139,2,23,197,1,197,10,12,28,28,248,22,190,7,23,202,1,11, +27,248,22,168,6,23,207,2,28,192,192,27,248,22,53,23,208,2,28,192,192, +28,248,22,65,23,208,2,249,22,173,8,248,22,68,23,210,2,2,25,11,250, +22,139,2,80,159,49,43,37,28,248,22,168,6,23,209,2,249,22,67,23,210, 1,248,80,159,52,59,36,23,212,1,87,94,23,209,1,249,22,67,23,210,1, -247,22,189,13,252,22,186,7,23,208,1,23,207,1,23,205,1,23,203,1,201, +247,22,131,14,252,22,128,8,23,208,1,23,207,1,23,205,1,23,203,1,201, 12,193,87,96,83,160,37,11,80,158,35,49,248,80,158,36,57,249,22,27,11, -80,158,38,51,248,22,155,4,80,159,36,50,37,248,22,129,5,80,159,36,36, -36,248,22,184,12,80,159,36,41,36,83,160,37,11,80,158,35,49,248,80,158, +80,158,38,51,248,22,161,4,80,159,36,50,37,248,22,135,5,80,159,36,36, +36,248,22,190,12,80,159,36,41,36,83,160,37,11,80,158,35,49,248,80,158, 36,57,249,22,27,11,80,158,38,51,159,35,20,102,159,35,16,1,11,16,0, 83,158,41,20,100,144,66,35,37,98,111,111,116,29,11,11,11,11,11,10,37, 80,158,35,35,20,102,159,39,16,23,2,1,2,2,30,2,4,72,112,97,116, @@ -543,7 +543,7 @@ 0,33,28,80,159,35,8,25,36,83,158,35,16,2,89,162,43,36,48,67,103, 101,116,45,100,105,114,223,0,33,29,80,159,35,59,36,83,158,35,16,2,89, 162,43,37,48,68,119,105,116,104,45,100,105,114,223,0,33,30,80,159,35,58, -36,83,158,35,16,2,248,22,181,7,69,115,111,45,115,117,102,102,105,120,80, +36,83,158,35,16,2,248,22,187,7,69,115,111,45,115,117,102,102,105,120,80, 159,35,35,36,83,158,35,16,2,89,162,43,37,59,2,2,223,0,33,39,80, 159,35,36,36,83,158,35,16,2,32,0,89,162,8,44,36,41,2,8,222,192, 80,159,35,41,36,83,158,35,16,2,247,22,128,2,80,159,35,42,36,83,158, diff --git a/src/mzscheme/src/future.c b/src/mzscheme/src/future.c index 44372d4111..bdf43c12d3 100644 --- a/src/mzscheme/src/future.c +++ b/src/mzscheme/src/future.c @@ -163,6 +163,7 @@ static void init_future_thread(struct Scheme_Future_State *fs, int i); #define THREAD_POOL_SIZE 12 #define INITIAL_C_STACK_SIZE 500000 +#define FUTURE_RUNSTACK_SIZE 1000 typedef struct Scheme_Future_State { struct Scheme_Future_Thread_State *pool_threads[THREAD_POOL_SIZE]; @@ -397,7 +398,7 @@ static void init_future_thread(Scheme_Future_State *fs, int i) { Scheme_Object **rs_start, **rs; - long init_runstack_size = 1000; + long init_runstack_size = FUTURE_RUNSTACK_SIZE; rs_start = scheme_alloc_runstack(init_runstack_size); rs = rs_start XFORM_OK_PLUS init_runstack_size; params.runstack_start = rs_start; @@ -565,6 +566,11 @@ Scheme_Object *future(int argc, Scheme_Object *argv[]) scheme_on_demand_generate_lambda(nc, 0, NULL); } + if (ncd->max_let_depth > FUTURE_RUNSTACK_SIZE * sizeof(void*)) { + /* Can't even call it in a future thread */ + ft->status = PENDING_OVERSIZE; + } + ft->code = (void*)ncd->code; pthread_mutex_lock(&fs->future_mutex); @@ -631,7 +637,11 @@ Scheme_Object *touch(int argc, Scheme_Object *argv[]) #endif pthread_mutex_lock(&fs->future_mutex); - if (ft->status == PENDING) { + if ((ft->status == PENDING) || (ft->status == PENDING_OVERSIZE)) { + if (ft->status == PENDING_OVERSIZE) { + scheme_log(scheme_main_logger, SCHEME_LOG_DEBUG, 0, + "future: oversize procedure deferred to runtime thread"); + } ft->status = RUNNING; pthread_mutex_unlock(&fs->future_mutex); @@ -820,7 +830,9 @@ void *worker_thread_future_loop(void *arg) //including runtime calls. //If jitcode asks the runrtime thread to do work, then //a GC can occur. - LOG("Running JIT code at %p...\n", ft->code); + LOG("Running JIT code at %p...\n", ft->code); + + MZ_RUNSTACK = MZ_RUNSTACK_START + fts->runstack_size; scheme_current_thread->error_buf = &newbuf; if (scheme_future_setjmp(newbuf)) { diff --git a/src/mzscheme/src/future.h b/src/mzscheme/src/future.h index a2c8eee44e..e1bad68ffe 100644 --- a/src/mzscheme/src/future.h +++ b/src/mzscheme/src/future.h @@ -34,6 +34,7 @@ typedef void* (*prim_pvoid_pvoid_pvoid_t)(void*, void*); #define RUNNING 1 #define WAITING_FOR_PRIM 2 #define FINISHED 3 +#define PENDING_OVERSIZE 4 #define FSRC_OTHER 0 #define FSRC_RATOR 1 diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index 1880d9773b..a845e2b62b 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -88,6 +88,8 @@ END_XFORM_ARITH; #define WORDS_TO_BYTES(x) ((x) << JIT_LOG_WORD_SIZE) #define MAX_TRY_SHIFT 30 +#define JIT_LOG_DOUBLE_SIZE 3 + /* a mzchar is an int: */ #define LOG_MZCHAR_SIZE 2 @@ -141,9 +143,11 @@ static void *bad_mcar_code, *bad_mcdr_code; static void *bad_set_mcar_code, *bad_set_mcdr_code; static void *bad_unbox_code; static void *bad_vector_length_code; +static void *bad_flvector_length_code; static void *vector_ref_code, *vector_ref_check_index_code, *vector_set_code, *vector_set_check_index_code; static void *string_ref_code, *string_ref_check_index_code, *string_set_code, *string_set_check_index_code; static void *bytes_ref_code, *bytes_ref_check_index_code, *bytes_set_code, *bytes_set_check_index_code; +static void *flvector_ref_check_index_code, *flvector_set_check_index_code; static void *syntax_e_code; void *scheme_on_demand_jit_code; static void *on_demand_jit_arity_code; @@ -3248,7 +3252,9 @@ static int generate_app(Scheme_App_Rec *app, Scheme_Object **alt_rands, int num_ rator = (alt_rands ? alt_rands[0] : app->args[0]); - if (SCHEME_PRIMP(rator)) { + if (no_call == 2) { + direct_prim = 1; + } else if (SCHEME_PRIMP(rator)) { if ((num_rands >= ((Scheme_Primitive_Proc *)rator)->mina) && ((num_rands <= ((Scheme_Primitive_Proc *)rator)->mu.maxa) || (((Scheme_Primitive_Proc *)rator)->mina < 0)) @@ -3594,6 +3600,7 @@ static int is_unboxable_op(Scheme_Object *obj, int flag) if (IS_NAMED_PRIM(obj, "unsafe-flabs")) return 1; if (IS_NAMED_PRIM(obj, "unsafe-fx->fl")) return 1; if (IS_NAMED_PRIM(obj, "unsafe-f64vector-ref")) return 1; + if (IS_NAMED_PRIM(obj, "unsafe-flvector-ref")) return 1; return 0; } @@ -5510,8 +5517,21 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in return 1; } else if (IS_NAMED_PRIM(rator, "vector-length") - || IS_NAMED_PRIM(rator, "unsafe-vector-length")) { + || IS_NAMED_PRIM(rator, "unsafe-vector-length") + || IS_NAMED_PRIM(rator, "flvector-length") + || IS_NAMED_PRIM(rator, "unsafe-flvector-length")) { GC_CAN_IGNORE jit_insn *reffail, *ref; + int unsafe = 0, for_fl = 0; + + if (IS_NAMED_PRIM(rator, "unsafe-vector-length")) { + unsafe = 1; + } else if (IS_NAMED_PRIM(rator, "flvector-length")) { + for_fl = 1; + } else if (IS_NAMED_PRIM(rator, "unsafe-flvector-length")) { + unsafe = 1; + for_fl = 1; + } + LOG_IT(("inlined vector-length\n")); @@ -5522,7 +5542,7 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in mz_runstack_unskipped(jitter, 1); - if (!IS_NAMED_PRIM(rator, "unsafe-vector-length")) { + if (!unsafe) { mz_rs_sync_fail_branch(); __START_TINY_JUMPS__(1); @@ -5530,16 +5550,25 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in __END_TINY_JUMPS__(1); reffail = _jit.x.pc; - (void)jit_calli(bad_vector_length_code); + if (!for_fl) + (void)jit_calli(bad_vector_length_code); + else + (void)jit_calli(bad_flvector_length_code); __START_TINY_JUMPS__(1); mz_patch_branch(ref); jit_ldxi_s(JIT_R1, JIT_R0, &((Scheme_Object *)0x0)->type); - (void)jit_bnei_i(reffail, JIT_R1, scheme_vector_type); + if (!for_fl) + (void)jit_bnei_i(reffail, JIT_R1, scheme_vector_type); + else + (void)jit_bnei_i(reffail, JIT_R1, scheme_flvector_type); __END_TINY_JUMPS__(1); } - (void)jit_ldxi_i(JIT_R0, JIT_R0, &SCHEME_VEC_SIZE(0x0)); + if (!for_fl) + (void)jit_ldxi_i(JIT_R0, JIT_R0, &SCHEME_VEC_SIZE(0x0)); + else + (void)jit_ldxi_l(JIT_R0, JIT_R0, &SCHEME_FLVEC_SIZE(0x0)); jit_lshi_l(JIT_R0, JIT_R0, 1); jit_ori_l(JIT_R0, JIT_R0, 0x1); @@ -5870,7 +5899,8 @@ static int generate_binary_char(mz_jit_state *jitter, Scheme_App3_Rec *app, return 1; } -static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int base_offset, int unsafe) +static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int base_offset, + int for_fl, int unsafe) /* if int_ready, JIT_R1 has num index (for safe mode) and JIT_V1 has pre-computed offset, otherwise JIT_R1 has fixnum index */ { @@ -5887,9 +5917,15 @@ static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int jit_ori_l(JIT_R1, JIT_R1, 0x1); } if (set) { - (void)jit_calli(vector_set_check_index_code); + if (!for_fl) + (void)jit_calli(vector_set_check_index_code); + else + (void)jit_calli(flvector_set_check_index_code); } else { - (void)jit_calli(vector_ref_check_index_code); + if (!for_fl) + (void)jit_calli(vector_ref_check_index_code); + else + (void)jit_calli(flvector_ref_check_index_code); } /* doesn't return */ CHECK_LIMIT(); @@ -5899,8 +5935,13 @@ static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int if (!int_ready) (void)jit_bmci_ul(reffail, JIT_R1, 0x1); jit_ldxi_s(JIT_R2, JIT_R0, &((Scheme_Object *)0x0)->type); - (void)jit_bnei_i(reffail, JIT_R2, scheme_vector_type); - jit_ldxi_i(JIT_R2, JIT_R0, (int)&SCHEME_VEC_SIZE(0x0)); + if (!for_fl) { + (void)jit_bnei_i(reffail, JIT_R2, scheme_vector_type); + jit_ldxi_i(JIT_R2, JIT_R0, (int)&SCHEME_VEC_SIZE(0x0)); + } else { + (void)jit_bnei_i(reffail, JIT_R2, scheme_flvector_type); + jit_ldxi_l(JIT_R2, JIT_R0, (int)&SCHEME_FLVEC_SIZE(0x0)); + } if (!int_ready) { jit_rshi_ul(JIT_V1, JIT_R1, 1); (void)jit_bler_ul(reffail, JIT_R2, JIT_V1); @@ -5908,6 +5949,15 @@ static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int (void)jit_bler_ul(reffail, JIT_R2, JIT_R1); } CHECK_LIMIT(); + + if (for_fl && set) { + jit_ldr_p(JIT_R2, JIT_RUNSTACK); + (void)jit_bmsi_ul(reffail, JIT_R2, 0x1); + jit_ldxi_s(JIT_R2, JIT_R2, &((Scheme_Object *)0x0)->type); + (void)jit_bnei_i(reffail, JIT_R2, scheme_double_type); + CHECK_LIMIT(); + } + __END_TINY_JUMPS__(1); } else { if (!int_ready) @@ -5915,15 +5965,28 @@ static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int } if (!int_ready) { - jit_lshi_ul(JIT_V1, JIT_V1, JIT_LOG_WORD_SIZE); + if (!for_fl) + jit_lshi_ul(JIT_V1, JIT_V1, JIT_LOG_WORD_SIZE); + else + jit_lshi_ul(JIT_V1, JIT_V1, JIT_LOG_DOUBLE_SIZE); jit_addi_p(JIT_V1, JIT_V1, base_offset); } if (set) { jit_ldr_p(JIT_R2, JIT_RUNSTACK); - jit_stxr_p(JIT_V1, JIT_R0, JIT_R2); + if (!for_fl) { + jit_stxr_p(JIT_V1, JIT_R0, JIT_R2); + } else { + jit_ldxi_d_fppush(JIT_FPR0, JIT_R2, &((Scheme_Double *)0x0)->double_val); + jit_stxr_d_fppop(JIT_V1, JIT_R0, JIT_FPR0); + } (void)jit_movi_p(JIT_R0, scheme_void); } else { - jit_ldxr_p(JIT_R0, JIT_R0, JIT_V1); + if (!for_fl) { + jit_ldxr_p(JIT_R0, JIT_R0, JIT_V1); + } else { + jit_ldxr_d_fppush(JIT_FPR0, JIT_R0, JIT_V1); + generate_alloc_double(jitter); + } } return 1; @@ -6166,7 +6229,8 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i || IS_NAMED_PRIM(rator, "string-ref") || IS_NAMED_PRIM(rator, "unsafe-string-ref") || IS_NAMED_PRIM(rator, "bytes-ref") - || IS_NAMED_PRIM(rator, "unsafe-bytes-ref")) { + || IS_NAMED_PRIM(rator, "unsafe-bytes-ref") + || IS_NAMED_PRIM(rator, "flvector-ref")) { int simple; int which, unsafe = 0, base_offset = ((int)&SCHEME_VEC_ELS(0x0)); @@ -6175,6 +6239,9 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i else if (IS_NAMED_PRIM(rator, "unsafe-vector-ref")) { which = 0; unsafe = 1; + } else if (IS_NAMED_PRIM(rator, "flvector-ref")) { + which = 3; + base_offset = ((int)&SCHEME_FLVEC_ELS(0x0)); } else if (IS_NAMED_PRIM(rator, "unsafe-struct-ref")) { which = 0; unsafe = 1; @@ -6204,7 +6271,11 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i if (!which) { /* vector-ref is relatively simple and worth inlining */ - generate_vector_op(jitter, 0, 0, base_offset, unsafe); + generate_vector_op(jitter, 0, 0, base_offset, 0, unsafe); + CHECK_LIMIT(); + } else if (which == 3) { + /* flvector-ref is relatively simple and worth inlining */ + generate_vector_op(jitter, 0, 0, base_offset, 1, unsafe); CHECK_LIMIT(); } else if (which == 1) { if (unsafe) { @@ -6247,12 +6318,18 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i (void)jit_movi_p(JIT_R1, offset); if (!which) offset = base_offset + WORDS_TO_BYTES(offset); + else if (which == 3) + offset = base_offset + (offset * sizeof(double)); else if (which == 1) offset = offset << LOG_MZCHAR_SIZE; jit_movi_l(JIT_V1, offset); if (!which) { /* vector-ref is relatively simple and worth inlining */ - generate_vector_op(jitter, 0, 1, base_offset, unsafe); + generate_vector_op(jitter, 0, 1, base_offset, 0, unsafe); + CHECK_LIMIT(); + } else if (which == 3) { + /* flvector-ref is relatively simple and worth inlining */ + generate_vector_op(jitter, 0, 1, base_offset, 1, unsafe); CHECK_LIMIT(); } else if (which == 1) { if (unsafe) { @@ -6281,18 +6358,27 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i } return 1; - } else if (IS_NAMED_PRIM(rator, "unsafe-f64vector-ref")) { + } else if (IS_NAMED_PRIM(rator, "unsafe-f64vector-ref") + || IS_NAMED_PRIM(rator, "unsafe-flvector-ref")) { int fpr0, unbox = jitter->unbox; + int is_f64; + is_f64 = IS_NAMED_PRIM(rator, "unsafe-f64vector-ref"); + jitter->unbox = 0; /* no unboxing of vector and index arguments */ generate_two_args(app->rand1, app->rand2, jitter, 1, 2); jitter->unbox = unbox; CHECK_LIMIT(); - jit_ldxi_p(JIT_R0, JIT_R0, (long)&(((Scheme_Structure *)0x0)->slots[0])); - jit_ldxi_p(JIT_R0, JIT_R0, (long)&SCHEME_CPTR_VAL(0x0)); + if (is_f64) { + jit_ldxi_p(JIT_R0, JIT_R0, (long)&(((Scheme_Structure *)0x0)->slots[0])); + jit_ldxi_p(JIT_R0, JIT_R0, (long)&SCHEME_CPTR_VAL(0x0)); + } jit_rshi_ul(JIT_R1, JIT_R1, 1); - jit_lshi_ul(JIT_R1, JIT_R1, 3); /* 3 = log(sizeof(double)) */ + jit_lshi_ul(JIT_R1, JIT_R1, JIT_LOG_DOUBLE_SIZE); + if (!is_f64) { + jit_addi_ul(JIT_R1, JIT_R1, (int)(&SCHEME_FLVEC_ELS(0x0))); + } if (jitter->unbox) fpr0 = JIT_FPR(jitter->unbox_depth); @@ -6485,6 +6571,7 @@ static int generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int } else if (!for_branch) { if (IS_NAMED_PRIM(rator, "vector-set!") || IS_NAMED_PRIM(rator, "unsafe-vector-set!") + || IS_NAMED_PRIM(rator, "flvector-set!") || IS_NAMED_PRIM(rator, "unsafe-struct-set!") || IS_NAMED_PRIM(rator, "string-set!") || IS_NAMED_PRIM(rator, "unsafe-string-set!") @@ -6499,6 +6586,9 @@ static int generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int else if (IS_NAMED_PRIM(rator, "unsafe-vector-set!")) { which = 0; unsafe = 1; + } else if (IS_NAMED_PRIM(rator, "flvector-set!")) { + which = 3; + base_offset = ((int)&SCHEME_FLVEC_ELS(0x0)); } else if (IS_NAMED_PRIM(rator, "unsafe-struct-set!")) { which = 0; unsafe = 1; @@ -6573,7 +6663,11 @@ static int generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int if (!simple) { if (!which) { /* vector-set! is relatively simple and worth inlining */ - generate_vector_op(jitter, 1, 0, base_offset, unsafe); + generate_vector_op(jitter, 1, 0, base_offset, 0, unsafe); + CHECK_LIMIT(); + } else if (which == 3) { + /* flvector-set! is relatively simple and worth inlining */ + generate_vector_op(jitter, 1, 0, base_offset, 1, unsafe); CHECK_LIMIT(); } else if (which == 1) { if (unsafe) { @@ -6605,12 +6699,18 @@ static int generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int (void)jit_movi_p(JIT_R1, offset); if (!which) offset = base_offset + WORDS_TO_BYTES(offset); + else if (which == 3) + offset = base_offset + (offset * sizeof(double)); else if (which == 1) offset = offset << LOG_MZCHAR_SIZE; jit_movi_l(JIT_V1, offset); if (!which) { /* vector-set! is relatively simple and worth inlining */ - generate_vector_op(jitter, 1, 1, base_offset, unsafe); + generate_vector_op(jitter, 1, 1, base_offset, 0, unsafe); + CHECK_LIMIT(); + } else if (which == 3) { + /* flvector-set! is relatively simple and worth inlining */ + generate_vector_op(jitter, 1, 1, base_offset, 1, unsafe); CHECK_LIMIT(); } else if (which == 1) { if (unsafe) { @@ -6641,7 +6741,10 @@ static int generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int mz_runstack_unskipped(jitter, 3 - pushed); return 1; - } else if (IS_NAMED_PRIM(rator, "unsafe-f64vector-set!")) { + } else if (IS_NAMED_PRIM(rator, "unsafe-f64vector-set!") + || IS_NAMED_PRIM(rator, "unsafe-flvector-set!")) { + int is_f64; + is_f64 = IS_NAMED_PRIM(rator, "unsafe-f64vector-set!"); if (can_unbox(app->args[3], 5, JIT_FPR_NUM-1)) { int got_two; if (is_constant_and_avoids_r1(app->args[1]) @@ -6684,10 +6787,15 @@ static int generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int } CHECK_LIMIT(); - jit_ldxi_p(JIT_R0, JIT_R0, (long)&(((Scheme_Structure *)0x0)->slots[0])); - jit_ldxi_p(JIT_R0, JIT_R0, (long)&SCHEME_CPTR_VAL(0x0)); + if (is_f64) { + jit_ldxi_p(JIT_R0, JIT_R0, (long)&(((Scheme_Structure *)0x0)->slots[0])); + jit_ldxi_p(JIT_R0, JIT_R0, (long)&SCHEME_CPTR_VAL(0x0)); + } jit_rshi_ul(JIT_R1, JIT_R1, 1); - jit_lshi_ul(JIT_R1, JIT_R1, 3); /* 3 = log(sizeof(double)) */ + jit_lshi_ul(JIT_R1, JIT_R1, JIT_LOG_DOUBLE_SIZE); + if (!is_f64) { + jit_addi_ul(JIT_R1, JIT_R1, (int)(&SCHEME_FLVEC_ELS(0x0))); + } jit_stxr_d_fppop(JIT_R1, JIT_R0, JIT_FPR0); CHECK_LIMIT(); @@ -8650,6 +8758,16 @@ static int do_generate_common(mz_jit_state *jitter, void *_data) CHECK_LIMIT(); register_sub_func(jitter, bad_vector_length_code, scheme_false); + /* *** bad_flvector_length_code *** */ + /* R0 is argument */ + bad_flvector_length_code = jit_get_ip().ptr; + mz_prolog(JIT_R1); + jit_prepare(1); + jit_pusharg_i(JIT_R0); + (void)mz_finish(ts_scheme_flvector_length); + CHECK_LIMIT(); + register_sub_func(jitter, bad_flvector_length_code, scheme_false); + /* *** call_original_unary_arith_code *** */ /* R0 is arg, R2 is code pointer, V1 is return address */ for (i = 0; i < 3; i++) { @@ -9150,6 +9268,40 @@ static int do_generate_common(mz_jit_state *jitter, void *_data) } } + /* *** {flvector}_{ref,set}_check_index_code *** */ + /* Same calling convention as for vector ops. */ + for (i = 0; i < 2; i++) { + if (!i) { + flvector_ref_check_index_code = jit_get_ip().ptr; + } else { + flvector_set_check_index_code = jit_get_ip().ptr; + } + + mz_prolog(JIT_R2); + + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(2)); + CHECK_RUNSTACK_OVERFLOW(); + jit_str_p(JIT_RUNSTACK, JIT_R0); + jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R1); + if (!i) { + jit_movi_i(JIT_R1, 2); + } else { + /* In set mode, value was already on run stack */ + jit_movi_i(JIT_R1, 3); + } + JIT_UPDATE_THREAD_RSPTR(); + jit_prepare(2); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_i(JIT_R1); + if (!i) { + (void)mz_finish(ts_scheme_checked_flvector_ref); + } else { + (void)mz_finish(ts_scheme_checked_flvector_set); + } + /* does not return */ + } + + /* *** syntax_ecode *** */ /* R0 is (potential) syntax object */ { diff --git a/src/mzscheme/src/jit_ts.c b/src/mzscheme/src/jit_ts.c index a43e0e5827..640e456944 100644 --- a/src/mzscheme/src/jit_ts.c +++ b/src/mzscheme/src/jit_ts.c @@ -60,6 +60,7 @@ define_ts_iS_s(scheme_checked_set_mcar, FSRC_OTHER) define_ts_iS_s(scheme_checked_set_mcdr, FSRC_OTHER) define_ts_s_s(scheme_unbox, FSRC_OTHER) define_ts_s_s(scheme_vector_length, FSRC_OTHER) +define_ts_s_s(scheme_flvector_length, FSRC_OTHER) define_ts_s_s(tail_call_with_values_from_multiple_result, FSRC_OTHER) define_ts_s_v(raise_bad_call_with_values, FSRC_OTHER) define_ts_s_s(call_with_values_from_multiple_result_multi, FSRC_OTHER) @@ -70,6 +71,8 @@ define_ts_iS_s(scheme_checked_string_ref, FSRC_OTHER) define_ts_iS_s(scheme_checked_string_set, FSRC_OTHER) define_ts_iS_s(scheme_checked_byte_string_ref, FSRC_OTHER) define_ts_iS_s(scheme_checked_byte_string_set, FSRC_OTHER) +define_ts_iS_s(scheme_checked_flvector_ref, FSRC_OTHER) +define_ts_iS_s(scheme_checked_flvector_set, FSRC_OTHER) define_ts_iS_s(scheme_checked_syntax_e, FSRC_OTHER) define_ts_iS_s(scheme_extract_checked_procedure, FSRC_OTHER) define_ts_S_s(apply_checked_fail, FSRC_OTHER) @@ -120,6 +123,7 @@ define_ts_siS_v(wrong_argument_count, FSRC_OTHER) # define ts_scheme_checked_set_mcdr scheme_checked_set_mcdr # define ts_scheme_unbox scheme_unbox # define ts_scheme_vector_length scheme_vector_length +# define ts_scheme_flvector_length scheme_flvector_length # define ts_tail_call_with_values_from_multiple_result tail_call_with_values_from_multiple_result # define ts_raise_bad_call_with_values raise_bad_call_with_values # define ts_call_with_values_from_multiple_result_multi call_with_values_from_multiple_result_multi @@ -130,6 +134,8 @@ define_ts_siS_v(wrong_argument_count, FSRC_OTHER) # define ts_scheme_checked_string_set scheme_checked_string_set # define ts_scheme_checked_byte_string_ref scheme_checked_byte_string_ref # define ts_scheme_checked_byte_string_set scheme_checked_byte_string_set +# define ts_scheme_checked_flvector_ref scheme_checked_flvector_ref +# define ts_scheme_checked_flvector_set scheme_checked_flvector_set # define ts_scheme_checked_syntax_e scheme_checked_syntax_e # define ts_scheme_extract_checked_procedure scheme_extract_checked_procedure # define ts_apply_checked_fail apply_checked_fail diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index 4e97078bc5..a302d65f43 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -1449,6 +1449,34 @@ static int vector_obj_FIXUP(void *p) { #define vector_obj_IS_CONST_SIZE 0 +static int flvector_obj_SIZE(void *p) { + Scheme_Double_Vector *vec = (Scheme_Double_Vector *)p; + + return + gcBYTES_TO_WORDS((sizeof(Scheme_Double_Vector) + + ((vec->size - 1) * sizeof(double)))); +} + +static int flvector_obj_MARK(void *p) { + Scheme_Double_Vector *vec = (Scheme_Double_Vector *)p; + + return + gcBYTES_TO_WORDS((sizeof(Scheme_Double_Vector) + + ((vec->size - 1) * sizeof(double)))); +} + +static int flvector_obj_FIXUP(void *p) { + Scheme_Double_Vector *vec = (Scheme_Double_Vector *)p; + + return + gcBYTES_TO_WORDS((sizeof(Scheme_Double_Vector) + + ((vec->size - 1) * sizeof(double)))); +} + +#define flvector_obj_IS_ATOMIC 1 +#define flvector_obj_IS_CONST_SIZE 0 + + static int input_port_SIZE(void *p) { return gcBYTES_TO_WORDS(sizeof(Scheme_Input_Port)); diff --git a/src/mzscheme/src/mzmarksrc.c b/src/mzscheme/src/mzmarksrc.c index e850efbb0b..a16deaaff4 100644 --- a/src/mzscheme/src/mzmarksrc.c +++ b/src/mzscheme/src/mzmarksrc.c @@ -546,6 +546,15 @@ vector_obj { + ((vec->size - 1) * sizeof(Scheme_Object *)))); } +flvector_obj { + Scheme_Double_Vector *vec = (Scheme_Double_Vector *)p; + + mark: + size: + gcBYTES_TO_WORDS((sizeof(Scheme_Double_Vector) + + ((vec->size - 1) * sizeof(double)))); +} + input_port { mark: Scheme_Input_Port *ip = (Scheme_Input_Port *)p; diff --git a/src/mzscheme/src/number.c b/src/mzscheme/src/number.c index af7445c20d..5e5f6171f4 100644 --- a/src/mzscheme/src/number.c +++ b/src/mzscheme/src/number.c @@ -98,6 +98,11 @@ static Scheme_Object *angle (int argc, Scheme_Object *argv[]); static Scheme_Object *int_sqrt (int argc, Scheme_Object *argv[]); static Scheme_Object *int_sqrt_rem (int argc, Scheme_Object *argv[]); +static Scheme_Object *flvector (int argc, Scheme_Object *argv[]); +static Scheme_Object *flvector_p (int argc, Scheme_Object *argv[]); +static Scheme_Object *flvector_length (int argc, Scheme_Object *argv[]); +static Scheme_Object *make_flvector (int argc, Scheme_Object *argv[]); + static Scheme_Object *fx_and (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_or (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_xor (int argc, Scheme_Object *argv[]); @@ -108,6 +113,10 @@ static Scheme_Object *fx_to_fl (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_ref (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_set (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_flvector_length (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_flvector_ref (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_flvector_set (int argc, Scheme_Object *argv[]); + static double not_a_number_val; Scheme_Object *scheme_inf_object, *scheme_minus_inf_object, *scheme_nan_object; @@ -284,7 +293,7 @@ scheme_init_number (Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("exact-positive-integer?", p, env); - p = scheme_make_noncm_prim(fixnum_p, "fixnum?", 1, 1); + p = scheme_make_immed_prim(fixnum_p, "fixnum?", 1, 1); SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("fixnum?", p, env); @@ -496,6 +505,39 @@ scheme_init_number (Scheme_Env *env) "inexact->exact", 1, 1, 1), env); + + scheme_add_global_constant("flvector", + scheme_make_prim_w_arity(flvector, + "flvector", + 0, -1), + env); + scheme_add_global_constant("flvector?", + scheme_make_folding_prim(flvector_p, + "flvector?", + 1, 1, 1), + env); + scheme_add_global_constant("make-flvector", + scheme_make_immed_prim(make_flvector, + "make-flvector", + 1, 2), + env); + + p = scheme_make_immed_prim(flvector_length, "flvector-length", 1, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flvector-length", p, env); + + p = scheme_make_immed_prim(scheme_checked_flvector_ref, + "flvector-ref", + 2, 2); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("flvector-ref", p, env); + + p = scheme_make_immed_prim(scheme_checked_flvector_set, + "flvector-set!", + 3, 3); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_NARY_INLINED; + scheme_add_global_constant("flvector-set!", p, env); } void scheme_init_unsafe_number(Scheme_Env *env) @@ -531,19 +573,34 @@ void scheme_init_unsafe_number(Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("unsafe-fx->fl", p, env); - p = scheme_make_noncm_prim(fl_ref, "unsafe-f64vector-ref", + p = scheme_make_immed_prim(fl_ref, "unsafe-f64vector-ref", 2, 2); if (scheme_can_inline_fp_op()) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant("unsafe-f64vector-ref", p, env); - p = scheme_make_noncm_prim(fl_set, "unsafe-f64vector-set!", + p = scheme_make_immed_prim(fl_set, "unsafe-f64vector-set!", 3, 3); if (scheme_can_inline_fp_op()) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_NARY_INLINED; scheme_add_global_constant("unsafe-f64vector-set!", p, env); -} + p = scheme_make_immed_prim(unsafe_flvector_length, "unsafe-flvector-length", + 1, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("unsafe-flvector-length", p, env); + + p = scheme_make_immed_prim(unsafe_flvector_ref, "unsafe-flvector-ref", + 2, 2); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("unsafe-flvector-ref", p, env); + + p = scheme_make_immed_prim(unsafe_flvector_set, "unsafe-flvector-set!", + 3, 3); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_NARY_INLINED; + scheme_add_global_constant("unsafe-flvector-set!", p, env); +} Scheme_Object * @@ -2787,6 +2844,156 @@ long scheme_integer_length(Scheme_Object *n) return SCHEME_INT_VAL(r); } + +/************************************************************************/ +/* flvectors */ +/************************************************************************/ + +static Scheme_Double_Vector *alloc_flvector(long size) +{ + Scheme_Double_Vector *vec; + + vec = (Scheme_Double_Vector *)scheme_malloc_fail_ok(scheme_malloc_atomic_tagged, + sizeof(Scheme_Double_Vector) + + ((size - 1) * sizeof(double))); + vec->so.type = scheme_flvector_type; + vec->size = size; + + return vec; +} + +static Scheme_Object *flvector (int argc, Scheme_Object *argv[]) +{ + int i; + Scheme_Double_Vector *vec; + + for (i = 0; i < argc; i++) { + if (!SCHEME_FLOATP(argv[i])) { + scheme_wrong_type("flvector", "inexact real", i, argc, argv); + return NULL; + } + } + + vec = alloc_flvector(argc); + + for (i = 0; i < argc; i++) { + vec->els[i] = SCHEME_FLOAT_VAL(argv[i]); + } + + return (Scheme_Object *)vec; +} + + +static Scheme_Object *flvector_p (int argc, Scheme_Object *argv[]) +{ + if (SCHEME_FLVECTORP(argv[0])) + return scheme_true; + else + return scheme_false; +} + +static Scheme_Object *make_flvector (int argc, Scheme_Object *argv[]) +{ + Scheme_Double_Vector *vec; + long size; + + if (SCHEME_INTP(argv[0])) + size = SCHEME_INT_VAL(argv[0]); + else if (SCHEME_BIGNUMP(argv[0])) { + if (SCHEME_BIGPOS(argv[0])) { + scheme_raise_out_of_memory("make-flvector", NULL); + return NULL; + } else + size = -1; + } else + size = -1; + + if (size < 0) + scheme_wrong_type("make-flvector", "exact non-negative integer", 0, argc, argv); + + if (argc > 1) { + if (!SCHEME_FLOATP(argv[1])) + scheme_wrong_type("make-flvector", "inexact real", 1, argc, argv); + } + + vec = alloc_flvector(size); + + if (argc > 1) { + int i; + double d = SCHEME_FLOAT_VAL(argv[1]); + for (i = 0; i < size; i++) { + vec->els[i] = d; + } + } + + return (Scheme_Object *)vec; +} + +Scheme_Object *scheme_flvector_length(Scheme_Object *vec) +{ + if (!SCHEME_FLVECTORP(vec)) + scheme_wrong_type("flvector-length", "flvector", 0, 1, &vec); + + return scheme_make_integer(SCHEME_FLVEC_SIZE(vec)); +} + +static Scheme_Object *flvector_length (int argc, Scheme_Object *argv[]) +{ + return scheme_flvector_length(argv[0]); +} + +Scheme_Object *scheme_checked_flvector_ref (int argc, Scheme_Object *argv[]) +{ + double d; + Scheme_Object *vec; + long len, pos; + + vec = argv[0]; + if (!SCHEME_FLVECTORP(vec)) + scheme_wrong_type("flvector-ref", "flvector", 0, argc, argv); + + len = SCHEME_FLVEC_SIZE(vec); + pos = scheme_extract_index("flvector-ref", 1, argc, argv, len, 0); + + if (pos >= len) { + scheme_bad_vec_index("flvector-ref", argv[1], + "flvector", vec, + 0, len); + return NULL; + } + + d = SCHEME_FLVEC_ELS(vec)[pos]; + + return scheme_make_double(d); +} + +Scheme_Object *scheme_checked_flvector_set (int argc, Scheme_Object *argv[]) +{ + Scheme_Object *vec; + long len, pos; + + vec = argv[0]; + if (!SCHEME_FLVECTORP(vec)) + scheme_wrong_type("flvector-set!", "flvector", 0, argc, argv); + + len = SCHEME_FLVEC_SIZE(vec); + pos = scheme_extract_index("flvector-set!", 1, argc, argv, len, 0); + + if (!SCHEME_FLOATP(argv[2])) + scheme_wrong_type("flvector-set!", "inexact real", 2, argc, argv); + + if (pos >= len) { + scheme_bad_vec_index("flvector-set!", argv[1], + "flvector", vec, + 0, len); + return NULL; + } + + SCHEME_FLVEC_ELS(vec)[pos] = SCHEME_FLOAT_VAL(argv[2]); + + return scheme_void; +} + /************************************************************************/ /* Unsafe */ /************************************************************************/ @@ -2848,3 +3055,29 @@ static Scheme_Object *fl_set (int argc, Scheme_Object *argv[]) ((double *)SCHEME_CPTR_VAL(p))[SCHEME_INT_VAL(argv[1])] = SCHEME_DBL_VAL(argv[2]); return scheme_void; } + +static Scheme_Object *unsafe_flvector_length (int argc, Scheme_Object *argv[]) +{ + return scheme_make_integer(SCHEME_FLVEC_SIZE(argv[0])); +} + +static Scheme_Object *unsafe_flvector_ref (int argc, Scheme_Object *argv[]) +{ + long pos; + double d; + + pos = SCHEME_INT_VAL(argv[1]); + d = SCHEME_FLVEC_ELS(argv[0])[pos]; + + return scheme_make_double(d); +} + +static Scheme_Object *unsafe_flvector_set (int argc, Scheme_Object *argv[]) +{ + long pos; + + pos = SCHEME_INT_VAL(argv[1]); + SCHEME_FLVEC_ELS(argv[0])[pos] = SCHEME_FLOAT_VAL(argv[2]); + + return scheme_void; +} diff --git a/src/mzscheme/src/schminc.h b/src/mzscheme/src/schminc.h index ab4f352503..26c15eb7ff 100644 --- a/src/mzscheme/src/schminc.h +++ b/src/mzscheme/src/schminc.h @@ -13,8 +13,8 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 959 -#define EXPECTED_UNSAFE_COUNT 49 +#define EXPECTED_PRIM_COUNT 965 +#define EXPECTED_UNSAFE_COUNT 52 #ifdef MZSCHEME_SOMETHING_OMITTED # undef USE_COMPILED_STARTUP diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 91d1b32c7e..c8fb71f3ac 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -3192,6 +3192,13 @@ Scheme_Object *scheme_checked_byte_string_ref(int argc, Scheme_Object *argv[]); Scheme_Object *scheme_checked_byte_string_set(int argc, Scheme_Object *argv[]); Scheme_Object *scheme_checked_syntax_e(int argc, Scheme_Object **argv); Scheme_Object *scheme_vector_length(Scheme_Object *v); +Scheme_Object *scheme_checked_flvector_ref(int argc, Scheme_Object **argv); +Scheme_Object *scheme_checked_flvector_set(int argc, Scheme_Object **argv); +Scheme_Object *scheme_flvector_length(Scheme_Object *v); + +void scheme_bad_vec_index(char *name, Scheme_Object *i, + const char *what, Scheme_Object *vec, + long bottom, long len); Scheme_Bucket_Table *scheme_make_weak_equal_table(void); diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h index 82a03ebd66..febb42eae0 100644 --- a/src/mzscheme/src/schvers.h +++ b/src/mzscheme/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "4.2.3.3" +#define MZSCHEME_VERSION "4.2.3.4" #define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Z 3 -#define MZSCHEME_VERSION_W 3 +#define MZSCHEME_VERSION_W 4 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W) diff --git a/src/mzscheme/src/stypes.h b/src/mzscheme/src/stypes.h index ea2d45731e..62ac0382b2 100644 --- a/src/mzscheme/src/stypes.h +++ b/src/mzscheme/src/stypes.h @@ -171,84 +171,85 @@ enum { scheme_noninline_proc_type, /* 153 */ scheme_prune_context_type, /* 154 */ scheme_future_type, /* 155 */ + scheme_flvector_type, /* 156 */ #ifdef MZTAG_REQUIRED - _scheme_last_normal_type_, /* 156 */ + _scheme_last_normal_type_, /* 157 */ - scheme_rt_weak_array, /* 157 */ + scheme_rt_weak_array, /* 158 */ - scheme_rt_comp_env, /* 158 */ - scheme_rt_constant_binding, /* 159 */ - scheme_rt_resolve_info, /* 160 */ - scheme_rt_optimize_info, /* 161 */ - scheme_rt_compile_info, /* 162 */ - scheme_rt_cont_mark, /* 163 */ - scheme_rt_saved_stack, /* 164 */ - scheme_rt_reply_item, /* 165 */ - scheme_rt_closure_info, /* 166 */ - scheme_rt_overflow, /* 167 */ - scheme_rt_overflow_jmp, /* 168 */ - scheme_rt_meta_cont, /* 169 */ - scheme_rt_dyn_wind_cell, /* 170 */ - scheme_rt_dyn_wind_info, /* 171 */ - scheme_rt_dyn_wind, /* 172 */ - scheme_rt_dup_check, /* 173 */ - scheme_rt_thread_memory, /* 174 */ - scheme_rt_input_file, /* 175 */ - scheme_rt_input_fd, /* 176 */ - scheme_rt_oskit_console_input, /* 177 */ - scheme_rt_tested_input_file, /* 178 */ - scheme_rt_tested_output_file, /* 179 */ - scheme_rt_indexed_string, /* 180 */ - scheme_rt_output_file, /* 181 */ - scheme_rt_load_handler_data, /* 182 */ - scheme_rt_pipe, /* 183 */ - scheme_rt_beos_process, /* 184 */ - scheme_rt_system_child, /* 185 */ - scheme_rt_tcp, /* 186 */ - scheme_rt_write_data, /* 187 */ - scheme_rt_tcp_select_info, /* 188 */ - scheme_rt_namespace_option, /* 189 */ - scheme_rt_param_data, /* 190 */ - scheme_rt_will, /* 191 */ - scheme_rt_struct_proc_info, /* 192 */ - scheme_rt_linker_name, /* 193 */ - scheme_rt_param_map, /* 194 */ - scheme_rt_finalization, /* 195 */ - scheme_rt_finalizations, /* 196 */ - scheme_rt_cpp_object, /* 197 */ - scheme_rt_cpp_array_object, /* 198 */ - scheme_rt_stack_object, /* 199 */ - scheme_rt_preallocated_object, /* 200 */ - scheme_thread_hop_type, /* 201 */ - scheme_rt_srcloc, /* 202 */ - scheme_rt_evt, /* 203 */ - scheme_rt_syncing, /* 204 */ - scheme_rt_comp_prefix, /* 205 */ - scheme_rt_user_input, /* 206 */ - scheme_rt_user_output, /* 207 */ - scheme_rt_compact_port, /* 208 */ - scheme_rt_read_special_dw, /* 209 */ - scheme_rt_regwork, /* 210 */ - scheme_rt_buf_holder, /* 211 */ - scheme_rt_parameterization, /* 212 */ - scheme_rt_print_params, /* 213 */ - scheme_rt_read_params, /* 214 */ - scheme_rt_native_code, /* 215 */ - scheme_rt_native_code_plus_case, /* 216 */ - scheme_rt_jitter_data, /* 217 */ - scheme_rt_module_exports, /* 218 */ - scheme_rt_delay_load_info, /* 219 */ - scheme_rt_marshal_info, /* 220 */ - scheme_rt_unmarshal_info, /* 221 */ - scheme_rt_runstack, /* 222 */ - scheme_rt_sfs_info, /* 223 */ - scheme_rt_validate_clearing, /* 224 */ - scheme_rt_rb_node, /* 225 */ + scheme_rt_comp_env, /* 159 */ + scheme_rt_constant_binding, /* 160 */ + scheme_rt_resolve_info, /* 161 */ + scheme_rt_optimize_info, /* 162 */ + scheme_rt_compile_info, /* 163 */ + scheme_rt_cont_mark, /* 164 */ + scheme_rt_saved_stack, /* 165 */ + scheme_rt_reply_item, /* 166 */ + scheme_rt_closure_info, /* 167 */ + scheme_rt_overflow, /* 168 */ + scheme_rt_overflow_jmp, /* 169 */ + scheme_rt_meta_cont, /* 170 */ + scheme_rt_dyn_wind_cell, /* 171 */ + scheme_rt_dyn_wind_info, /* 172 */ + scheme_rt_dyn_wind, /* 173 */ + scheme_rt_dup_check, /* 174 */ + scheme_rt_thread_memory, /* 175 */ + scheme_rt_input_file, /* 176 */ + scheme_rt_input_fd, /* 177 */ + scheme_rt_oskit_console_input, /* 178 */ + scheme_rt_tested_input_file, /* 179 */ + scheme_rt_tested_output_file, /* 180 */ + scheme_rt_indexed_string, /* 181 */ + scheme_rt_output_file, /* 182 */ + scheme_rt_load_handler_data, /* 183 */ + scheme_rt_pipe, /* 184 */ + scheme_rt_beos_process, /* 185 */ + scheme_rt_system_child, /* 186 */ + scheme_rt_tcp, /* 187 */ + scheme_rt_write_data, /* 188 */ + scheme_rt_tcp_select_info, /* 189 */ + scheme_rt_namespace_option, /* 190 */ + scheme_rt_param_data, /* 191 */ + scheme_rt_will, /* 192 */ + scheme_rt_struct_proc_info, /* 193 */ + scheme_rt_linker_name, /* 194 */ + scheme_rt_param_map, /* 195 */ + scheme_rt_finalization, /* 196 */ + scheme_rt_finalizations, /* 197 */ + scheme_rt_cpp_object, /* 198 */ + scheme_rt_cpp_array_object, /* 199 */ + scheme_rt_stack_object, /* 200 */ + scheme_rt_preallocated_object, /* 201 */ + scheme_thread_hop_type, /* 202 */ + scheme_rt_srcloc, /* 203 */ + scheme_rt_evt, /* 204 */ + scheme_rt_syncing, /* 205 */ + scheme_rt_comp_prefix, /* 206 */ + scheme_rt_user_input, /* 207 */ + scheme_rt_user_output, /* 208 */ + scheme_rt_compact_port, /* 209 */ + scheme_rt_read_special_dw, /* 210 */ + scheme_rt_regwork, /* 211 */ + scheme_rt_buf_holder, /* 212 */ + scheme_rt_parameterization, /* 213 */ + scheme_rt_print_params, /* 214 */ + scheme_rt_read_params, /* 215 */ + scheme_rt_native_code, /* 216 */ + scheme_rt_native_code_plus_case, /* 217 */ + scheme_rt_jitter_data, /* 218 */ + scheme_rt_module_exports, /* 219 */ + scheme_rt_delay_load_info, /* 220 */ + scheme_rt_marshal_info, /* 221 */ + scheme_rt_unmarshal_info, /* 222 */ + scheme_rt_runstack, /* 223 */ + scheme_rt_sfs_info, /* 224 */ + scheme_rt_validate_clearing, /* 225 */ + scheme_rt_rb_node, /* 226 */ #endif - scheme_place_type, /* 226 */ - scheme_engine_type, /* 227 */ + scheme_place_type, /* 227 */ + scheme_engine_type, /* 228 */ _scheme_last_type_ }; diff --git a/src/mzscheme/src/type.c b/src/mzscheme/src/type.c index 297e0ab71f..5408530458 100644 --- a/src/mzscheme/src/type.c +++ b/src/mzscheme/src/type.c @@ -161,6 +161,7 @@ scheme_init_type () set_name(scheme_syntax_compiler_type, ""); set_name(scheme_macro_type, ""); set_name(scheme_vector_type, ""); + set_name(scheme_flvector_type, ""); set_name(scheme_bignum_type, ""); set_name(scheme_escaping_cont_type, ""); set_name(scheme_sema_type, ""); @@ -540,6 +541,7 @@ void scheme_register_traversers(void) GC_REG_TRAV(scheme_mutable_pair_type, cons_cell); GC_REG_TRAV(scheme_raw_pair_type, cons_cell); GC_REG_TRAV(scheme_vector_type, vector_obj); + GC_REG_TRAV(scheme_flvector_type, flvector_obj); GC_REG_TRAV(scheme_cpointer_type, cpointer_obj); GC_REG_TRAV(scheme_offset_cpointer_type, offset_cpointer_obj); diff --git a/src/mzscheme/src/vector.c b/src/mzscheme/src/vector.c index 3a3d661da4..2818ebdcb2 100644 --- a/src/mzscheme/src/vector.c +++ b/src/mzscheme/src/vector.c @@ -321,27 +321,33 @@ Scheme_Object *scheme_vector_length(Scheme_Object *v) return vector_length(1, a); } -static Scheme_Object * -bad_index(char *name, Scheme_Object *i, Scheme_Object *vec, int bottom) +void scheme_bad_vec_index(char *name, Scheme_Object *i, const char *what, Scheme_Object *vec, + long bottom, long len) { - int n = SCHEME_VEC_SIZE(vec) - 1; - - if (SCHEME_VEC_SIZE(vec)) { + if (len) { + long n = len - 1; char *vstr; int vlen; vstr = scheme_make_provided_string(vec, 2, &vlen); scheme_raise_exn(MZEXN_FAIL_CONTRACT, - "%s: index %s out of range [%d, %d] for vector: %t", + "%s: index %s out of range [%ld, %ld] for %s: %t", name, scheme_make_provided_string(i, 2, NULL), bottom, n, + what, vstr, vlen); } else scheme_raise_exn(MZEXN_FAIL_CONTRACT, - "%s: bad index %s for empty vector", + "%s: bad index %s for empty %s", name, - scheme_make_provided_string(i, 0, NULL)); - + scheme_make_provided_string(i, 0, NULL), + what); +} + +static Scheme_Object * +bad_index(char *name, Scheme_Object *i, Scheme_Object *vec, int bottom) +{ + scheme_bad_vec_index(name, i, "vector", vec, bottom, SCHEME_VEC_SIZE(vec)); return NULL; } diff --git a/src/worksp/mred/mred.manifest b/src/worksp/mred/mred.manifest index 5d8d4648b5..a9be731446 100644 --- a/src/worksp/mred/mred.manifest +++ b/src/worksp/mred/mred.manifest @@ -1,7 +1,7 @@