Files: 7c6e94b073aaac86243093e7d533ecd1cbdb587d / typeCheckWrapper.js
3093 bytesRaw
1 | const LANGUAGE_TYPES = { |
2 | 'mod': 0x0, |
3 | 'buf': 0x1, |
4 | 'elem': 0x2, |
5 | 'link': 0x3, |
6 | 'i32': 0x7f, |
7 | 'i64': 0x7e, |
8 | 'f32': 0x7d, |
9 | 'f64': 0x7c, |
10 | 'anyFunc': 0x70, |
11 | 'func': 0x60, |
12 | 'block_type': 0x40 |
13 | } |
14 | |
15 | module.exports = function (params) { |
16 | const module = [{ |
17 | 'name': 'preramble', |
18 | 'magic': [ |
19 | 0, |
20 | 97, |
21 | 115, |
22 | 109 |
23 | ], |
24 | 'version': [ |
25 | 1, |
26 | 0, |
27 | 0, |
28 | 0 |
29 | ] |
30 | }, { |
31 | 'name': 'type', |
32 | 'entries': [{ |
33 | 'form': 'func', |
34 | 'params': [ |
35 | ] |
36 | }, { |
37 | 'form': 'func', |
38 | 'params': [ |
39 | // imported check |
40 | ] |
41 | }, { |
42 | 'form': 'func', |
43 | 'params': [ |
44 | // exported check |
45 | ] |
46 | }, { |
47 | 'form': 'func', |
48 | 'params': [ |
49 | // invoke |
50 | ] |
51 | }] |
52 | }, { |
53 | 'name': 'import', |
54 | 'entries': [{ |
55 | 'moduleStr': 'env', |
56 | 'fieldStr': 'checkTypes', |
57 | 'kind': 'function', |
58 | 'type': 0 |
59 | }] |
60 | }, { |
61 | 'name': 'function', |
62 | 'entries': [ |
63 | 1, |
64 | 2 |
65 | ] |
66 | }, { |
67 | 'name': 'table', |
68 | 'entries': [{ |
69 | 'elementType': 'anyFunc', |
70 | 'limits': { |
71 | 'flags': 1, |
72 | 'intial': 1, |
73 | 'maximum': 1 |
74 | } |
75 | }] |
76 | }, { |
77 | 'name': 'global', |
78 | 'entries': [] |
79 | }, { |
80 | 'name': 'export', |
81 | 'entries': [{ |
82 | 'field_str': 'table', |
83 | 'kind': 'table', |
84 | 'index': 0 |
85 | }, { |
86 | 'field_str': 'invoke', |
87 | 'kind': 'function', |
88 | 'index': 2 |
89 | }, { |
90 | 'field_str': 'check', |
91 | 'kind': 'function', |
92 | 'index': 1 |
93 | }] |
94 | }, { |
95 | 'name': 'code', |
96 | 'entries': [{ |
97 | 'locals': [], |
98 | 'code': [] |
99 | }, { |
100 | 'locals': [], |
101 | 'code': [] |
102 | }] |
103 | }] |
104 | |
105 | const definedTypes = new Set(['actor', 'func', 'buf']) |
106 | const setGlobals = [] |
107 | const importType = module[1].entries[0].params |
108 | const checkType = module[1].entries[1].params |
109 | const invokerType = module[1].entries[2].params |
110 | const invokeType = module[1].entries[3].params |
111 | const checkCode = module[7].entries[0].code |
112 | const invokeCode = module[7].entries[1].code |
113 | |
114 | params.forEach((param, index) => { |
115 | let baseType = param |
116 | const typeCode = LANGUAGE_TYPES[param] |
117 | // import type |
118 | if (definedTypes.has(param)) { |
119 | baseType = 'i32' |
120 | } else { |
121 | baseType = param |
122 | } |
123 | |
124 | // check import |
125 | importType.push('i32') |
126 | importType.push('i32') |
127 | checkCode.push({ |
128 | 'return_type': 'i32', |
129 | 'name': 'const', |
130 | 'immediates': typeCode |
131 | }) |
132 | checkCode.push({ |
133 | 'name': 'get_local', |
134 | 'immediates': index |
135 | }) |
136 | invokeCode.push({ |
137 | 'name': 'get_local', |
138 | 'immediates': index |
139 | }) |
140 | // check export |
141 | checkType.push(baseType) |
142 | // invoke |
143 | invokeType.push(baseType) |
144 | invokerType.push(baseType) |
145 | }) |
146 | |
147 | module[7].entries[0].code = checkCode.concat(setGlobals, [{ |
148 | 'name': 'call', |
149 | 'immediates': '0' |
150 | }, { |
151 | 'name': 'end' |
152 | }]) |
153 | invokeCode.push({ |
154 | 'return_type': 'i32', |
155 | 'name': 'const', |
156 | 'immediates': '0' |
157 | }) |
158 | invokeCode.push({ |
159 | 'name': 'call_indirect', |
160 | 'immediates': { |
161 | 'index': 3, |
162 | 'reserved': 0 |
163 | } |
164 | }) |
165 | invokeCode.push({ |
166 | 'name': 'end' |
167 | }) |
168 | return module |
169 | } |
170 |
Built with git-ssb-web