assemblyscript
Version:
A TypeScript-like language for WebAssembly.
88 lines (71 loc) • 2.85 kB
text/typescript
import { Typeinfo, TypeinfoFlags } from "./shared/typeinfo";
import { E_INDEXOUTOFRANGE } from "./util/error";
import { ArrayBufferView } from "./arraybuffer";
// @ts-ignore: decorator
export declare const __rtti_base: usize;
// @ts-ignore: decorator
export declare function __visit_globals(cookie: u32): void;
// @ts-ignore: decorator
export declare function __visit_members(ref: usize, cookie: u32): void;
// @ts-ignore: decorator
export function __typeinfo(id: u32): TypeinfoFlags {
let ptr = __rtti_base;
if (id > load<u32>(ptr)) throw new Error(E_INDEXOUTOFRANGE);
return changetype<Typeinfo>(ptr + sizeof<u32>() + id * offsetof<Typeinfo>()).flags;
}
// @ts-ignore: decorator
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
export function __newArray(length: i32, alignLog2: usize, id: u32, data: usize = 0): usize {
let bufferSize = <usize>length << alignLog2;
// make sure `buffer` is tracked by the shadow stack
let buffer = changetype<ArrayBuffer>(__newBuffer(bufferSize, idof<ArrayBuffer>(), data));
// ...since allocating the array may trigger GC steps
let array = __new(offsetof<i32[]>(), id);
store<usize>(array, changetype<usize>(buffer), offsetof<ArrayBufferView>("buffer"));
__link(array, changetype<usize>(buffer), false);
store<usize>(array, changetype<usize>(buffer), offsetof<ArrayBufferView>("dataStart"));
store<i32>(array, bufferSize, offsetof<ArrayBufferView>("byteLength"));
store<i32>(array, length, offsetof<i32[]>("length_"));
return array;
}
// @ts-ignore: decorator
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;