194 "native typedef char",
195 type => {
196 this.char = type;
197 type.isPrimitive = true;
198 type.isInt = true;
199 type.isNumber = true;
200 type.isSigned = true;
201 type.canRepresent = value => isBitwiseEquivalent(cast(Int8Array, value), value);
202 type.size = 1;
203 type.defaultValue = 0;
204 type.createLiteral = (origin, value) => IntLiteral.withType(origin, cast(Int8Array, value), type);
205 type.successorValue = value => cast(Int8Array, value + 1);
206 type.valuesEqual = (a, b) => a === b;
207 type.populateDefaultValue = (buffer, offset) => buffer.set(offset, 0);
208 type.formatValueFromIntLiteral = value => cast(Int8Array, value);
209 type.formatValueFromUintLiteral = value => cast(Int8Array, value);
210 type.allValues = function*() {
211 for (let i = 0; i <= 0xff; ++i) {
212 let value = cast(Int8Array, i);
213 yield {value: value, name: value};
214 }
215 };
216 });
217
218 this._map.set(
219 "native typedef short",
220 type => {
221 this.short = type;
222 type.isPrimitive = true;
223 type.isInt = true;
224 type.isNumber = true;
225 type.isSigned = true;
226 type.canRepresent = value => isBitwiseEquivalent(cast(Int16Array, value), value);
227 type.size = 1;
228 type.defaultValue = 0;
229 type.createLiteral = (origin, value) => IntLiteral.withType(origin, cast(Int16Array, value), type);
230 type.successorValue = value => cast(Int16Array, value + 1);
231 type.valuesEqual = (a, b) => a === b;
232 type.populateDefaultValue = (buffer, offset) => buffer.set(offset, 0);
233 type.formatValueFromIntLiteral = value => cast(Int16Array, value);
234 type.formatValueFromUintLiteral = value => cast(Int16Array, value);
235 type.allValues = function*() {
236 for (let i = 0; i <= 0xffff; ++i) {
237 let value = cast(Int16Array, i);
238 yield {value: value, name: value};
239 }
240 };
241 });
242
243 this._map.set(
244 "native typedef int",
245 type => {
246 this.int = type;
247 type.isPrimitive = true;
248 type.isInt = true;
249 type.isNumber = true;
250 type.isSigned = true;
251 type.canRepresent = value => isBitwiseEquivalent(value | 0, value);
252 type.size = 1;
253 type.defaultValue = 0;
254 type.createLiteral = (origin, value) => IntLiteral.withType(origin, value | 0, type);
255 type.successorValue = value => (value + 1) | 0;
256 type.valuesEqual = (a, b) => a === b;
257 type.populateDefaultValue = (buffer, offset) => buffer.set(offset, 0);
258 type.formatValueFromIntLiteral = value => value | 0;
259 type.formatValueFromUintLiteral = value => value | 0;
260 type.allValues = function*() {
261 for (let i = 0; i <= 0xffffffff; ++i) {
262 let value = i | 0;
263 yield {value: value, name: value};
264 }
265 };
266 });
267
268 this._map.set(
269 "native typedef half",
270 type => {
271 this.half = type;
272 type.isPrimitive = true;
273 type.size = 1;
274 type.isFloating = true;
275 type.isNumber = true;
276 type.canRepresent = value => isBitwiseEquivalent(castToHalf(value), value);
277 type.populateDefaultValue = (buffer, offset) => buffer.set(offset, 0);
278 type.formatValueFromIntLiteral = value => value;
279 type.formatValueFromUintLiteral = value => value;
280 type.formatValueFromFloatLiteral = value => castToHalf(value);
281 });
282
283 this._map.set(
284 "native typedef float",
285 type => {
286 this.float = type;
287 type.isPrimitive = true;
288 type.size = 1;
289 type.isFloating = true;
290 type.isNumber = true;
291 type.canRepresent = value => isBitwiseEquivalent(Math.fround(value), value);
292 type.populateDefaultValue = (buffer, offset) => buffer.set(offset, 0);
293 type.formatValueFromIntLiteral = value => value;
294 type.formatValueFromUintLiteral = value => value;
295 type.formatValueFromFloatLiteral = value => Math.fround(value);
296 });
297
298 this._map.set(
299 "native typedef atomic_int",
300 type => {
301 this.atomic_int = type;
302 // FIXME: Figure out what to put here.
303 });
304
305 this._map.set(
306 "native typedef atomic_uint",
307 type => {
308 this.atomic_uint = type;
309 // FIXME: Figure out what to put here.
310 });