Commit 72354593 authored by simonm's avatar simonm
Browse files

[project @ 1999-01-26 16:16:19 by simonm]

- Add specialised closure types (CONSTR_p_n, THUNK_p_n, FUN_p_n)
- Add -T<n> RTS flag to specify the number of steps in younger generations.
parent fc9eb69f
......@@ -43,7 +43,7 @@ import Const ( Literal(..) )
import Maybes ( maybeToBool, catMaybes )
import PrimOp ( primOpNeedsWrapper, pprPrimOp, PrimOp(..) )
import PrimRep ( isFloatingRep, PrimRep(..), getPrimRepSize, showPrimRep )
import SMRep ( getSMRepStr )
import SMRep ( pprSMRep )
import Unique ( pprUnique, Unique{-instance NamedThing-} )
import UniqSet ( emptyUniqSet, elementOfUniqSet,
addOneToUniqSet, UniqSet
......@@ -450,7 +450,7 @@ pprAbsC stmt@(CClosureInfoAndCode cl_info slow maybe_fast srt cl_descr) _
else empty,
type_str ]
type_str = text (getSMRepStr (closureSMRep cl_info))
type_str = pprSMRep (closureSMRep cl_info)
pp_descr = hcat [char '"', text (stringToC cl_descr), char '"']
pp_type = hcat [char '"', text (stringToC (closureTypeDescr cl_info)), char '"']
......
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
% $Id: CgHeapery.lhs,v 1.12 1999/01/21 10:31:56 simonm Exp $
% $Id: CgHeapery.lhs,v 1.13 1999/01/26 16:16:33 simonm Exp $
%
\section[CgHeapery]{Heap management functions}
......@@ -21,7 +21,7 @@ import CLabel
import CgMonad
import CgStackery ( getFinalStackHW, mkTaggedStkAmodes, mkTagAssts )
import SMRep ( fixedHdrSize, getSMRepStr )
import SMRep ( fixedHdrSize )
import AbsCUtils ( mkAbstractCs, getAmodeRep )
import CgUsages ( getVirtAndRealHp, getRealSp, setVirtHp, setRealHp,
initHeapUsage
......@@ -446,7 +446,6 @@ allocDynClosure closure_info use_cc blame_cc amodes_with_offsets
-- GENERATE CC PROFILING MESSAGES
costCentresC SLIT("CCS_ALLOC") [blame_cc, mkIntCLit closure_size]
-- CLitLit (_PK_ type_str) IntRep] -- not necessary? --SDM
`thenC`
-- BUMP THE VIRTUAL HEAP POINTER
......@@ -457,7 +456,6 @@ allocDynClosure closure_info use_cc blame_cc amodes_with_offsets
where
closure_size = closureSize closure_info
slop_size = slopSize closure_info
type_str = getSMRepStr (closureSMRep closure_info)
-- Avoid hanging on to anything in the CC field when we're not profiling.
......
%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
% $Id: ClosureInfo.lhs,v 1.32 1998/12/18 17:40:54 simonpj Exp $
% $Id: ClosureInfo.lhs,v 1.33 1999/01/26 16:16:33 simonm Exp $
%
\section[ClosureInfo]{Data structures which describe closures}
......@@ -59,7 +59,8 @@ import AbsCSyn ( MagicId, node, VirtualHeapOffset, HeapOffset )
import StgSyn
import CgMonad
import Constants ( mIN_UPD_SIZE, mIN_SIZE_NonUpdHeapObject )
import Constants ( mIN_UPD_SIZE, mIN_SIZE_NonUpdHeapObject,
mAX_SPEC_FUN_SIZE, mAX_SPEC_THUNK_SIZE, mAX_SPEC_CONSTR_SIZE )
import CgRetConv ( assignRegs )
import CLabel ( CLabel, mkStdEntryLabel, mkFastEntryLabel,
mkInfoTableLabel,
......@@ -393,18 +394,19 @@ layOutStaticClosure name kind_fn things lf_info
(tot_wds, -- #ptr_wds + #nonptr_wds
ptr_wds, -- #ptr_wds
things_w_offsets) = mkVirtHeapOffsets (StaticRep bot bot bot) kind_fn things
-- constructors with no pointer fields will definitely be NOCAF things.
-- this is a compromise until we can generate both kinds of constructor
-- (a normal static kind and the NOCAF_STATIC kind).
closure_type = case lf_info of
LFCon _ _ | ptr_wds == 0 -> CONSTR_NOCAF
_ -> getClosureType lf_info
_ -> getStaticClosureType lf_info
bot = panic "layoutStaticClosure"
layOutStaticNoFVClosure :: Name -> LambdaFormInfo -> ClosureInfo
layOutStaticNoFVClosure name lf_info
= MkClosureInfo name lf_info (StaticRep 0 0 (getClosureType lf_info))
= MkClosureInfo name lf_info (StaticRep 0 0 (getStaticClosureType lf_info))
\end{code}
%************************************************************************
......@@ -422,24 +424,48 @@ chooseDynSMRep
chooseDynSMRep lf_info tot_wds ptr_wds
= let
nonptr_wds = tot_wds - ptr_wds
closure_type = getClosureType lf_info
closure_type = getClosureType tot_wds ptr_wds nonptr_wds lf_info
in
case lf_info of
LFTuple _ True -> ConstantRep
LFCon _ True -> ConstantRep
_ -> GenericRep ptr_wds nonptr_wds closure_type
getClosureType :: LambdaFormInfo -> ClosureType
getClosureType lf_info =
getStaticClosureType :: LambdaFormInfo -> ClosureType
getStaticClosureType lf_info =
case lf_info of
LFCon con True -> CONSTR_NOCAF
LFCon con False -> CONSTR
LFCon con False -> CONSTR
LFReEntrant _ _ _ _ -> FUN
LFTuple _ _ -> CONSTR
LFThunk _ _ _ _ (SelectorThunk _) -> THUNK_SELECTOR
LFThunk _ _ _ _ _ -> THUNK
_ -> panic "getClosureType"
-- ToDo: could be anything else here?
getClosureType :: Int -> Int -> Int -> LambdaFormInfo -> ClosureType
getClosureType tot_wds ptrs nptrs lf_info =
case lf_info of
LFCon con True -> CONSTR_NOCAF
LFCon con False
| tot_wds > 0 && tot_wds <= mAX_SPEC_CONSTR_SIZE -> CONSTR_p_n ptrs nptrs
| otherwise -> CONSTR
LFReEntrant _ _ _ _
| tot_wds > 0 && tot_wds <= mAX_SPEC_FUN_SIZE -> FUN_p_n ptrs nptrs
| otherwise -> FUN
LFTuple _ _
| tot_wds > 0 && tot_wds <= mAX_SPEC_CONSTR_SIZE -> CONSTR_p_n ptrs nptrs
| otherwise -> CONSTR
LFThunk _ _ _ _ (SelectorThunk _) -> THUNK_SELECTOR
LFThunk _ _ _ _ _
| tot_wds > 0 && tot_wds <= mAX_SPEC_THUNK_SIZE -> THUNK_p_n ptrs nptrs
| otherwise -> THUNK
_ -> panic "getClosureType"
\end{code}
%************************************************************************
......
......@@ -10,7 +10,7 @@ Other modules should access this info through ClosureInfo.
module SMRep (
SMRep(..), ClosureType(..),
isConstantRep, isStaticRep,
fixedHdrSize, arrHdrSize, fixedItblSize, getSMRepStr, getClosureTypeStr
fixedHdrSize, arrHdrSize, fixedItblSize, pprSMRep
#ifndef OMIT_NATIVE_CODEGEN
, getSMRepClosureTypeInt
......@@ -67,9 +67,12 @@ data SMRep
data ClosureType
= CONSTR
| CONSTR_p_n Int Int
| CONSTR_NOCAF
| FUN
| FUN_p_n Int Int
| THUNK
| THUNK_p_n Int Int
| THUNK_SELECTOR
deriving (Eq,Ord)
......@@ -135,18 +138,22 @@ instance Text SMRep where
ConstantRep -> "")
instance Outputable SMRep where
ppr rep = text (show rep)
getSMRepStr (GenericRep _ _ t) = getClosureTypeStr t
getSMRepStr (StaticRep _ _ t) = getClosureTypeStr t ++ "_STATIC"
getSMRepStr ConstantRep = "CONSTR_NOCAF_STATIC"
getSMRepStr BlackHoleRep = "BLACKHOLE"
getClosureTypeStr CONSTR = "CONSTR"
getClosureTypeStr CONSTR_NOCAF = "CONSTR_NOCAF"
getClosureTypeStr FUN = "FUN"
getClosureTypeStr THUNK = "THUNK"
getClosureTypeStr THUNK_SELECTOR = "THUNK_SELECTOR"
ppr rep = pprSMRep rep
pprSMRep :: SMRep -> SDoc
pprSMRep (GenericRep _ _ t) = pprClosureType t
pprSMRep (StaticRep _ _ t) = pprClosureType t <> ptext SLIT("_STATIC")
pprSMRep ConstantRep = ptext SLIT("CONSTR_NOCAF_STATIC")
pprSMRep BlackHoleRep = ptext SLIT("BLACKHOLE")
pprClosureType CONSTR = ptext SLIT("CONSTR")
pprClosureType (CONSTR_p_n p n) = ptext SLIT("CONSTR_") <> int p <> char '_' <> int n
pprClosureType CONSTR_NOCAF = ptext SLIT("CONSTR_NOCAF")
pprClosureType FUN = ptext SLIT("FUN")
pprClosureType (FUN_p_n p n) = ptext SLIT("FUN_") <> int p <> char '_' <> int n
pprClosureType THUNK = ptext SLIT("THUNK")
pprClosureType (THUNK_p_n p n) = ptext SLIT("THUNK_") <> int p <> char '_' <> int n
pprClosureType THUNK_SELECTOR = ptext SLIT("THUNK_SELECTOR")
#ifndef OMIT_NATIVE_CODEGEN
getSMRepClosureTypeInt :: SMRep -> Int
......
......@@ -18,6 +18,9 @@ module Constants (
mAX_CONTEXT_REDUCTION_DEPTH,
mAX_TUPLE_SIZE,
mAX_SPEC_THUNK_SIZE,
mAX_SPEC_FUN_SIZE,
mAX_SPEC_CONSTR_SIZE,
mAX_SPEC_SELECTEE_SIZE,
mAX_SPEC_AP_SIZE,
......@@ -107,6 +110,11 @@ uNFOLDING_KEENESS_FACTOR = ( 2.0 :: Float)
\begin{code}
-- specialised fun/thunk/constr closure types
mAX_SPEC_THUNK_SIZE = (MAX_SPEC_THUNK_SIZE :: Int)
mAX_SPEC_FUN_SIZE = (MAX_SPEC_FUN_SIZE :: Int)
mAX_SPEC_CONSTR_SIZE = (MAX_SPEC_CONSTR_SIZE :: Int)
-- pre-compiled thunk types
mAX_SPEC_SELECTEE_SIZE = (MAX_SPEC_SELECTEE_SIZE :: Int)
mAX_SPEC_AP_SIZE = (MAX_SPEC_AP_SIZE :: Int)
......
/* ----------------------------------------------------------------------------
* $Id: ClosureTypes.h,v 1.6 1999/01/26 11:12:55 simonm Exp $
* $Id: ClosureTypes.h,v 1.7 1999/01/26 16:16:19 simonm Exp $
*
* Closure Type Constants
*
......@@ -13,52 +13,65 @@
/* Object tag 0 raises an internal error */
#define INVALID_OBJECT 0
#define CONSTR 1
/* #define CONSTR_p_np */
#define CONSTR_INTLIKE 2
#define CONSTR_CHARLIKE 3
#define CONSTR_STATIC 4
#define CONSTR_NOCAF_STATIC 5
#define FUN 6
#define FUN_STATIC 7
#define THUNK 8
/* #define THUNK_p_np */
#define THUNK_STATIC 9
#define THUNK_SELECTOR 10
#define BCO 11
#define AP_UPD 12
#define PAP 13
#define IND 14
#define IND_OLDGEN 15
#define IND_PERM 16
#define IND_OLDGEN_PERM 17
#define IND_STATIC 18
#define CAF_UNENTERED 19
#define CAF_ENTERED 20
#define CAF_BLACKHOLE 21
#define RET_BCO 22
#define RET_SMALL 23
#define RET_VEC_SMALL 24
#define RET_BIG 25
#define RET_VEC_BIG 26
#define RET_DYN 27
#define UPDATE_FRAME 28
#define CATCH_FRAME 29
#define STOP_FRAME 30
#define SEQ_FRAME 31
#define BLACKHOLE 32
#define BLACKHOLE_BQ 33
#define MVAR 34
#define ARR_WORDS 35
#define MUT_ARR_WORDS 36
#define MUT_ARR_PTRS 37
#define MUT_ARR_PTRS_FROZEN 38
#define MUT_VAR 49
#define WEAK 40
#define FOREIGN 41
#define STABLE_NAME 42
#define TSO 43
#define BLOCKED_FETCH 44
#define FETCH_ME 45
#define EVACUATED 46
#define CONSTR_1_0 2
#define CONSTR_0_1 3
#define CONSTR_2_0 4
#define CONSTR_1_1 5
#define CONSTR_0_2 6
#define CONSTR_INTLIKE 7
#define CONSTR_CHARLIKE 8
#define CONSTR_STATIC 9
#define CONSTR_NOCAF_STATIC 10
#define FUN 11
#define FUN_1_0 12
#define FUN_0_1 13
#define FUN_2_0 14
#define FUN_1_1 15
#define FUN_0_2 16
#define FUN_STATIC 17
#define THUNK 18
#define THUNK_1_0 19
#define THUNK_0_1 20
#define THUNK_2_0 21
#define THUNK_1_1 22
#define THUNK_0_2 23
#define THUNK_STATIC 24
#define THUNK_SELECTOR 25
#define BCO 26
#define AP_UPD 27
#define PAP 28
#define IND 29
#define IND_OLDGEN 30
#define IND_PERM 31
#define IND_OLDGEN_PERM 32
#define IND_STATIC 33
#define CAF_UNENTERED 34
#define CAF_ENTERED 35
#define CAF_BLACKHOLE 36
#define RET_BCO 37
#define RET_SMALL 38
#define RET_VEC_SMALL 39
#define RET_BIG 40
#define RET_VEC_BIG 41
#define RET_DYN 42
#define UPDATE_FRAME 43
#define CATCH_FRAME 44
#define STOP_FRAME 45
#define SEQ_FRAME 46
#define BLACKHOLE 47
#define BLACKHOLE_BQ 48
#define MVAR 49
#define ARR_WORDS 50
#define MUT_ARR_WORDS 51
#define MUT_ARR_PTRS 52
#define MUT_ARR_PTRS_FROZEN 53
#define MUT_VAR 54
#define WEAK 55
#define FOREIGN 56
#define STABLE_NAME 57
#define TSO 58
#define BLOCKED_FETCH 59
#define FETCH_ME 60
#define EVACUATED 61
#endif CLOSURETYPES_H
/* ----------------------------------------------------------------------------
* $Id: Constants.h,v 1.3 1999/01/21 10:31:41 simonm Exp $
* $Id: Constants.h,v 1.4 1999/01/26 16:16:20 simonm Exp $
*
* Constants
*
......@@ -88,6 +88,12 @@
#define MAX_SPEC_AP_SIZE 8
/* Specialised FUN/THUNK/CONSTR closure types */
#define MAX_SPEC_THUNK_SIZE 2
#define MAX_SPEC_FUN_SIZE 2
#define MAX_SPEC_CONSTR_SIZE 2
/* -----------------------------------------------------------------------------
Update Frame Layout
-------------------------------------------------------------------------- */
......
/* ----------------------------------------------------------------------------
* $Id: InfoTables.h,v 1.6 1999/01/26 11:12:55 simonm Exp $
* $Id: InfoTables.h,v 1.7 1999/01/26 16:16:21 simonm Exp $
*
* Info Tables
*
......@@ -85,18 +85,32 @@ typedef struct {
typedef enum {
INVALID_OBJECT /* Object tag 0 raises an internal error */
, CONSTR
/* CONSTR_p_np */
, CONSTR_1_0
, CONSTR_0_1
, CONSTR_2_0
, CONSTR_1_1
, CONSTR_0_2
, CONSTR_INTLIKE
, CONSTR_CHARLIKE
, CONSTR_STATIC
, CONSTR_NOCAF_STATIC
, FUN
, FUN_1_0
, FUN_0_1
, FUN_2_0
, FUN_1_1
, FUN_0_2
, FUN_STATIC
, THUNK
/* THUNK_p_np */
, THUNK_1_0
, THUNK_0_1
, THUNK_2_0
, THUNK_1_1
, THUNK_0_2
, THUNK_STATIC
, THUNK_SELECTOR
......@@ -176,11 +190,26 @@ typedef enum {
/* HNF BTM NS STA THU MUT UPT SRT */
#define FLAGS_CONSTR (_HNF| _NS )
#define FLAGS_CONSTR_1_0 (_HNF| _NS )
#define FLAGS_CONSTR_0_1 (_HNF| _NS )
#define FLAGS_CONSTR_2_0 (_HNF| _NS )
#define FLAGS_CONSTR_1_1 (_HNF| _NS )
#define FLAGS_CONSTR_0_2 (_HNF| _NS )
#define FLAGS_CONSTR_STATIC (_HNF| _NS|_STA )
#define FLAGS_CONSTR_NOCAF_STATIC (_HNF| _NS|_STA )
#define FLAGS_FUN (_HNF| _NS| _SRT )
#define FLAGS_FUN_1_0 (_HNF| _NS )
#define FLAGS_FUN_0_1 (_HNF| _NS )
#define FLAGS_FUN_2_0 (_HNF| _NS )
#define FLAGS_FUN_1_1 (_HNF| _NS )
#define FLAGS_FUN_0_2 (_HNF| _NS )
#define FLAGS_FUN_STATIC (_HNF| _NS|_STA| _SRT )
#define FLAGS_THUNK ( _BTM| _THU| _SRT )
#define FLAGS_THUNK_1_0 ( _BTM| _THU| _SRT )
#define FLAGS_THUNK_0_1 ( _BTM| _THU| _SRT )
#define FLAGS_THUNK_2_0 ( _BTM| _THU| _SRT )
#define FLAGS_THUNK_1_1 ( _BTM| _THU| _SRT )
#define FLAGS_THUNK_0_2 ( _BTM| _THU| _SRT )
#define FLAGS_THUNK_STATIC ( _BTM| _STA|_THU| _SRT )
#define FLAGS_THUNK_SELECTOR ( _BTM| _THU| _SRT )
#define FLAGS_BCO (_HNF| _NS )
......
/* -----------------------------------------------------------------------------
* $Id: GC.c,v 1.19 1999/01/26 11:12:43 simonm Exp $
* $Id: GC.c,v 1.20 1999/01/26 16:16:22 simonm Exp $
*
* Two-space garbage collector
*
......@@ -807,7 +807,7 @@ MarkRoot(StgClosure *root)
return evacuate(root);
}
static inline void addBlock(step *step)
static void addBlock(step *step)
{
bdescr *bd = allocBlock();
bd->gen = step->gen;
......@@ -828,9 +828,8 @@ static inline void addBlock(step *step)
}
static __inline__ StgClosure *
copy(StgClosure *src, nat size, bdescr *bd)
copy(StgClosure *src, nat size, step *step)
{
step *step;
P_ to, from, dest;
/* Find out where we're going, using the handy "to" pointer in
......@@ -838,7 +837,6 @@ copy(StgClosure *src, nat size, bdescr *bd)
* evacuate to an older generation, adjust it here (see comment
* by evacuate()).
*/
step = bd->step->to;
if (step->gen->no < evac_gen) {
step = &generations[evac_gen].steps[0];
}
......@@ -850,11 +848,12 @@ copy(StgClosure *src, nat size, bdescr *bd)
addBlock(step);
}
dest = step->hp;
step->hp += size;
for(to = dest, from = (P_)src; size>0; --size) {
for(to = step->hp, from = (P_)src; size>0; --size) {
*to++ = *from++;
}
dest = step->hp;
step->hp = to;
return (StgClosure *)dest;
}
......@@ -864,12 +863,10 @@ copy(StgClosure *src, nat size, bdescr *bd)
*/
static __inline__ StgClosure *
copyPart(StgClosure *src, nat size_to_reserve, nat size_to_copy, bdescr *bd)
copyPart(StgClosure *src, nat size_to_reserve, nat size_to_copy, step *step)
{
step *step;
P_ dest, to, from;
step = bd->step->to;
if (step->gen->no < evac_gen) {
step = &generations[evac_gen].steps[0];
}
......@@ -878,12 +875,12 @@ copyPart(StgClosure *src, nat size_to_reserve, nat size_to_copy, bdescr *bd)
addBlock(step);
}
dest = step->hp;
step->hp += size_to_reserve;
for(to = dest, from = (P_)src; size_to_copy>0; --size_to_copy) {
for(to = step->hp, from = (P_)src; size_to_copy>0; --size_to_copy) {
*to++ = *from++;
}
dest = step->hp;
step->hp += size_to_reserve;
return (StgClosure *)dest;
}
......@@ -942,6 +939,7 @@ evacuate_large(StgPtr p, rtsBool mutable)
*/
if (bd->gen->no < evac_gen) {
failed_to_evac = rtsTrue;
TICK_GC_FAILED_PROMOTION();
}
return;
}
......@@ -1039,6 +1037,7 @@ evacuate(StgClosure *q)
{
StgClosure *to;
bdescr *bd = NULL;
step *step;
const StgInfoTable *info;
loop:
......@@ -1052,9 +1051,11 @@ loop:
if (bd->gen->no < evac_gen) {
/* nope */
failed_to_evac = rtsTrue;
TICK_GC_FAILED_PROMOTION();
}
return q;
}
step = bd->step->to;
}
/* make sure the info pointer is into text space */
......@@ -1065,20 +1066,43 @@ loop:
switch (info -> type) {
case BCO:
to = copy(q,bco_sizeW(stgCast(StgBCO*,q)),bd);
to = copy(q,bco_sizeW(stgCast(StgBCO*,q)),step);
upd_evacuee(q,to);
return to;
case MUT_VAR:
case MVAR:
to = copy(q,sizeW_fromITBL(info),bd);
to = copy(q,sizeW_fromITBL(info),step);
upd_evacuee(q,to);
evacuate_mutable((StgMutClosure *)to);
return to;
case STABLE_NAME:
stable_ptr_table[((StgStableName *)q)->sn].keep = rtsTrue;
to = copy(q,sizeofW(StgStableName),bd);
to = copy(q,sizeofW(StgStableName),step);
upd_evacuee(q,to);
return to;
case FUN_1_0:
case FUN_0_1:
case CONSTR_1_0:
case CONSTR_0_1:
to = copy(q,sizeofW(StgHeader)+1,step);
upd_evacuee(q,to);
return to;
case THUNK_1_0: /* here because of MIN_UPD_SIZE */
case THUNK_0_1:
case FUN_1_1:
case FUN_0_2:
case FUN_2_0:
case THUNK_1_1:
case THUNK_0_2:
case THUNK_2_0:
case CONSTR_1_1:
case CONSTR_0_2:
case CONSTR_2_0:
to = copy(q,sizeofW(StgHeader)+2,step);
upd_evacuee(q,to);
return to;
......@@ -1091,18 +1115,18 @@ loop:
case CAF_ENTERED:
case WEAK:
case FOREIGN:
to = copy(q,sizeW_fromITBL(info),bd);
to = copy(q,sizeW_fromITBL(info),step);
upd_evacuee(q,to);
return to;
case CAF_BLACKHOLE:
case BLACKHOLE:
to = copyPart(q,BLACKHOLE_sizeW(),sizeofW(StgHeader),bd);
to = copyPart(q,BLACKHOLE_sizeW(),sizeofW(StgHeader),step);
upd_evacuee(q,to);
return to;
case BLACKHOLE_BQ:
to = copy(q,BLACKHOLE_sizeW(),bd);
to = copy(q,BLACKHOLE_sizeW(),step);
upd_evacuee(q,to);
evacuate_mutable((StgMutClosure *)to);
return to;
......@@ -1116,6 +1140,11 @@ loop:
selectee_info = get_itbl(selectee);
switch (selectee_info->type) {
case CONSTR:
case CONSTR_1_0:
case CONSTR_0_1:
case CONSTR_2_0:
case CONSTR_1_1:
case CONSTR_0_2:
case CONSTR_STATIC:
{
StgNat32 offset = info->layout.selector_offset;
......@@ -1137,6 +1166,7 @@ loop:
if (bd->evacuated) {
if (bd->gen->no < evac_gen) {
failed_to_evac = rtsTrue;
TICK_GC_FAILED_PROMOTION();
}
return q;
}
......@@ -1165,6 +1195,11 @@ loop:
goto selector_loop;
case THUNK:
case THUNK_1_0:
case THUNK_0_1:
case THUNK_2_0:
case THUNK_1_1:
case THUNK_0_2:
case THUNK_STATIC:
case THUNK_SELECTOR:
/* aargh - do recursively???? */
......@@ -1179,7 +1214,7 @@ loop:
barf("evacuate: THUNK_SELECTOR: strange selectee");
}
}
to = copy(q,THUNK_SELECTOR_sizeW(),bd);
to = copy(q,THUNK_SELECTOR_sizeW(),step);
upd_evacuee(q,to);
return to;