From e8f37dd478b5f1fc38f133d3e441aadf55b809e5 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Sun, 8 Jun 2014 14:37:46 +0100 Subject: [PATCH] Specification for patterniterate(). dereference visitor. Copied from Perforce Change: 186433 ServerID: perforce.ravenbrook.com --- mps/code/dbgpool.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/mps/code/dbgpool.c b/mps/code/dbgpool.c index 4f0b27f798d..a47aabb1b3e 100644 --- a/mps/code/dbgpool.c +++ b/mps/code/dbgpool.c @@ -227,6 +227,20 @@ static void DebugPoolFinish(Pool pool) } +/* patternIterate -- call visitor for occurrences of pattern between + * base and limit + * + * pattern is an arbitrary pattern that's size bytes long. + * + * Imagine that the entirety of memory were covered by contiguous + * copies of pattern starting at address 0. Then call visitor for each + * copy (or part) of pattern that lies between base and limit. In each + * call, target is the address of the copy or part (where base <= + * target < limit); source is the corresponding byte of the pattern + * (where pattern <= source < pattern + size); and size is the length + * of the copy or part. + */ + static Bool patternIterate(Addr pattern, Size size, Addr base, Addr limit, Bool (*visitor)(Addr target, Addr source, Size size)) { @@ -247,18 +261,18 @@ static Bool patternIterate(Addr pattern, Size size, Addr base, Addr limit, break; } else if (p == rounded && end <= limit) { /* Room for a whole copy */ - if (!visitor(p, pattern, size)) + if (!(*visitor)(p, pattern, size)) return FALSE; p = end; } else if (p < rounded && rounded <= end && rounded <= limit) { /* Copy up to rounded */ - if (!visitor(p, AddrAdd(pattern, offset), AddrOffset(p, rounded))) + if (!(*visitor)(p, AddrAdd(pattern, offset), AddrOffset(p, rounded))) return FALSE; p = rounded; } else { /* Copy up to limit */ AVER(limit <= end && (p == rounded || limit <= rounded)); - if (!visitor(p, AddrAdd(pattern, offset), AddrOffset(p, limit))) + if (!(*visitor)(p, AddrAdd(pattern, offset), AddrOffset(p, limit))) return FALSE; p = limit; }