#include "GCThread.h"
#include "GCUtils.h"
#include "Compact.h"
+#include "MarkStack.h"
#include "Prelude.h"
#include "Trace.h"
#include "LdvProfile.h"
to = alloc_for_copy(size,stp);
- TICK_GC_WORDS_COPIED(size);
-
from = (StgPtr)src;
to[0] = (W_)info;
for (i = 1; i < size; i++) { // unroll for small i
*p = TAG_CLOSURE(tag,(StgClosure*)to);
src->header.info = (const StgInfoTable *)MK_FORWARDING_PTR(to);
- TICK_GC_WORDS_COPIED(size);
-
from = (StgPtr)src;
to[0] = (W_)info;
for (i = 1; i < size; i++) { // unroll for small i
to = alloc_for_copy(size_to_reserve, stp);
*p = (StgClosure *)to;
- TICK_GC_WORDS_COPIED(size_to_copy);
-
from = (StgPtr)src;
to[0] = info;
for (i = 1; i < size_to_copy; i++) { // unroll for small i
ws = &gct->steps[new_stp->abs_no];
bd->flags |= BF_EVACUATED;
- bd->step = new_stp;
- bd->gen_no = new_stp->gen_no;
+ initBdescr(bd, new_stp);
// If this is a block of pinned objects, we don't have to scan
// these objects, because they aren't allowed to contain any
*/
if (!is_marked((P_)q,bd)) {
mark((P_)q,bd);
- if (mark_stack_full()) {
- debugTrace(DEBUG_gc,"mark stack overflowed");
- mark_stack_overflowed = rtsTrue;
- reset_mark_stack();
- }
push_mark_stack((P_)q);
}
return;
}
- stp = bd->step->to;
+ stp = bd->dest;
info = q->header.info;
if (IS_FORWARDING_PTR(info))
copy(p,info,q,sizeW_fromITBL(INFO_PTR_TO_STRUCT(info)),stp);
return;
+ // For ints and chars of low value, save space by replacing references to
+ // these with closures with references to common, shared ones in the RTS.
+ //
+ // * Except when compiling into Windows DLLs which don't support cross-package
+ // data references very well.
+ //
case CONSTR_0_1:
- {
+ {
+#if defined(__PIC__) && defined(mingw32_HOST_OS)
+ copy_tag_nolock(p,info,q,sizeofW(StgHeader)+1,stp,tag);
+#else
StgWord w = (StgWord)q->payload[0];
if (info == Czh_con_info &&
// unsigned, so always true: (StgChar)w >= MIN_CHARLIKE &&
else {
copy_tag_nolock(p,info,q,sizeofW(StgHeader)+1,stp,tag);
}
+#endif
return;
}
// check whether it was updated in the meantime.
*q = (StgClosure *)p;
if (evac) {
- copy(q,(const StgInfoTable *)info_ptr,(StgClosure *)p,THUNK_SELECTOR_sizeW(),bd->step->to);
+ copy(q,(const StgInfoTable *)info_ptr,(StgClosure *)p,THUNK_SELECTOR_sizeW(),bd->dest);
}
unchain_thunk_selectors(prev_thunk_selector, *q);
return;