diff --git a/collects/compiler/decompile.rkt b/collects/compiler/decompile.rkt index 053ad00fb9..48671220a2 100644 --- a/collects/compiler/decompile.rkt +++ b/collects/compiler/decompile.rkt @@ -193,7 +193,12 @@ [(struct toplevel (depth pos const? set-const?)) (list-ref/protect (glob-desc-vars globs) pos 'def-vals)])) ids) - ,(decompile-expr rhs globs stack closed))] + ,(if (inline-variant? rhs) + `(begin + ,(list 'quote '%%inline-variant%%) + ,(decompile-expr (inline-variant-inline rhs) globs stack closed) + ,(decompile-expr (inline-variant-direct rhs) globs stack closed)) + (decompile-expr rhs globs stack closed)))] [(struct def-syntaxes (ids rhs prefix max-let-depth dummy)) `(define-syntaxes ,ids ,(let-values ([(globs defns) (decompile-prefix prefix stx-ht)]) diff --git a/collects/compiler/zo-marshal.rkt b/collects/compiler/zo-marshal.rkt index 22f5d5b95e..bfa9deb811 100644 --- a/collects/compiler/zo-marshal.rkt +++ b/collects/compiler/zo-marshal.rkt @@ -168,10 +168,10 @@ (define apply-values-type-num 24) (define case-lambda-sequence-type-num 25) (define module-type-num 26) -(define variable-type-num 34) -(define top-type-num 99) -(define prefix-type-num 112) -(define free-id-info-type-num 161) +(define inline-variants-type-num 27) +(define variable-type-num 35) +(define prefix-type-num 113) +(define free-id-info-type-num 162) (define-syntax define-enum (syntax-rules () diff --git a/collects/compiler/zo-parse.rkt b/collects/compiler/zo-parse.rkt index 5f47e9cc54..0f8ecde12e 100644 --- a/collects/compiler/zo-parse.rkt +++ b/collects/compiler/zo-parse.rkt @@ -329,6 +329,9 @@ (define (read-module-wrap v) v) +(define (read-inline-variant v) + (make-inline-variant (car v) (cdr v))) + ;; ---------------------------------------- ;; Unmarshal dispatch for various types @@ -355,10 +358,11 @@ [(24) 'apply-values-type] [(25) 'case-lambda-sequence-type] [(26) 'module-type] - [(34) 'variable-type] - [(35) 'module-variable-type] - [(112) 'resolve-prefix-type] - [(161) 'free-id-info-type] + [(27) 'inline-variant-type] + [(35) 'variable-type] + [(36) 'module-variable-type] + [(113) 'resolve-prefix-type] + [(162) 'free-id-info-type] [else (error 'int->type "unknown type: ~e" i)])) (define type-readers @@ -378,6 +382,7 @@ (cons 'case-lambda-sequence-type read-case-lambda) (cons 'begin0-sequence-type read-begin0) (cons 'module-type read-module) + (cons 'inline-variant-type read-inline-variant) (cons 'resolve-prefix-type read-resolve-prefix) (cons 'free-id-info-type read-free-id-info) (cons 'define-values-type read-define-values) diff --git a/collects/compiler/zo-structs.rkt b/collects/compiler/zo-structs.rkt index d1ed02537d..971e7b06c1 100644 --- a/collects/compiler/zo-structs.rkt +++ b/collects/compiler/zo-structs.rkt @@ -94,9 +94,12 @@ [max-let-depth exact-nonnegative-integer?] [dummy (or/c toplevel? #f)])) +(define-form-struct (inline-variant form) ([direct expr?] + [inline expr?])) + ;; Definitions (top level or within module): (define-form-struct (def-values form) ([ids (listof (or/c toplevel? symbol?))] - [rhs (or/c expr? seq? any/c)])) + [rhs (or/c expr? seq? inline-variant? any/c)])) (define-form-struct (def-syntaxes form) ([ids (listof (or/c toplevel? symbol?))] [rhs (or/c expr? seq? any/c)] [prefix prefix?]