as-labs 0.1.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.
@@ -0,0 +1,446 @@
1
+ import { decode } from "@webassemblyjs/wasm-parser";
2
+ import { CallExpression, IdentifierExpression, ParenthesizedExpression, getFunctionName, } from "assemblyscript/dist/assemblyscript.js";
3
+ import { Transform } from "assemblyscript/dist/transform.js";
4
+ const CUSTOM_SECTION_NAME = "metadata.code.branch_hint";
5
+ export default class BranchHintTransform extends Transform {
6
+ functionHintsByDeclaration = new Map();
7
+ functionHintsByInternalName = new Map();
8
+ afterParse(parser) {
9
+ for (const source of parser.sources) {
10
+ if (source.sourceKind === 2 /* SourceKind.Library */)
11
+ continue;
12
+ if (source.internalPath.startsWith("~lib/"))
13
+ continue;
14
+ for (const statement of source.statements) {
15
+ this.visitNode(statement, null);
16
+ }
17
+ }
18
+ }
19
+ afterInitialize(program) {
20
+ for (const [declaration, hints] of this.functionHintsByDeclaration) {
21
+ const element = program.elementsByDeclaration.get(declaration);
22
+ if (!element || !element.internalName || hints.length === 0)
23
+ continue;
24
+ this.functionHintsByInternalName.set(element.internalName, hints);
25
+ }
26
+ }
27
+ afterCompile(module) {
28
+ if (this.functionHintsByInternalName.size === 0)
29
+ return;
30
+ const originalEmitBinary = module.emitBinary.bind(module);
31
+ module.emitBinary = ((...args) => {
32
+ const result = originalEmitBinary(...args);
33
+ result.binary = injectBranchHints(result.binary, module, this.functionHintsByInternalName);
34
+ return result;
35
+ });
36
+ }
37
+ visitNode(node, currentFunction) {
38
+ if (!node)
39
+ return;
40
+ if (Array.isArray(node)) {
41
+ for (const item of node)
42
+ this.visitNode(item, currentFunction);
43
+ return;
44
+ }
45
+ switch (node.kind) {
46
+ case 55 /* NodeKind.FunctionDeclaration */:
47
+ this.visitFunctionLike(node, node);
48
+ return;
49
+ case 58 /* NodeKind.MethodDeclaration */:
50
+ this.visitFunctionLike(node, node);
51
+ return;
52
+ case 41 /* NodeKind.If */:
53
+ this.visitConditionalStatement(node, currentFunction, [node.ifTrue, node.ifFalse]);
54
+ return;
55
+ case 49 /* NodeKind.While */:
56
+ this.visitConditionalStatement(node, currentFunction, [node.body]);
57
+ return;
58
+ case 33 /* NodeKind.Do */:
59
+ this.visitConditionalStatement(node, currentFunction, [node.body]);
60
+ return;
61
+ case 39 /* NodeKind.For */:
62
+ this.visitConditionalStatement(node, currentFunction, [node.initializer, node.incrementor, node.body]);
63
+ return;
64
+ case 30 /* NodeKind.Block */:
65
+ this.visitNode(node.statements, currentFunction);
66
+ return;
67
+ case 44 /* NodeKind.Switch */:
68
+ this.visitNode(node.condition, currentFunction);
69
+ this.visitNode(node.cases, currentFunction);
70
+ return;
71
+ case 64 /* NodeKind.SwitchCase */:
72
+ this.visitNode(node.label, currentFunction);
73
+ this.visitNode(node.statements, currentFunction);
74
+ return;
75
+ case 38 /* NodeKind.Expression */:
76
+ this.visitNode(node.expression, currentFunction);
77
+ return;
78
+ case 43 /* NodeKind.Return */:
79
+ this.visitNode(node.value, currentFunction);
80
+ return;
81
+ case 47 /* NodeKind.Variable */:
82
+ this.visitNode(node.declarations, currentFunction);
83
+ return;
84
+ case 61 /* NodeKind.VariableDeclaration */:
85
+ this.visitNode(node.initializer, currentFunction);
86
+ return;
87
+ case 9 /* NodeKind.Call */:
88
+ this.visitNode(node.expression, currentFunction);
89
+ this.visitNode(node.args, currentFunction);
90
+ return;
91
+ case 8 /* NodeKind.Binary */:
92
+ this.visitNode(node.left, currentFunction);
93
+ this.visitNode(node.right, currentFunction);
94
+ return;
95
+ case 28 /* NodeKind.UnaryPrefix */:
96
+ case 27 /* NodeKind.UnaryPostfix */:
97
+ case 20 /* NodeKind.Parenthesized */:
98
+ case 7 /* NodeKind.Assertion */:
99
+ this.visitNode(node.operand ?? node.expression, currentFunction);
100
+ return;
101
+ case 22 /* NodeKind.Ternary */:
102
+ this.visitNode(node.condition, currentFunction);
103
+ this.visitNode(node.ifThen, currentFunction);
104
+ this.visitNode(node.ifElse, currentFunction);
105
+ return;
106
+ case 40 /* NodeKind.ForOf */:
107
+ this.visitNode(node.variable, currentFunction);
108
+ this.visitNode(node.iterable, currentFunction);
109
+ this.visitNode(node.body, currentFunction);
110
+ return;
111
+ case 46 /* NodeKind.Try */:
112
+ this.visitNode(node.bodyStatements, currentFunction);
113
+ this.visitNode(node.catchStatements, currentFunction);
114
+ this.visitNode(node.finallyStatements, currentFunction);
115
+ return;
116
+ case 45 /* NodeKind.Throw */:
117
+ this.visitNode(node.value, currentFunction);
118
+ return;
119
+ case 48 /* NodeKind.Void */:
120
+ this.visitNode(node.expression, currentFunction);
121
+ return;
122
+ default:
123
+ return;
124
+ }
125
+ }
126
+ visitFunctionLike(node, declaration) {
127
+ if (!node.body)
128
+ return;
129
+ this.visitNode(node.body, declaration);
130
+ }
131
+ visitConditionalStatement(node, currentFunction, extraChildren) {
132
+ if (!currentFunction)
133
+ return;
134
+ const hint = unwrapHint(node.condition);
135
+ if (hint) {
136
+ node.condition = hint.expression;
137
+ let hints = this.functionHintsByDeclaration.get(currentFunction);
138
+ if (!hints) {
139
+ hints = [];
140
+ this.functionHintsByDeclaration.set(currentFunction, hints);
141
+ }
142
+ hints.push({ value: hint.value });
143
+ }
144
+ else {
145
+ this.visitNode(node.condition, currentFunction);
146
+ }
147
+ for (const child of extraChildren) {
148
+ this.visitNode(child, currentFunction);
149
+ }
150
+ }
151
+ }
152
+ function unwrapHint(expression) {
153
+ let current = expression;
154
+ while (current instanceof ParenthesizedExpression) {
155
+ current = current.expression;
156
+ }
157
+ if (!(current instanceof CallExpression))
158
+ return null;
159
+ const callee = current.expression;
160
+ if (!(callee instanceof IdentifierExpression))
161
+ return null;
162
+ if (current.args.length !== 1)
163
+ return null;
164
+ if (callee.text === "likely") {
165
+ return { value: 1, expression: current.args[0] };
166
+ }
167
+ if (callee.text === "unlikely") {
168
+ return { value: 0, expression: current.args[0] };
169
+ }
170
+ return null;
171
+ }
172
+ function injectBranchHints(binary, module, functionHintsByInternalName) {
173
+ const importedFunctionCount = countImportedFunctions(binary);
174
+ const functionOrder = [];
175
+ for (let i = 0, n = module.getNumFunctions(); i < n; i++) {
176
+ const name = getFunctionName(module.getFunctionByIndex(i));
177
+ functionOrder.push(name ?? "");
178
+ }
179
+ const conditionalOffsets = collectConditionalOffsets(binary);
180
+ const functionHints = [];
181
+ for (let definedIndex = 0; definedIndex < conditionalOffsets.length; definedIndex++) {
182
+ const internalName = functionOrder[importedFunctionCount + definedIndex];
183
+ const wanted = functionHintsByInternalName.get(internalName);
184
+ if (!wanted || wanted.length === 0)
185
+ continue;
186
+ const available = conditionalOffsets[definedIndex] || [];
187
+ const matched = [];
188
+ const count = Math.min(wanted.length, available.length);
189
+ for (let i = 0; i < count; i++) {
190
+ matched.push({
191
+ offset: available[i],
192
+ value: wanted[i].value,
193
+ });
194
+ }
195
+ if (matched.length === 0)
196
+ continue;
197
+ functionHints.push({
198
+ functionIndex: importedFunctionCount + definedIndex,
199
+ hints: matched,
200
+ });
201
+ }
202
+ if (functionHints.length === 0)
203
+ return binary;
204
+ const payload = encodeBranchHintPayload(functionHints);
205
+ const customSection = encodeCustomSection(CUSTOM_SECTION_NAME, payload);
206
+ return insertCustomSectionBeforeCode(binary, customSection, CUSTOM_SECTION_NAME);
207
+ }
208
+ function countImportedFunctions(binary) {
209
+ const sections = parseSections(binary);
210
+ const importSection = sections.find((section) => section.id === 2);
211
+ if (!importSection)
212
+ return 0;
213
+ let offset = importSection.payloadOffset;
214
+ const end = importSection.end;
215
+ const countInfo = readU32(binary, offset);
216
+ offset = countInfo.nextOffset;
217
+ let functionImports = 0;
218
+ for (let i = 0; i < countInfo.value && offset < end; i++) {
219
+ const moduleName = readName(binary, offset);
220
+ offset = moduleName.nextOffset;
221
+ const fieldName = readName(binary, offset);
222
+ offset = fieldName.nextOffset;
223
+ const kind = binary[offset++];
224
+ switch (kind) {
225
+ case 0:
226
+ functionImports++;
227
+ offset = readU32(binary, offset).nextOffset;
228
+ break;
229
+ case 1:
230
+ offset = skipTableType(binary, offset);
231
+ break;
232
+ case 2:
233
+ offset = skipMemoryType(binary, offset);
234
+ break;
235
+ case 3:
236
+ offset = skipGlobalType(binary, offset);
237
+ break;
238
+ case 4:
239
+ offset = skipTagType(binary, offset);
240
+ break;
241
+ default:
242
+ throw new Error(`Unsupported import kind ${kind}`);
243
+ }
244
+ }
245
+ return functionImports;
246
+ }
247
+ function collectConditionalOffsets(binary) {
248
+ const ast = decode(binary, {
249
+ dump: false,
250
+ ignoreCodeSection: false,
251
+ ignoreDataSection: true,
252
+ });
253
+ const functions = [];
254
+ walk(ast, (node) => {
255
+ if (node?.type === "Func") {
256
+ functions.push(node);
257
+ }
258
+ });
259
+ return functions.map((func) => {
260
+ const bodySize = readU32(binary, func.loc.start.column);
261
+ const localsOffset = bodySize.nextOffset;
262
+ const offsets = [];
263
+ walk(func.body, (node) => {
264
+ if (!node || !node.loc)
265
+ return;
266
+ if (node.type === "IfInstruction") {
267
+ offsets.push(node.loc.start.column - localsOffset - 1);
268
+ }
269
+ else if (node.type === "Instr" && node.id === "br_if") {
270
+ offsets.push(node.loc.start.column - localsOffset);
271
+ }
272
+ });
273
+ return offsets.filter((offset) => offset >= 0);
274
+ });
275
+ }
276
+ function walk(node, visit) {
277
+ if (!node || typeof node !== "object")
278
+ return;
279
+ if (Array.isArray(node)) {
280
+ for (const item of node)
281
+ walk(item, visit);
282
+ return;
283
+ }
284
+ visit(node);
285
+ for (const [key, value] of Object.entries(node)) {
286
+ if (key === "loc")
287
+ continue;
288
+ walk(value, visit);
289
+ }
290
+ }
291
+ function encodeBranchHintPayload(functionHints) {
292
+ const bytes = [];
293
+ writeU32(bytes, functionHints.length);
294
+ for (const { functionIndex, hints } of functionHints) {
295
+ writeU32(bytes, functionIndex);
296
+ writeU32(bytes, hints.length);
297
+ for (const hint of hints) {
298
+ writeU32(bytes, hint.offset);
299
+ writeU32(bytes, 1);
300
+ writeU32(bytes, hint.value);
301
+ }
302
+ }
303
+ return Uint8Array.from(bytes);
304
+ }
305
+ function encodeCustomSection(name, payload) {
306
+ const nameBytes = new TextEncoder().encode(name);
307
+ const contents = [];
308
+ writeU32(contents, nameBytes.length);
309
+ contents.push(...nameBytes);
310
+ contents.push(...payload);
311
+ const section = [];
312
+ section.push(0);
313
+ writeU32(section, contents.length);
314
+ section.push(...contents);
315
+ return Uint8Array.from(section);
316
+ }
317
+ function insertCustomSectionBeforeCode(binary, customSection, sectionName) {
318
+ const sections = parseSections(binary);
319
+ const filtered = sections.filter((section) => {
320
+ if (section.id !== 0)
321
+ return true;
322
+ return readCustomSectionName(binary, section) !== sectionName;
323
+ });
324
+ const codeSection = filtered.find((section) => section.id === 10);
325
+ if (!codeSection) {
326
+ throw new Error("WebAssembly module has no code section");
327
+ }
328
+ const output = [];
329
+ output.push(...binary.slice(0, 8));
330
+ for (const section of filtered) {
331
+ if (section.start === codeSection.start) {
332
+ output.push(...customSection);
333
+ }
334
+ output.push(...binary.slice(section.start, section.end));
335
+ }
336
+ return Uint8Array.from(output);
337
+ }
338
+ function parseSections(binary) {
339
+ const sections = [];
340
+ let offset = 8;
341
+ while (offset < binary.length) {
342
+ const start = offset;
343
+ const id = binary[offset++];
344
+ const size = readU32(binary, offset);
345
+ offset = size.nextOffset;
346
+ const payloadOffset = offset;
347
+ const end = payloadOffset + size.value;
348
+ sections.push({
349
+ id,
350
+ start,
351
+ payloadOffset,
352
+ end,
353
+ });
354
+ offset = end;
355
+ }
356
+ return sections;
357
+ }
358
+ function readCustomSectionName(binary, section) {
359
+ const name = readName(binary, section.payloadOffset);
360
+ return name.value;
361
+ }
362
+ function readName(binary, offset) {
363
+ const length = readU32(binary, offset);
364
+ const start = length.nextOffset;
365
+ const end = start + length.value;
366
+ return {
367
+ value: new TextDecoder().decode(binary.slice(start, end)),
368
+ nextOffset: end,
369
+ };
370
+ }
371
+ function readU32(binary, offset) {
372
+ let value = 0;
373
+ let shift = 0;
374
+ let current = offset;
375
+ while (true) {
376
+ const byte = binary[current++];
377
+ value |= (byte & 0x7f) << shift;
378
+ if ((byte & 0x80) === 0) {
379
+ return { value: value >>> 0, nextOffset: current };
380
+ }
381
+ shift += 7;
382
+ }
383
+ }
384
+ function skipTableType(binary, offset) {
385
+ offset = skipReferenceType(binary, offset);
386
+ return skipLimits(binary, offset);
387
+ }
388
+ function skipMemoryType(binary, offset) {
389
+ return skipLimits(binary, offset);
390
+ }
391
+ function skipGlobalType(binary, offset) {
392
+ offset = skipValueType(binary, offset);
393
+ return offset + 1;
394
+ }
395
+ function skipTagType(binary, offset) {
396
+ offset += 1;
397
+ return readU32(binary, offset).nextOffset;
398
+ }
399
+ function skipLimits(binary, offset) {
400
+ const flags = binary[offset++];
401
+ offset = readU32(binary, offset).nextOffset;
402
+ if (flags & 0x01) {
403
+ offset = readU32(binary, offset).nextOffset;
404
+ }
405
+ if (flags & 0x04) {
406
+ offset = readU32(binary, offset).nextOffset;
407
+ }
408
+ return offset;
409
+ }
410
+ function skipReferenceType(binary, offset) {
411
+ const type = binary[offset];
412
+ if (type === 0x63 || type === 0x64) {
413
+ return offset + 1;
414
+ }
415
+ return skipHeapType(binary, offset + 1);
416
+ }
417
+ function skipValueType(binary, offset) {
418
+ const type = binary[offset];
419
+ if (type === 0x7f ||
420
+ type === 0x7e ||
421
+ type === 0x7d ||
422
+ type === 0x7c ||
423
+ type === 0x7b ||
424
+ type === 0x70 ||
425
+ type === 0x6f) {
426
+ return offset + 1;
427
+ }
428
+ return skipReferenceType(binary, offset);
429
+ }
430
+ function skipHeapType(binary, offset) {
431
+ const type = binary[offset];
432
+ if (type <= 0x7f)
433
+ return offset + 1;
434
+ return readU32(binary, offset).nextOffset;
435
+ }
436
+ function writeU32(target, value) {
437
+ let current = value >>> 0;
438
+ do {
439
+ let byte = current & 0x7f;
440
+ current >>>= 7;
441
+ if (current !== 0)
442
+ byte |= 0x80;
443
+ target.push(byte);
444
+ } while (current !== 0);
445
+ }
446
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../branch-hinting/transform/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Parser, Program } from "assemblyscript/dist/assemblyscript.js";
2
+ import type binaryen from "assemblyscript/lib/binaryen.js";
3
+ import { Transform } from "assemblyscript/dist/transform.js";
4
+ export default class LabsTransform extends Transform {
5
+ private readonly transforms;
6
+ constructor();
7
+ afterParse(parser: Parser): Promise<void>;
8
+ afterInitialize(program: Program): Promise<void>;
9
+ afterCompile(module: binaryen.Module): Promise<void>;
10
+ }
@@ -0,0 +1,25 @@
1
+ import { Transform } from "assemblyscript/dist/transform.js";
2
+ import BranchHintingTransform from "../branch-hinting/transform/index.js";
3
+ export default class LabsTransform extends Transform {
4
+ transforms;
5
+ constructor() {
6
+ super();
7
+ this.transforms = [new BranchHintingTransform()];
8
+ }
9
+ async afterParse(parser) {
10
+ for (const transform of this.transforms) {
11
+ await transform.afterParse?.(parser);
12
+ }
13
+ }
14
+ async afterInitialize(program) {
15
+ for (const transform of this.transforms) {
16
+ await transform.afterInitialize?.(program);
17
+ }
18
+ }
19
+ async afterCompile(module) {
20
+ for (const transform of this.transforms) {
21
+ await transform.afterCompile?.(module);
22
+ }
23
+ }
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../transform/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,sBAAsB,MAAM,sCAAsC,CAAC;AAQ1E,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAS;IACjC,UAAU,CAAkB;IAE7C;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAgB;QACpC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAuB;QACxC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;CACF"}
package/index.ts ADDED
@@ -0,0 +1 @@
1
+ export { likely, unlikely } from "./branch-hinting/index";
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "as-labs",
3
+ "version": "0.1.0",
4
+ "description": "Experimental AssemblyScript APIs and transforms",
5
+ "type": "module",
6
+ "main": "./dist/transform/index.js",
7
+ "types": "./index.ts",
8
+ "homepage": "https://github.com/JairusSW/as-extensions",
9
+ "bugs": {
10
+ "url": "https://github.com/JairusSW/as-extensions/issues"
11
+ },
12
+ "funding": "https://github.com/sponsors/JairusSW",
13
+ "keywords": [
14
+ "assemblyscript",
15
+ "webassembly",
16
+ "wasm",
17
+ "transform",
18
+ "experimental",
19
+ "branch-hinting"
20
+ ],
21
+ "files": [
22
+ "branch-hinting",
23
+ "dist",
24
+ "transform",
25
+ "index.ts",
26
+ "README.md",
27
+ "CHANGELOG.md",
28
+ "LICENSE"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.json",
32
+ "test:unit": "vitest run test/branch-hints.test.js",
33
+ "test:as": "ast test",
34
+ "test": "npm run build && npm run test:unit && npm run test:as",
35
+ "release:check": "npm run test && npm pack --dry-run",
36
+ "prepublishOnly": "npm run test"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/JairusSW/as-extensions.git"
41
+ },
42
+ "license": "MIT",
43
+ "dependencies": {
44
+ "@webassemblyjs/ast": "^1.14.1",
45
+ "@webassemblyjs/wasm-parser": "^1.14.1",
46
+ "assemblyscript": "^0.28.12"
47
+ },
48
+ "devDependencies": {
49
+ "@assemblyscript/wasi-shim": "^0.1.0",
50
+ "as-test": "^1.0.7",
51
+ "typescript": "^6.0.2",
52
+ "vitest": "^4.1.2",
53
+ "wabt": "^1.0.39"
54
+ }
55
+ }
@@ -0,0 +1,37 @@
1
+ import type { Parser, Program } from "assemblyscript/dist/assemblyscript.js";
2
+ import type binaryen from "assemblyscript/lib/binaryen.js";
3
+ import { Transform } from "assemblyscript/dist/transform.js";
4
+ import BranchHintingTransform from "../branch-hinting/transform/index.js";
5
+
6
+ type TransformHook = {
7
+ afterParse?(parser: Parser): void | Promise<void>;
8
+ afterInitialize?(program: Program): void | Promise<void>;
9
+ afterCompile?(module: binaryen.Module): void | Promise<void>;
10
+ };
11
+
12
+ export default class LabsTransform extends Transform {
13
+ private readonly transforms: TransformHook[];
14
+
15
+ constructor() {
16
+ super();
17
+ this.transforms = [new BranchHintingTransform()];
18
+ }
19
+
20
+ async afterParse(parser: Parser): Promise<void> {
21
+ for (const transform of this.transforms) {
22
+ await transform.afterParse?.(parser);
23
+ }
24
+ }
25
+
26
+ async afterInitialize(program: Program): Promise<void> {
27
+ for (const transform of this.transforms) {
28
+ await transform.afterInitialize?.(program);
29
+ }
30
+ }
31
+
32
+ async afterCompile(module: binaryen.Module): Promise<void> {
33
+ for (const transform of this.transforms) {
34
+ await transform.afterCompile?.(module);
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,3 @@
1
+ declare module "@webassemblyjs/wasm-parser" {
2
+ export function decode(bytes: Uint8Array, options?: Record<string, unknown>): unknown;
3
+ }