/** * Allocate space for a new object. This is frequently executed code and the coding is * deliberaetly sensitive to the optimizing compiler. After changing this, always check the IR/MC * that is generated. * * @param bytes The number of bytes allocated * @param align The requested alignment * @param offset The offset from the alignment * @return The address of the first byte of the allocated region */ @Inline public final Address alloc(int bytes, int align, int offset) { /* establish how much we need */ Address start = alignAllocationNoFill(cursor, align, offset); Address end = start.plus(bytes); /* check whether we've exceeded the limit */ if (end.GT(limit)) { if (bytes > BYTES_IN_LINE) return overflowAlloc(bytes, align, offset); else return allocSlowHot(bytes, align, offset); } /* sufficient memory is available, so we can finish performing the allocation */ fillAlignmentGap(cursor, start); cursor = end; return start; }
/** * Allocate space for a new object. This is frequently executed code and the coding is * deliberaetly sensitive to the optimizing compiler. After changing this, always check the IR/MC * that is generated. * * @param bytes The number of bytes allocated * @param align The requested alignment * @param offset The offset from the alignment * @return The address of the first byte of the allocated region */ public final Address overflowAlloc(int bytes, int align, int offset) { /* establish how much we need */ Address start = alignAllocationNoFill(largeCursor, align, offset); Address end = start.plus(bytes); /* check whether we've exceeded the limit */ if (end.GT(largeLimit)) { requestForLarge = true; Address rtn = allocSlowInline(bytes, align, offset); requestForLarge = false; return rtn; } /* sufficient memory is available, so we can finish performing the allocation */ fillAlignmentGap(largeCursor, start); largeCursor = end; return start; }