From 392f089a2cddea816d65fe2228bb44fe4fbad5d3 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Mon, 24 Feb 2014 23:02:42 +0000 Subject: [PATCH] Bug fix. nonsensical case in cbsfindlargest when size is passed as zero. Added RangeCopy. Copied from Perforce Change: 184496 ServerID: perforce.ravenbrook.com --- mps/code/cbs.c | 11 ++++++++--- mps/code/range.c | 8 ++++++++ mps/code/range.h | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/mps/code/cbs.c b/mps/code/cbs.c index fc4ae964603..f20896b97b7 100644 --- a/mps/code/cbs.c +++ b/mps/code/cbs.c @@ -764,7 +764,7 @@ static void cbsFindDeleteRange(Range rangeReturn, Range oldRangeReturn, need to allocate a new block. */ AVER(res == ResOK); } else - mps_lib_memcpy(oldRangeReturn, rangeReturn, sizeof(RangeStruct)); + RangeCopy(oldRangeReturn, rangeReturn); } @@ -873,8 +873,13 @@ Bool CBSFindLargest(Range rangeReturn, Range oldRangeReturn, AVER(CBSBlockSize(block) >= maxSize); RangeInit(&range, CBSBlockBase(block), CBSBlockLimit(block)); AVER(RangeSize(&range) >= maxSize); - cbsFindDeleteRange(rangeReturn, oldRangeReturn, cbs, &range, - size, findDelete); + if (size > 0) + cbsFindDeleteRange(rangeReturn, oldRangeReturn, cbs, &range, + size, findDelete); + else { + RangeCopy(rangeReturn, &range); /* FIXME: sense? */ + RangeCopy(oldRangeReturn, &range); + } } } diff --git a/mps/code/range.c b/mps/code/range.c index c12682ddd3a..eb22a9d22e6 100644 --- a/mps/code/range.c +++ b/mps/code/range.c @@ -43,6 +43,14 @@ void RangeFinish(Range range) range->base = range->limit = NULL; } +void RangeCopy(Range toRange, Range fromRange) +{ + AVERT(Range, fromRange); + toRange->base = fromRange->base; + toRange->limit = fromRange->limit; + toRange->sig = RangeSig; +} + Res RangeDescribe(Range range, mps_lib_FILE *stream) { Res res; diff --git a/mps/code/range.h b/mps/code/range.h index 69bd95d31a8..ea113ab656e 100644 --- a/mps/code/range.h +++ b/mps/code/range.h @@ -29,6 +29,7 @@ typedef struct RangeStruct *Range; extern void RangeInit(Range range, Addr base, Addr limit); extern void RangeFinish(Range range); +extern void RangeCopy(Range toRange, Range fromRange); extern Res RangeDescribe(Range range, mps_lib_FILE *stream); extern Bool RangeCheck(Range range); extern Bool RangeIsAligned(Range range, Align align);