import { Typeinfo, TypeinfoFlags } from "./shared/typeinfo"; import { E_INDEXOUTOFRANGE } from "./util/error"; import { BLOCK, BLOCK_OVERHEAD } from "./rt/common"; import { ArrayBufferView } from "./arraybuffer"; // @ts-ignore: decorator @builtin export declare const RTTI_BASE: usize; // @ts-ignore: decorator @builtin @unsafe export declare function __visit_globals(cookie: u32): void; // @ts-ignore: decorator @builtin @unsafe export declare function __visit_members(ref: usize, cookie: u32): void; // @ts-ignore: decorator @unsafe export function __typeinfo(id: u32): TypeinfoFlags { var ptr = RTTI_BASE; if (id > load(ptr)) throw new Error(E_INDEXOUTOFRANGE); return changetype(ptr + sizeof() + id * offsetof()).flags; } // @ts-ignore: decorator @unsafe export function __instanceof(ref: usize, superId: u32): bool { // keyword var id = changetype(ref - BLOCK_OVERHEAD).rtId; var ptr = RTTI_BASE; if (id <= load(ptr)) { do if (id == superId) return true; while (id = changetype(ptr + sizeof() + id * offsetof()).base); } return false; } // @ts-ignore: decorator @unsafe export function __allocArray(length: i32, alignLog2: usize, id: u32, data: usize = 0): usize { var array = __alloc(offsetof(), id); var bufferSize = length << alignLog2; var buffer = __alloc(bufferSize, idof()); store(array, __retain(buffer), offsetof("data")); changetype(array).dataStart = buffer; changetype(array).dataLength = bufferSize; store(changetype(array), length, offsetof("length_")); if (data) memory.copy(buffer, data, bufferSize); return array; } // These are provided by the respective implementation, included as another entry file by asc: // @builtin @unsafe // export declare function __alloc(size: usize, id: u32): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __realloc(ref: usize, size: usize): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __free(ref: usize): void; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __retain(ref: usize): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __retainRelease(ref: usize, oldRef: usize): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __release(ref: usize): void; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __collect(): void; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __visit(ref: usize, cookie: u32): void;