git ssb

0+

wanderer🌟 / js-primea-hypervisor



Tree: 0de9abab60ad6c7b9852a3219889dc1a080484d5

Files: 0de9abab60ad6c7b9852a3219889dc1a080484d5 / typeCheckWrapper.js

3093 bytesRaw
1const 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
15module.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