trim some fat from module-variable references

svn: r12833
This commit is contained in:
Matthew Flatt 2008-12-13 17:38:14 +00:00
parent bd01cda595
commit cf8b75939b
18 changed files with 835 additions and 712 deletions

View File

@ -57,7 +57,8 @@
(values (append (values (append
(map (lambda (tl) (map (lambda (tl)
(match tl (match tl
[(? symbol?) '#%linkage] [#f '#%linkage]
[(? symbol?) (string->symbol (format "_~a" tl))]
[(struct global-bucket (name)) [(struct global-bucket (name))
(string->symbol (format "_~a" name))] (string->symbol (format "_~a" name))]
[(struct module-variable (modidx sym pos phase)) [(struct module-variable (modidx sym pos phase))

View File

@ -85,15 +85,10 @@
(define (read-variable v) (define (read-variable v)
(if (symbol? v) (if (symbol? v)
(make-global-bucket v) (make-global-bucket v)
(let-values ([(phase modname varname) (error "expected a symbol")))
(match v
[(list* phase modname varname) (define (do-not-read-variable v)
(values phase modname varname)] (error "should not get here"))
[(list* modname varname)
(values 0 modname varname)])])
(if (and (zero? phase) (eq? modname '#%kernel))
(error 'bucket "var ~a" varname)
(make-module-variable modname varname -1 phase)))))
(define (read-compilation-top v) (define (read-compilation-top v)
(match v (match v
@ -198,6 +193,7 @@
,rename ,max-let-depth ,dummy ,rename ,max-let-depth ,dummy
,prefix ,kernel-exclusion ,reprovide-kernel? ,prefix ,kernel-exclusion ,reprovide-kernel?
,indirect-provides ,num-indirect-provides ,indirect-provides ,num-indirect-provides
,indirect-syntax-provides ,num-indirect-syntax-provides
,indirect-et-provides ,num-indirect-et-provides ,indirect-et-provides ,num-indirect-et-provides
,protects ,et-protects ,protects ,et-protects
,provide-phase-count . ,rest) ,provide-phase-count . ,rest)
@ -282,7 +278,7 @@
(cons 'with-cont-mark-type read-with-cont-mark) (cons 'with-cont-mark-type read-with-cont-mark)
(cons 'quote-syntax-type read-topsyntax) (cons 'quote-syntax-type read-topsyntax)
(cons 'variable-type read-variable) (cons 'variable-type read-variable)
(cons 'module-variable-type read-variable) (cons 'module-variable-type do-not-read-variable)
(cons 'compilation-top-type read-compilation-top) (cons 'compilation-top-type read-compilation-top)
(cons 'case-lambda-sequence-type read-case-lambda) (cons 'case-lambda-sequence-type read-case-lambda)
(cons 'begin0-sequence-type read-sequence) (cons 'begin0-sequence-type read-sequence)
@ -719,7 +715,11 @@
(let ([mod (read-compact cp)] (let ([mod (read-compact cp)]
[var (read-compact cp)] [var (read-compact cp)]
[pos (read-compact-number cp)]) [pos (read-compact-number cp)])
(make-module-variable mod var pos 0))] (let-values ([(mod-phase pos)
(if (= pos -2)
(values 1 (read-compact-number cp))
(values 0 pos))])
(make-module-variable mod var pos mod-phase)))]
[(local-unbox) [(local-unbox)
(let* ([p* (read-compact-number cp)] (let* ([p* (read-compact-number cp)]
[p (if (< p* 0) [p (if (< p* 0)

View File

@ -198,7 +198,8 @@ Removes @scheme[card] from the table.}
@defmethod[(move-cards [cards (listof (is-a?/c card<%>))] @defmethod[(move-cards [cards (listof (is-a?/c card<%>))]
[x real?] [x real?]
[y real?] [y real?]
[offset-proc (exact-nonnegative-integer? . -> . (values real? real?)) [offset-proc (exact-nonnegative-integer?
. -> . (values real? real?))
(lambda (i) (values 0 0))]) (lambda (i) (values 0 0))])
void?]{ void?]{

View File

@ -103,7 +103,7 @@ Represents an element.}
Returns @scheme[#t] if @scheme[v] is a @scheme[pcdata] instance, Returns @scheme[#t] if @scheme[v] is a @scheme[pcdata] instance,
@scheme[element] instance, an @scheme[entity] instance, @scheme[element] instance, an @scheme[entity] instance,
@scheme[comment], or @scheme[pcdata] instance.} @scheme[comment], or @scheme[cdata] instance.}
@defstruct[(attribute source) ([name symbol?] [value string?])]{ @defstruct[(attribute source) ([name symbol?] [value string?])]{

View File

@ -45,7 +45,7 @@ static void *print_out_pointer(const char *prefix, void *p,
trace_page_t *page; trace_page_t *page;
const char *what; const char *what;
page = find_page(p); page = pagemap_find_page(GC->page_maps, p);
if (!page || (trace_page_type(page) == TRACE_PAGE_BAD)) { if (!page || (trace_page_type(page) == TRACE_PAGE_BAD)) {
GCPRINT(GCOUTF, "%s??? %p\n", prefix, p); GCPRINT(GCOUTF, "%s??? %p\n", prefix, p);
return NULL; return NULL;
@ -94,7 +94,7 @@ static void print_traced_objects(int path_length_limit,
GC_print_tagged_value_proc print_tagged_value) GC_print_tagged_value_proc print_tagged_value)
{ {
int i; int i;
avoid_collection++; GC->dumping_avoid_collection++;
GCPRINT(GCOUTF, "Begin Trace\n"); GCPRINT(GCOUTF, "Begin Trace\n");
for (i = 0; i < found_object_count; i++) { for (i = 0; i < found_object_count; i++) {
void *p; void *p;
@ -107,5 +107,5 @@ static void print_traced_objects(int path_length_limit,
} }
} }
GCPRINT(GCOUTF, "End Trace\n"); GCPRINT(GCOUTF, "End Trace\n");
--avoid_collection; --GC->dumping_avoid_collection;
} }

View File

@ -934,7 +934,7 @@ static void backtrace_new_page(NewGC *gc, mpage *page)
static void free_backtrace(struct mpage *page) static void free_backtrace(struct mpage *page)
{ {
free_pages(page->backtrace, APAGE_SIZE); free_pages(GC, page->backtrace, APAGE_SIZE);
} }
static void *bt_source; static void *bt_source;
@ -1590,6 +1590,11 @@ void GC_register_traversers(short tag, Size_Proc size, Mark_Proc mark,
mark_tag = BTC_get_redirect_tag(gc, mark_tag); mark_tag = BTC_get_redirect_tag(gc, mark_tag);
#endif #endif
#if MZ_GC_BACKTRACE
/* Keep tagged objects in tagged space: */
atomic = 0;
#endif
gc->mark_table[mark_tag] = atomic ? (Mark_Proc)PAGE_ATOMIC : mark; gc->mark_table[mark_tag] = atomic ? (Mark_Proc)PAGE_ATOMIC : mark;
gc->fixup_table[tag] = fixup; gc->fixup_table[tag] = fixup;
} }
@ -2145,7 +2150,7 @@ static void mark_backpointers(NewGC *gc)
pagemap_add(pagemap, work); pagemap_add(pagemap, work);
if(work->big_page) { if(work->big_page) {
work->big_page = 2; work->big_page = 2;
push_ptr(PPTR(NUM(work->addr) + PREFIX_SIZE)); push_ptr(PPTR(NUM(work->addr) + PREFIX_SIZE + sizeof(struct objhead)));
} else { } else {
if(work->page_type != PAGE_ATOMIC) { if(work->page_type != PAGE_ATOMIC) {
void **start = PPTR(NUM(work->addr) + PREFIX_SIZE); void **start = PPTR(NUM(work->addr) + PREFIX_SIZE);

File diff suppressed because it is too large Load Diff

View File

@ -123,6 +123,8 @@ static Scheme_Object *write_toplevel(Scheme_Object *obj);
static Scheme_Object *read_toplevel(Scheme_Object *obj); static Scheme_Object *read_toplevel(Scheme_Object *obj);
static Scheme_Object *write_variable(Scheme_Object *obj); static Scheme_Object *write_variable(Scheme_Object *obj);
static Scheme_Object *read_variable(Scheme_Object *obj); static Scheme_Object *read_variable(Scheme_Object *obj);
static Scheme_Object *write_module_variable(Scheme_Object *obj);
static Scheme_Object *read_module_variable(Scheme_Object *obj);
static Scheme_Object *write_local(Scheme_Object *obj); static Scheme_Object *write_local(Scheme_Object *obj);
static Scheme_Object *read_local(Scheme_Object *obj); static Scheme_Object *read_local(Scheme_Object *obj);
static Scheme_Object *read_local_unbox(Scheme_Object *obj); static Scheme_Object *read_local_unbox(Scheme_Object *obj);
@ -561,8 +563,8 @@ static void make_kernel_env(void)
scheme_install_type_reader(scheme_toplevel_type, read_toplevel); scheme_install_type_reader(scheme_toplevel_type, read_toplevel);
scheme_install_type_writer(scheme_variable_type, write_variable); scheme_install_type_writer(scheme_variable_type, write_variable);
scheme_install_type_reader(scheme_variable_type, read_variable); scheme_install_type_reader(scheme_variable_type, read_variable);
scheme_install_type_writer(scheme_module_variable_type, write_variable); scheme_install_type_writer(scheme_module_variable_type, write_module_variable);
scheme_install_type_reader(scheme_module_variable_type, read_variable); scheme_install_type_reader(scheme_module_variable_type, read_module_variable);
scheme_install_type_writer(scheme_local_type, write_local); scheme_install_type_writer(scheme_local_type, write_local);
scheme_install_type_reader(scheme_local_type, read_local); scheme_install_type_reader(scheme_local_type, read_local);
scheme_install_type_writer(scheme_local_unbox_type, write_local); scheme_install_type_writer(scheme_local_unbox_type, write_local);
@ -3319,7 +3321,7 @@ void scheme_optimize_info_done(Optimize_Info *info)
Resolve_Prefix *scheme_resolve_prefix(int phase, Comp_Prefix *cp, int simplify) Resolve_Prefix *scheme_resolve_prefix(int phase, Comp_Prefix *cp, int simplify)
{ {
Resolve_Prefix *rp; Resolve_Prefix *rp;
Scheme_Object **tls, **stxes, *simplify_cache; Scheme_Object **tls, **stxes, *simplify_cache, *m;
Scheme_Hash_Table *ht; Scheme_Hash_Table *ht;
int i; int i;
@ -3344,7 +3346,15 @@ Resolve_Prefix *scheme_resolve_prefix(int phase, Comp_Prefix *cp, int simplify)
if (ht) { if (ht) {
for (i = 0; i < ht->size; i++) { for (i = 0; i < ht->size; i++) {
if (ht->vals[i]) { if (ht->vals[i]) {
tls[SCHEME_TOPLEVEL_POS(ht->vals[i])] = ht->keys[i]; m = ht->keys[i];
if (SAME_TYPE(SCHEME_TYPE(m), scheme_module_variable_type)) {
if (SCHEME_FALSEP(((Scheme_Modidx *)((Module_Variable *)m)->modidx)->base)
&& SCHEME_FALSEP(((Scheme_Modidx *)((Module_Variable *)m)->modidx)->path)) {
/* Reduce self-referece to just a symbol: */
m = ((Module_Variable *)m)->sym;
}
}
tls[SCHEME_TOPLEVEL_POS(ht->vals[i])] = m;
} }
} }
} }
@ -4941,92 +4951,54 @@ static Scheme_Object *read_toplevel(Scheme_Object *obj)
} }
static Scheme_Object *write_variable(Scheme_Object *obj) static Scheme_Object *write_variable(Scheme_Object *obj)
/* WARNING: phase-0 module variables and #%kernel references /* #%kernel references are handled in print.c, instead */
are handled in print.c, instead */
{ {
if (SAME_TYPE(scheme_variable_type, SCHEME_TYPE(obj))) { Scheme_Object *sym;
Scheme_Object *sym; Scheme_Env *home;
Scheme_Env *home; Scheme_Module *m;
Scheme_Module *m;
sym = (Scheme_Object *)(SCHEME_VAR_BUCKET(obj))->key; sym = (Scheme_Object *)(SCHEME_VAR_BUCKET(obj))->key;
home = ((Scheme_Bucket_With_Home *)obj)->home; home = ((Scheme_Bucket_With_Home *)obj)->home;
m = home->module; m = home->module;
/* If we get a writeable variable (instead of a module variable), /* If we get a writeable variable (instead of a module variable),
it must be a reference to a module referenced directly by its it must be a reference to a module referenced directly by its
a symbolic name (i.e., no path). */ a symbolic name (i.e., no path). */
if (m) { if (m) {
sym = scheme_make_pair(m->modname, sym); sym = scheme_make_pair(m->modname, sym);
if (home->mod_phase) if (home->mod_phase)
sym = scheme_make_pair(scheme_make_integer(home->mod_phase), sym); sym = scheme_make_pair(scheme_make_integer(home->mod_phase), sym);
}
return sym;
} else {
Module_Variable *mv = (Module_Variable *)obj;
return scheme_make_pair(scheme_make_integer(mv->mod_phase),
scheme_make_pair(mv->modidx,
mv->sym));
} }
return sym;
} }
static Scheme_Object *read_variable(Scheme_Object *obj) static Scheme_Object *read_variable(Scheme_Object *obj)
/* WARNING: phase-0 module variables and #%kernel references /* #%kernel references are handled in read.c, instead */
are handled in read.c, instead */
{ {
Scheme_Env *env; Scheme_Env *env;
env = scheme_get_env(NULL); env = scheme_get_env(NULL);
if (!SCHEME_SYMBOLP(obj)) { if (!SCHEME_SYMBOLP(obj)) return NULL;
/* Find variable from module. */
Scheme_Object *modname, *varname;
int mod_phase = 0;
if (!SCHEME_PAIRP(obj)) return NULL;
modname = SCHEME_CAR(obj);
if (SCHEME_INTP(modname)) {
mod_phase = SCHEME_INT_VAL(modname);
if (mod_phase != 1) return NULL;
obj = SCHEME_CDR(obj);
if (!SCHEME_PAIRP(obj)) return NULL;
modname = SCHEME_CAR(obj);
}
varname = SCHEME_CDR(obj);
if (SAME_OBJ(modname, kernel_symbol) && !mod_phase) {
return (Scheme_Object *)scheme_global_bucket(varname, scheme_get_kernel_env());
} else {
Module_Variable *mv;
Scheme_Object *insp;
insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR);
mv = MALLOC_ONE_TAGGED(Module_Variable);
mv->so.type = scheme_module_variable_type;
mv->modidx = modname;
mv->sym = varname;
mv->insp = insp;
mv->pos = -1;
mv->mod_phase = mod_phase;
return (Scheme_Object *)mv;
}
}
return (Scheme_Object *)scheme_global_bucket(obj, env); return (Scheme_Object *)scheme_global_bucket(obj, env);
} }
static Scheme_Object *write_module_variable(Scheme_Object *obj)
{
scheme_signal_error("module variables should have been handled in print.c");
return NULL;
}
static Scheme_Object *read_module_variable(Scheme_Object *obj)
{
scheme_signal_error("module variables should have been handled in read.c");
return NULL;
}
static Scheme_Object *write_local(Scheme_Object *obj) static Scheme_Object *write_local(Scheme_Object *obj)
{ {
return scheme_make_integer(SCHEME_LOCAL_POS(obj)); return scheme_make_integer(SCHEME_LOCAL_POS(obj));
@ -5128,9 +5100,16 @@ static Scheme_Object *read_resolve_prefix(Scheme_Object *obj)
if (SCHEME_FALSEP(stx)) { if (SCHEME_FALSEP(stx)) {
stx = NULL; stx = NULL;
} else if (SCHEME_RPAIRP(stx)) { } else if (SCHEME_RPAIRP(stx)) {
rp->delay_info = (struct Scheme_Load_Delay *)SCHEME_CDR(stx); struct Scheme_Load_Delay *d;
rp->delay_refcount++; Scheme_Object *pr;
d = (struct Scheme_Load_Delay *)SCHEME_CDR(stx);
stx = SCHEME_CAR(stx); stx = SCHEME_CAR(stx);
pr = rp->delay_info_rpair;
if (!pr) {
pr = scheme_make_raw_pair(scheme_make_integer(0), (Scheme_Object *)d);
rp->delay_info_rpair = pr;
}
SCHEME_CAR(pr) = scheme_make_integer(SCHEME_INT_VAL(SCHEME_CAR(pr)) + 1);
} else { } else {
if (!SCHEME_STXP(stx)) return NULL; if (!SCHEME_STXP(stx)) return NULL;
} }

View File

@ -1721,20 +1721,23 @@ Scheme_Object *scheme_make_syntax_compiled(int idx, Scheme_Object *data)
static Scheme_Object *link_module_variable(Scheme_Object *modidx, static Scheme_Object *link_module_variable(Scheme_Object *modidx,
Scheme_Object *varname, Scheme_Object *varname,
Scheme_Object *insp, int check_access, Scheme_Object *insp,
int pos, int mod_phase, int pos, int mod_phase,
Scheme_Env *env) Scheme_Env *env,
Scheme_Object **exprs, int which)
{ {
Scheme_Object *modname; Scheme_Object *modname;
Scheme_Env *menv; Scheme_Env *menv;
int self = 0;
/* If it's a name id, resolve the name. */ /* If it's a name id, resolve the name. */
modname = scheme_module_resolve(modidx, 1); modname = scheme_module_resolve(modidx, 1);
if (env->module && SAME_OBJ(env->module->modname, modname) if (env->module && SAME_OBJ(env->module->modname, modname)
&& (env->mod_phase == mod_phase)) && (env->mod_phase == mod_phase)) {
self = 1;
menv = env; menv = env;
else { } else {
menv = scheme_module_access(modname, env, mod_phase); menv = scheme_module_access(modname, env, mod_phase);
if (!menv && env->phase) { if (!menv && env->phase) {
@ -1757,22 +1760,57 @@ static Scheme_Object *link_module_variable(Scheme_Object *modidx,
return NULL; return NULL;
} }
if (!SAME_OBJ(menv, env)) { if (check_access && !SAME_OBJ(menv, env)) {
varname = scheme_check_accessible_in_module(menv, insp, NULL, varname, NULL, NULL, varname = scheme_check_accessible_in_module(menv, insp, NULL, varname, NULL, NULL,
insp, pos, 0, NULL, env); insp, pos, 0, NULL, env);
} }
} }
if (exprs) {
if (self) {
exprs[which] = varname;
} else {
if (mod_phase != 0)
modname = scheme_make_pair(modname, scheme_make_integer(mod_phase));
modname = scheme_make_pair(varname, modname);
exprs[which] = modname;
}
}
return (Scheme_Object *)scheme_global_bucket(varname, menv); return (Scheme_Object *)scheme_global_bucket(varname, menv);
} }
static Scheme_Object *link_toplevel(Scheme_Object *expr, Scheme_Env *env, static Scheme_Object *link_toplevel(Scheme_Object **exprs, int which, Scheme_Env *env,
Scheme_Object *src_modidx, Scheme_Object *src_modidx,
Scheme_Object *dest_modidx) Scheme_Object *dest_modidx)
{ {
if (SCHEME_SYMBOLP(expr)) { Scheme_Object *expr = exprs[which];
if (SCHEME_FALSEP(expr)) {
/* See scheme_make_environment_dummy */ /* See scheme_make_environment_dummy */
return (Scheme_Object *)scheme_global_bucket(begin_symbol, env); return (Scheme_Object *)scheme_global_bucket(begin_symbol, env);
} else if (SCHEME_PAIRP(expr) || SCHEME_SYMBOLP(expr)) {
/* Simplified module reference */
Scheme_Object *modname, *varname;
int mod_phase = 0;
if (SCHEME_SYMBOLP(expr)) {
varname = expr;
modname = env->module->modname;
mod_phase = env->mod_phase;
} else {
varname = SCHEME_CAR(expr);
modname = SCHEME_CDR(expr);
if (SCHEME_PAIRP(modname)) {
mod_phase = SCHEME_INT_VAL(SCHEME_CDR(modname));
modname = SCHEME_CAR(modname);
}
}
return link_module_variable(modname,
varname,
0, NULL,
-1, mod_phase,
env,
NULL, 0);
} else if (SAME_TYPE(SCHEME_TYPE(expr), scheme_variable_type)) { } else if (SAME_TYPE(SCHEME_TYPE(expr), scheme_variable_type)) {
Scheme_Bucket_With_Home *b = (Scheme_Bucket_With_Home *)expr; Scheme_Bucket_With_Home *b = (Scheme_Bucket_With_Home *)expr;
@ -1781,18 +1819,20 @@ static Scheme_Object *link_toplevel(Scheme_Object *expr, Scheme_Env *env,
else else
return link_module_variable(b->home->module->modname, return link_module_variable(b->home->module->modname,
(Scheme_Object *)b->bucket.bucket.key, (Scheme_Object *)b->bucket.bucket.key,
b->home->module->insp, 1, b->home->module->insp,
-1, b->home->mod_phase, -1, b->home->mod_phase,
env); env,
exprs, which);
} else { } else {
Module_Variable *mv = (Module_Variable *)expr; Module_Variable *mv = (Module_Variable *)expr;
return link_module_variable(scheme_modidx_shift(mv->modidx, return link_module_variable(scheme_modidx_shift(mv->modidx,
src_modidx, src_modidx,
dest_modidx), dest_modidx),
mv->sym, mv->insp, mv->sym, 1, mv->insp,
mv->pos, mv->mod_phase, mv->pos, mv->mod_phase,
env); env,
exprs, which);
} }
} }
@ -8589,6 +8629,7 @@ static void *eval_k(void)
v = _scheme_eval_linked_expr_wp(v, p); v = _scheme_eval_linked_expr_wp(v, p);
} else if (SAME_TYPE(SCHEME_TYPE(v), scheme_compilation_top_type)) { } else if (SAME_TYPE(SCHEME_TYPE(v), scheme_compilation_top_type)) {
Scheme_Compilation_Top *top = (Scheme_Compilation_Top *)v; Scheme_Compilation_Top *top = (Scheme_Compilation_Top *)v;
Resolve_Prefix *rp;
int depth; int depth;
depth = top->max_let_depth + scheme_prefix_depth(top->prefix); depth = top->max_let_depth + scheme_prefix_depth(top->prefix);
@ -8604,6 +8645,9 @@ static void *eval_k(void)
if (use_jit) if (use_jit)
v = scheme_jit_expr(v); v = scheme_jit_expr(v);
else
v = scheme_eval_clone(v);
rp = scheme_prefix_eval_clone(top->prefix);
save_runstack = scheme_push_prefix(env, top->prefix, NULL, NULL, 0, env->phase); save_runstack = scheme_push_prefix(env, top->prefix, NULL, NULL, 0, env->phase);
@ -9689,6 +9733,60 @@ local_eval(int argc, Scheme_Object **argv)
return scheme_void; return scheme_void;
} }
/*========================================================================*/
/* cloning prefix information */
/*========================================================================*/
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);
break;
default:
naya = orig;
break;
}
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)
{
Resolve_Prefix *naya;
Scheme_Object **tls;
if (!rp->num_toplevels)
return rp;
naya = MALLOC_ONE_TAGGED(Resolve_Prefix);
memcpy(naya, rp, sizeof(Resolve_Prefix));
tls = MALLOC_N(Scheme_Object*, rp->num_toplevels);
memcpy(tls, rp->toplevels, sizeof(Scheme_Object *) * rp->num_toplevels);
naya->toplevels = tls;
return naya;
}
/*========================================================================*/ /*========================================================================*/
/* creating/pushing prefix for top-levels and syntax objects */ /* creating/pushing prefix for top-levels and syntax objects */
/*========================================================================*/ /*========================================================================*/
@ -9725,7 +9823,7 @@ Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp,
for (i = 0; i < rp->num_toplevels; i++) { for (i = 0; i < rp->num_toplevels; i++) {
v = rp->toplevels[i]; v = rp->toplevels[i];
if (genv) if (genv)
v = link_toplevel(rp->toplevels[i], genv, src_modidx, now_modidx); v = link_toplevel(rp->toplevels, i, genv, src_modidx, now_modidx);
a[i] = v; a[i] = v;
} }
@ -9733,7 +9831,7 @@ Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp,
i = rp->num_toplevels; i = rp->num_toplevels;
v = scheme_stx_phase_shift_as_rename(now_phase - src_phase, src_modidx, now_modidx, v = scheme_stx_phase_shift_as_rename(now_phase - src_phase, src_modidx, now_modidx,
genv ? genv->export_registry : NULL); genv ? genv->export_registry : NULL);
if (v || rp->delay_info) { if (v || (rp->delay_info_rpair && SCHEME_CDR(rp->delay_info_rpair))) {
/* Put lazy-shift info in a[i]: */ /* Put lazy-shift info in a[i]: */
Scheme_Object **ls; Scheme_Object **ls;
ls = MALLOC_N(Scheme_Object *, 2); ls = MALLOC_N(Scheme_Object *, 2);
@ -9926,15 +10024,17 @@ int scheme_validate_rator_wants_box(Scheme_Object *app_rator, int pos,
int num_toplevels, int num_stxes, int num_lifts) int num_toplevels, int num_stxes, int num_lifts)
{ {
Scheme_Closure_Data *data = NULL; Scheme_Closure_Data *data = NULL;
Scheme_Type ty;
while (1) { while (1) {
if (SAME_TYPE(SCHEME_TYPE(app_rator), scheme_closure_type)) { ty = SCHEME_TYPE(app_rator);
if (SAME_TYPE(ty, scheme_closure_type)) {
data = SCHEME_COMPILED_CLOS_CODE(app_rator); data = SCHEME_COMPILED_CLOS_CODE(app_rator);
break; break;
} else if (SAME_TYPE(SCHEME_TYPE(app_rator), scheme_unclosed_procedure_type)) { } else if (SAME_TYPE(ty, scheme_unclosed_procedure_type)) {
data = (Scheme_Closure_Data *)app_rator; data = (Scheme_Closure_Data *)app_rator;
break; break;
} else if (SAME_TYPE(SCHEME_TYPE(app_rator), scheme_toplevel_type)) { } else if (SAME_TYPE(ty, scheme_toplevel_type)) {
int p; int p;
p = SCHEME_TOPLEVEL_POS(app_rator); p = SCHEME_TOPLEVEL_POS(app_rator);
while (1) { while (1) {

View File

@ -3942,6 +3942,9 @@ void scheme_run_module_exptime(Scheme_Env *menv, int set_ns)
for_stx = SCHEME_TRUEP(SCHEME_VEC_ELS(e)[4]); for_stx = SCHEME_TRUEP(SCHEME_VEC_ELS(e)[4]);
e = SCHEME_VEC_ELS(e)[1]; e = SCHEME_VEC_ELS(e)[1];
if (SCHEME_SYMBOLP(names))
names = scheme_make_pair(names, scheme_null);
eval_exptime(names, scheme_list_length(names), e, exp_env, rhs_env, eval_exptime(names, scheme_list_length(names), e, exp_env, rhs_env,
rp, let_depth, 1, (for_stx ? for_stx_globals : syntax), for_stx, rp, let_depth, 1, (for_stx ? for_stx_globals : syntax), for_stx,
NULL); NULL);
@ -4602,7 +4605,7 @@ module_execute(Scheme_Object *data)
return scheme_void; return scheme_void;
} }
static Scheme_Object *rebuild_et_vec(Scheme_Object *naya, Scheme_Object *vec) static Scheme_Object *rebuild_et_vec(Scheme_Object *naya, Scheme_Object *vec, Resolve_Prefix *rp)
{ {
Scheme_Object *vec2; Scheme_Object *vec2;
int i; int i;
@ -4613,23 +4616,35 @@ static Scheme_Object *rebuild_et_vec(Scheme_Object *naya, Scheme_Object *vec)
SCHEME_VEC_ELS(vec2)[i] = SCHEME_VEC_ELS(vec)[i]; SCHEME_VEC_ELS(vec2)[i] = SCHEME_VEC_ELS(vec)[i];
} }
SCHEME_VEC_ELS(vec2)[1] = naya; SCHEME_VEC_ELS(vec2)[1] = naya;
SCHEME_VEC_ELS(vec2)[3] = (Scheme_Object *)rp;
return vec2; return vec2;
} }
static Scheme_Object *jit_vector(Scheme_Object *orig_l, int in_vec) static Scheme_Object *jit_vector(Scheme_Object *orig_l, int in_vec, int jit)
{ {
Scheme_Object *orig, *naya = NULL; Scheme_Object *orig, *naya = NULL;
Resolve_Prefix *orig_rp, *rp;
int i, cnt; int i, cnt;
cnt = SCHEME_VEC_SIZE(orig_l); cnt = SCHEME_VEC_SIZE(orig_l);
for (i = 0; i < cnt; i++) { for (i = 0; i < cnt; i++) {
orig = SCHEME_VEC_ELS(orig_l)[i]; orig = SCHEME_VEC_ELS(orig_l)[i];
if (in_vec) if (in_vec) {
orig_rp = (Resolve_Prefix *)SCHEME_VEC_ELS(orig)[3];
rp = scheme_prefix_eval_clone(orig_rp);
orig = SCHEME_VEC_ELS(orig)[1]; orig = SCHEME_VEC_ELS(orig)[1];
} else {
orig_rp = rp = NULL;
}
naya = scheme_jit_expr(orig); if (jit)
if (!SAME_OBJ(orig, naya)) naya = scheme_jit_expr(orig);
else
naya = orig;
if (!SAME_OBJ(orig, naya)
|| !SAME_OBJ(orig_rp, rp))
break; break;
} }
@ -4641,16 +4656,27 @@ static Scheme_Object *jit_vector(Scheme_Object *orig_l, int in_vec)
SCHEME_VEC_ELS(new_l)[j] = SCHEME_VEC_ELS(orig_l)[j]; SCHEME_VEC_ELS(new_l)[j] = SCHEME_VEC_ELS(orig_l)[j];
} }
if (in_vec) if (in_vec)
naya = rebuild_et_vec(naya, SCHEME_VEC_ELS(orig_l)[i]); naya = rebuild_et_vec(naya, SCHEME_VEC_ELS(orig_l)[i], rp);
SCHEME_VEC_ELS(new_l)[i] = naya; SCHEME_VEC_ELS(new_l)[i] = naya;
for (i++; i < cnt; i++) { for (i++; i < cnt; i++) {
orig = SCHEME_VEC_ELS(orig_l)[i]; orig = SCHEME_VEC_ELS(orig_l)[i];
if (in_vec)
orig = SCHEME_VEC_ELS(orig)[1];
naya = scheme_jit_expr(orig);
if (in_vec) { if (in_vec) {
if (!SAME_OBJ(orig, naya)) orig_rp = (Resolve_Prefix *)SCHEME_VEC_ELS(orig)[3];
naya = rebuild_et_vec(naya, SCHEME_VEC_ELS(orig_l)[i]); rp = scheme_prefix_eval_clone(orig_rp);
orig = SCHEME_VEC_ELS(orig)[1];
} else {
orig_rp = rp = NULL;
}
if (jit)
naya = scheme_jit_expr(orig);
else
naya = orig;
if (in_vec) {
if (!SAME_OBJ(orig, naya)
|| !SAME_OBJ(rp, orig_rp))
naya = rebuild_et_vec(naya, SCHEME_VEC_ELS(orig_l)[i], rp);
else else
naya = SCHEME_VEC_ELS(orig_l)[i]; naya = SCHEME_VEC_ELS(orig_l)[i];
} }
@ -4661,25 +4687,44 @@ static Scheme_Object *jit_vector(Scheme_Object *orig_l, int in_vec)
return orig_l; return orig_l;
} }
static Scheme_Object *module_jit(Scheme_Object *data) static Scheme_Object *do_module_clone(Scheme_Object *data, int jit)
{ {
Scheme_Module *m = (Scheme_Module *)data; Scheme_Module *m = (Scheme_Module *)data;
Scheme_Object *l1, *l2; Scheme_Object *l1, *l2;
Resolve_Prefix *rp;
rp = scheme_prefix_eval_clone(m->prefix);
l1 = jit_vector(m->body, 0); if (jit)
l2 = jit_vector(m->et_body, 1); l1 = jit_vector(m->body, 0, jit);
else
l1 = m->body;
l2 = jit_vector(m->et_body, 1, jit);
if (SAME_OBJ(l1, m->body) && SAME_OBJ(l2, m->body)) if (SAME_OBJ(l1, m->body)
&& SAME_OBJ(l2, m->body)
&& SAME_OBJ(rp, m->prefix))
return data; return data;
m = MALLOC_ONE_TAGGED(Scheme_Module); m = MALLOC_ONE_TAGGED(Scheme_Module);
memcpy(m, data, sizeof(Scheme_Module)); memcpy(m, data, sizeof(Scheme_Module));
m->body = l1; m->body = l1;
m->et_body = l2; m->et_body = l2;
m->prefix = rp;
return (Scheme_Object *)m; return (Scheme_Object *)m;
} }
static Scheme_Object *module_jit(Scheme_Object *data)
{
return do_module_clone(data, 1);
}
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, static void module_validate(Scheme_Object *data, Mz_CPort *port,
char *stack, Validate_TLS tls, char *stack, Validate_TLS tls,
int depth, int letlimit, int delta, int depth, int letlimit, int delta,
@ -6115,7 +6160,9 @@ static Scheme_Object *do_module_begin(Scheme_Object *form, Scheme_Comp_Env *env,
/* Add code with names and lexical depth to exp-time body: */ /* Add code with names and lexical depth to exp-time body: */
vec = scheme_make_vector(5, NULL); vec = scheme_make_vector(5, NULL);
SCHEME_VEC_ELS(vec)[0] = names; SCHEME_VEC_ELS(vec)[0] = ((SCHEME_PAIRP(names) && SCHEME_NULLP(SCHEME_CDR(names)))
? SCHEME_CAR(names)
: names);
SCHEME_VEC_ELS(vec)[1] = m; SCHEME_VEC_ELS(vec)[1] = m;
SCHEME_VEC_ELS(vec)[2] = scheme_make_integer(ri->max_let_depth); SCHEME_VEC_ELS(vec)[2] = scheme_make_integer(ri->max_let_depth);
SCHEME_VEC_ELS(vec)[3] = (Scheme_Object *)rp; SCHEME_VEC_ELS(vec)[3] = (Scheme_Object *)rp;
@ -6125,6 +6172,7 @@ static Scheme_Object *do_module_begin(Scheme_Object *form, Scheme_Comp_Env *env,
m = scheme_sfs(m, NULL, ri->max_let_depth); m = scheme_sfs(m, NULL, ri->max_let_depth);
if (ri->use_jit) if (ri->use_jit)
m = scheme_jit_expr(m); m = scheme_jit_expr(m);
rp = scheme_prefix_eval_clone(rp);
eval_exptime(names, count, m, eenv->genv, rhs_env, rp, ri->max_let_depth, 0, eval_exptime(names, count, m, eenv->genv, rhs_env, rp, ri->max_let_depth, 0,
(for_stx ? env->genv->exp_env->toplevel : env->genv->syntax), for_stx, (for_stx ? env->genv->exp_env->toplevel : env->genv->syntax), for_stx,

View File

@ -2191,7 +2191,7 @@ static int resolve_prefix_val_MARK(void *p) {
Resolve_Prefix *rp = (Resolve_Prefix *)p; Resolve_Prefix *rp = (Resolve_Prefix *)p;
gcMARK(rp->toplevels); gcMARK(rp->toplevels);
gcMARK(rp->stxes); gcMARK(rp->stxes);
gcMARK(rp->delay_info); gcMARK(rp->delay_info_rpair);
return return
gcBYTES_TO_WORDS(sizeof(Resolve_Prefix)); gcBYTES_TO_WORDS(sizeof(Resolve_Prefix));
@ -2201,7 +2201,7 @@ static int resolve_prefix_val_FIXUP(void *p) {
Resolve_Prefix *rp = (Resolve_Prefix *)p; Resolve_Prefix *rp = (Resolve_Prefix *)p;
gcFIXUP(rp->toplevels); gcFIXUP(rp->toplevels);
gcFIXUP(rp->stxes); gcFIXUP(rp->stxes);
gcFIXUP(rp->delay_info); gcFIXUP(rp->delay_info_rpair);
return return
gcBYTES_TO_WORDS(sizeof(Resolve_Prefix)); gcBYTES_TO_WORDS(sizeof(Resolve_Prefix));

View File

@ -870,7 +870,7 @@ resolve_prefix_val {
Resolve_Prefix *rp = (Resolve_Prefix *)p; Resolve_Prefix *rp = (Resolve_Prefix *)p;
gcMARK(rp->toplevels); gcMARK(rp->toplevels);
gcMARK(rp->stxes); gcMARK(rp->stxes);
gcMARK(rp->delay_info); gcMARK(rp->delay_info_rpair);
size: size:
gcBYTES_TO_WORDS(sizeof(Resolve_Prefix)); gcBYTES_TO_WORDS(sizeof(Resolve_Prefix));

View File

@ -2358,8 +2358,7 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht,
symtab_set(pp, mt, obj); symtab_set(pp, mt, obj);
} }
} }
else if (compact && SAME_TYPE(SCHEME_TYPE(obj), scheme_module_variable_type) else if (compact && SAME_TYPE(SCHEME_TYPE(obj), scheme_module_variable_type))
&& !((Module_Variable *)obj)->mod_phase)
{ {
Scheme_Object *idx; Scheme_Object *idx;
@ -2378,7 +2377,11 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht,
print(mv->modidx, notdisplay, 1, ht, mt, pp); print(mv->modidx, notdisplay, 1, ht, mt, pp);
} }
print(mv->sym, notdisplay, 1, ht, mt, pp); print(mv->sym, notdisplay, 1, ht, mt, pp);
print_compact_number(pp, mv->pos); if (((Module_Variable *)obj)->mod_phase) {
/* mod_phase must be 1 */
print_compact_number(pp, -2);
}
print_compact_number(pp, mv->pos);
symtab_set(pp, mt, obj); symtab_set(pp, mt, obj);
} }

View File

@ -4357,7 +4357,7 @@ static Scheme_Object *read_compact_svector(CPort *port, int l)
return o; return o;
} }
static int cpt_branch[256]; static unsigned char cpt_branch[256];
static Scheme_Object *read_compact(CPort *port, int use_stack); static Scheme_Object *read_compact(CPort *port, int use_stack);
@ -4377,8 +4377,7 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
unsigned int l; unsigned int l;
char *s, buffer[BLK_BUF_SIZE]; char *s, buffer[BLK_BUF_SIZE];
int ch; int ch;
int need_car = 0, proper = 0; Scheme_Object *v;
Scheme_Object *v, *first = NULL, *last = NULL;
#ifdef DO_STACK_CHECK #ifdef DO_STACK_CHECK
{ {
@ -4392,7 +4391,7 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
} }
#endif #endif
while (1) { {
ZO_CHECK(port->pos < port->size); ZO_CHECK(port->pos < port->size);
ch = CP_GETC(port); ch = CP_GETC(port);
@ -4530,30 +4529,22 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
SCHEME_SET_IMMUTABLE(v); SCHEME_SET_IMMUTABLE(v);
break; break;
case CPT_PAIR: case CPT_PAIR:
if (need_car) { {
Scheme_Object *car, *cdr; Scheme_Object *car, *cdr;
car = read_compact(port, 0); car = read_compact(port, 0);
cdr = read_compact(port, 0); cdr = read_compact(port, 0);
v = scheme_make_pair(car, cdr); v = scheme_make_pair(car, cdr);
} else {
need_car = 1;
continue;
} }
break; break;
case CPT_LIST: case CPT_LIST:
l = read_compact_number(port); l = read_compact_number(port);
if (need_car) { if (l == 1) {
if (l == 1) { Scheme_Object *car, *cdr;
Scheme_Object *car, *cdr; car = read_compact(port, 0);
car = read_compact(port, 0); cdr = read_compact(port, 0);
cdr = read_compact(port, 0); v = scheme_make_pair(car, cdr);
v = scheme_make_pair(car, cdr); } else
} else v = read_compact_list(l, 0, 0, port);
v = read_compact_list(l, 0, 0, port);
} else {
need_car = l;
continue;
}
break; break;
case CPT_VECTOR: case CPT_VECTOR:
{ {
@ -4761,7 +4752,12 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
mv->modidx = mod; mv->modidx = mod;
mv->insp = port->insp; mv->insp = port->insp;
mv->sym = var; mv->sym = var;
mv->pos = pos; if (pos == -2) {
mv->mod_phase = 1;
pos = read_compact_number(port);
mv->pos = pos;
} else
mv->pos = pos;
v = (Scheme_Object *)mv; v = (Scheme_Object *)mv;
} }
@ -4887,21 +4883,15 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
{ {
int ppr = CPT_BETWEEN(ch, SMALL_PROPER_LIST); int ppr = CPT_BETWEEN(ch, SMALL_PROPER_LIST);
l = ch - (ppr ? CPT_SMALL_PROPER_LIST_START : CPT_SMALL_LIST_START); l = ch - (ppr ? CPT_SMALL_PROPER_LIST_START : CPT_SMALL_LIST_START);
if (need_car) { if (l == 1) {
if (l == 1) { Scheme_Object *car, *cdr;
Scheme_Object *car, *cdr; car = read_compact(port, 0);
car = read_compact(port, 0); cdr = (ppr
cdr = (ppr ? scheme_null
? scheme_null : read_compact(port, 0));
: read_compact(port, 0)); v = scheme_make_pair(car, cdr);
v = scheme_make_pair(car, cdr); } else
} else v = read_compact_list(l, ppr, /* use_stack */ 0, port);
v = read_compact_list(l, ppr, /* use_stack */ 0, port);
} else {
proper = ppr;
need_car = l;
continue;
}
} }
break; break;
case CPT_SMALL_APPLICATION_START: case CPT_SMALL_APPLICATION_START:
@ -4975,28 +4965,9 @@ static Scheme_Object *read_compact(CPort *port, int use_stack)
if (!v) if (!v)
scheme_ill_formed_code(port); scheme_ill_formed_code(port);
if (need_car) {
Scheme_Object *pair;
pair = scheme_make_pair(v, scheme_null);
if (last)
SCHEME_CDR(last) = pair;
else
first = pair;
last = pair;
--need_car;
if (!need_car && proper)
break;
} else {
if (last)
SCHEME_CDR(last) = v;
break;
}
} }
return first ? first : v; return v;
} }
static Scheme_Object *read_compact_list(int c, int proper, int use_stack, CPort *port) static Scheme_Object *read_compact_list(int c, int proper, int use_stack, CPort *port)

View File

@ -1863,8 +1863,7 @@ typedef struct Resolve_Prefix
int num_toplevels, num_stxes, num_lifts; int num_toplevels, num_stxes, num_lifts;
Scheme_Object **toplevels; Scheme_Object **toplevels;
Scheme_Object **stxes; /* simplified */ Scheme_Object **stxes; /* simplified */
int delay_refcount; Scheme_Object *delay_info_rpair; /* (rcons refcount Scheme_Load_Delay*) */
struct Scheme_Load_Delay *delay_info;
} Resolve_Prefix; } Resolve_Prefix;
typedef struct Resolve_Info typedef struct Resolve_Info
@ -2394,6 +2393,11 @@ Scheme_Object **scheme_push_prefix(Scheme_Env *genv, Resolve_Prefix *rp,
int src_phase, int now_phase); int src_phase, int now_phase);
void scheme_pop_prefix(Scheme_Object **rs); void scheme_pop_prefix(Scheme_Object **rs);
Scheme_Object *scheme_eval_clone(Scheme_Object *expr);
Resolve_Prefix *scheme_prefix_eval_clone(Resolve_Prefix *rp);
Scheme_Object *scheme_module_eval_clone(Scheme_Object *data);
Scheme_Object *scheme_syntaxes_eval_clone(Scheme_Object *form);
Scheme_Object *scheme_make_environment_dummy(Scheme_Comp_Env *env); Scheme_Object *scheme_make_environment_dummy(Scheme_Comp_Env *env);
Scheme_Env *scheme_environment_from_dummy(Scheme_Object *dummy); Scheme_Env *scheme_environment_from_dummy(Scheme_Object *dummy);

View File

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

View File

@ -1823,12 +1823,18 @@ Scheme_Object *scheme_add_rename(Scheme_Object *o, Scheme_Object *rename)
void scheme_load_delayed_syntax(struct Resolve_Prefix *rp, long i) void scheme_load_delayed_syntax(struct Resolve_Prefix *rp, long i)
{ {
Scheme_Object *stx; Scheme_Object *stx;
int c;
stx = scheme_load_delayed_code(SCHEME_INT_VAL(rp->stxes[i]), stx = scheme_load_delayed_code(SCHEME_INT_VAL(rp->stxes[i]),
rp->delay_info); (struct Scheme_Load_Delay *)SCHEME_CDR(rp->delay_info_rpair));
rp->stxes[i] = stx; rp->stxes[i] = stx;
--rp->delay_refcount; c = SCHEME_INT_VAL(SCHEME_CAR(rp->delay_info_rpair));
if (!rp->delay_refcount) --c;
rp->delay_info = NULL; SCHEME_CAR(rp->delay_info_rpair) = scheme_make_integer(c);
if (!c) {
SCHEME_CDR(rp->delay_info_rpair) = NULL;
rp->delay_info_rpair = NULL;
}
} }
Scheme_Object *scheme_delayed_rename(Scheme_Object **o, long i) Scheme_Object *scheme_delayed_rename(Scheme_Object **o, long i)

View File

@ -5294,29 +5294,44 @@ define_for_syntaxes_execute(Scheme_Object *form)
return do_define_syntaxes_execute(form, NULL, 1); return do_define_syntaxes_execute(form, NULL, 1);
} }
static Scheme_Object *do_define_syntaxes_jit(Scheme_Object *expr) static Scheme_Object *do_define_syntaxes_jit(Scheme_Object *expr, int jit)
{ {
Scheme_Object *naya; Resolve_Prefix *rp, *orig_rp;
Scheme_Object *naya, *rhs;
naya = scheme_jit_expr(SCHEME_VEC_ELS(expr)[0]); rhs = SCHEME_VEC_ELS(expr)[0];
if (jit)
naya = scheme_jit_expr(rhs);
else
naya = rhs;
orig_rp = (Resolve_Prefix *)SCHEME_VEC_ELS(expr)[1];
rp = scheme_prefix_eval_clone(orig_rp);
if (SAME_OBJ(naya, expr)) if (SAME_OBJ(naya, rhs)
&& SAME_OBJ(orig_rp, rp))
return expr; return expr;
else { else {
expr = clone_vector(expr, 0); expr = clone_vector(expr, 0);
SCHEME_VEC_ELS(expr)[0] = naya; SCHEME_VEC_ELS(expr)[0] = naya;
SCHEME_VEC_ELS(expr)[1] = (Scheme_Object *)rp;
return expr; return expr;
} }
} }
static Scheme_Object *define_syntaxes_jit(Scheme_Object *expr) static Scheme_Object *define_syntaxes_jit(Scheme_Object *expr)
{ {
return do_define_syntaxes_jit(expr); return do_define_syntaxes_jit(expr, 1);
} }
static Scheme_Object *define_for_syntaxes_jit(Scheme_Object *expr) static Scheme_Object *define_for_syntaxes_jit(Scheme_Object *expr)
{ {
return do_define_syntaxes_jit(expr); return do_define_syntaxes_jit(expr, 1);
}
Scheme_Object *scheme_syntaxes_eval_clone(Scheme_Object *expr)
{
return do_define_syntaxes_jit(expr, 0);
} }
static void do_define_syntaxes_validate(Scheme_Object *data, Mz_CPort *port, static void do_define_syntaxes_validate(Scheme_Object *data, Mz_CPort *port,
@ -5611,10 +5626,9 @@ define_for_syntaxes_expand(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Exp
Scheme_Object *scheme_make_environment_dummy(Scheme_Comp_Env *env) Scheme_Object *scheme_make_environment_dummy(Scheme_Comp_Env *env)
{ {
/* Get a prefixed-based accessor for a dummy top-level bucket. It's /* Get a prefixed-based accessor for a dummy top-level bucket. It's
used to "link" to the right environment at run time. The `begin' used to "link" to the right environment at run time. The #f as
symbol is arbitrary; the top-level/prefix support handles a symbol a toplevel is handled in the prefix linker specially. */
as a "toplevel" specially. */ return scheme_register_toplevel_in_prefix(scheme_false, env, NULL, 0);
return scheme_register_toplevel_in_prefix(begin_symbol, env, NULL, 0);
} }
Scheme_Env *scheme_environment_from_dummy(Scheme_Object *dummy) Scheme_Env *scheme_environment_from_dummy(Scheme_Object *dummy)