const HEADER_SIZE: usize = sizeof(); @sealed export class ArrayBuffer { readonly byteLength: i32; constructor(length: i32) { if (length > 0x7fffffff) throw new RangeError("Invalid array buffer length"); var buffer = allocate_memory(HEADER_SIZE + length); store(buffer, length); return changetype(buffer); } slice(begin: i32 = 0, end: i32 = 0x7fffffff): ArrayBuffer { var len = this.byteLength; if (begin < 0) begin = max(len + begin, 0); else begin = min(begin, len); if (end < 0) end = max(len + end, 0); else end = min(end, len); var newLen = max(end - begin, 0); if (newLen) { let buffer = allocate_memory(HEADER_SIZE + newLen); store(buffer, newLen); move_memory(buffer + HEADER_SIZE, changetype(this) + HEADER_SIZE + begin, newLen); return changetype(buffer); } else if (ArrayBuffer.EMPTY) { return ArrayBuffer.EMPTY; } else { let buffer = allocate_memory(HEADER_SIZE); store(buffer, 0); ArrayBuffer.EMPTY = changetype(buffer); return changetype(buffer); } } /** @internal */ static EMPTY: ArrayBuffer | null = null; }