this.limit = start.add(chunkSize.sub(BYTES_IN_ADDRESS)); this.region.add(REGION_LIMIT_OFFSET).store(this.limit);
limit = start.add(chunkSize.sub(BYTES_IN_ADDRESS)); region.add(REGION_LIMIT_OFFSET).store(limit);
  final protected Address allocSlowOnce(int bytes, int align, int offset,                                            boolean inGC) {    // Ensure the selected chunk size can accomodate the largest object.    Extent chunkSize = Word.fromIntZeroExtend(bytes).add(CHUNK_MASK)                       .and(CHUNK_MASK.not()).toExtent();    Address start = space.acquire(Conversions.bytesToPages(chunkSize));    if (start.isZero())      return start;    if (!allowScanning) {       // simple allocator      if (start.NE(this.limit)) this.cursor = start;      this.limit = start.add(chunkSize);    } else {      if (initialRegion.isZero()) {        // first allocation        this.initialRegion = start;        this.region = start;        this.cursor = region.add(DATA_START_OFFSET);      } else if (this.limit.add(BYTES_IN_ADDRESS).NE(start)                  || this.region.diff(start.add(chunkSize)).toWord().toExtent()                    .GT(maximumRegionSize())) {        // non contiguous or maximum size, initialize new region        this.region.add(NEXT_REGION_OFFSET).store(start);        this.region.add(DATA_END_OFFSET).store(this.cursor);              this.region = start;        this.cursor = start.add(DATA_START_OFFSET);      }      this.limit = start.add(chunkSize.sub(BYTES_IN_ADDRESS));      this.region.add(REGION_LIMIT_OFFSET).store(this.limit);    }    return this.alloc(bytes, align, offset);  }