forked from AssemblyScript/assemblyscript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrt.ts
89 lines (72 loc) · 2.82 KB
/
rt.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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<u32>(ptr)) throw new Error(E_INDEXOUTOFRANGE);
return changetype<Typeinfo>(ptr + sizeof<u32>() + id * offsetof<Typeinfo>()).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 = <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
@global @unsafe
function __tostack(ptr: usize): usize { // eslint-disable-line
return ptr;
}
export let __finalize: u32 = 0;
// 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;