letrec-created closures need to be initially zeroed, unless it's the last closure for the letrec
svn: r5459
This commit is contained in:
parent
2b10f81125
commit
f4c8a45e2a
|
@ -2033,7 +2033,7 @@ void GC_mark(const void *const_p)
|
||||||
btc_mark is right */
|
btc_mark is right */
|
||||||
set_btc_mark(NUM(page) + HEADER_SIZEB);
|
set_btc_mark(NUM(page) + HEADER_SIZEB);
|
||||||
}
|
}
|
||||||
|
|
||||||
page->marked_on = 1;
|
page->marked_on = 1;
|
||||||
record_backtrace(page, PTR(NUM(page) + HEADER_SIZEB));
|
record_backtrace(page, PTR(NUM(page) + HEADER_SIZEB));
|
||||||
GCDEBUG((DEBUGOUTF, "Marking %p on big page %p\n", p, page));
|
GCDEBUG((DEBUGOUTF, "Marking %p on big page %p\n", p, page));
|
||||||
|
|
|
@ -3446,7 +3446,8 @@ static void ensure_closure_native(Scheme_Closure_Data *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int generate_closure(Scheme_Closure_Data *data,
|
static int generate_closure(Scheme_Closure_Data *data,
|
||||||
mz_jit_state *jitter)
|
mz_jit_state *jitter,
|
||||||
|
int immediately_filled)
|
||||||
{
|
{
|
||||||
Scheme_Native_Closure_Data *code;
|
Scheme_Native_Closure_Data *code;
|
||||||
int retptr;
|
int retptr;
|
||||||
|
@ -3465,7 +3466,11 @@ static int generate_closure(Scheme_Closure_Data *data,
|
||||||
jit_movi_l(JIT_R0, sz);
|
jit_movi_l(JIT_R0, sz);
|
||||||
mz_prepare(1);
|
mz_prepare(1);
|
||||||
jit_pusharg_l(JIT_R0);
|
jit_pusharg_l(JIT_R0);
|
||||||
(void)mz_finish(GC_malloc_one_small_dirty_tagged);
|
if (immediately_filled) {
|
||||||
|
(void)mz_finish(GC_malloc_one_small_dirty_tagged);
|
||||||
|
} else {
|
||||||
|
(void)mz_finish(GC_malloc_one_small_tagged);
|
||||||
|
}
|
||||||
jit_retval(JIT_R0);
|
jit_retval(JIT_R0);
|
||||||
retptr = mz_retain(code);
|
retptr = mz_retain(code);
|
||||||
init_word = *(long *)&example_so;
|
init_word = *(long *)&example_so;
|
||||||
|
@ -3593,7 +3598,7 @@ static int generate_case_closure(Scheme_Object *obj, mz_jit_state *jitter)
|
||||||
o = (Scheme_Object *)((Scheme_Closure *)o)->code;
|
o = (Scheme_Object *)((Scheme_Closure *)o)->code;
|
||||||
data = (Scheme_Closure_Data *)o;
|
data = (Scheme_Closure_Data *)o;
|
||||||
mz_pushr_p(JIT_R1);
|
mz_pushr_p(JIT_R1);
|
||||||
generate_closure(data, jitter);
|
generate_closure(data, jitter, 1);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
generate_closure_fill(data, jitter);
|
generate_closure_fill(data, jitter);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
|
@ -4281,7 +4286,7 @@ static int generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int m
|
||||||
LOG_IT(("lambda\n"));
|
LOG_IT(("lambda\n"));
|
||||||
|
|
||||||
/* Allocate closure */
|
/* Allocate closure */
|
||||||
generate_closure(data, jitter);
|
generate_closure(data, jitter, 1);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
|
|
||||||
generate_closure_fill(data, jitter);
|
generate_closure_fill(data, jitter);
|
||||||
|
@ -4417,7 +4422,7 @@ static int generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int m
|
||||||
/* Create unfinished closures */
|
/* Create unfinished closures */
|
||||||
for (i = 0; i < l->count; i++) {
|
for (i = 0; i < l->count; i++) {
|
||||||
((Scheme_Closure_Data *)l->procs[i])->context = (Scheme_Object *)l;
|
((Scheme_Closure_Data *)l->procs[i])->context = (Scheme_Object *)l;
|
||||||
generate_closure((Scheme_Closure_Data *)l->procs[i], jitter);
|
generate_closure((Scheme_Closure_Data *)l->procs[i], jitter, i + 1 == l->count);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_R0);
|
jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_R0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user