gofront 1.2.3 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -4
- package/src/cli-core.js +520 -15
- package/src/codegen/expressions.js +229 -30
- package/src/codegen/index.js +38 -20
- package/src/codegen/runtime.js +14 -2
- package/src/codegen/statements.js +95 -15
- package/src/codegen/stdlib/builder.js +2 -2
- package/src/codegen/stdlib/bytes.js +1 -1
- package/src/codegen/stdlib/fmt.js +3 -4
- package/src/codegen/stdlib/io.js +1 -2
- package/src/codegen/templ.js +1 -1
- package/src/dev-server.js +279 -83
- package/src/index.js +87 -16
- package/src/parser/expressions.js +11 -0
- package/src/pwa.js +138 -0
- package/src/typechecker/assignability.js +61 -8
- package/src/typechecker/resolve.js +37 -3
- package/src/typechecker/stdlib/core.js +16 -13
- package/src/typechecker/stdlib/extended.js +11 -2
- package/src/typechecker/stdlib/web.js +418 -0
- package/src/typechecker/stdlib.js +2 -0
- package/src/typechecker/types.js +78 -17
- package/src/vendor.js +158 -43
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
// WebGL, WebGPU, and TypedArray standard library type definitions.
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ANY,
|
|
5
|
+
BOOL,
|
|
6
|
+
FLOAT32,
|
|
7
|
+
FLOAT64,
|
|
8
|
+
INT,
|
|
9
|
+
INT8,
|
|
10
|
+
INT16,
|
|
11
|
+
INT32,
|
|
12
|
+
STRING,
|
|
13
|
+
UINT8,
|
|
14
|
+
UINT16,
|
|
15
|
+
UINT32,
|
|
16
|
+
VOID,
|
|
17
|
+
} from "../types.js";
|
|
18
|
+
|
|
19
|
+
const func = (params, returns = [VOID], variadic = false) => ({
|
|
20
|
+
kind: "func",
|
|
21
|
+
params,
|
|
22
|
+
returns,
|
|
23
|
+
variadic,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const WEBGL_CONSTANTS_LIST = {
|
|
27
|
+
ARRAY_BUFFER: 0x8892,
|
|
28
|
+
ELEMENT_ARRAY_BUFFER: 0x8893,
|
|
29
|
+
UNIFORM_BUFFER: 0x8a11,
|
|
30
|
+
STATIC_DRAW: 0x88e4,
|
|
31
|
+
DYNAMIC_DRAW: 0x88e8,
|
|
32
|
+
STREAM_DRAW: 0x88e0,
|
|
33
|
+
FLOAT: 0x1406,
|
|
34
|
+
UNSIGNED_SHORT: 0x1403,
|
|
35
|
+
UNSIGNED_BYTE: 0x1401,
|
|
36
|
+
UNSIGNED_INT: 0x1405,
|
|
37
|
+
BYTE: 0x1400,
|
|
38
|
+
SHORT: 0x1402,
|
|
39
|
+
INT: 0x1404,
|
|
40
|
+
HALF_FLOAT: 0x140b,
|
|
41
|
+
TRIANGLES: 0x0004,
|
|
42
|
+
TRIANGLE_STRIP: 0x0005,
|
|
43
|
+
TRIANGLE_FAN: 0x0006,
|
|
44
|
+
LINES: 0x0001,
|
|
45
|
+
LINE_STRIP: 0x0003,
|
|
46
|
+
LINE_LOOP: 0x0002,
|
|
47
|
+
POINTS: 0x0000,
|
|
48
|
+
COLOR_BUFFER_BIT: 0x00004000,
|
|
49
|
+
DEPTH_BUFFER_BIT: 0x00000100,
|
|
50
|
+
STENCIL_BUFFER_BIT: 0x00000400,
|
|
51
|
+
DEPTH_TEST: 0x0b71,
|
|
52
|
+
BLEND: 0x0be2,
|
|
53
|
+
CULL_FACE: 0x0b44,
|
|
54
|
+
VERTEX_SHADER: 0x8b31,
|
|
55
|
+
FRAGMENT_SHADER: 0x8b30,
|
|
56
|
+
COMPILE_STATUS: 0x8b81,
|
|
57
|
+
LINK_STATUS: 0x8b82,
|
|
58
|
+
VALIDATE_STATUS: 0x8b83,
|
|
59
|
+
RGBA: 0x1908,
|
|
60
|
+
RGB: 0x1907,
|
|
61
|
+
ALPHA: 0x1906,
|
|
62
|
+
LUMINANCE: 0x1909,
|
|
63
|
+
RGBA8: 0x8058,
|
|
64
|
+
RGBA32F: 0x8814,
|
|
65
|
+
TEXTURE_2D: 0x0de1,
|
|
66
|
+
TEXTURE_CUBE_MAP: 0x8513,
|
|
67
|
+
TEXTURE0: 0x84c0,
|
|
68
|
+
TEXTURE_MIN_FILTER: 0x2801,
|
|
69
|
+
TEXTURE_MAG_FILTER: 0x2800,
|
|
70
|
+
TEXTURE_WRAP_S: 0x2802,
|
|
71
|
+
TEXTURE_WRAP_T: 0x2803,
|
|
72
|
+
NEAREST: 0x2600,
|
|
73
|
+
LINEAR: 0x2601,
|
|
74
|
+
NEAREST_MIPMAP_NEAREST: 0x2700,
|
|
75
|
+
LINEAR_MIPMAP_NEAREST: 0x2701,
|
|
76
|
+
NEAREST_MIPMAP_LINEAR: 0x2702,
|
|
77
|
+
LINEAR_MIPMAP_LINEAR: 0x2703,
|
|
78
|
+
REPEAT: 0x2901,
|
|
79
|
+
CLAMP_TO_EDGE: 0x812f,
|
|
80
|
+
MIRRORED_REPEAT: 0x8370,
|
|
81
|
+
BACK: 0x0405,
|
|
82
|
+
FRONT: 0x0404,
|
|
83
|
+
FRONT_AND_BACK: 0x0408,
|
|
84
|
+
CW: 0x0900,
|
|
85
|
+
CCW: 0x0901,
|
|
86
|
+
LESS: 0x0201,
|
|
87
|
+
LEQUAL: 0x0203,
|
|
88
|
+
GREATER: 0x0204,
|
|
89
|
+
GEQUAL: 0x0206,
|
|
90
|
+
EQUAL: 0x0202,
|
|
91
|
+
NOTEQUAL: 0x0205,
|
|
92
|
+
ALWAYS: 0x0207,
|
|
93
|
+
NEVER: 0x0200,
|
|
94
|
+
SRC_ALPHA: 0x0302,
|
|
95
|
+
ONE_MINUS_SRC_ALPHA: 0x0303,
|
|
96
|
+
ONE: 1,
|
|
97
|
+
ZERO: 0,
|
|
98
|
+
FRAMEBUFFER: 0x8d40,
|
|
99
|
+
RENDERBUFFER: 0x8d41,
|
|
100
|
+
COLOR_ATTACHMENT0: 0x8ce0,
|
|
101
|
+
DEPTH_ATTACHMENT: 0x8d00,
|
|
102
|
+
FRAMEBUFFER_COMPLETE: 0x8cd5,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
function buildArrayBufferType() {
|
|
106
|
+
const fields = new Map([["byteLength", INT]]);
|
|
107
|
+
const methods = new Map();
|
|
108
|
+
const named = { kind: "named", name: "ArrayBuffer", underlying: null };
|
|
109
|
+
const iface = {
|
|
110
|
+
kind: "interface",
|
|
111
|
+
name: "ArrayBuffer",
|
|
112
|
+
fields,
|
|
113
|
+
methods,
|
|
114
|
+
};
|
|
115
|
+
named.underlying = iface;
|
|
116
|
+
methods.set("slice", func([INT, INT], [named]));
|
|
117
|
+
return named;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function buildDataViewType(arrayBufferType) {
|
|
121
|
+
const fields = new Map([
|
|
122
|
+
["buffer", arrayBufferType],
|
|
123
|
+
["byteLength", INT],
|
|
124
|
+
["byteOffset", INT],
|
|
125
|
+
]);
|
|
126
|
+
const methods = new Map([
|
|
127
|
+
["getInt8", func([INT], [INT8])],
|
|
128
|
+
["getUint8", func([INT], [UINT8])],
|
|
129
|
+
["getInt16", func([INT, BOOL], [INT16])],
|
|
130
|
+
["getUint16", func([INT, BOOL], [UINT16])],
|
|
131
|
+
["getInt32", func([INT, BOOL], [INT32])],
|
|
132
|
+
["getUint32", func([INT, BOOL], [UINT32])],
|
|
133
|
+
["getFloat32", func([INT, BOOL], [FLOAT32])],
|
|
134
|
+
["getFloat64", func([INT, BOOL], [FLOAT64])],
|
|
135
|
+
["setInt8", func([INT, INT8])],
|
|
136
|
+
["setUint8", func([INT, UINT8])],
|
|
137
|
+
["setInt16", func([INT, INT16, BOOL])],
|
|
138
|
+
["setUint16", func([INT, UINT16, BOOL])],
|
|
139
|
+
["setInt32", func([INT, INT32, BOOL])],
|
|
140
|
+
["setUint32", func([INT, UINT32, BOOL])],
|
|
141
|
+
["setFloat32", func([INT, FLOAT32, BOOL])],
|
|
142
|
+
["setFloat64", func([INT, FLOAT64, BOOL])],
|
|
143
|
+
]);
|
|
144
|
+
const named = { kind: "named", name: "DataView", underlying: null };
|
|
145
|
+
named.underlying = { kind: "interface", name: "DataView", fields, methods };
|
|
146
|
+
return named;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function buildTypedArrayType(name, elemType, arrayBufferType) {
|
|
150
|
+
const fields = new Map([
|
|
151
|
+
["buffer", arrayBufferType],
|
|
152
|
+
["byteLength", INT],
|
|
153
|
+
["byteOffset", INT],
|
|
154
|
+
["length", INT],
|
|
155
|
+
]);
|
|
156
|
+
const methods = new Map();
|
|
157
|
+
const named = { kind: "named", name, underlying: null };
|
|
158
|
+
const iface = {
|
|
159
|
+
kind: "interface",
|
|
160
|
+
name,
|
|
161
|
+
fields,
|
|
162
|
+
methods,
|
|
163
|
+
_elemType: elemType,
|
|
164
|
+
_isTypedArray: true,
|
|
165
|
+
};
|
|
166
|
+
named.underlying = iface;
|
|
167
|
+
methods.set("subarray", func([INT, INT], [named]));
|
|
168
|
+
methods.set("slice", func([INT, INT], [named]));
|
|
169
|
+
methods.set("set", func([ANY, INT], [VOID]));
|
|
170
|
+
return named;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function createWebGLMethods() {
|
|
174
|
+
const methods = new Map();
|
|
175
|
+
const add = (name, fn) => {
|
|
176
|
+
methods.set(name, fn);
|
|
177
|
+
const camel = name[0].toLowerCase() + name.slice(1);
|
|
178
|
+
if (camel !== name) methods.set(camel, fn);
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// Buffer operations
|
|
182
|
+
add("BufferData", func([INT, ANY, INT]));
|
|
183
|
+
add("BufferSubData", func([INT, INT, ANY]));
|
|
184
|
+
add("CreateBuffer", func([], [ANY]));
|
|
185
|
+
add("BindBuffer", func([INT, ANY]));
|
|
186
|
+
add("DeleteBuffer", func([ANY]));
|
|
187
|
+
add("VertexAttribPointer", func([INT, INT, INT, BOOL, INT, INT]));
|
|
188
|
+
add("VertexAttribIPointer", func([INT, INT, INT, INT, INT]));
|
|
189
|
+
add("EnableVertexAttribArray", func([INT]));
|
|
190
|
+
add("DisableVertexAttribArray", func([INT]));
|
|
191
|
+
|
|
192
|
+
// Shaders and programs
|
|
193
|
+
add("CreateShader", func([INT], [ANY]));
|
|
194
|
+
add("ShaderSource", func([ANY, STRING]));
|
|
195
|
+
add("CompileShader", func([ANY]));
|
|
196
|
+
add("GetShaderParameter", func([ANY, INT], [ANY]));
|
|
197
|
+
add("GetShaderInfoLog", func([ANY], [STRING]));
|
|
198
|
+
add("DeleteShader", func([ANY]));
|
|
199
|
+
add("CreateProgram", func([], [ANY]));
|
|
200
|
+
add("AttachShader", func([ANY, ANY]));
|
|
201
|
+
add("DetachShader", func([ANY, ANY]));
|
|
202
|
+
add("LinkProgram", func([ANY]));
|
|
203
|
+
add("GetProgramParameter", func([ANY, INT], [ANY]));
|
|
204
|
+
add("GetProgramInfoLog", func([ANY], [STRING]));
|
|
205
|
+
add("UseProgram", func([ANY]));
|
|
206
|
+
add("DeleteProgram", func([ANY]));
|
|
207
|
+
|
|
208
|
+
// Uniforms and attributes
|
|
209
|
+
add("GetUniformLocation", func([ANY, STRING], [ANY]));
|
|
210
|
+
add("GetAttribLocation", func([ANY, STRING], [INT]));
|
|
211
|
+
add("Uniform1f", func([ANY, FLOAT64]));
|
|
212
|
+
add("Uniform2f", func([ANY, FLOAT64, FLOAT64]));
|
|
213
|
+
add("Uniform3f", func([ANY, FLOAT64, FLOAT64, FLOAT64]));
|
|
214
|
+
add("Uniform4f", func([ANY, FLOAT64, FLOAT64, FLOAT64, FLOAT64]));
|
|
215
|
+
add("Uniform1i", func([ANY, INT]));
|
|
216
|
+
add("Uniform2i", func([ANY, INT, INT]));
|
|
217
|
+
add("Uniform3i", func([ANY, INT, INT, INT]));
|
|
218
|
+
add("Uniform4i", func([ANY, INT, INT, INT, INT]));
|
|
219
|
+
add("Uniform1fv", func([ANY, ANY]));
|
|
220
|
+
add("Uniform2fv", func([ANY, ANY]));
|
|
221
|
+
add("Uniform3fv", func([ANY, ANY]));
|
|
222
|
+
add("Uniform4fv", func([ANY, ANY]));
|
|
223
|
+
add("Uniform1iv", func([ANY, ANY]));
|
|
224
|
+
add("Uniform2iv", func([ANY, ANY]));
|
|
225
|
+
add("Uniform3iv", func([ANY, ANY]));
|
|
226
|
+
add("Uniform4iv", func([ANY, ANY]));
|
|
227
|
+
add("UniformMatrix2fv", func([ANY, BOOL, ANY]));
|
|
228
|
+
add("UniformMatrix3fv", func([ANY, BOOL, ANY]));
|
|
229
|
+
add("UniformMatrix4fv", func([ANY, BOOL, ANY]));
|
|
230
|
+
|
|
231
|
+
// Viewport, clear, draw
|
|
232
|
+
add("Viewport", func([INT, INT, INT, INT]));
|
|
233
|
+
add("ClearColor", func([FLOAT64, FLOAT64, FLOAT64, FLOAT64]));
|
|
234
|
+
add("ClearDepth", func([FLOAT64]));
|
|
235
|
+
add("Clear", func([INT]));
|
|
236
|
+
add("DrawArrays", func([INT, INT, INT]));
|
|
237
|
+
add("DrawElements", func([INT, INT, INT, INT]));
|
|
238
|
+
add("DrawArraysInstanced", func([INT, INT, INT, INT]));
|
|
239
|
+
add("DrawElementsInstanced", func([INT, INT, INT, INT, INT]));
|
|
240
|
+
add("Enable", func([INT]));
|
|
241
|
+
add("Disable", func([INT]));
|
|
242
|
+
add("CullFace", func([INT]));
|
|
243
|
+
add("FrontFace", func([INT]));
|
|
244
|
+
add("DepthFunc", func([INT]));
|
|
245
|
+
add("DepthMask", func([BOOL]));
|
|
246
|
+
add("BlendFunc", func([INT, INT]));
|
|
247
|
+
add("BlendFuncSeparate", func([INT, INT, INT, INT]));
|
|
248
|
+
add("Flush", func([]));
|
|
249
|
+
add("Finish", func([]));
|
|
250
|
+
|
|
251
|
+
// Textures
|
|
252
|
+
add("CreateTexture", func([], [ANY]));
|
|
253
|
+
add("BindTexture", func([INT, ANY]));
|
|
254
|
+
add("DeleteTexture", func([ANY]));
|
|
255
|
+
add("TexParameteri", func([INT, INT, INT]));
|
|
256
|
+
add("TexParameterf", func([INT, INT, FLOAT64]));
|
|
257
|
+
add(
|
|
258
|
+
"TexImage2D",
|
|
259
|
+
func([INT, INT, INT, INT, INT, INT, INT, INT, ANY], [VOID], true),
|
|
260
|
+
);
|
|
261
|
+
add("GenerateMipmap", func([INT]));
|
|
262
|
+
add("ActiveTexture", func([INT]));
|
|
263
|
+
|
|
264
|
+
// WebGL2 VAOs
|
|
265
|
+
add("CreateVertexArray", func([], [ANY]));
|
|
266
|
+
add("BindVertexArray", func([ANY]));
|
|
267
|
+
add("DeleteVertexArray", func([ANY]));
|
|
268
|
+
|
|
269
|
+
// Framebuffers
|
|
270
|
+
add("CreateFramebuffer", func([], [ANY]));
|
|
271
|
+
add("BindFramebuffer", func([INT, ANY]));
|
|
272
|
+
add("DeleteFramebuffer", func([ANY]));
|
|
273
|
+
add("FramebufferTexture2D", func([INT, INT, INT, ANY, INT]));
|
|
274
|
+
add("CheckFramebufferStatus", func([INT], [INT]));
|
|
275
|
+
|
|
276
|
+
return methods;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function createWebGPUMethods() {
|
|
280
|
+
const queueMethods = new Map();
|
|
281
|
+
const addQueue = (name, fn) => {
|
|
282
|
+
queueMethods.set(name, fn);
|
|
283
|
+
const camel = name[0].toLowerCase() + name.slice(1);
|
|
284
|
+
if (camel !== name) queueMethods.set(camel, fn);
|
|
285
|
+
};
|
|
286
|
+
addQueue("Submit", func([ANY]));
|
|
287
|
+
addQueue("WriteBuffer", func([ANY, INT, ANY]));
|
|
288
|
+
|
|
289
|
+
const deviceMethods = new Map();
|
|
290
|
+
const addDev = (name, fn) => {
|
|
291
|
+
deviceMethods.set(name, fn);
|
|
292
|
+
const camel = name[0].toLowerCase() + name.slice(1);
|
|
293
|
+
if (camel !== name) deviceMethods.set(camel, fn);
|
|
294
|
+
};
|
|
295
|
+
addDev("CreateBuffer", func([ANY], [ANY]));
|
|
296
|
+
addDev("CreateShaderModule", func([ANY], [ANY]));
|
|
297
|
+
addDev("CreateRenderPipeline", func([ANY], [ANY]));
|
|
298
|
+
addDev("CreateComputePipeline", func([ANY], [ANY]));
|
|
299
|
+
addDev("CreateCommandEncoder", func([ANY], [ANY]));
|
|
300
|
+
addDev("CreateBindGroup", func([ANY], [ANY]));
|
|
301
|
+
addDev("CreateBindGroupLayout", func([ANY], [ANY]));
|
|
302
|
+
addDev("CreatePipelineLayout", func([ANY], [ANY]));
|
|
303
|
+
|
|
304
|
+
const adapterMethods = new Map();
|
|
305
|
+
const addAdapt = (name, fn) => {
|
|
306
|
+
adapterMethods.set(name, fn);
|
|
307
|
+
const camel = name[0].toLowerCase() + name.slice(1);
|
|
308
|
+
if (camel !== name) adapterMethods.set(camel, fn);
|
|
309
|
+
};
|
|
310
|
+
addAdapt("RequestDevice", func([ANY], [ANY]));
|
|
311
|
+
|
|
312
|
+
return { queueMethods, deviceMethods, adapterMethods };
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export function setupWebGlobals(globals, types) {
|
|
316
|
+
const arrayBuffer = buildArrayBufferType();
|
|
317
|
+
const dataView = buildDataViewType(arrayBuffer);
|
|
318
|
+
|
|
319
|
+
const typedArrays = [
|
|
320
|
+
["Float32Array", FLOAT32],
|
|
321
|
+
["Float64Array", FLOAT64],
|
|
322
|
+
["Int8Array", INT8],
|
|
323
|
+
["Int16Array", INT16],
|
|
324
|
+
["Int32Array", INT32],
|
|
325
|
+
["Uint8Array", UINT8],
|
|
326
|
+
["Uint16Array", UINT16],
|
|
327
|
+
["Uint32Array", UINT32],
|
|
328
|
+
["Uint8ClampedArray", UINT8],
|
|
329
|
+
].map(([name, elem]) => buildTypedArrayType(name, elem, arrayBuffer));
|
|
330
|
+
|
|
331
|
+
types.set("ArrayBuffer", arrayBuffer);
|
|
332
|
+
types.set("DataView", dataView);
|
|
333
|
+
globals.define("ArrayBuffer", arrayBuffer);
|
|
334
|
+
globals.define("DataView", dataView);
|
|
335
|
+
|
|
336
|
+
for (const ta of typedArrays) {
|
|
337
|
+
types.set(ta.name, ta);
|
|
338
|
+
globals.define(ta.name, ta);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// WebGL constants map
|
|
342
|
+
const constFields = new Map();
|
|
343
|
+
for (const [k] of Object.entries(WEBGL_CONSTANTS_LIST)) {
|
|
344
|
+
constFields.set(k, INT);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const webglMethods = createWebGLMethods();
|
|
348
|
+
const webglContext = {
|
|
349
|
+
kind: "named",
|
|
350
|
+
name: "WebGLRenderingContext",
|
|
351
|
+
underlying: {
|
|
352
|
+
kind: "interface",
|
|
353
|
+
name: "WebGLRenderingContext",
|
|
354
|
+
fields: constFields,
|
|
355
|
+
methods: webglMethods,
|
|
356
|
+
_isOpen: true,
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
const webgl2Context = {
|
|
360
|
+
kind: "named",
|
|
361
|
+
name: "WebGL2RenderingContext",
|
|
362
|
+
underlying: {
|
|
363
|
+
kind: "interface",
|
|
364
|
+
name: "WebGL2RenderingContext",
|
|
365
|
+
fields: constFields,
|
|
366
|
+
methods: webglMethods,
|
|
367
|
+
_isOpen: true,
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
types.set("WebGLRenderingContext", webglContext);
|
|
372
|
+
types.set("WebGL2RenderingContext", webgl2Context);
|
|
373
|
+
globals.define("WebGLRenderingContext", webglContext);
|
|
374
|
+
globals.define("WebGL2RenderingContext", webgl2Context);
|
|
375
|
+
|
|
376
|
+
// WebGPU types
|
|
377
|
+
const { queueMethods, deviceMethods, adapterMethods } = createWebGPUMethods();
|
|
378
|
+
const gpuQueue = {
|
|
379
|
+
kind: "named",
|
|
380
|
+
name: "GPUQueue",
|
|
381
|
+
underlying: {
|
|
382
|
+
kind: "interface",
|
|
383
|
+
name: "GPUQueue",
|
|
384
|
+
fields: new Map(),
|
|
385
|
+
methods: queueMethods,
|
|
386
|
+
_isOpen: true,
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
const gpuDevice = {
|
|
390
|
+
kind: "named",
|
|
391
|
+
name: "GPUDevice",
|
|
392
|
+
underlying: {
|
|
393
|
+
kind: "interface",
|
|
394
|
+
name: "GPUDevice",
|
|
395
|
+
fields: new Map([["queue", gpuQueue]]),
|
|
396
|
+
methods: deviceMethods,
|
|
397
|
+
_isOpen: true,
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
const gpuAdapter = {
|
|
401
|
+
kind: "named",
|
|
402
|
+
name: "GPUAdapter",
|
|
403
|
+
underlying: {
|
|
404
|
+
kind: "interface",
|
|
405
|
+
name: "GPUAdapter",
|
|
406
|
+
fields: new Map(),
|
|
407
|
+
methods: adapterMethods,
|
|
408
|
+
_isOpen: true,
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
types.set("GPUQueue", gpuQueue);
|
|
413
|
+
types.set("GPUDevice", gpuDevice);
|
|
414
|
+
types.set("GPUAdapter", gpuAdapter);
|
|
415
|
+
globals.define("GPUQueue", gpuQueue);
|
|
416
|
+
globals.define("GPUDevice", gpuDevice);
|
|
417
|
+
globals.define("GPUAdapter", gpuAdapter);
|
|
418
|
+
}
|
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
|
|
10
10
|
import { setupCoreGlobals } from "./stdlib/core.js";
|
|
11
11
|
import { setupExtendedGlobals } from "./stdlib/extended.js";
|
|
12
|
+
import { setupWebGlobals } from "./stdlib/web.js";
|
|
12
13
|
|
|
13
14
|
export function setupGlobals(globals, types) {
|
|
14
15
|
setupCoreGlobals(globals, types);
|
|
15
16
|
setupExtendedGlobals(globals, types);
|
|
17
|
+
setupWebGlobals(globals, types);
|
|
16
18
|
}
|
package/src/typechecker/types.js
CHANGED
|
@@ -44,6 +44,19 @@ export const LOG_OPS = new Set(["&&", "||"]);
|
|
|
44
44
|
// ── Built-in types ───────────────────────────────────────────
|
|
45
45
|
|
|
46
46
|
export const INT = { kind: "basic", name: "int" };
|
|
47
|
+
export const INT8 = { kind: "basic", name: "int8" };
|
|
48
|
+
export const INT16 = { kind: "basic", name: "int16" };
|
|
49
|
+
export const INT32 = { kind: "basic", name: "int32" };
|
|
50
|
+
export const INT64 = { kind: "basic", name: "int64" };
|
|
51
|
+
export const UINT = { kind: "basic", name: "uint" };
|
|
52
|
+
export const UINT8 = { kind: "basic", name: "uint8" };
|
|
53
|
+
export const BYTE = UINT8;
|
|
54
|
+
export const UINT16 = { kind: "basic", name: "uint16" };
|
|
55
|
+
export const UINT32 = { kind: "basic", name: "uint32" };
|
|
56
|
+
export const UINT64 = { kind: "basic", name: "uint64" };
|
|
57
|
+
export const UINTPTR = { kind: "basic", name: "uintptr" };
|
|
58
|
+
export const RUNE = INT;
|
|
59
|
+
export const FLOAT32 = { kind: "basic", name: "float32" };
|
|
47
60
|
export const FLOAT64 = { kind: "basic", name: "float64" };
|
|
48
61
|
export const STRING = { kind: "basic", name: "string" };
|
|
49
62
|
export const BOOL = { kind: "basic", name: "bool" };
|
|
@@ -73,30 +86,47 @@ export const UNTYPED_COMPLEX = { kind: "untyped", base: "complex128" };
|
|
|
73
86
|
|
|
74
87
|
export const BASIC_TYPES = {
|
|
75
88
|
int: INT,
|
|
89
|
+
int8: INT8,
|
|
90
|
+
int16: INT16,
|
|
91
|
+
int32: INT32,
|
|
92
|
+
int64: INT64,
|
|
93
|
+
uint: UINT,
|
|
94
|
+
uint8: UINT8,
|
|
95
|
+
uint16: UINT16,
|
|
96
|
+
uint32: UINT32,
|
|
97
|
+
uint64: UINT64,
|
|
98
|
+
uintptr: UINTPTR,
|
|
99
|
+
byte: UINT8,
|
|
100
|
+
rune: RUNE,
|
|
101
|
+
float32: FLOAT32,
|
|
76
102
|
float64: FLOAT64,
|
|
103
|
+
complex64: COMPLEX64,
|
|
104
|
+
complex128: COMPLEX128,
|
|
77
105
|
string: STRING,
|
|
78
106
|
bool: BOOL,
|
|
79
107
|
any: ANY,
|
|
80
|
-
byte: INT,
|
|
81
|
-
rune: INT,
|
|
82
|
-
// Sized integer / float aliases — all map to int or float64 at runtime
|
|
83
|
-
uint: INT,
|
|
84
|
-
int8: INT,
|
|
85
|
-
int16: INT,
|
|
86
|
-
int32: INT,
|
|
87
|
-
int64: INT,
|
|
88
|
-
uint8: INT,
|
|
89
|
-
uint16: INT,
|
|
90
|
-
uint32: INT,
|
|
91
|
-
uint64: INT,
|
|
92
|
-
uintptr: INT,
|
|
93
|
-
float32: FLOAT64,
|
|
94
|
-
complex64: COMPLEX64,
|
|
95
|
-
complex128: COMPLEX128,
|
|
96
108
|
};
|
|
97
109
|
|
|
98
110
|
export const COMPARABLE = { kind: "basic", name: "comparable" };
|
|
99
111
|
|
|
112
|
+
export const SIZED_INT_NAMES = [
|
|
113
|
+
"int",
|
|
114
|
+
"int8",
|
|
115
|
+
"int16",
|
|
116
|
+
"int32",
|
|
117
|
+
"int64",
|
|
118
|
+
"uint",
|
|
119
|
+
"uint8",
|
|
120
|
+
"uint16",
|
|
121
|
+
"uint32",
|
|
122
|
+
"uint64",
|
|
123
|
+
"uintptr",
|
|
124
|
+
"byte",
|
|
125
|
+
"rune",
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
export const SIZED_FLOAT_NAMES = ["float32", "float64"];
|
|
129
|
+
|
|
100
130
|
function makeBasicPredicate(...names) {
|
|
101
131
|
const set = new Set(names);
|
|
102
132
|
const pred = (t) => {
|
|
@@ -109,10 +139,41 @@ function makeBasicPredicate(...names) {
|
|
|
109
139
|
return pred;
|
|
110
140
|
}
|
|
111
141
|
|
|
112
|
-
export const isNumeric = makeBasicPredicate(
|
|
142
|
+
export const isNumeric = makeBasicPredicate(
|
|
143
|
+
...SIZED_INT_NAMES,
|
|
144
|
+
...SIZED_FLOAT_NAMES,
|
|
145
|
+
);
|
|
146
|
+
export const isInteger = makeBasicPredicate(...SIZED_INT_NAMES);
|
|
147
|
+
export const isFloat = makeBasicPredicate(...SIZED_FLOAT_NAMES);
|
|
113
148
|
export const isString = makeBasicPredicate("string");
|
|
114
149
|
export const isBool = makeBasicPredicate("bool");
|
|
115
150
|
|
|
151
|
+
// ── TypedArray mappings ──────────────────────────────────────
|
|
152
|
+
export const TYPED_ARRAY_CONSTRUCTORS = {
|
|
153
|
+
float32: "Float32Array",
|
|
154
|
+
float64: "Float64Array",
|
|
155
|
+
uint8: "Uint8Array",
|
|
156
|
+
byte: "Uint8Array",
|
|
157
|
+
int8: "Int8Array",
|
|
158
|
+
uint16: "Uint16Array",
|
|
159
|
+
int16: "Int16Array",
|
|
160
|
+
uint32: "Uint32Array",
|
|
161
|
+
int32: "Int32Array",
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
export function typedArrayConstructorForElem(elemType) {
|
|
165
|
+
if (!elemType) return null;
|
|
166
|
+
const name = elemType.kind === "basic" ? elemType.name : null;
|
|
167
|
+
return name ? (TYPED_ARRAY_CONSTRUCTORS[name] ?? null) : null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function isTypedArraySlice(type) {
|
|
171
|
+
if (!type) return false;
|
|
172
|
+
const base = type.kind === "named" ? type.underlying : type;
|
|
173
|
+
if (base?.kind !== "slice") return false;
|
|
174
|
+
return typedArrayConstructorForElem(base.elem) !== null;
|
|
175
|
+
}
|
|
176
|
+
|
|
116
177
|
export function isComplex(t) {
|
|
117
178
|
if (!t) return false;
|
|
118
179
|
if (t.kind === "basic" && (t.name === "complex128" || t.name === "complex64"))
|