<<>> <> <> <> <<>> MimZonePort: DEFINITIONS = BEGIN UZone: TYPE = UNCOUNTED ZONE; AllocProc: TYPE = PROC [self: UZone, size: CARDINAL] RETURNS [LONG POINTER]; FreeProc: TYPE = PROC [LONG POINTER]; UZoneProcs: TYPE = RECORD [alloc: AllocProc, free: FreeProc]; UZoneProcsPtr: TYPE = LONG POINTER TO UZoneProcs; OldUZone: TYPE = LONG POINTER TO UZoneProcsPtr; NewUZone: TYPE = LONG POINTER TO UZoneProcs; ScratchPtr: TYPE = LONG POINTER TO Scratch; Scratch: TYPE = ARRAY [0..WORDS[UZoneProcs]+WORDS[UZoneProcsPtr]) OF WORD; MakeZone: PROC [alloc: AllocProc, free: FreeProc, scratch: ScratchPtr] RETURNS [UZone] = INLINE { up: UZoneProcsPtr; IF BITS[WORD] = 16 THEN { <> oz: OldUZone = LOOPHOLE[scratch]; up ¬ LOOPHOLE[scratch+SIZE[UZoneProcsPtr]]; oz­ ¬ up; } ELSE { <> up ¬ LOOPHOLE[scratch]; }; up.alloc ¬ alloc; up.free ¬ free; RETURN [LOOPHOLE[scratch]]; }; END.