import { Typeinfo, TypeinfoFlags } from "./shared/typeinfo"; import { E_INDEXOUTOFRANGE } from "./util/error"; 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 { let 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 __newBuffer(size: usize, id: u32, data: usize = 0): usize { let buffer = __new(size, id); if (data) memory.copy(buffer, data, size); return buffer; } // @ts-ignore: decorator @unsafe export function __newArray(length: i32, alignLog2: usize, id: u32, data: usize = 0): usize { let bufferSize = length << alignLog2; // make sure `buffer` is tracked by the shadow stack let buffer = changetype(__newBuffer(bufferSize, idof(), data)); // ...since allocating the array may trigger GC steps let array = __new(offsetof(), id); store(array, changetype(buffer), offsetof("buffer")); __link(array, changetype(buffer), false); store(array, changetype(buffer), offsetof("dataStart")); store(array, bufferSize, offsetof("byteLength")); store(array, length, offsetof("length_")); return array; } // @ts-ignore: decorator @global @unsafe function __tostack(ptr: usize): usize { // eslint-disable-line return ptr; } // These are provided by the respective implementation, included as another entry file by asc: // // @ts-ignore: decorator // @builtin @unsafe // export declare function __alloc(size: usize): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __realloc(ptr: usize, size: usize): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __free(ptr: usize): void; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __new(size: usize, id: u32): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __renew(ptr: usize, size: usize): usize; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __link(parentPtr: usize, childPtr: usize, expectMultiple: bool): void; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __collect(): void; // // @ts-ignore: decorator // @builtin @unsafe // export declare function __visit(ptr: usize, cookie: u32): void;