reorgnize datatypes of less common bytecode forms

removing a layer of indirection, and setting up
 for an internal reorganization of the compiler code
This commit is contained in:
Matthew Flatt 2011-05-05 20:52:23 -06:00
parent 047c21edb4
commit e9721058fb
15 changed files with 2472 additions and 2459 deletions

View File

@ -149,21 +149,29 @@
;; ----------------------------------------
(define toplevel-type-num 0)
(define syntax-type-num 3)
(define sequence-type-num 7)
(define unclosed-procedure-type-num 9)
(define let-value-type-num 10)
(define let-void-type-num 11)
(define letrec-type-num 12)
(define wcm-type-num 14)
(define quote-syntax-type-num 15)
(define variable-type-num 24)
(define top-type-num 89)
(define case-lambda-sequence-type-num 99)
(define begin0-sequence-type-num 100)
(define module-type-num 103)
(define prefix-type-num 105)
(define free-id-info-type-num 154)
(define sequence-type-num 6)
(define unclosed-procedure-type-num 8)
(define let-value-type-num 9)
(define let-void-type-num 10)
(define letrec-type-num 11)
(define wcm-type-num 13)
(define quote-syntax-type-num 14)
(define define-values-type-num 15)
(define define-syntaxes-type-num 16)
(define define-for-syntax-type-num 17)
(define set-bang-type-num 18)
(define boxenv-type-num 19)
(define begin0-sequence-type-num 20)
(define splice-sequence-type-num 21)
(define require-form-type-num 22)
(define varref-form-type-num 23)
(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-syntax define-enum
(syntax-rules ()
@ -212,21 +220,6 @@
CPT_PREFAB
CPT_LET_ONE_UNUSED)
(define-enum
0
DEFINE_VALUES_EXPD
DEFINE_SYNTAX_EXPD
SET_EXPD
CASE_LAMBDA_EXPD
BEGIN0_EXPD
BOXENV_EXPD
MODULE_EXPD
REQUIRE_EXPD
DEFINE_FOR_SYNTAX_EXPD
REF_EXPD
APPVALS_EXPD
SPLICE_EXPD)
(define CPT_SMALL_NUMBER_START 36)
(define CPT_SMALL_NUMBER_END 60)
@ -271,10 +264,6 @@
#f
#f))
(define-struct case-seq (name lams))
(define-struct (seq0 seq) ())
(define (encode-module-bindings module-bindings)
(define encode-nominal-path
(match-lambda
@ -440,9 +429,6 @@
(out-byte #xF0 out)
(out-bytes (int->bytes n) out)]))
(define (out-syntax key val out)
(out-marshaled syntax-type-num (list* key val) out))
(define (out-marshaled type-num val out)
(if (type-num . < . (- CPT_SMALL_MARSHALLED_END CPT_SMALL_MARSHALLED_START))
(out-byte (+ CPT_SMALL_MARSHALLED_START type-num) out)
@ -541,11 +527,11 @@
[(? mod?)
(out-module v out)]
[(struct def-values (ids rhs))
(out-syntax DEFINE_VALUES_EXPD
(out-marshaled define-values-type-num
(list->vector (cons (protect-quote rhs) ids))
out)]
[(struct def-syntaxes (ids rhs prefix max-let-depth))
(out-syntax DEFINE_SYNTAX_EXPD
(out-marshaled define-syntaxes-type-num
(list->vector (list* (protect-quote rhs)
prefix
max-let-depth
@ -553,22 +539,22 @@
ids))
out)]
[(struct def-for-syntax (ids rhs prefix max-let-depth))
(out-syntax DEFINE_FOR_SYNTAX_EXPD
(out-marshaled define-for-syntax-type-num
(list->vector (list* (protect-quote rhs)
prefix
max-let-depth
*dummy*
ids))
out)]
[(struct seq0 (forms))
[(struct beg0 (forms))
(out-marshaled begin0-sequence-type-num (map protect-quote forms) out)]
[(struct seq (forms))
(out-marshaled sequence-type-num (map protect-quote forms) out)]
[(struct splice (forms))
(out-syntax SPLICE_EXPD (make-seq forms) out)]
(out-marshaled splice-sequence-type-num forms out)]
[(struct req (reqs dummy))
(error "cannot handle top-level `require', yet")
(out-syntax REQUIRE_EXPD (cons dummy reqs) out)]
(out-marshaled require-form-type-num (cons dummy reqs) out)]
[(struct toplevel (depth pos const? ready?))
(out-marshaled toplevel-type-num
(cons
@ -589,7 +575,7 @@
(out-byte CPT_REFERENCE out)
(out-number id out)]
[(struct assign (id rhs undef-ok?))
(out-syntax SET_EXPD
(out-marshaled set-bang-type-num
(cons undef-ok? (cons id rhs))
out)]
[(struct localref (unbox? offset clear? other-clears? flonum?))
@ -617,19 +603,6 @@
[(? lam?)
(out-lam v out)]
[(struct case-lam (name lams))
(let ([seq (make-case-seq name lams)])
;; XXX: This seems like an optimization, which should probably happen somewhere else
;; If all closures are empty, generate a case sequence directly
(if (andmap (lambda (lam)
(or (closure? lam)
(and (lam? lam)
(equal? (lam-closure-map lam) #()))))
lams)
(out-anything seq out)
(out-syntax CASE_LAMBDA_EXPD
seq
out)))]
[(struct case-seq (name lams))
(out-marshaled case-lambda-sequence-type-num
(cons (or name null)
lams)
@ -666,7 +639,7 @@
(protect-quote body))
out)]
[(struct boxenv (pos body))
(out-syntax BOXENV_EXPD
(out-marshaled boxenv-type-num
(cons
pos
(protect-quote body))
@ -687,14 +660,10 @@
(out-anything (protect-quote e) out))
(cons rator rands)))]
[(struct apply-values (proc args-expr))
(out-syntax APPVALS_EXPD
(out-marshaled apply-values-type-num
(cons (protect-quote proc)
(protect-quote args-expr))
out)]
[(struct beg0 (exprs))
(out-syntax BEGIN0_EXPD
(make-seq0 exprs)
out)]
[(struct with-cont-mark (key val body))
(out-marshaled wcm-type-num
(list*
@ -703,7 +672,7 @@
(protect-quote body))
out)]
[(struct varref (expr))
(out-syntax REF_EXPD
(out-marshaled varref-form-type-num
expr
out)]
[(protected-symref v)
@ -823,10 +792,6 @@
(let-values ([(name base) (module-path-index-split v)])
(out-anything name out)
(out-anything base out))]
[(module-decl content)
(out-marshaled module-type-num
content
out)]
[(stx encoded)
(out-byte CPT_STX out)
(out-anything encoded out)]
@ -866,13 +831,10 @@
(out-bytes bstr out)]
[else (error 'out-anything "~s" (current-type-trace))])))))
(define-struct module-decl (content))
(define (out-module mod-form out)
(match mod-form
[(struct mod (name srcname self-modidx prefix provides requires body syntax-body unexported
max-let-depth dummy lang-info internal-context))
(out-syntax MODULE_EXPD
(let* ([lookup-req (lambda (phase)
(let ([a (assq phase requires)])
(if a
@ -956,9 +918,9 @@
[l (cons self-modidx l)]
[l (cons srcname l)]
[l (cons name l)])
(make-module-decl l))
out)]))
(out-marshaled module-type-num
l
out))]))
(define (lookup-encoded-wrapped w out)
(hash-ref! (out-encoded-wraps out) w

View File

@ -200,9 +200,7 @@
(make-case-lam (car v) (cdr v)))
(define (read-begin0 v)
(match v
[(struct seq (exprs))
(make-beg0 exprs)]))
(make-beg0 v))
(define (read-boxenv v)
(make-boxenv (car v) (cdr v)))
@ -213,7 +211,7 @@
(define (read-apply-values v)
(make-apply-values (car v) (cdr v)))
(define (read-splice v)
(make-splice (seq-forms v)))
(make-splice v))
(define (in-list* l n)
(make-do-sequence
@ -303,51 +301,39 @@
;; ----------------------------------------
;; Unmarshal dispatch for various types
(define (read-more-syntax v)
(let ([id (car v)]
[v (cdr v)])
;; This is the ..._EXPD mapping from "schpriv.h":
(case id
[(0) (read-define-values v)]
[(1) (read-define-syntax v)]
[(2) (read-set! v)]
[(3) v] ; a case-lam already
[(4) (read-begin0 v)]
[(5) (read-boxenv v)]
[(6) (read-module-wrap v)]
[(7) (read-require v)]
[(8) (read-define-for-syntax v)]
[(9) (read-#%variable-ref v)]
[(10) (read-apply-values v)]
[(11) (read-splice v)]
[else (error 'read-mode-unsyntax "unknown id: ~e" id)])))
;; Type mappings from "stypes.h":
(define (int->type i)
(case i
[(0) 'toplevel-type]
[(3) 'syntax-type]
[(7) 'sequence-type]
[(9) 'unclosed-procedure-type]
[(10) 'let-value-type]
[(11) 'let-void-type]
[(12) 'letrec-type]
[(14) 'with-cont-mark-type]
[(15) 'quote-syntax-type]
[(24) 'variable-type]
[(25) 'module-variable-type]
[(99) 'case-lambda-sequence-type]
[(100) 'begin0-sequence-type]
[(103) 'module-type]
[(105) 'resolve-prefix-type]
[(154) 'free-id-info-type]
[(6) 'sequence-type]
[(8) 'unclosed-procedure-type]
[(9) 'let-value-type]
[(10) 'let-void-type]
[(11) 'letrec-type]
[(13) 'with-cont-mark-type]
[(14) 'quote-syntax-type]
[(15) 'define-values-type]
[(16) 'define-syntaxes-type]
[(17) 'define-for-syntax-type]
[(18) 'set-bang-type]
[(19) 'boxenv-type]
[(20) 'begin0-sequence-type]
[(21) 'splice-sequence-type]
[(22) 'require-form-type]
[(23) 'varref-form-type]
[(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]
[else (error 'int->type "unknown type: ~e" i)]))
(define type-readers
(make-immutable-hash
(list
(cons 'toplevel-type read-toplevel)
(cons 'syntax-type read-more-syntax)
(cons 'sequence-type read-sequence)
(cons 'unclosed-procedure-type read-unclosed-procedure)
(cons 'let-value-type read-let-value)
@ -359,10 +345,19 @@
(cons 'module-variable-type do-not-read-variable)
(cons 'compilation-top-type read-compilation-top)
(cons 'case-lambda-sequence-type read-case-lambda)
(cons 'begin0-sequence-type read-sequence)
(cons 'begin0-sequence-type read-begin0)
(cons 'module-type read-module)
(cons 'resolve-prefix-type read-resolve-prefix)
(cons 'free-id-info-type read-free-id-info))))
(cons 'free-id-info-type read-free-id-info)
(cons 'define-values-type read-define-values)
(cons 'define-syntaxes-type read-define-syntax)
(cons 'define-for-syntax-type read-define-for-syntax)
(cons 'set-bang-type read-set!)
(cons 'boxenv-type read-boxenv)
(cons 'require-form-type read-require)
(cons 'varref-form-type read-#%variable-ref)
(cons 'apply-values-type read-apply-values)
(cons 'sequence-splice-type read-splice))))
(define (get-reader type)
(hash-ref type-readers type

File diff suppressed because it is too large Load Diff

View File

@ -3744,8 +3744,7 @@ static Scheme_Object *do_optimize_info_lookup(Optimize_Info *info, int pos, int
break;
else
*closure_offset = delta;
} else if (SAME_TYPE(SCHEME_TYPE(n), scheme_compiled_syntax_type)
&& (SCHEME_PINT_VAL(n) == CASE_LAMBDA_EXPD)) {
} else if (SAME_TYPE(SCHEME_TYPE(n), scheme_case_lambda_sequence_type)) {
if (!closure_offset)
break;
else

View File

@ -111,7 +111,8 @@
The fourth pass, "sfs", performs another liveness analysis on stack
slows and inserts operations to clear stack slots as necessary to
make execution safe for space. In particular, dead slots need to be
cleared before a non-tail call into arbitrary Scheme code.
cleared before a non-tail call into arbitrary Scheme code. This pass
can mutate the result of the "resolve" pass.
Just-in-time compilation:
@ -239,12 +240,11 @@ static Scheme_Object *read_application(Scheme_Object *obj);
static Scheme_Object *write_sequence(Scheme_Object *obj);
static Scheme_Object *read_sequence(Scheme_Object *obj);
static Scheme_Object *read_sequence_save_first(Scheme_Object *obj);
static Scheme_Object *read_sequence_splice(Scheme_Object *obj);
static Scheme_Object *write_branch(Scheme_Object *obj);
static Scheme_Object *read_branch(Scheme_Object *obj);
static Scheme_Object *write_with_cont_mark(Scheme_Object *obj);
static Scheme_Object *read_with_cont_mark(Scheme_Object *obj);
static Scheme_Object *write_syntax(Scheme_Object *obj);
static Scheme_Object *read_syntax(Scheme_Object *obj);
static Scheme_Object *write_quote_syntax(Scheme_Object *obj);
static Scheme_Object *read_quote_syntax(Scheme_Object *obj);
@ -366,10 +366,10 @@ scheme_init_eval (Scheme_Env *env)
scheme_install_type_reader(scheme_with_cont_mark_type, read_with_cont_mark);
scheme_install_type_writer(scheme_quote_syntax_type, write_quote_syntax);
scheme_install_type_reader(scheme_quote_syntax_type, read_quote_syntax);
scheme_install_type_writer(scheme_syntax_type, write_syntax);
scheme_install_type_reader(scheme_syntax_type, read_syntax);
scheme_install_type_writer(scheme_begin0_sequence_type, write_sequence);
scheme_install_type_reader(scheme_begin0_sequence_type, read_sequence_save_first);
scheme_install_type_writer(scheme_splice_sequence_type, write_sequence);
scheme_install_type_reader(scheme_splice_sequence_type, read_sequence_splice);
GLOBAL_PRIM_W_ARITY2("eval", eval, 1, 2, 0, -1, env);
GLOBAL_PRIM_W_ARITY2("eval-syntax", eval_stx, 1, 2, 0, -1, env);
@ -787,7 +787,7 @@ int scheme_omittable_expr(Scheme_Object *o, int vals, int fuel, int resolved,
&& (SCHEME_LOCAL_POS(o) > deeper_than))
|| (vtype == scheme_unclosed_procedure_type)
|| (vtype == scheme_compiled_unclosed_procedure_type)
|| ((vtype == scheme_compiled_syntax_type) && (SCHEME_PINT_VAL(o) == CASE_LAMBDA_EXPD))
|| (vtype == scheme_case_lambda_sequence_type)
|| (vtype == scheme_case_lambda_sequence_type)
|| (vtype == scheme_quote_syntax_type)
|| (vtype == scheme_compiled_quote_syntax_type)) {
@ -817,8 +817,7 @@ int scheme_omittable_expr(Scheme_Object *o, int vals, int fuel, int resolved,
}
}
if ((vtype == scheme_syntax_type)
&& (SCHEME_PINT_VAL(o) == CASE_LAMBDA_EXPD)) {
if (vtype == scheme_case_lambda_sequence_type) {
note_match(1, vals, warn_info);
return 1;
}
@ -1804,7 +1803,7 @@ static Scheme_Object *look_for_letv_change(Scheme_Sequence *s)
Scheme_Sequence *naya;
naya = malloc_sequence(nsize);
naya->so.type = scheme_sequence_type;
naya->so.type = s->so.type;
naya->count = nsize;
nv = (Scheme_Object *)naya;
@ -1817,7 +1816,7 @@ static Scheme_Object *look_for_letv_change(Scheme_Sequence *s)
if (esize > 1) {
Scheme_Sequence *e;
e = malloc_sequence(esize);
e->so.type = scheme_sequence_type;
e->so.type = s->so.type;
e->count = esize;
for (i = 0; i < esize; i++) {
@ -1852,30 +1851,6 @@ static Scheme_Object *resolve_sequence(Scheme_Object *o, Resolve_Info *info)
return look_for_letv_change(s);
}
Scheme_Object *scheme_make_syntax_resolved(int idx, Scheme_Object *data)
{
Scheme_Object *v;
v = scheme_alloc_object();
v->type = scheme_syntax_type;
SCHEME_PINT_VAL(v) = idx;
SCHEME_IPTR_VAL(v) = (void *)data;
return v;
}
Scheme_Object *scheme_make_syntax_compiled(int idx, Scheme_Object *data)
{
Scheme_Object *v;
v = scheme_alloc_object();
v->type = scheme_compiled_syntax_type;
SCHEME_PINT_VAL(v) = idx;
SCHEME_IPTR_VAL(v) = (void *)data;
return v;
}
static Scheme_Object *link_module_variable(Scheme_Object *modidx,
Scheme_Object *varname,
int check_access, Scheme_Object *insp,
@ -2073,13 +2048,6 @@ Scheme_Object *scheme_resolve_expr(Scheme_Object *expr, Resolve_Info *info)
: 0));
}
}
case scheme_compiled_syntax_type:
{
Scheme_Syntax_Resolver f;
f = scheme_syntax_resolvers[SCHEME_PINT_VAL(expr)];
return f((Scheme_Object *)SCHEME_IPTR_VAL(expr), info);
}
case scheme_application_type:
return resolve_application(expr, info, 0);
case scheme_application2_type:
@ -2087,6 +2055,8 @@ Scheme_Object *scheme_resolve_expr(Scheme_Object *expr, Resolve_Info *info)
case scheme_application3_type:
return resolve_application3(expr, info, 0);
case scheme_sequence_type:
case scheme_begin0_sequence_type:
case scheme_splice_sequence_type:
return resolve_sequence(expr, info);
case scheme_branch_type:
return resolve_branch(expr, info);
@ -2120,6 +2090,26 @@ Scheme_Object *scheme_resolve_expr(Scheme_Object *expr, Resolve_Info *info)
case scheme_module_variable_type:
scheme_signal_error("got top-level in wrong place");
return 0;
case scheme_define_values_type:
return scheme_define_values_resolve(expr, info);
case scheme_define_syntaxes_type:
return scheme_define_syntaxes_resolve(expr, info);
case scheme_define_for_syntax_type:
return scheme_define_for_syntaxes_resolve(expr, info);
case scheme_set_bang_type:
return scheme_set_resolve(expr, info);
case scheme_require_form_type:
return scheme_top_level_require_resolve(expr, info);
case scheme_varref_form_type:
return scheme_ref_resolve(expr, info);
case scheme_apply_values_type:
return scheme_apply_values_resolve(expr, info);
case scheme_case_lambda_sequence_type:
return scheme_case_lambda_resolve(expr, info);
case scheme_module_type:
return scheme_module_expr_resolve(expr, info);
case scheme_boxenv_type:
scheme_signal_error("internal error: no boxenv resolve");
default:
return expr;
}
@ -2210,10 +2200,6 @@ Scheme_Object *scheme_uncompile_expr(Scheme_Object *expr, Resolve_Prefix *prefix
sprintf(buf, "@!%d", SCHEME_LOCAL_POS(expr));
return scheme_intern_symbol(buf);
}
case scheme_compiled_syntax_type:
{
return scheme_void;
}
case scheme_application_type:
{
Scheme_App_Rec *app = (Scheme_App_Rec *)expr;
@ -2395,22 +2381,18 @@ static int estimate_expr_size(Scheme_Object *expr, int sz, int fuel)
sz += 1;
break;
}
case scheme_compiled_syntax_type:
case scheme_case_lambda_sequence_type:
{
if (SCHEME_PINT_VAL(expr) == CASE_LAMBDA_EXPD) {
int max_sz = sz + 1, a_sz;
Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)SCHEME_IPTR_VAL(expr);
Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)expr;
int i;
for (i = cl->count; i--; ) {
a_sz = estimate_expr_size(cl->array[i], sz, fuel);
if (a_sz > max_sz) max_sz = a_sz;
}
sz = max_sz;
} else {
sz += 1; /* FIXME */
}
break;
}
case scheme_application2_type:
{
Scheme_App2_Rec *app = (Scheme_App2_Rec *)expr;
@ -2490,6 +2472,7 @@ static int estimate_expr_size(Scheme_Object *expr, int sz, int fuel)
}
case scheme_compiled_toplevel_type:
case scheme_compiled_quote_syntax_type:
/* FIXME: other syntax types not covered */
default:
sz += 1;
break;
@ -2686,10 +2669,8 @@ Scheme_Object *optimize_for_inline(Optimize_Info *info, Scheme_Object *le, int a
}
}
if (le
&& SAME_TYPE(SCHEME_TYPE(le), scheme_compiled_syntax_type)
&& (SCHEME_PINT_VAL(le) == CASE_LAMBDA_EXPD)) {
Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)SCHEME_IPTR_VAL(le);
if (le && SAME_TYPE(SCHEME_TYPE(le), scheme_case_lambda_sequence_type)) {
Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)le;
Scheme_Object *cp;
int i, count;
@ -3656,10 +3637,8 @@ static Scheme_Object *lookup_constant_proc(Optimize_Info *info, Scheme_Object *r
}
}
if (c
&& (SAME_TYPE(scheme_compiled_unclosed_procedure_type, SCHEME_TYPE(c))
|| (SAME_TYPE(scheme_compiled_syntax_type, SCHEME_TYPE(c))
&& (SCHEME_PINT_VAL(c) == CASE_LAMBDA_EXPD))))
if (c && (SAME_TYPE(scheme_compiled_unclosed_procedure_type, SCHEME_TYPE(c))
|| SAME_TYPE(scheme_case_lambda_sequence_type, SCHEME_TYPE(c))))
return c;
return NULL;
@ -3930,7 +3909,7 @@ static Scheme_Object *finish_optimize_application3(Scheme_App3_Rec *app, Optimiz
cnt = 1;
cl = NULL;
} else {
cl = (Scheme_Case_Lambda *)SCHEME_IPTR_VAL(proc);
cl = (Scheme_Case_Lambda *)proc;
cnt = cl->count;
}
@ -4119,7 +4098,14 @@ Scheme_Object *scheme_optimize_apply_values(Scheme_Object *f, Scheme_Object *e,
return (Scheme_Object *)app2;
}
return scheme_make_syntax_compiled(APPVALS_EXPD, cons(f, e));
{
Scheme_Object *av;
av = scheme_alloc_object();
av->type = scheme_apply_values_type;
SCHEME_PTR1_VAL(av) = f;
SCHEME_PTR2_VAL(av) = e;
return av;
}
}
static Scheme_Object *optimize_sequence(Scheme_Object *o, Optimize_Info *info, int context)
@ -4164,7 +4150,7 @@ static Scheme_Object *optimize_sequence(Scheme_Object *o, Optimize_Info *info, i
int j = 0;
s2 = malloc_sequence(s->count - drop);
s2->so.type = scheme_sequence_type;
s2->so.type = s->so.type;
s2->count = s->count - drop;
for (i = 0; i < s->count; i++) {
@ -4451,13 +4437,6 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in
return expr;
}
case scheme_compiled_syntax_type:
{
Scheme_Syntax_Optimizer f;
f = scheme_syntax_optimizers[SCHEME_PINT_VAL(expr)];
return f((Scheme_Object *)SCHEME_IPTR_VAL(expr), info, context);
}
case scheme_application_type:
return optimize_application(expr, info, context);
case scheme_application2_type:
@ -4465,6 +4444,7 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in
case scheme_application3_type:
return optimize_application3(expr, info, context);
case scheme_sequence_type:
case scheme_splice_sequence_type:
return optimize_sequence(expr, info, context);
case scheme_branch_type:
return optimize_branch(expr, info, context);
@ -4525,6 +4505,26 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in
case scheme_module_variable_type:
scheme_signal_error("got top-level in wrong place");
return 0;
case scheme_define_values_type:
return scheme_define_values_optimize(expr, info, context);
case scheme_varref_form_type:
return scheme_ref_optimize(expr, info, context);
case scheme_set_bang_type:
return scheme_set_optimize(expr, info, context);
case scheme_define_syntaxes_type:
return scheme_define_syntaxes_optimize(expr, info, context);
case scheme_define_for_syntax_type:
return scheme_define_for_syntaxes_optimize(expr, info, context);
case scheme_case_lambda_sequence_type:
return scheme_case_lambda_optimize(expr, info, context);
case scheme_begin0_sequence_type:
return scheme_begin0_optimize(expr, info, context);
case scheme_apply_values_type:
return scheme_apply_values_optimize(expr, info, context);
case scheme_require_form_type:
return scheme_top_level_require_optimize(expr, info, context);
case scheme_module_type:
return scheme_module_optimize(expr, info, context);
default:
info->size += 1;
return expr;
@ -4552,14 +4552,6 @@ Scheme_Object *scheme_optimize_clone(int dup_ok, Scheme_Object *expr, Optimize_I
}
return expr;
}
case scheme_compiled_syntax_type:
{
Scheme_Syntax_Cloner f;
f = scheme_syntax_cloners[SCHEME_PINT_VAL(expr)];
if (!f) return NULL;
return f(dup_ok, (Scheme_Object *)SCHEME_IPTR_VAL(expr), info, delta, closure_depth);
}
case scheme_application2_type:
{
Scheme_App2_Rec *app = (Scheme_App2_Rec *)expr, *app2;
@ -4673,6 +4665,7 @@ Scheme_Object *scheme_optimize_clone(int dup_ok, Scheme_Object *expr, Optimize_I
}
case scheme_sequence_type:
case scheme_begin0_sequence_type:
case scheme_splice_sequence_type:
{
Scheme_Sequence *seq = (Scheme_Sequence *)expr, *seq2;
int i;
@ -4736,6 +4729,22 @@ Scheme_Object *scheme_optimize_clone(int dup_ok, Scheme_Object *expr, Optimize_I
case scheme_compiled_toplevel_type:
case scheme_compiled_quote_syntax_type:
return expr;
case scheme_define_values_type:
case scheme_define_syntaxes_type:
case scheme_define_for_syntax_type:
case scheme_set_bang_type:
case scheme_boxenv_type:
return NULL;
case scheme_require_form_type:
return NULL;
case scheme_varref_form_type:
return NULL;
case scheme_apply_values_type:
return scheme_apply_values_clone(dup_ok, expr, info, delta, closure_depth);
case scheme_case_lambda_sequence_type:
return scheme_case_lambda_clone(dup_ok, expr, info, delta, closure_depth);
case scheme_module_type:
return NULL;
default:
if (t > _scheme_compiled_values_types_) {
if (dup_ok || scheme_compiled_duplicate_ok(expr))
@ -4766,18 +4775,6 @@ Scheme_Object *scheme_optimize_shift(Scheme_Object *expr, int delta, int after_d
}
return expr;
}
case scheme_compiled_syntax_type:
{
Scheme_Syntax_Shifter f;
f = scheme_syntax_shifters[SCHEME_PINT_VAL(expr)];
if (!f) {
scheme_signal_error("scheme_optimize_shift: no shift available for %d", SCHEME_PINT_VAL(expr));
return NULL;
}
return f((Scheme_Object *)SCHEME_IPTR_VAL(expr), delta, after_depth);
}
case scheme_application_type:
{
Scheme_App_Rec *app = (Scheme_App_Rec *)expr;
@ -4845,6 +4842,7 @@ Scheme_Object *scheme_optimize_shift(Scheme_Object *expr, int delta, int after_d
return (Scheme_Object *)head;
}
case scheme_sequence_type:
case scheme_splice_sequence_type:
case scheme_begin0_sequence_type:
{
Scheme_Sequence *seq = (Scheme_Sequence *)expr;
@ -4892,6 +4890,22 @@ Scheme_Object *scheme_optimize_shift(Scheme_Object *expr, int delta, int after_d
case scheme_compiled_toplevel_type:
case scheme_compiled_quote_syntax_type:
return expr;
case scheme_set_bang_type:
return scheme_set_shift(expr, delta, after_depth);
case scheme_varref_form_type:
return scheme_ref_shift(expr, delta, after_depth);
case scheme_apply_values_type:
return scheme_apply_values_shift(expr, delta, after_depth);
case scheme_case_lambda_sequence_type:
return scheme_case_lambda_shift(expr, delta, after_depth);
case scheme_boxenv_type:
case scheme_define_values_type:
case scheme_define_syntaxes_type:
case scheme_define_for_syntax_type:
case scheme_require_form_type:
case scheme_module_type:
scheme_signal_error("scheme_optimize_shift: no shift available for %d", SCHEME_TYPE(expr));
return NULL;
default:
return expr;
}
@ -5067,10 +5081,7 @@ Scheme_Object *scheme_sfs_add_clears(Scheme_Object *expr, Scheme_Object *clears,
clears = SCHEME_CDR(clears);
}
if (pre)
return (Scheme_Object *)s;
else
return scheme_make_syntax_resolved(BEGIN0_EXPD, (Scheme_Object *)s);
}
static void sfs_note_app(SFS_Info *info, Scheme_Object *rator)
@ -5589,12 +5600,11 @@ static Scheme_Object *sfs_letrec(Scheme_Object *o, SFS_Info *info)
for (i = 0; i < count; i++) {
v = scheme_sfs_expr(procs[i], info, i);
if (SAME_TYPE(SCHEME_TYPE(v), scheme_syntax_type)
&& (SCHEME_PINT_VAL(v) == BEGIN0_EXPD)) {
if (SAME_TYPE(SCHEME_TYPE(v), scheme_begin0_sequence_type)) {
/* Some clearing actions were added to the closure.
Lift them out. */
int j;
Scheme_Sequence *cseq = (Scheme_Sequence *)SCHEME_IPTR_VAL(v);
Scheme_Sequence *cseq = (Scheme_Sequence *)v;
for (j = 1; j < cseq->count; j++) {
int pos;
pos = SCHEME_LOCAL_POS(cseq->array[j]);
@ -5670,18 +5680,6 @@ Scheme_Object *scheme_sfs_expr(Scheme_Object *expr, SFS_Info *info, int closure_
}
}
break;
case scheme_syntax_type:
{
Scheme_Syntax_SFSer f;
Scheme_Object *orig, *naya;
f = scheme_syntax_sfsers[SCHEME_PINT_VAL(expr)];
orig = SCHEME_IPTR_VAL(expr);
naya = f(orig, info);
if (!SAME_OBJ(orig, naya))
expr = naya;
}
break;
case scheme_application_type:
expr = sfs_application(expr, info);
break;
@ -5692,6 +5690,7 @@ Scheme_Object *scheme_sfs_expr(Scheme_Object *expr, SFS_Info *info, int closure_
expr = sfs_application3(expr, info);
break;
case scheme_sequence_type:
case scheme_splice_sequence_type:
expr = sfs_sequence(expr, info);
break;
case scheme_branch_type:
@ -5721,9 +5720,8 @@ Scheme_Object *scheme_sfs_expr(Scheme_Object *expr, SFS_Info *info, int closure_
if (ZERO_SIZED_CLOSUREP(c)) {
Scheme_Object *code;
code = scheme_sfs_closure((Scheme_Object *)c->code, info, closure_self_pos);
if (SAME_TYPE(SCHEME_TYPE(code), scheme_syntax_type)
&& (SCHEME_PINT_VAL(code) == BEGIN0_EXPD)) {
Scheme_Sequence *seq = (Scheme_Sequence *)SCHEME_IPTR_VAL(code);
if (SAME_TYPE(SCHEME_TYPE(code), scheme_begin0_sequence_type)) {
Scheme_Sequence *seq = (Scheme_Sequence *)code;
c->code = (Scheme_Closure_Data *)seq->array[0];
seq->array[0] = expr;
expr = code;
@ -5745,6 +5743,39 @@ Scheme_Object *scheme_sfs_expr(Scheme_Object *expr, SFS_Info *info, int closure_
/* FIXME: maybe need to handle eagerly created closure */
}
break;
case scheme_define_values_type:
expr = scheme_define_values_sfs(expr, info);
break;
case scheme_define_syntaxes_type:
expr = scheme_define_for_syntaxes_sfs(expr, info);
break;
case scheme_define_for_syntax_type:
expr = scheme_define_syntaxes_sfs(expr, info);
break;
case scheme_set_bang_type:
expr = scheme_set_sfs(expr, info);
break;
case scheme_boxenv_type:
expr = scheme_bangboxenv_sfs(expr, info);
break;
case scheme_begin0_sequence_type:
expr = scheme_begin0_sfs(expr, info);
break;
case scheme_require_form_type:
expr = scheme_top_level_require_sfs(expr, info);
break;
case scheme_varref_form_type:
expr = scheme_ref_sfs(expr, info);
break;
case scheme_apply_values_type:
expr = scheme_apply_values_sfs(expr, info);
break;
case scheme_case_lambda_sequence_type:
expr = scheme_case_lambda_sfs(expr, info);
break;
case scheme_module_type:
expr = scheme_module_sfs(expr, info);
break;
default:
break;
}
@ -6020,19 +6051,6 @@ Scheme_Object *scheme_jit_expr(Scheme_Object *expr)
Scheme_Type type = SCHEME_TYPE(expr);
switch (type) {
case scheme_syntax_type:
{
Scheme_Syntax_Jitter f;
Scheme_Object *orig, *naya;
f = scheme_syntax_jitters[SCHEME_PINT_VAL(expr)];
orig = SCHEME_IPTR_VAL(expr);
naya = f(orig);
if (SAME_OBJ(orig, naya))
return expr;
return scheme_make_syntax_resolved(SCHEME_PINT_VAL(expr), naya);
}
case scheme_application_type:
return jit_application(expr);
case scheme_application2_type:
@ -6040,6 +6058,7 @@ Scheme_Object *scheme_jit_expr(Scheme_Object *expr)
case scheme_application3_type:
return jit_application3(expr);
case scheme_sequence_type:
case scheme_splice_sequence_type:
return jit_sequence(expr);
case scheme_branch_type:
return jit_branch(expr);
@ -6068,6 +6087,28 @@ Scheme_Object *scheme_jit_expr(Scheme_Object *expr)
{
return scheme_unclose_case_lambda(expr, 1);
}
case scheme_define_values_type:
return scheme_define_values_jit(expr);
case scheme_define_syntaxes_type:
return scheme_define_syntaxes_jit(expr);
case scheme_define_for_syntax_type:
return scheme_define_for_syntaxes_jit(expr);
case scheme_set_bang_type:
return scheme_set_jit(expr);
case scheme_boxenv_type:
return scheme_bangboxenv_jit(expr);
case scheme_begin0_sequence_type:
return scheme_begin0_jit(expr);
case scheme_require_form_type:
return scheme_top_level_require_jit(expr);
case scheme_varref_form_type:
return scheme_ref_jit(expr);
case scheme_apply_values_type:
return scheme_apply_values_jit(expr);
case scheme_case_lambda_sequence_type:
return scheme_case_lambda_jit(expr);
case scheme_module_type:
return scheme_module_jit(expr);
default:
return expr;
}
@ -9783,15 +9824,6 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands,
EVAL_SFS_CLEAR(RUNSTACK, obj);
goto returnv_never_multi;
}
case scheme_syntax_type:
{
Scheme_Syntax_Executer f;
UPDATE_THREAD_RSPTR();
f = scheme_syntax_executers[SCHEME_PINT_VAL(obj)];
v = f((Scheme_Object *)SCHEME_IPTR_VAL(obj));
break;
}
case scheme_application_type:
{
Scheme_App_Rec *app;
@ -10335,6 +10367,78 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands,
goto returnv_never_multi;
}
case scheme_define_values_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_define_values_execute(obj);
break;
}
case scheme_define_syntaxes_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_define_syntaxes_execute(obj);
break;
}
case scheme_define_for_syntax_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_define_for_syntaxes_execute(obj);
break;
}
case scheme_set_bang_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_set_execute(obj);
break;
}
case scheme_boxenv_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_bangboxenv_execute(obj);
break;
}
case scheme_begin0_sequence_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_begin0_execute(obj);
break;
}
case scheme_splice_sequence_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_splice_execute(obj);
break;
}
case scheme_require_form_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_top_level_require_execute(obj);
break;
}
case scheme_varref_form_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_ref_execute(obj);
break;
}
case scheme_apply_values_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_apply_values_execute(obj);
break;
}
case scheme_case_lambda_sequence_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_case_lambda_execute(obj);
break;
}
case scheme_module_type:
{
UPDATE_THREAD_RSPTR();
v = scheme_module_execute(obj, NULL);
break;
}
default:
v = obj;
goto returnv_never_multi;
@ -11748,31 +11852,16 @@ Scheme_Object *scheme_eval_clone(Scheme_Object *expr)
/* Clone as much as necessary of `expr' so that prefixes are
cloned. Cloned prefixes, in turn, can be updated by linking to
reduce the overhead of cross-module references. */
if (SAME_TYPE(SCHEME_TYPE(expr), scheme_syntax_type)) {
int kind;
Scheme_Object *orig, *naya;
kind = SCHEME_PINT_VAL(expr);
orig = SCHEME_IPTR_VAL(expr);
switch (kind) {
case MODULE_EXPD:
naya = scheme_module_eval_clone(orig);
break;
case DEFINE_SYNTAX_EXPD:
case DEFINE_FOR_SYNTAX_EXPD:
naya = scheme_syntaxes_eval_clone(orig);
switch (SCHEME_TYPE(expr)) {
case scheme_module_type:
return scheme_module_eval_clone(expr);
break;
case scheme_define_syntaxes_type:
case scheme_define_for_syntax_type:
return scheme_syntaxes_eval_clone(expr);
default:
naya = orig;
break;
return expr;
}
if (SAME_OBJ(orig, naya))
return expr;
return scheme_make_syntax_resolved(kind, naya);
} else
return expr;
}
Resolve_Prefix *scheme_prefix_eval_clone(Resolve_Prefix *rp)
@ -12666,21 +12755,6 @@ void scheme_validate_expr(Mz_CPort *port, Scheme_Object *expr,
}
}
break;
case scheme_syntax_type:
{
Scheme_Syntax_Validater f;
int p = SCHEME_PINT_VAL(expr);
no_flo(need_flonum, port);
if ((p < 0) || (p >= _COUNT_EXPD_))
scheme_ill_formed_code(port);
f = scheme_syntax_validaters[p];
f((Scheme_Object *)SCHEME_IPTR_VAL(expr), port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map, result_ignored, vc, tailpos, procs);
}
break;
case scheme_application_type:
{
Scheme_App_Rec *app = (Scheme_App_Rec *)expr;
@ -12754,6 +12828,7 @@ void scheme_validate_expr(Mz_CPort *port, Scheme_Object *expr,
}
break;
case scheme_sequence_type:
case scheme_splice_sequence_type:
{
Scheme_Sequence *seq = (Scheme_Sequence *)expr;
int cnt;
@ -12989,6 +13064,73 @@ void scheme_validate_expr(Mz_CPort *port, Scheme_Object *expr,
goto top;
}
break;
case scheme_define_values_type:
no_flo(need_flonum, port);
scheme_define_values_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_define_syntaxes_type:
no_flo(need_flonum, port);
scheme_define_syntaxes_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_define_for_syntax_type:
no_flo(need_flonum, port);
scheme_define_for_syntaxes_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_set_bang_type:
no_flo(need_flonum, port);
scheme_set_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_boxenv_type:
no_flo(need_flonum, port);
scheme_bangboxenv_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_begin0_sequence_type:
no_flo(need_flonum, port);
scheme_begin0_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_require_form_type:
no_flo(need_flonum, port);
scheme_top_level_require_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_varref_form_type:
no_flo(need_flonum, port);
scheme_ref_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_apply_values_type:
no_flo(need_flonum, port);
scheme_apply_values_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_case_lambda_sequence_type:
no_flo(need_flonum, port);
scheme_case_lambda_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
case scheme_module_type:
no_flo(need_flonum, port);
scheme_module_validate(expr, port, stack, tls, depth, letlimit, delta,
num_toplevels, num_stxes, num_lifts, tl_use_map,
result_ignored, vc, tailpos, procs);
break;
default:
/* All values are definitely ok, except pre-closed closures.
Such a closure can refer back to itself, so we use a flag
@ -13105,6 +13247,14 @@ static Scheme_Object *read_sequence_save_first(Scheme_Object *obj)
return scheme_make_sequence_compilation(obj, -2);
}
static Scheme_Object *read_sequence_splice(Scheme_Object *obj)
{
obj = scheme_make_sequence_compilation(obj, 1);
if (SAME_TYPE(SCHEME_TYPE(obj), scheme_sequence_type))
obj->type = scheme_splice_sequence_type;
return obj;
}
static Scheme_Object *write_branch(Scheme_Object *obj)
{
scheme_signal_error("branch writer shouldn't be used");
@ -13143,118 +13293,6 @@ static Scheme_Object *read_with_cont_mark(Scheme_Object *obj)
return (Scheme_Object *)wcm;
}
static Scheme_Object *write_syntax(Scheme_Object *obj)
{
Scheme_Object *idx, *rest, *l;
int protect_after, c;
c = SCHEME_PINT_VAL(obj);
idx = scheme_make_integer(c);
protect_after = scheme_syntax_protect_afters[c];
if (c == BEGIN0_EXPD) {
Scheme_Object *v;
v = SCHEME_PTR_VAL(obj);
switch (SCHEME_TYPE(v)) {
case scheme_sequence_type:
case scheme_begin0_sequence_type:
break;
default:
break;
}
}
l = rest = (Scheme_Object *)SCHEME_IPTR_VAL(obj);
if (protect_after == -2) {
/* -2 => protect first element of vector */
if (SCHEME_VECTORP(l)) {
l = scheme_protect_quote(SCHEME_VEC_ELS(rest)[0]);
if (!SAME_OBJ(l, SCHEME_VEC_ELS(rest)[0])) {
Scheme_Object *vec;
intptr_t i, len;
len = SCHEME_VEC_SIZE(rest);
vec = scheme_make_vector(len, NULL);
SCHEME_VEC_ELS(vec)[0] = l;
for (i = 1; i < len; i++) {
SCHEME_VEC_ELS(vec)[i] = SCHEME_VEC_ELS(rest)[i];
}
rest = vec;
}
} else {
scheme_signal_error("expected a vector for syntax");
}
} else {
for (c = 0; SCHEME_PAIRP(l) && (c < protect_after); c++) {
l = SCHEME_CDR(l);
}
if (!SCHEME_NULLP(l) && (c == protect_after)) {
Scheme_Object *new_l;
new_l = scheme_protect_quote(l);
if (new_l != l) {
Scheme_Object *first = NULL, *last = NULL;
while (rest != l) {
Scheme_Object *p;
p = scheme_make_pair(SCHEME_CAR(rest), scheme_null);
if (last)
SCHEME_CDR(last) = p;
else
first = p;
last = p;
rest = SCHEME_CDR(rest);
}
if (last)
SCHEME_CDR(last) = new_l;
else
first = new_l;
rest = first;
}
}
}
return cons(idx, rest);
}
static Scheme_Object *read_syntax(Scheme_Object *obj)
{
Scheme_Object *idx;
Scheme_Object *first = NULL, *last = NULL;
int limit;
if (!SCHEME_PAIRP(obj) || !SCHEME_INTP(SCHEME_CAR(obj)))
return NULL; /* bad .zo */
idx = SCHEME_CAR(obj);
/* Copy obj, up to number of cons cells before a "protected" value: */
limit = scheme_syntax_protect_afters[SCHEME_INT_VAL(idx)];
obj = SCHEME_CDR(obj);
while (SCHEME_PAIRP(obj) && (limit > 0)) {
Scheme_Object *p;
p = scheme_make_pair(SCHEME_CAR(obj), scheme_null);
if (last)
SCHEME_CDR(last) = p;
else
first = p;
last = p;
obj = SCHEME_CDR(obj);
limit--;
}
if (last)
SCHEME_CDR(last) = obj;
else
first = obj;
return scheme_make_syntax_resolved(SCHEME_INT_VAL(idx), first);
}
static Scheme_Object *write_quote_syntax(Scheme_Object *obj)
{
Scheme_Quote_Syntax *qs = (Scheme_Quote_Syntax *)obj;

View File

@ -1789,9 +1789,11 @@ scheme_resolve_closure_compilation(Scheme_Object *_data, Resolve_Info *info,
int j = i + closure_size + convert_size;
Scheme_Object *bcode;
bcode = scheme_make_syntax_resolved(BOXENV_EXPD,
scheme_make_pair(scheme_make_integer(j),
data->code));
bcode = scheme_alloc_object();
bcode->type = scheme_boxenv_type;
SCHEME_PTR1_VAL(bcode) = scheme_make_integer(j);
SCHEME_PTR2_VAL(bcode) = data->code;
data->code = bcode;
}
}
@ -3585,8 +3587,8 @@ const char *scheme_get_proc_name(Scheme_Object *p, int *len, int for_error)
name = ((Scheme_Closure_Data *)p)->name;
} else if (type == scheme_closure_type) {
name = SCHEME_COMPILED_CLOS_CODE(p)->name;
} else if (type == scheme_compiled_syntax_type) {
Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)SCHEME_IPTR_VAL(p);
} else if (type == scheme_case_lambda_sequence_type) {
Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)p;
if (!cl->count)
name = NULL;
else

View File

@ -320,15 +320,8 @@ static int is_short(Scheme_Object *obj, int fuel)
t = SCHEME_TYPE(obj);
switch (t) {
case scheme_syntax_type:
{
int t;
t = SCHEME_PINT_VAL(obj);
if (t == CASE_LAMBDA_EXPD)
case scheme_case_lambda_sequence_type:
return fuel - 1;
else
return 0;
}
break;
case scheme_application_type:
{
@ -552,12 +545,8 @@ int scheme_is_simple(Scheme_Object *obj, int depth, int just_markless, mz_jit_st
type = SCHEME_TYPE(obj);
switch (type) {
case scheme_syntax_type:
{
int t;
t = SCHEME_PINT_VAL(obj);
return (t == CASE_LAMBDA_EXPD);
}
case scheme_case_lambda_sequence_type:
return 1;
break;
case scheme_branch_type:
@ -636,9 +625,6 @@ int scheme_is_non_gc(Scheme_Object *obj, int depth)
type = SCHEME_TYPE(obj);
switch (type) {
case scheme_syntax_type:
break;
case scheme_branch_type:
if (depth) {
Scheme_Branch_Rec *b = (Scheme_Branch_Rec *)obj;
@ -711,8 +697,8 @@ static int is_a_procedure(Scheme_Object *v, mz_jit_state *jitter)
if (SAME_TYPE(t, scheme_closure_type)
|| SAME_TYPE(t, scheme_unclosed_procedure_type))
return 1;
else if (SAME_TYPE(t, scheme_syntax_type)) {
return (SCHEME_PINT_VAL(v) == CASE_LAMBDA_EXPD);
else if (SAME_TYPE(t, scheme_case_lambda_sequence_type)) {
return 1;
} else if (SAME_TYPE(t, scheme_local_type)) {
int flags;
return scheme_mz_is_closure(jitter, SCHEME_LOCAL_POS(v), -1, &flags);
@ -1889,12 +1875,7 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
END_JIT_DATA(3);
return 1;
}
case scheme_syntax_type:
{
int pos;
pos = SCHEME_PINT_VAL(obj);
switch (pos) {
case CASE_LAMBDA_EXPD:
case scheme_case_lambda_sequence_type:
{
START_JIT_DATA();
LOG_IT(("case-lambda\n"));
@ -1902,11 +1883,12 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
if (for_branch)
finish_branch_with_true(jitter, for_branch);
else
generate_case_closure(SCHEME_IPTR_VAL(obj), jitter, target);
generate_case_closure(obj, jitter, target);
END_JIT_DATA(5);
return 1;
}
break;
case BEGIN0_EXPD:
case scheme_begin0_sequence_type:
{
Scheme_Sequence *seq;
GC_CAN_IGNORE jit_insn *ref, *ref2;
@ -1915,7 +1897,7 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
LOG_IT(("begin0\n"));
seq = (Scheme_Sequence *)SCHEME_IPTR_VAL(obj);
seq = (Scheme_Sequence *)obj;
/* Evaluate first expression, and for consistency with bytecode
evaluation, allow multiple values. */
@ -1985,23 +1967,24 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
if (for_branch) finish_branch(jitter, target, for_branch);
END_JIT_DATA(6);
return 1;
}
break;
case SET_EXPD:
case scheme_set_bang_type:
{
Scheme_Set_Bang *sb = (Scheme_Set_Bang *)obj;
Scheme_Object *p, *v;
int pos, set_undef;
GC_CAN_IGNORE jit_insn *ref1, *ref2, *ref3
GC_CAN_IGNORE jit_insn *ref1, *ref2, *ref3;
START_JIT_DATA();
LOG_IT(("set!\n"));
p = SCHEME_IPTR_VAL(obj);
v = SCHEME_CAR(p);
set_undef = SCHEME_TRUEP(v);
p = SCHEME_CDR(p);
v = SCHEME_CAR(p);
p = SCHEME_CDR(p);
p = sb->val;
v = sb->var;
set_undef = sb->set_undef;
scheme_generate_non_tail(p, jitter, 0, 1, 0);
CHECK_LIMIT();
@ -2051,9 +2034,11 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
(void)jit_movi_p(target, scheme_void);
}
END_JIT_DATA(7);
return 1;
}
break;
case APPVALS_EXPD:
case scheme_apply_values_type:
{
Scheme_Object *p, *v;
GC_CAN_IGNORE jit_insn *ref, *ref2, *ref3, *ref5, *refloop;
@ -2061,9 +2046,8 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
LOG_IT(("appvals\n"));
p = SCHEME_IPTR_VAL(obj);
v = SCHEME_CAR(p);
p = SCHEME_CDR(p);
v = SCHEME_PTR1_VAL(obj);
p = SCHEME_PTR2_VAL(obj);
scheme_generate_non_tail(v, jitter, 0, 1, 0);
CHECK_LIMIT();
@ -2198,9 +2182,10 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
if (is_tail)
return 2;
return 1;
}
break;
case BOXENV_EXPD:
case scheme_boxenv_type:
{
Scheme_Object *p, *v;
int pos;
@ -2211,10 +2196,9 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
mz_rs_sync();
JIT_UPDATE_THREAD_RSPTR_IF_NEEDED();
p = (Scheme_Object *)SCHEME_IPTR_VAL(obj);
v = SCHEME_CAR(p);
v = SCHEME_PTR1_VAL(obj);
pos = mz_remap(SCHEME_INT_VAL(v));
p = SCHEME_CDR(p);
p = SCHEME_PTR2_VAL(obj);
#ifdef CAN_INLINE_ALLOC
scheme_inline_alloc(jitter, sizeof(Scheme_Object*), -1, 0, 0, 0, 0);
@ -2238,18 +2222,20 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
scheme_generate(p, jitter, is_tail, wcm_may_replace, multi_ok, orig_target, for_branch);
END_JIT_DATA(8);
return 1;
}
break;
case REF_EXPD:
case scheme_varref_form_type:
{
if (for_branch)
finish_branch_with_true(jitter, for_branch);
else {
Scheme_Object *dummy;
int pos;
mz_rs_sync();
obj = SCHEME_IPTR_VAL(obj);
dummy = SCHEME_PTR2_VAL(obj);
obj = SCHEME_PTR1_VAL(obj);
@ -2278,31 +2264,21 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
jit_retval(target);
VALIDATE_RESULT(target);
}
}
break;
case SPLICE_EXPD:
{
scheme_signal_error("internal error: cannot JIT a top-level splice form");
}
break;
default:
{
mz_rs_sync();
JIT_UPDATE_THREAD_RSPTR_IF_NEEDED();
obj = SCHEME_IPTR_VAL(obj);
(void)jit_patchable_movi_p(JIT_R2, obj); /* !! */
CHECK_LIMIT();
mz_prepare(1);
jit_pusharg_p(JIT_R2);
(void)mz_finish(scheme_syntax_executers[pos]);
CHECK_LIMIT();
jit_retval(target);
VALIDATE_RESULT(target);
if (for_branch) finish_branch(jitter, target, for_branch);
}
}
return 1;
}
break;
case scheme_splice_sequence_type:
case scheme_define_values_type:
case scheme_define_syntaxes_type:
case scheme_define_for_syntax_type:
case scheme_require_form_type:
case scheme_module_type:
{
scheme_signal_error("internal error: cannot JIT a top-level form");
return 0;
}
break;
case scheme_application_type:
{
Scheme_App_Rec *app = (Scheme_App_Rec *)obj;

View File

@ -88,36 +88,10 @@ static Scheme_Object *require_expand(Scheme_Object *form, Scheme_Comp_Env *env,
static Scheme_Object *provide_syntax(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Info *rec, int drec);
static Scheme_Object *provide_expand(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Expand_Info *erec, int drec);
static Scheme_Object *module_execute(Scheme_Object *data);
static Scheme_Object *top_level_require_execute(Scheme_Object *data);
static Scheme_Object *module_jit(Scheme_Object *data);
static Scheme_Object *top_level_require_jit(Scheme_Object *data);
static Scheme_Object *module_optimize(Scheme_Object *data, Optimize_Info *info, int context);
static Scheme_Object *module_resolve(Scheme_Object *data, Resolve_Info *info);
static Scheme_Object *module_sfs(Scheme_Object *data, SFS_Info *info);
static Scheme_Object *top_level_require_optimize(Scheme_Object *data, Optimize_Info *info, int context);
static Scheme_Object *top_level_require_resolve(Scheme_Object *data, Resolve_Info *info);
static Scheme_Object *top_level_require_sfs(Scheme_Object *data, SFS_Info *info);
static void module_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
static void top_level_require_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
static Scheme_Object *write_module(Scheme_Object *obj);
static Scheme_Object *read_module(Scheme_Object *obj);
static Scheme_Object *read_top_level_require(Scheme_Object *obj);
static Scheme_Object *write_top_level_require(Scheme_Object *obj);
static Scheme_Module *module_load(Scheme_Object *modname, Scheme_Env *env, const char *who);
@ -303,17 +277,6 @@ static void qsort_provides(Scheme_Object **exs, Scheme_Object **exsns, Scheme_Ob
void scheme_init_module(Scheme_Env *env)
{
scheme_register_syntax(MODULE_EXPD,
module_optimize,
module_resolve, module_sfs, module_validate,
module_execute, module_jit,
NULL, NULL, -1);
scheme_register_syntax(REQUIRE_EXPD,
top_level_require_optimize,
top_level_require_resolve, top_level_require_sfs, top_level_require_validate,
top_level_require_execute, top_level_require_jit,
NULL, NULL, 2);
scheme_add_global_keyword("module",
scheme_make_compiled_syntax(module_syntax,
module_expand),
@ -386,6 +349,8 @@ void scheme_init_module(Scheme_Env *env)
scheme_install_type_writer(scheme_module_type, write_module);
scheme_install_type_reader(scheme_module_type, read_module);
scheme_install_type_writer(scheme_require_form_type, write_top_level_require);
scheme_install_type_reader(scheme_require_form_type, read_top_level_require);
GLOBAL_PARAMETER("current-module-name-resolver", current_module_name_resolver, MZCONFIG_CURRENT_MODULE_RESOLVER, env);
GLOBAL_PARAMETER("current-module-declare-name", current_module_name_prefix, MZCONFIG_CURRENT_MODULE_NAME, env);
@ -4690,21 +4655,14 @@ static int needs_prompt(Scheme_Object *e)
case scheme_local_type:
case scheme_local_unbox_type:
return 0;
case scheme_syntax_type:
switch (SCHEME_PINT_VAL(e)) {
case CASE_LAMBDA_EXPD:
case scheme_case_lambda_sequence_type:
return 0;
case DEFINE_VALUES_EXPD:
e = (Scheme_Object *)SCHEME_IPTR_VAL(e);
case scheme_define_values_type:
e = SCHEME_VEC_ELS(e)[0];
break;
default:
return 1;
}
break;
default:
return 1;
}
}
}
@ -5015,9 +4973,8 @@ Scheme_Module *scheme_extract_compiled_module(Scheme_Object *o)
if (!c->prefix) /* => compiled module is in `code' field */
return (Scheme_Module *)c->code;
if (SAME_TYPE(SCHEME_TYPE(c->code), scheme_syntax_type)
&& (SCHEME_PINT_VAL(c->code) == MODULE_EXPD)) {
return (Scheme_Module *)SCHEME_IPTR_VAL(c->code);
if (SAME_TYPE(SCHEME_TYPE(c->code), scheme_module_type)) {
return (Scheme_Module *)c->code;
}
}
@ -5387,11 +5344,6 @@ static Scheme_Object *do_module_execute(Scheme_Object *data, Scheme_Env *genv, i
return scheme_void;
}
static Scheme_Object *module_execute(Scheme_Object *data)
{
return do_module_execute(data, NULL, 1);
}
Scheme_Object *scheme_module_execute(Scheme_Object *data, Scheme_Env *genv)
{
return do_module_execute(data, genv, 0);
@ -5507,7 +5459,7 @@ static Scheme_Object *do_module_clone(Scheme_Object *data, int jit)
return (Scheme_Object *)m;
}
static Scheme_Object *module_jit(Scheme_Object *data)
Scheme_Object *scheme_module_jit(Scheme_Object *data)
{
return do_module_clone(data, 1);
}
@ -5517,7 +5469,7 @@ Scheme_Object *scheme_module_eval_clone(Scheme_Object *data)
return do_module_clone(data, 0);
}
static void module_validate(Scheme_Object *data, Mz_CPort *port,
void scheme_module_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
@ -5530,9 +5482,6 @@ static void module_validate(Scheme_Object *data, Mz_CPort *port,
Resolve_Prefix *rp;
Scheme_Object *e;
if (!SAME_TYPE(SCHEME_TYPE(data), scheme_module_type))
scheme_ill_formed_code(port);
m = (Scheme_Module *)data;
if (!SCHEME_MODNAMEP(m->modname))
@ -5590,8 +5539,8 @@ static int set_code_closure_flags(Scheme_Object *clones,
return flags;
}
static Scheme_Object *
module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
Scheme_Object *
scheme_module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
{
Scheme_Module *m = (Scheme_Module *)data;
Scheme_Object *e, *vars, *old_context;
@ -5612,13 +5561,11 @@ module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
at the expense of later inlining. */
for (i_m = 0; i_m < cnt; i_m++) {
e = SCHEME_VEC_ELS(m->body)[i_m];
if (SAME_TYPE(SCHEME_TYPE(e), scheme_compiled_syntax_type)
&& (SCHEME_PINT_VAL(e) == DEFINE_VALUES_EXPD)) {
if (SAME_TYPE(SCHEME_TYPE(e), scheme_define_values_type)) {
int n;
e = (Scheme_Object *)SCHEME_IPTR_VAL(e);
vars = SCHEME_CAR(e);
e = SCHEME_CDR(e);
vars = SCHEME_VEC_ELS(e)[0];
e = SCHEME_VEC_ELS(e)[1];
n = scheme_list_length(vars);
if (n == 1) {
@ -5654,11 +5601,10 @@ module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
is_proc_def = 0;
if (OPT_DISCOURAGE_EARLY_INLINE && info->enforce_const) {
if (SAME_TYPE(SCHEME_TYPE(e), scheme_compiled_syntax_type)
&& (SCHEME_PINT_VAL(e) == DEFINE_VALUES_EXPD)) {
if (SAME_TYPE(SCHEME_TYPE(e), scheme_define_values_type)) {
Scheme_Object *e2;
e2 = (Scheme_Object *)SCHEME_IPTR_VAL(e);
e2 = SCHEME_CDR(e2);
e2 = (Scheme_Object *)e;
e2 = SCHEME_VEC_ELS(e2)[1];
if (IS_COMPILED_PROC(e2))
is_proc_def = 1;
}
@ -5682,14 +5628,11 @@ module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
/* If this expression/definition can't have any side effect
(including raising an exception), then continue the group of
simultaneous definitions: */
if (SAME_TYPE(SCHEME_TYPE(e), scheme_compiled_syntax_type)
&& (SCHEME_PINT_VAL(e) == DEFINE_VALUES_EXPD)) {
if (SAME_TYPE(SCHEME_TYPE(e), scheme_define_values_type)) {
int n, cnst = 0, sproc = 0;
e = (Scheme_Object *)SCHEME_IPTR_VAL(e);
vars = SCHEME_CAR(e);
e = SCHEME_CDR(e);
vars = SCHEME_VEC_ELS(e)[0];
e = SCHEME_VEC_ELS(e)[1];
n = scheme_list_length(vars);
cont = scheme_omittable_expr(e, n, -1, 0, info, -1);
@ -5810,11 +5753,9 @@ module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
e = SCHEME_VEC_ELS(m->body)[start_simltaneous];
if (OPT_LIMIT_FUNCTION_RESIZE) {
if (SAME_TYPE(SCHEME_TYPE(e), scheme_compiled_syntax_type)
&& (SCHEME_PINT_VAL(e) == DEFINE_VALUES_EXPD)) {
if (SAME_TYPE(SCHEME_TYPE(e), scheme_define_values_type)) {
Scheme_Object *sub_e;
sub_e = (Scheme_Object *)SCHEME_IPTR_VAL(e);
sub_e = SCHEME_CDR(sub_e);
sub_e = SCHEME_VEC_ELS(e)[1];
if (IS_COMPILED_PROC(sub_e))
old_sz = scheme_compiled_proc_body_size(sub_e);
else
@ -5833,8 +5774,7 @@ module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
Scheme_Object *rpos;
rpos = scheme_hash_get(re_consts, scheme_make_integer(start_simltaneous));
if (rpos) {
e = (Scheme_Object *)SCHEME_IPTR_VAL(e);
e = SCHEME_CDR(e);
e = SCHEME_VEC_ELS(e)[1];
if (!scheme_compiled_propagate_ok(e, info)
&& scheme_is_statically_proc(e, info)) {
/* If we previously installed a procedure for inlining,
@ -5921,11 +5861,11 @@ module_optimize(Scheme_Object *data, Optimize_Info *info, int context)
/* Exp-time body was optimized during compilation */
return scheme_make_syntax_compiled(MODULE_EXPD, data);
return data;
}
static Scheme_Object *
module_resolve(Scheme_Object *data, Resolve_Info *old_rslv)
Scheme_Object *
scheme_module_expr_resolve(Scheme_Object *data, Resolve_Info *old_rslv)
{
Scheme_Module *m = (Scheme_Module *)data;
Scheme_Object *b, *lift_vec;
@ -5967,11 +5907,11 @@ module_resolve(Scheme_Object *data, Resolve_Info *old_rslv)
/* Exp-time body was resolved during compilation */
return scheme_make_syntax_resolved(MODULE_EXPD, data);
return data;
}
static Scheme_Object *
module_sfs(Scheme_Object *data, SFS_Info *old_info)
Scheme_Object *
scheme_module_sfs(Scheme_Object *data, SFS_Info *old_info)
{
Scheme_Module *m = (Scheme_Module *)data;
Scheme_Object *e, *ex;
@ -5984,9 +5924,7 @@ module_sfs(Scheme_Object *data, SFS_Info *old_info)
info = scheme_new_sfs_info(m->max_let_depth);
info->for_mod = 1;
scheme_sfs(scheme_make_syntax_resolved(MODULE_EXPD, data),
info,
m->max_let_depth);
scheme_sfs(data, info, m->max_let_depth);
return data;
}
@ -6243,7 +6181,7 @@ static Scheme_Object *do_module(Scheme_Object *form, Scheme_Comp_Env *env,
m->lang_info = pv;
}
fm = scheme_make_syntax_compiled(MODULE_EXPD, (Scheme_Object *)m);
fm = (Scheme_Object *)m;
} else {
Scheme_Object *hints, *formname;
@ -9928,21 +9866,21 @@ do_require_execute(Scheme_Env *env, Scheme_Object *form)
return scheme_void;
}
static Scheme_Object *
top_level_require_execute(Scheme_Object *data)
Scheme_Object *
scheme_top_level_require_execute(Scheme_Object *data)
{
do_require_execute(scheme_environment_from_dummy(SCHEME_CAR(data)),
SCHEME_CDR(data));
do_require_execute(scheme_environment_from_dummy(SCHEME_PTR1_VAL(data)),
SCHEME_PTR2_VAL(data));
return scheme_void;
}
static Scheme_Object *
top_level_require_jit(Scheme_Object *data)
Scheme_Object *
scheme_top_level_require_jit(Scheme_Object *data)
{
return data;
}
static void top_level_require_validate(Scheme_Object *data, Mz_CPort *port,
void scheme_top_level_require_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
@ -9952,24 +9890,26 @@ static void top_level_require_validate(Scheme_Object *data, Mz_CPort *port,
{
}
static Scheme_Object *
top_level_require_optimize(Scheme_Object *data, Optimize_Info *info, int context)
Scheme_Object *
scheme_top_level_require_optimize(Scheme_Object *data, Optimize_Info *info, int context)
{
return scheme_make_syntax_compiled(REQUIRE_EXPD, data);
return data;
}
static Scheme_Object *
top_level_require_resolve(Scheme_Object *data, Resolve_Info *rslv)
Scheme_Object *
scheme_top_level_require_resolve(Scheme_Object *data, Resolve_Info *rslv)
{
Scheme_Object *dummy = SCHEME_CAR(data);
Scheme_Object *dummy = SCHEME_PTR1_VAL(data);
dummy = scheme_resolve_expr(dummy, rslv);
return scheme_make_syntax_resolved(REQUIRE_EXPD, cons(dummy, SCHEME_CDR(data)));
SCHEME_PTR1_VAL(data) = dummy;
return data;
}
static Scheme_Object *
top_level_require_sfs(Scheme_Object *data, SFS_Info *rslv)
Scheme_Object *
scheme_top_level_require_sfs(Scheme_Object *data, SFS_Info *rslv)
{
return data;
}
@ -9978,7 +9918,7 @@ static Scheme_Object *do_require(Scheme_Object *form, Scheme_Comp_Env *env,
Scheme_Compile_Expand_Info *rec, int drec)
{
Scheme_Hash_Table *ht;
Scheme_Object *rn_set, *dummy, *modidx;
Scheme_Object *rn_set, *dummy, *modidx, *data;
Scheme_Env *genv;
if (!scheme_is_toplevel(env))
@ -10014,9 +9954,13 @@ static Scheme_Object *do_require(Scheme_Object *form, Scheme_Comp_Env *env,
scheme_compile_rec_done_local(rec, drec);
scheme_default_compile_rec(rec, drec);
return scheme_make_syntax_compiled(REQUIRE_EXPD,
cons(dummy,
form));
data = scheme_alloc_object();
data->type = scheme_require_form_type;
SCHEME_PTR1_VAL(data) = dummy;
SCHEME_PTR2_VAL(data) = form;
return data;
} else
return form;
}
@ -10664,3 +10608,22 @@ static Scheme_Object *read_module(Scheme_Object *obj)
return (Scheme_Object *)m;
}
Scheme_Object *write_top_level_require(Scheme_Object *o)
{
return scheme_make_pair(SCHEME_PTR1_VAL(o), SCHEME_PTR2_VAL(o));
}
Scheme_Object *read_top_level_require(Scheme_Object *o)
{
Scheme_Object *data;
if (!SCHEME_PAIRP(o)) return NULL;
data = scheme_alloc_object();
data->type = scheme_require_form_type;
SCHEME_PTR1_VAL(data) = SCHEME_CAR(o);
SCHEME_PTR2_VAL(data) = SCHEME_CDR(o);
return data;
}

View File

@ -656,6 +656,35 @@ static int let_header_FIXUP(void *p, struct NewGC *gc) {
#define let_header_IS_CONST_SIZE 1
static int set_bang_SIZE(void *p, struct NewGC *gc) {
return
gcBYTES_TO_WORDS(sizeof(Scheme_Set_Bang));
}
static int set_bang_MARK(void *p, struct NewGC *gc) {
Scheme_Set_Bang *b = (Scheme_Set_Bang *)p;
gcMARK2(b->var, gc);
gcMARK2(b->val, gc);
return
gcBYTES_TO_WORDS(sizeof(Scheme_Set_Bang));
}
static int set_bang_FIXUP(void *p, struct NewGC *gc) {
Scheme_Set_Bang *b = (Scheme_Set_Bang *)p;
gcFIXUP2(b->var, gc);
gcFIXUP2(b->val, gc);
return
gcBYTES_TO_WORDS(sizeof(Scheme_Set_Bang));
}
#define set_bang_IS_ATOMIC 0
#define set_bang_IS_CONST_SIZE 1
static int prim_proc_SIZE(void *p, struct NewGC *gc) {
Scheme_Primitive_Proc *prim = (Scheme_Primitive_Proc *)p;

View File

@ -243,6 +243,17 @@ let_header {
gcBYTES_TO_WORDS(sizeof(Scheme_Let_Header));
}
set_bang {
mark:
Scheme_Set_Bang *b = (Scheme_Set_Bang *)p;
gcMARK2(b->var, gc);
gcMARK2(b->val, gc);
size:
gcBYTES_TO_WORDS(sizeof(Scheme_Set_Bang));
}
prim_proc {
Scheme_Primitive_Proc *prim = (Scheme_Primitive_Proc *)p;

View File

@ -2495,6 +2495,12 @@ Scheme_Object *scheme_sfs_add_clears(Scheme_Object *expr, Scheme_Object *clears,
typedef struct Scheme_Object *(*Scheme_Syntax_SFSer)(Scheme_Object *data, SFS_Info *info);
typedef struct Scheme_Set_Bang {
Scheme_Object so;
int set_undef;
Scheme_Object *var, *val;
} Scheme_Set_Bang;
/* Resolving & linking */
#define DEFINE_VALUES_EXPD 0
#define DEFINE_SYNTAX_EXPD 1
@ -2510,34 +2516,10 @@ typedef struct Scheme_Object *(*Scheme_Syntax_SFSer)(Scheme_Object *data, SFS_In
#define SPLICE_EXPD 11
#define _COUNT_EXPD_ 12
#define scheme_register_syntax(i, fo, fr, fs, fv, fe, fj, cl, sh, pa) \
(scheme_syntax_optimizers[i] = fo, \
scheme_syntax_resolvers[i] = fr, \
scheme_syntax_executers[i] = fe, \
scheme_syntax_sfsers[i] = fs, \
scheme_syntax_validaters[i] = fv, \
scheme_syntax_jitters[i] = fj, \
scheme_syntax_cloners[i] = cl, \
scheme_syntax_shifters[i] = sh, \
scheme_syntax_protect_afters[i] = pa)
extern Scheme_Syntax_Optimizer scheme_syntax_optimizers[_COUNT_EXPD_];
extern Scheme_Syntax_Resolver scheme_syntax_resolvers[_COUNT_EXPD_];
extern Scheme_Syntax_SFSer scheme_syntax_sfsers[_COUNT_EXPD_];
extern Scheme_Syntax_Validater scheme_syntax_validaters[_COUNT_EXPD_];
extern Scheme_Syntax_Executer scheme_syntax_executers[_COUNT_EXPD_];
extern Scheme_Syntax_Jitter scheme_syntax_jitters[_COUNT_EXPD_];
extern Scheme_Syntax_Cloner scheme_syntax_cloners[_COUNT_EXPD_];
extern Scheme_Syntax_Shifter scheme_syntax_shifters[_COUNT_EXPD_];
extern int scheme_syntax_protect_afters[_COUNT_EXPD_];
Scheme_Object *scheme_protect_quote(Scheme_Object *expr);
Scheme_Object *scheme_make_syntax_resolved(int idx, Scheme_Object *data);
Scheme_Object *scheme_make_syntax_compiled(int idx, Scheme_Object *data);
#define IS_COMPILED_PROC(vals_expr) (SAME_TYPE(SCHEME_TYPE(vals_expr), scheme_compiled_unclosed_procedure_type) \
|| (SAME_TYPE(SCHEME_TYPE(vals_expr), scheme_compiled_syntax_type) \
&& (SCHEME_PINT_VAL(vals_expr) == CASE_LAMBDA_EXPD)))
|| SAME_TYPE(SCHEME_TYPE(vals_expr), scheme_case_lambda_sequence_type))
int scheme_compiled_proc_body_size(Scheme_Object *o);
Scheme_Object *scheme_optimize_expr(Scheme_Object *, Optimize_Info *, int context);
@ -2954,6 +2936,153 @@ Scheme_Object *scheme_rename_transformer_id(Scheme_Object *o);
int scheme_is_set_transformer(Scheme_Object *o);
Scheme_Object *scheme_set_transformer_proc(Scheme_Object *o);
Scheme_Object *scheme_define_values_execute(Scheme_Object *data);
Scheme_Object *scheme_ref_execute(Scheme_Object *data);
Scheme_Object *scheme_set_execute(Scheme_Object *data);
Scheme_Object *scheme_define_syntaxes_execute(Scheme_Object *expr);
Scheme_Object *scheme_define_for_syntaxes_execute(Scheme_Object *expr);
Scheme_Object *scheme_case_lambda_execute(Scheme_Object *expr);
Scheme_Object *scheme_begin0_execute(Scheme_Object *data);
Scheme_Object *scheme_apply_values_execute(Scheme_Object *data);
Scheme_Object *scheme_splice_execute(Scheme_Object *data);
Scheme_Object *scheme_bangboxenv_execute(Scheme_Object *data);
Scheme_Object *scheme_top_level_require_execute(Scheme_Object *data);
Scheme_Object *scheme_define_values_optimize(Scheme_Object *data, Optimize_Info *info, int context);
Scheme_Object *scheme_ref_optimize(Scheme_Object *data, Optimize_Info *info, int context);
Scheme_Object *scheme_set_optimize(Scheme_Object *data, Optimize_Info *info, int context);
Scheme_Object *scheme_define_syntaxes_optimize(Scheme_Object *expr, Optimize_Info *info, int context);
Scheme_Object *scheme_define_for_syntaxes_optimize(Scheme_Object *expr, Optimize_Info *info, int context);
Scheme_Object *scheme_case_lambda_optimize(Scheme_Object *expr, Optimize_Info *info, int context);
Scheme_Object *scheme_begin0_optimize(Scheme_Object *data, Optimize_Info *info, int context);
Scheme_Object *scheme_apply_values_optimize(Scheme_Object *data, Optimize_Info *info, int context);
Scheme_Object *scheme_module_optimize(Scheme_Object *data, Optimize_Info *info, int context);
Scheme_Object *scheme_top_level_require_optimize(Scheme_Object *data, Optimize_Info *info, int context);
Scheme_Object *scheme_begin0_clone(int dup_ok, Scheme_Object *data, Optimize_Info *info, int delta, int closure_depth);
Scheme_Object *scheme_set_clone(int dup_ok, Scheme_Object *data, Optimize_Info *info, int delta, int closure_depth);
Scheme_Object *scheme_apply_values_clone(int dup_ok, Scheme_Object *data, Optimize_Info *info, int delta, int closure_depth);
Scheme_Object *scheme_case_lambda_clone(int dup_ok, Scheme_Object *data, Optimize_Info *info, int delta, int closure_depth);
Scheme_Object *scheme_begin0_shift(Scheme_Object *data, int delta, int after_depth);
Scheme_Object *scheme_set_shift(Scheme_Object *data, int delta, int after_depth);
Scheme_Object *scheme_ref_shift(Scheme_Object *data, int delta, int after_depth);
Scheme_Object *scheme_case_lambda_shift(Scheme_Object *data, int delta, int after_depth);
Scheme_Object *scheme_apply_values_shift(Scheme_Object *data, int delta, int after_depth);
Scheme_Object *scheme_define_values_resolve(Scheme_Object *data, Resolve_Info *info);
Scheme_Object *scheme_ref_resolve(Scheme_Object *data, Resolve_Info *info);
Scheme_Object *scheme_set_resolve(Scheme_Object *data, Resolve_Info *info);
Scheme_Object *scheme_define_syntaxes_resolve(Scheme_Object *expr, Resolve_Info *info);
Scheme_Object *scheme_define_for_syntaxes_resolve(Scheme_Object *expr, Resolve_Info *info);
Scheme_Object *scheme_case_lambda_resolve(Scheme_Object *expr, Resolve_Info *info);
Scheme_Object *scheme_begin0_resolve(Scheme_Object *data, Resolve_Info *info);
Scheme_Object *scheme_apply_values_resolve(Scheme_Object *data, Resolve_Info *info);
Scheme_Object *scheme_module_expr_resolve(Scheme_Object *data, Resolve_Info *info);
Scheme_Object *scheme_top_level_require_resolve(Scheme_Object *data, Resolve_Info *info);
Scheme_Object *scheme_define_values_sfs(Scheme_Object *data, SFS_Info *info);
Scheme_Object *scheme_ref_sfs(Scheme_Object *data, SFS_Info *info);
Scheme_Object *scheme_set_sfs(Scheme_Object *data, SFS_Info *info);
Scheme_Object *scheme_define_syntaxes_sfs(Scheme_Object *expr, SFS_Info *info);
Scheme_Object *scheme_define_for_syntaxes_sfs(Scheme_Object *expr, SFS_Info *info);
Scheme_Object *scheme_case_lambda_sfs(Scheme_Object *expr, SFS_Info *info);
Scheme_Object *scheme_begin0_sfs(Scheme_Object *data, SFS_Info *info);
Scheme_Object *scheme_apply_values_sfs(Scheme_Object *data, SFS_Info *info);
Scheme_Object *scheme_bangboxenv_sfs(Scheme_Object *data, SFS_Info *info);
Scheme_Object *scheme_module_sfs(Scheme_Object *data, SFS_Info *info);
Scheme_Object *scheme_top_level_require_sfs(Scheme_Object *data, SFS_Info *info);
void scheme_define_values_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_ref_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_set_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_define_syntaxes_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_define_for_syntaxes_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_case_lambda_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_begin0_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_apply_values_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_bangboxenv_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_module_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
void scheme_top_level_require_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls,
int depth, int letlimit, int delta,
int num_toplevels, int num_stxes, int num_lifts,
void *tl_use_map, int result_ignored,
struct Validate_Clearing *vc, int tailpos,
Scheme_Hash_Tree *procs);
Scheme_Object *scheme_define_values_jit(Scheme_Object *data);
Scheme_Object *scheme_ref_jit(Scheme_Object *data);
Scheme_Object *scheme_set_jit(Scheme_Object *data);
Scheme_Object *scheme_define_syntaxes_jit(Scheme_Object *expr);
Scheme_Object *scheme_define_for_syntaxes_jit(Scheme_Object *expr);
Scheme_Object *scheme_case_lambda_jit(Scheme_Object *expr);
Scheme_Object *scheme_begin0_jit(Scheme_Object *data);
Scheme_Object *scheme_apply_values_jit(Scheme_Object *data);
Scheme_Object *scheme_bangboxenv_jit(Scheme_Object *data);
Scheme_Object *scheme_module_jit(Scheme_Object *data);
Scheme_Object *scheme_top_level_require_jit(Scheme_Object *data);
/*========================================================================*/
/* namespaces and modules */
/*========================================================================*/

View File

@ -13,12 +13,12 @@
consistently.)
*/
#define MZSCHEME_VERSION "5.1.1.4"
#define MZSCHEME_VERSION "5.1.1.5"
#define MZSCHEME_VERSION_X 5
#define MZSCHEME_VERSION_Y 1
#define MZSCHEME_VERSION_Z 1
#define MZSCHEME_VERSION_W 4
#define MZSCHEME_VERSION_W 5
#define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y)
#define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)

View File

@ -5,262 +5,270 @@ enum {
scheme_toplevel_type, /* 0 */
scheme_local_type, /* 1 */
scheme_local_unbox_type, /* 2 */
scheme_syntax_type, /* 3 */
scheme_application_type, /* 4 */
scheme_application2_type, /* 5 */
scheme_application3_type, /* 6 */
scheme_sequence_type, /* 7 */
scheme_branch_type, /* 8 */
scheme_unclosed_procedure_type, /* 9 */
scheme_let_value_type, /* 10 */
scheme_let_void_type, /* 11 */
scheme_letrec_type, /* 12 */
scheme_let_one_type, /* 13 */
scheme_with_cont_mark_type, /* 14 */
scheme_quote_syntax_type, /* 15 */
scheme_application_type, /* 3 */
scheme_application2_type, /* 4 */
scheme_application3_type, /* 5 */
scheme_sequence_type, /* 6 */
scheme_branch_type, /* 7 */
scheme_unclosed_procedure_type, /* 8 */
scheme_let_value_type, /* 9 */
scheme_let_void_type, /* 10 */
scheme_letrec_type, /* 11 */
scheme_let_one_type, /* 12 */
scheme_with_cont_mark_type, /* 13 */
scheme_quote_syntax_type, /* 14 */
scheme_define_values_type, /* 15 */
scheme_define_syntaxes_type, /* 16 */
scheme_define_for_syntax_type, /* 17 */
scheme_set_bang_type, /* 18 */
scheme_boxenv_type, /* 19 */
scheme_begin0_sequence_type, /* 20 */
scheme_splice_sequence_type, /* 21 */
scheme_require_form_type, /* 22 */
scheme_varref_form_type, /* 23 */
scheme_apply_values_type, /* 24 */
scheme_case_lambda_sequence_type, /* 25 */
scheme_module_type, /* 26 */
_scheme_values_types_, /* All following types are values */
/* intermediate compiled: */
scheme_compiled_unclosed_procedure_type,/* 17 */
scheme_compiled_let_value_type, /* 18 */
scheme_compiled_let_void_type, /* 19 */
scheme_compiled_syntax_type, /* 20 */
scheme_compiled_toplevel_type, /* 21 */
scheme_compiled_quote_syntax_type, /* 22 */
scheme_compiled_unclosed_procedure_type,/* 28 */
scheme_compiled_let_value_type, /* 29 */
scheme_compiled_let_void_type, /* 30 */
scheme_compiled_toplevel_type, /* 31 */
scheme_compiled_quote_syntax_type, /* 32 */
scheme_quote_compilation_type, /* used while writing, only */
/* Registered in prefix table: */
scheme_variable_type, /* 24 */
scheme_variable_type, /* 34 */
scheme_module_variable_type, /* link replaces with scheme_variable_type */
_scheme_compiled_values_types_, /* 26 */
_scheme_compiled_values_types_, /* 36 */
/* procedure types */
scheme_prim_type, /* 27 */
scheme_closed_prim_type, /* 28 */
scheme_closure_type, /* 29 */
scheme_case_closure_type, /* 30 */
scheme_cont_type, /* 31 */
scheme_escaping_cont_type, /* 32 */
scheme_proc_struct_type, /* 33 */
scheme_native_closure_type, /* 34 */
scheme_proc_chaperone_type, /* 35 */
scheme_prim_type, /* 37 */
scheme_closed_prim_type, /* 38 */
scheme_closure_type, /* 39 */
scheme_case_closure_type, /* 40 */
scheme_cont_type, /* 41 */
scheme_escaping_cont_type, /* 42 */
scheme_proc_struct_type, /* 43 */
scheme_native_closure_type, /* 44 */
scheme_proc_chaperone_type, /* 45 */
scheme_chaperone_type, /* 36 */
scheme_chaperone_type, /* 46 */
/* structure type (plus one above for procs) */
scheme_structure_type, /* 37 */
scheme_structure_type, /* 47 */
/* basic types */
scheme_char_type, /* 38 */
scheme_integer_type, /* 39 */
scheme_bignum_type, /* 40 */
scheme_rational_type, /* 41 */
scheme_float_type, /* 42 */
scheme_double_type, /* 43 */
scheme_complex_type, /* 44 */
scheme_char_string_type, /* 45 */
scheme_byte_string_type, /* 46 */
scheme_unix_path_type, /* 47 */
scheme_windows_path_type, /* 48 */
scheme_symbol_type, /* 49 */
scheme_keyword_type, /* 50 */
scheme_null_type, /* 51 */
scheme_pair_type, /* 52 */
scheme_mutable_pair_type, /* 53 */
scheme_vector_type, /* 54 */
scheme_inspector_type, /* 55 */
scheme_input_port_type, /* 56 */
scheme_output_port_type, /* 57 */
scheme_eof_type, /* 58 */
scheme_true_type, /* 59 */
scheme_false_type, /* 60 */
scheme_void_type, /* 61 */
scheme_syntax_compiler_type, /* 62 */
scheme_macro_type, /* 63 */
scheme_box_type, /* 64 */
scheme_thread_type, /* 65 */
scheme_stx_offset_type, /* 66 */
scheme_cont_mark_set_type, /* 67 */
scheme_sema_type, /* 68 */
scheme_hash_table_type, /* 69 */
scheme_hash_tree_type, /* 70 */
scheme_cpointer_type, /* 71 */
scheme_prefix_type, /* 72 */
scheme_weak_box_type, /* 73 */
scheme_ephemeron_type, /* 74 */
scheme_struct_type_type, /* 75 */
scheme_module_index_type, /* 76 */
scheme_set_macro_type, /* 77 */
scheme_listener_type, /* 78 */
scheme_namespace_type, /* 79 */
scheme_config_type, /* 80 */
scheme_stx_type, /* 81 */
scheme_will_executor_type, /* 82 */
scheme_custodian_type, /* 83 */
scheme_random_state_type, /* 84 */
scheme_regexp_type, /* 85 */
scheme_bucket_type, /* 86 */
scheme_bucket_table_type, /* 87 */
scheme_subprocess_type, /* 88 */
scheme_compilation_top_type, /* 89 */
scheme_wrap_chunk_type, /* 90 */
scheme_eval_waiting_type, /* 91 */
scheme_tail_call_waiting_type, /* 92 */
scheme_undefined_type, /* 93 */
scheme_struct_property_type, /* 94 */
scheme_chaperone_property_type, /* 95 */
scheme_multiple_values_type, /* 96 */
scheme_placeholder_type, /* 97 */
scheme_table_placeholder_type, /* 98 */
scheme_case_lambda_sequence_type, /* 99 */
scheme_begin0_sequence_type, /* 100 */
scheme_rename_table_type, /* 101 */
scheme_rename_table_set_type, /* 102 */
scheme_module_type, /* 103 */
scheme_svector_type, /* 104 */
scheme_resolve_prefix_type, /* 105 */
scheme_security_guard_type, /* 106 */
scheme_indent_type, /* 107 */
scheme_udp_type, /* 108 */
scheme_udp_evt_type, /* 109 */
scheme_tcp_accept_evt_type, /* 110 */
scheme_id_macro_type, /* 111 */
scheme_evt_set_type, /* 112 */
scheme_wrap_evt_type, /* 113 */
scheme_handle_evt_type, /* 114 */
scheme_nack_guard_evt_type, /* 115 */
scheme_semaphore_repost_type, /* 116 */
scheme_channel_type, /* 117 */
scheme_channel_put_type, /* 118 */
scheme_thread_resume_type, /* 119 */
scheme_thread_suspend_type, /* 120 */
scheme_thread_dead_type, /* 121 */
scheme_poll_evt_type, /* 122 */
scheme_nack_evt_type, /* 123 */
scheme_module_registry_type, /* 124 */
scheme_thread_set_type, /* 125 */
scheme_string_converter_type, /* 126 */
scheme_alarm_type, /* 127 */
scheme_thread_recv_evt_type, /* 128 */
scheme_thread_cell_type, /* 129 */
scheme_channel_syncer_type, /* 130 */
scheme_special_comment_type, /* 131 */
scheme_write_evt_type, /* 132 */
scheme_always_evt_type, /* 133 */
scheme_never_evt_type, /* 134 */
scheme_progress_evt_type, /* 135 */
scheme_certifications_type, /* 136 */
scheme_already_comp_type, /* 137 */
scheme_readtable_type, /* 138 */
scheme_intdef_context_type, /* 139 */
scheme_lexical_rib_type, /* 140 */
scheme_thread_cell_values_type, /* 141 */
scheme_global_ref_type, /* 142 */
scheme_cont_mark_chain_type, /* 143 */
scheme_raw_pair_type, /* 144 */
scheme_prompt_type, /* 145 */
scheme_prompt_tag_type, /* 146 */
scheme_expanded_syntax_type, /* 147 */
scheme_delay_syntax_type, /* 148 */
scheme_cust_box_type, /* 149 */
scheme_resolved_module_path_type, /* 150 */
scheme_module_phase_exports_type, /* 151 */
scheme_logger_type, /* 152 */
scheme_log_reader_type, /* 153 */
scheme_free_id_info_type, /* 154 */
scheme_rib_delimiter_type, /* 155 */
scheme_noninline_proc_type, /* 156 */
scheme_prune_context_type, /* 157 */
scheme_future_type, /* 158 */
scheme_flvector_type, /* 159 */
scheme_fxvector_type, /* 160 */
scheme_place_type, /* 161 */
scheme_place_async_channel_type, /* 162 */
scheme_place_bi_channel_type, /* 163 */
scheme_once_used_type, /* 164 */
scheme_serialized_symbol_type, /* 165 */
scheme_serialized_structure_type, /* 166 */
scheme_char_type, /* 48 */
scheme_integer_type, /* 49 */
scheme_bignum_type, /* 50 */
scheme_rational_type, /* 51 */
scheme_float_type, /* 52 */
scheme_double_type, /* 53 */
scheme_complex_type, /* 54 */
scheme_char_string_type, /* 55 */
scheme_byte_string_type, /* 56 */
scheme_unix_path_type, /* 57 */
scheme_windows_path_type, /* 58 */
scheme_symbol_type, /* 59 */
scheme_keyword_type, /* 60 */
scheme_null_type, /* 61 */
scheme_pair_type, /* 62 */
scheme_mutable_pair_type, /* 63 */
scheme_vector_type, /* 64 */
scheme_inspector_type, /* 65 */
scheme_input_port_type, /* 66 */
scheme_output_port_type, /* 67 */
scheme_eof_type, /* 68 */
scheme_true_type, /* 69 */
scheme_false_type, /* 70 */
scheme_void_type, /* 71 */
scheme_syntax_compiler_type, /* 72 */
scheme_macro_type, /* 73 */
scheme_box_type, /* 74 */
scheme_thread_type, /* 75 */
scheme_stx_offset_type, /* 76 */
scheme_cont_mark_set_type, /* 77 */
scheme_sema_type, /* 78 */
scheme_hash_table_type, /* 79 */
scheme_hash_tree_type, /* 80 */
scheme_cpointer_type, /* 81 */
scheme_prefix_type, /* 82 */
scheme_weak_box_type, /* 83 */
scheme_ephemeron_type, /* 84 */
scheme_struct_type_type, /* 85 */
scheme_module_index_type, /* 86 */
scheme_set_macro_type, /* 87 */
scheme_listener_type, /* 88 */
scheme_namespace_type, /* 89 */
scheme_config_type, /* 90 */
scheme_stx_type, /* 91 */
scheme_will_executor_type, /* 92 */
scheme_custodian_type, /* 93 */
scheme_random_state_type, /* 94 */
scheme_regexp_type, /* 95 */
scheme_bucket_type, /* 96 */
scheme_bucket_table_type, /* 97 */
scheme_subprocess_type, /* 98 */
scheme_compilation_top_type, /* 99 */
scheme_wrap_chunk_type, /* 100 */
scheme_eval_waiting_type, /* 101 */
scheme_tail_call_waiting_type, /* 102 */
scheme_undefined_type, /* 103 */
scheme_struct_property_type, /* 104 */
scheme_chaperone_property_type, /* 105 */
scheme_multiple_values_type, /* 106 */
scheme_placeholder_type, /* 107 */
scheme_table_placeholder_type, /* 108 */
scheme_rename_table_type, /* 109 */
scheme_rename_table_set_type, /* 110 */
scheme_svector_type, /* 111 */
scheme_resolve_prefix_type, /* 112 */
scheme_security_guard_type, /* 113 */
scheme_indent_type, /* 114 */
scheme_udp_type, /* 115 */
scheme_udp_evt_type, /* 116 */
scheme_tcp_accept_evt_type, /* 117 */
scheme_id_macro_type, /* 118 */
scheme_evt_set_type, /* 119 */
scheme_wrap_evt_type, /* 120 */
scheme_handle_evt_type, /* 121 */
scheme_nack_guard_evt_type, /* 122 */
scheme_semaphore_repost_type, /* 123 */
scheme_channel_type, /* 124 */
scheme_channel_put_type, /* 125 */
scheme_thread_resume_type, /* 126 */
scheme_thread_suspend_type, /* 127 */
scheme_thread_dead_type, /* 128 */
scheme_poll_evt_type, /* 129 */
scheme_nack_evt_type, /* 130 */
scheme_module_registry_type, /* 131 */
scheme_thread_set_type, /* 132 */
scheme_string_converter_type, /* 133 */
scheme_alarm_type, /* 134 */
scheme_thread_recv_evt_type, /* 135 */
scheme_thread_cell_type, /* 136 */
scheme_channel_syncer_type, /* 137 */
scheme_special_comment_type, /* 138 */
scheme_write_evt_type, /* 139 */
scheme_always_evt_type, /* 140 */
scheme_never_evt_type, /* 141 */
scheme_progress_evt_type, /* 142 */
scheme_certifications_type, /* 143 */
scheme_already_comp_type, /* 144 */
scheme_readtable_type, /* 145 */
scheme_intdef_context_type, /* 146 */
scheme_lexical_rib_type, /* 147 */
scheme_thread_cell_values_type, /* 148 */
scheme_global_ref_type, /* 149 */
scheme_cont_mark_chain_type, /* 150 */
scheme_raw_pair_type, /* 151 */
scheme_prompt_type, /* 152 */
scheme_prompt_tag_type, /* 153 */
scheme_expanded_syntax_type, /* 154 */
scheme_delay_syntax_type, /* 155 */
scheme_cust_box_type, /* 156 */
scheme_resolved_module_path_type, /* 157 */
scheme_module_phase_exports_type, /* 158 */
scheme_logger_type, /* 159 */
scheme_log_reader_type, /* 160 */
scheme_free_id_info_type, /* 161 */
scheme_rib_delimiter_type, /* 162 */
scheme_noninline_proc_type, /* 163 */
scheme_prune_context_type, /* 164 */
scheme_future_type, /* 165 */
scheme_flvector_type, /* 166 */
scheme_fxvector_type, /* 167 */
scheme_place_type, /* 168 */
scheme_place_async_channel_type, /* 169 */
scheme_place_bi_channel_type, /* 170 */
scheme_once_used_type, /* 171 */
scheme_serialized_symbol_type, /* 172 */
scheme_serialized_structure_type, /* 173 */
/* use scheme_currently_unused_type above, first */
#ifdef MZTAG_REQUIRED
_scheme_last_normal_type_, /* 167 */
_scheme_last_normal_type_, /* 174 */
scheme_rt_weak_array, /* 168 */
scheme_rt_weak_array, /* 175 */
scheme_rt_comp_env, /* 168*/
scheme_rt_constant_binding, /* 170 */
scheme_rt_resolve_info, /* 171 */
scheme_rt_optimize_info, /* 172 */
scheme_rt_compile_info, /* 173 */
scheme_rt_cont_mark, /* 174 */
scheme_rt_saved_stack, /* 175 */
scheme_rt_reply_item, /* 176 */
scheme_rt_closure_info, /* 177 */
scheme_rt_overflow, /* 178 */
scheme_rt_overflow_jmp, /* 179 */
scheme_rt_meta_cont, /* 180 */
scheme_rt_dyn_wind_cell, /* 181 */
scheme_rt_dyn_wind_info, /* 182 */
scheme_rt_dyn_wind, /* 183 */
scheme_rt_dup_check, /* 184 */
scheme_rt_thread_memory, /* 185 */
scheme_rt_input_file, /* 186 */
scheme_rt_input_fd, /* 187 */
scheme_rt_oskit_console_input, /* 188 */
scheme_rt_tested_input_file, /* 189 */
scheme_rt_tested_output_file, /* 190 */
scheme_rt_indexed_string, /* 191 */
scheme_rt_output_file, /* 192 */
scheme_rt_load_handler_data, /* 193 */
scheme_rt_pipe, /* 194 */
scheme_rt_beos_process, /* 195 */
scheme_rt_system_child, /* 196 */
scheme_rt_tcp, /* 197 */
scheme_rt_write_data, /* 198 */
scheme_rt_tcp_select_info, /* 199 */
scheme_rt_param_data, /* 200 */
scheme_rt_will, /* 201 */
scheme_rt_struct_proc_info, /* 202 */
scheme_rt_linker_name, /* 203 */
scheme_rt_param_map, /* 204 */
scheme_rt_finalization, /* 205 */
scheme_rt_finalizations, /* 206 */
scheme_rt_cpp_object, /* 207 */
scheme_rt_cpp_array_object, /* 208 */
scheme_rt_stack_object, /* 209 */
scheme_rt_preallocated_object, /* 210 */
scheme_thread_hop_type, /* 211 */
scheme_rt_srcloc, /* 212 */
scheme_rt_evt, /* 213 */
scheme_rt_syncing, /* 214 */
scheme_rt_comp_prefix, /* 215 */
scheme_rt_user_input, /* 216 */
scheme_rt_user_output, /* 217 */
scheme_rt_compact_port, /* 218 */
scheme_rt_read_special_dw, /* 219 */
scheme_rt_regwork, /* 220 */
scheme_rt_buf_holder, /* 221 */
scheme_rt_parameterization, /* 222 */
scheme_rt_print_params, /* 223 */
scheme_rt_read_params, /* 224 */
scheme_rt_native_code, /* 225 */
scheme_rt_native_code_plus_case, /* 226 */
scheme_rt_jitter_data, /* 227 */
scheme_rt_module_exports, /* 228 */
scheme_rt_delay_load_info, /* 229 */
scheme_rt_marshal_info, /* 230 */
scheme_rt_unmarshal_info, /* 231 */
scheme_rt_runstack, /* 232 */
scheme_rt_sfs_info, /* 233 */
scheme_rt_validate_clearing, /* 234 */
scheme_rt_rb_node, /* 235 */
scheme_rt_lightweight_cont, /* 236 */
scheme_rt_constant_binding, /* 177 */
scheme_rt_resolve_info, /* 178 */
scheme_rt_optimize_info, /* 179 */
scheme_rt_compile_info, /* 180 */
scheme_rt_cont_mark, /* 181 */
scheme_rt_saved_stack, /* 182 */
scheme_rt_reply_item, /* 183 */
scheme_rt_closure_info, /* 184 */
scheme_rt_overflow, /* 185 */
scheme_rt_overflow_jmp, /* 186 */
scheme_rt_meta_cont, /* 187 */
scheme_rt_dyn_wind_cell, /* 188 */
scheme_rt_dyn_wind_info, /* 189 */
scheme_rt_dyn_wind, /* 190 */
scheme_rt_dup_check, /* 191 */
scheme_rt_thread_memory, /* 192 */
scheme_rt_input_file, /* 193 */
scheme_rt_input_fd, /* 194 */
scheme_rt_oskit_console_input, /* 195 */
scheme_rt_tested_input_file, /* 196 */
scheme_rt_tested_output_file, /* 197 */
scheme_rt_indexed_string, /* 198 */
scheme_rt_output_file, /* 199 */
scheme_rt_load_handler_data, /* 200 */
scheme_rt_pipe, /* 201 */
scheme_rt_beos_process, /* 202 */
scheme_rt_system_child, /* 203 */
scheme_rt_tcp, /* 204 */
scheme_rt_write_data, /* 205 */
scheme_rt_tcp_select_info, /* 206 */
scheme_rt_param_data, /* 207 */
scheme_rt_will, /* 208 */
scheme_rt_struct_proc_info, /* 209 */
scheme_rt_linker_name, /* 210 */
scheme_rt_param_map, /* 211 */
scheme_rt_finalization, /* 212 */
scheme_rt_finalizations, /* 213 */
scheme_rt_cpp_object, /* 214 */
scheme_rt_cpp_array_object, /* 215 */
scheme_rt_stack_object, /* 216 */
scheme_rt_preallocated_object, /* 217 */
scheme_thread_hop_type, /* 218 */
scheme_rt_srcloc, /* 219 */
scheme_rt_evt, /* 220 */
scheme_rt_syncing, /* 221 */
scheme_rt_comp_prefix, /* 222 */
scheme_rt_user_input, /* 223 */
scheme_rt_user_output, /* 224 */
scheme_rt_compact_port, /* 225 */
scheme_rt_read_special_dw, /* 226 */
scheme_rt_regwork, /* 227 */
scheme_rt_buf_holder, /* 228 */
scheme_rt_parameterization, /* 229 */
scheme_rt_print_params, /* 230 */
scheme_rt_read_params, /* 231 */
scheme_rt_native_code, /* 232 */
scheme_rt_native_code_plus_case, /* 233 */
scheme_rt_jitter_data, /* 234 */
scheme_rt_module_exports, /* 235 */
scheme_rt_delay_load_info, /* 236 */
scheme_rt_marshal_info, /* 237 */
scheme_rt_unmarshal_info, /* 238 */
scheme_rt_runstack, /* 239 */
scheme_rt_sfs_info, /* 240 */
scheme_rt_validate_clearing, /* 241 */
scheme_rt_rb_node, /* 242 */
scheme_rt_lightweight_cont, /* 243 */
#endif
scheme_fsemaphore_type, /* 238 */
scheme_fsemaphore_type, /* 244 */
_scheme_last_type_
};

File diff suppressed because it is too large Load Diff

View File

@ -107,15 +107,24 @@ scheme_init_type ()
set_name(scheme_application3_type, "<binary-application-code>");
set_name(scheme_compiled_unclosed_procedure_type, "<procedure-semi-code>");
set_name(scheme_unclosed_procedure_type, "<procedure-code>");
set_name(scheme_syntax_type, "<syntax-code>");
set_name(scheme_compiled_syntax_type, "<syntax-semi-code>");
set_name(scheme_branch_type, "<branch-code>");
set_name(scheme_sequence_type, "<sequence-code>");
set_name(scheme_case_lambda_sequence_type, "<case-lambda-code>");
set_name(scheme_begin0_sequence_type, "<begin0-code>");
set_name(scheme_with_cont_mark_type, "<with-continuation-mark-code>");
set_name(scheme_quote_syntax_type, "<quote-syntax-code>");
set_name(scheme_define_values_type, "<define-values-code>");
set_name(scheme_define_syntaxes_type, "<define-syntaxes-code>");
set_name(scheme_define_for_syntax_type, "<define-for-syntax-code>");
set_name(scheme_begin0_sequence_type, "<begin0-code>");
set_name(scheme_splice_sequence_type, "<splicing-begin-code>");
set_name(scheme_module_type, "<module-code>");
set_name(scheme_set_bang_type, "<set!-code>");
set_name(scheme_boxenv_type, "<boxenv-code>");
set_name(scheme_require_form_type, "<require-code>");
set_name(scheme_varref_form_type, "<varref-code>");
set_name(scheme_apply_values_type, "<apply-values-code>");
set_name(scheme_case_lambda_sequence_type, "<case-lambda-code>");
set_name(scheme_let_value_type, "<let-value-code>");
set_name(scheme_let_void_type, "<let-void-code>");
set_name(scheme_compiled_let_value_type, "<let-value-semi-code>");
@ -214,7 +223,6 @@ scheme_init_type ()
set_name(scheme_set_macro_type, "<set!-transformer>");
set_name(scheme_id_macro_type, "<rename-transformer>");
set_name(scheme_module_type, "<module-code>");
set_name(scheme_module_index_type, "<module-path-index>");
set_name(scheme_subprocess_type, "<subprocess>");
@ -502,7 +510,6 @@ void scheme_register_traversers(void)
GC_REG_TRAV(scheme_variable_type, variable_obj);
GC_REG_TRAV(scheme_local_type, local_obj);
GC_REG_TRAV(scheme_local_unbox_type, local_obj);
GC_REG_TRAV(scheme_syntax_type, iptr_obj);
GC_REG_TRAV(scheme_application_type, app_rec);
GC_REG_TRAV(scheme_application2_type, app2_rec);
GC_REG_TRAV(scheme_application3_type, app3_rec);
@ -517,12 +524,24 @@ void scheme_register_traversers(void)
GC_REG_TRAV(scheme_quote_syntax_type, quotesyntax_obj);
GC_REG_TRAV(scheme_module_variable_type, module_var);
GC_REG_TRAV(scheme_define_values_type, vector_obj);
GC_REG_TRAV(scheme_define_syntaxes_type, vector_obj);
GC_REG_TRAV(scheme_define_for_syntax_type, vector_obj);
GC_REG_TRAV(scheme_varref_form_type, twoptr_obj);
GC_REG_TRAV(scheme_apply_values_type, twoptr_obj);
GC_REG_TRAV(scheme_boxenv_type, twoptr_obj);
GC_REG_TRAV(scheme_case_lambda_sequence_type, case_closure);
GC_REG_TRAV(scheme_begin0_sequence_type, seq_rec);
GC_REG_TRAV(scheme_splice_sequence_type, seq_rec);
GC_REG_TRAV(scheme_set_bang_type, set_bang);
GC_REG_TRAV(scheme_module_type, module_val);
GC_REG_TRAV(scheme_require_form_type, twoptr_obj);
GC_REG_TRAV(_scheme_values_types_, bad_trav);
GC_REG_TRAV(scheme_compiled_unclosed_procedure_type, unclosed_proc);
GC_REG_TRAV(scheme_compiled_let_value_type, comp_let_value);
GC_REG_TRAV(scheme_compiled_let_void_type, let_header);
GC_REG_TRAV(scheme_compiled_syntax_type, iptr_obj);
GC_REG_TRAV(scheme_compiled_toplevel_type, toplevel_obj);
GC_REG_TRAV(scheme_compiled_quote_syntax_type, local_obj);
@ -603,8 +622,6 @@ void scheme_register_traversers(void)
GC_REG_TRAV(scheme_undefined_type, char_obj); /* small */
GC_REG_TRAV(scheme_placeholder_type, small_object);
GC_REG_TRAV(scheme_table_placeholder_type, iptr_obj);
GC_REG_TRAV(scheme_case_lambda_sequence_type, case_closure);
GC_REG_TRAV(scheme_begin0_sequence_type, seq_rec);
GC_REG_TRAV(scheme_svector_type, svector_val);
@ -614,7 +631,6 @@ void scheme_register_traversers(void)
GC_REG_TRAV(scheme_stx_type, stx_val);
GC_REG_TRAV(scheme_stx_offset_type, stx_off_val);
GC_REG_TRAV(scheme_expanded_syntax_type, twoptr_obj);
GC_REG_TRAV(scheme_module_type, module_val);
GC_REG_TRAV(scheme_rt_module_exports, module_exports_val);
GC_REG_TRAV(scheme_module_phase_exports_type, module_phase_exports_val);
GC_REG_TRAV(scheme_module_index_type, modidx_val);