From 139c44155b09b461dc7065e7e4e6e58287fe702a Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Sat, 23 Apr 2016 16:30:08 +0100 Subject: [PATCH] Converting arena finish and describe methods to specialize instfinish and instdescribe. Copied from Perforce Change: 191614 ServerID: perforce.ravenbrook.com --- mps/code/arena.c | 27 +++++++++++---------------- mps/code/arenacl.c | 4 ++-- mps/code/arenavm.c | 13 +++++++------ mps/code/mpmst.h | 2 -- mps/code/mpmtypes.h | 2 -- 5 files changed, 20 insertions(+), 28 deletions(-) diff --git a/mps/code/arena.c b/mps/code/arena.c index 3fc69afc30f..fca92bd05d3 100644 --- a/mps/code/arena.c +++ b/mps/code/arena.c @@ -43,8 +43,8 @@ static void ArenaTrivCompact(Arena arena, Trace trace); static void arenaFreePage(Arena arena, Addr base, Pool pool); static void arenaFreeLandFinish(Arena arena); static Res ArenaAbsInit(Arena arena, Size grainSize, ArgList args); -static void ArenaAbsFinish(Arena arena); -static Res ArenaAbsDescribe(Arena arena, mps_lib_FILE *stream, Count depth); +static void ArenaAbsFinish(Inst inst); +static Res ArenaAbsDescribe(Inst inst, mps_lib_FILE *stream, Count depth); static void ArenaNoFree(Addr base, Size size, Pool pool) @@ -107,10 +107,11 @@ DEFINE_CLASS(Inst, ArenaClass, klass) DEFINE_CLASS(Arena, AbstractArena, klass) { INHERIT_CLASS(&klass->protocol, AbstractArena, Inst); + klass->protocol.finish = ArenaAbsFinish; + klass->protocol.describe = ArenaAbsDescribe; klass->size = sizeof(ArenaStruct); klass->varargs = ArgTrivVarargs; klass->init = ArenaAbsInit; - klass->finish = ArenaAbsFinish; klass->create = ArenaNoCreate; klass->destroy = ArenaNoDestroy; klass->purgeSpare = ArenaNoPurgeSpare; @@ -120,7 +121,6 @@ DEFINE_CLASS(Arena, AbstractArena, klass) klass->chunkInit = ArenaNoChunkInit; klass->chunkFinish = ArenaNoChunkFinish; klass->compact = ArenaTrivCompact; - klass->describe = ArenaAbsDescribe; klass->pagesMarkAllocated = ArenaNoPagesMarkAllocated; klass->sig = ArenaClassSig; } @@ -134,7 +134,6 @@ Bool ArenaClassCheck(ArenaClass klass) CHECKL(klass->size >= sizeof(ArenaStruct)); CHECKL(FUNCHECK(klass->varargs)); CHECKL(FUNCHECK(klass->init)); - CHECKL(FUNCHECK(klass->finish)); CHECKL(FUNCHECK(klass->create)); CHECKL(FUNCHECK(klass->destroy)); CHECKL(FUNCHECK(klass->purgeSpare)); @@ -144,7 +143,6 @@ Bool ArenaClassCheck(ArenaClass klass) CHECKL(FUNCHECK(klass->chunkInit)); CHECKL(FUNCHECK(klass->chunkFinish)); CHECKL(FUNCHECK(klass->compact)); - CHECKL(FUNCHECK(klass->describe)); CHECKL(FUNCHECK(klass->pagesMarkAllocated)); CHECKS(ArenaClass, klass); return TRUE; @@ -406,19 +404,15 @@ failInit: } -/* ArenaAbsFinish -- finish the generic part of the arena - * - * .finish.caller: Unlike PoolFinish, this is called by the class finish - * methods, not the generic Destroy. This is because the class is - * responsible for deallocating the descriptor. - */ +/* ArenaAbsFinish -- finish the generic part of the arena */ -static void ArenaAbsFinish(Arena arena) +static void ArenaAbsFinish(Inst inst) { + Arena arena = MustBeA(AbstractArena, inst); AVERC(Arena, arena); PoolFinish(ArenaCBSBlockPool(arena)); arena->sig = SigInvalid; - InstFinish(MustBeA(Inst, arena)); + NextMethod(Inst, AbstractArena, finish)(inst); GlobalsFinish(ArenaGlobals(arena)); LocusFinish(arena); RingFinish(ArenaChunkRing(arena)); @@ -510,8 +504,9 @@ void ControlFinish(Arena arena) /* ArenaDescribe -- describe the arena */ -static Res ArenaAbsDescribe(Arena arena, mps_lib_FILE *stream, Count depth) +static Res ArenaAbsDescribe(Inst inst, mps_lib_FILE *stream, Count depth) { + Arena arena = CouldBeA(AbstractArena, inst); Res res; if (!TESTC(AbstractArena, arena)) @@ -565,7 +560,7 @@ static Res ArenaAbsDescribe(Arena arena, mps_lib_FILE *stream, Count depth) Res ArenaDescribe(Arena arena, mps_lib_FILE *stream, Count depth) { - return Method(Arena, arena, describe)(arena, stream, depth); + return Method(Inst, arena, describe)(MustBeA(Inst, arena), stream, depth); } diff --git a/mps/code/arenacl.c b/mps/code/arenacl.c index bc139e23857..72e8c4af386 100644 --- a/mps/code/arenacl.c +++ b/mps/code/arenacl.c @@ -311,7 +311,7 @@ static Res ClientArenaCreate(Arena *arenaReturn, ArgList args) return ResOK; failChunkCreate: - NextMethod(Arena, ClientArena, finish)(arena); + NextMethod(Inst, ClientArena, finish)(MustBeA(Inst, arena)); failSuperInit: AVER(res != ResOK); return res; @@ -336,7 +336,7 @@ static void ClientArenaDestroy(Arena arena) AVER(arena->reserved == 0); AVER(arena->committed == 0); - NextMethod(Arena, ClientArena, finish)(arena); /* */ + NextMethod(Inst, ClientArena, finish)(MustBeA(Inst, arena)); } diff --git a/mps/code/arenavm.c b/mps/code/arenavm.c index 9467e104bc2..613f4aef8e8 100644 --- a/mps/code/arenavm.c +++ b/mps/code/arenavm.c @@ -187,17 +187,18 @@ static Bool VMArenaCheck(VMArena vmArena) /* VMArenaDescribe -- describe the VMArena */ -static Res VMArenaDescribe(Arena arena, mps_lib_FILE *stream, Count depth) +static Res VMArenaDescribe(Inst inst, mps_lib_FILE *stream, Count depth) { - Res res; + Arena arena = CouldBeA(AbstractArena, inst); VMArena vmArena = CouldBeA(VMArena, arena); + Res res; if (!TESTC(VMArena, vmArena)) return ResPARAM; if (stream == NULL) return ResPARAM; - res = NextMethod(Arena, VMArena, describe)(arena, stream, depth); + res = NextMethod(Inst, VMArena, describe)(inst, stream, depth); if (res != ResOK) return res; @@ -666,7 +667,7 @@ static Res VMArenaCreate(Arena *arenaReturn, ArgList args) return ResOK; failChunkCreate: - NextMethod(Arena, VMArena, finish)(arena); + NextMethod(Inst, VMArena, finish)(MustBeA(Inst, arena)); failArenaInit: VMUnmap(vm, VMBase(vm), VMLimit(vm)); failVMMap: @@ -701,7 +702,7 @@ static void VMArenaDestroy(Arena arena) vmArena->sig = SigInvalid; - NextMethod(Arena, VMArena, finish)(arena); /* */ + NextMethod(Inst, VMArena, finish)(MustBeA(Inst, arena)); /* Copy VM descriptor to stack-local storage so that we can continue * using the descriptor after the VM has been unmapped. */ @@ -1195,6 +1196,7 @@ mps_res_t mps_arena_vm_growth(mps_arena_t mps_arena, DEFINE_CLASS(Arena, VMArena, klass) { INHERIT_CLASS(klass, VMArena, AbstractArena); + klass->protocol.describe = VMArenaDescribe; klass->size = sizeof(VMArenaStruct); klass->varargs = VMArenaVarargs; klass->create = VMArenaCreate; @@ -1205,7 +1207,6 @@ DEFINE_CLASS(Arena, VMArena, klass) klass->chunkInit = VMChunkInit; klass->chunkFinish = VMChunkFinish; klass->compact = VMCompact; - klass->describe = VMArenaDescribe; klass->pagesMarkAllocated = VMPagesMarkAllocated; } diff --git a/mps/code/mpmst.h b/mps/code/mpmst.h index d1e738d890d..fcb56d5465c 100644 --- a/mps/code/mpmst.h +++ b/mps/code/mpmst.h @@ -494,7 +494,6 @@ typedef struct mps_arena_class_s { size_t size; /* size of outer structure */ ArenaVarargsMethod varargs; ArenaInitMethod init; - ArenaFinishMethod finish; ArenaCreateMethod create; ArenaDestroyMethod destroy; ArenaPurgeSpareMethod purgeSpare; @@ -504,7 +503,6 @@ typedef struct mps_arena_class_s { ArenaChunkInitMethod chunkInit; ArenaChunkFinishMethod chunkFinish; ArenaCompactMethod compact; - ArenaDescribeMethod describe; ArenaPagesMarkAllocatedMethod pagesMarkAllocated; Sig sig; } ArenaClassStruct; diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h index bc438ede851..b18d5c3691f 100644 --- a/mps/code/mpmtypes.h +++ b/mps/code/mpmtypes.h @@ -114,7 +114,6 @@ typedef void (*ArenaVarargsMethod)(ArgStruct args[], va_list varargs); typedef Res (*ArenaCreateMethod)(Arena *arenaReturn, ArgList args); typedef void (*ArenaDestroyMethod)(Arena arena); typedef Res (*ArenaInitMethod)(Arena arena, Size grainSize, ArgList args); -typedef void (*ArenaFinishMethod)(Arena arena); typedef Size (*ArenaPurgeSpareMethod)(Arena arena, Size size); typedef Res (*ArenaExtendMethod)(Arena arena, Addr base, Size size); typedef Res (*ArenaGrowMethod)(Arena arena, LocusPref pref, Size size); @@ -122,7 +121,6 @@ typedef void (*ArenaFreeMethod)(Addr base, Size size, Pool pool); typedef Res (*ArenaChunkInitMethod)(Chunk chunk, BootBlock boot); typedef void (*ArenaChunkFinishMethod)(Chunk chunk); typedef void (*ArenaCompactMethod)(Arena arena, Trace trace); -typedef Res (*ArenaDescribeMethod)(Arena arena, mps_lib_FILE *stream, Count depth); typedef Res (*ArenaPagesMarkAllocatedMethod)(Arena arena, Chunk chunk, Index baseIndex, Count pages, Pool pool);