@exornea/zeno-compiler 1.7.0 → 2.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.
Files changed (70) hide show
  1. package/bin/zeno-codegen.mjs +79 -31
  2. package/bin/zeno-diff-layout.mjs +60 -0
  3. package/bin/zeno-inspect.mjs +67 -0
  4. package/dist/analyzer.d.ts.map +1 -1
  5. package/dist/analyzer.js +48 -26
  6. package/dist/analyzer.js.map +1 -1
  7. package/dist/emitter-ast.d.ts +8 -0
  8. package/dist/emitter-ast.d.ts.map +1 -0
  9. package/dist/emitter-ast.js +34 -0
  10. package/dist/emitter-ast.js.map +1 -0
  11. package/dist/emitter-capabilities.d.ts +8 -0
  12. package/dist/emitter-capabilities.d.ts.map +1 -0
  13. package/dist/emitter-capabilities.js +59 -0
  14. package/dist/emitter-capabilities.js.map +1 -0
  15. package/dist/emitter-fields.d.ts +3 -0
  16. package/dist/emitter-fields.d.ts.map +1 -0
  17. package/dist/emitter-fields.js +180 -0
  18. package/dist/emitter-fields.js.map +1 -0
  19. package/dist/emitter-input.d.ts +3 -0
  20. package/dist/emitter-input.d.ts.map +1 -0
  21. package/dist/emitter-input.js +45 -0
  22. package/dist/emitter-input.js.map +1 -0
  23. package/dist/emitter-names.d.ts +5 -0
  24. package/dist/emitter-names.d.ts.map +1 -0
  25. package/dist/emitter-names.js +10 -0
  26. package/dist/emitter-names.js.map +1 -0
  27. package/dist/emitter-runtime-imports.d.ts +3 -0
  28. package/dist/emitter-runtime-imports.d.ts.map +1 -0
  29. package/dist/emitter-runtime-imports.js +73 -0
  30. package/dist/emitter-runtime-imports.js.map +1 -0
  31. package/dist/emitter-scan-kernels.d.ts +10 -0
  32. package/dist/emitter-scan-kernels.d.ts.map +1 -0
  33. package/dist/emitter-scan-kernels.js +174 -0
  34. package/dist/emitter-scan-kernels.js.map +1 -0
  35. package/dist/emitter-static-accessors.d.ts +4 -0
  36. package/dist/emitter-static-accessors.d.ts.map +1 -0
  37. package/dist/emitter-static-accessors.js +114 -0
  38. package/dist/emitter-static-accessors.js.map +1 -0
  39. package/dist/emitter-template.d.ts +7 -0
  40. package/dist/emitter-template.d.ts.map +1 -1
  41. package/dist/emitter-template.js +8 -3
  42. package/dist/emitter-template.js.map +1 -1
  43. package/dist/emitter-writers.d.ts +4 -0
  44. package/dist/emitter-writers.d.ts.map +1 -0
  45. package/dist/emitter-writers.js +246 -0
  46. package/dist/emitter-writers.js.map +1 -0
  47. package/dist/emitter.d.ts +9 -1
  48. package/dist/emitter.d.ts.map +1 -1
  49. package/dist/emitter.js +31 -660
  50. package/dist/emitter.js.map +1 -1
  51. package/dist/index.d.ts +5 -2
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +5 -2
  54. package/dist/index.js.map +1 -1
  55. package/dist/layout-manifest.d.ts +37 -0
  56. package/dist/layout-manifest.d.ts.map +1 -0
  57. package/dist/layout-manifest.js +251 -0
  58. package/dist/layout-manifest.js.map +1 -0
  59. package/dist/lowering.d.ts +5 -2
  60. package/dist/lowering.d.ts.map +1 -1
  61. package/dist/lowering.js +86 -27
  62. package/dist/lowering.js.map +1 -1
  63. package/dist/source-map.d.ts +10 -0
  64. package/dist/source-map.d.ts.map +1 -0
  65. package/dist/source-map.js +371 -0
  66. package/dist/source-map.js.map +1 -0
  67. package/dist/validator.d.ts.map +1 -1
  68. package/dist/validator.js +34 -16
  69. package/dist/validator.js.map +1 -1
  70. package/package.json +5 -3
@@ -0,0 +1,180 @@
1
+ import { scalarGetterMethod, scalarSetterMethod, scalarTsType, } from "@exornea/zeno-schema";
2
+ import { emitFixedArrayFieldAccessor } from "./emitter-fixed-array.js";
3
+ import { encodingLiteral, toPascalCase } from "./emitter-names.js";
4
+ import { method } from "./emitter-template.js";
5
+ export function emitField(layout, field) {
6
+ // This switch intentionally mirrors the Layout IR field-kind surface.
7
+ // Split it only when a dispatch table removes real emitter complexity.
8
+ switch (field.kind) {
9
+ case "scalar": {
10
+ const getterMethod = scalarGetterMethod(field.scalar);
11
+ const setterMethod = scalarSetterMethod(field.scalar);
12
+ const typeName = scalarTsType(field.scalar);
13
+ const getterArgs = field.byteLength === 1 || field.scalar === "bool" ? "" : ", this.littleEndian";
14
+ const instanceOffset = `this.baseOffset + ${field.offset}`;
15
+ const getterBody = field.scalar === "bool"
16
+ ? `return this.view.${getterMethod}(${instanceOffset}) !== 0;`
17
+ : `return this.view.${getterMethod}(${instanceOffset}${getterArgs});`;
18
+ const setterBody = field.scalar === "bool"
19
+ ? `this.view.${setterMethod}(${instanceOffset}, value ? 1 : 0);`
20
+ : `this.view.${setterMethod}(${instanceOffset}, value${getterArgs});`;
21
+ return method `
22
+ get ${field.name}(): ${typeName} {
23
+ ${getterBody}
24
+ }
25
+ set ${field.name}(value: ${typeName}) {
26
+ ${setterBody}
27
+ }`;
28
+ }
29
+ case "fixed-bytes":
30
+ return method `
31
+ ${field.name}Bytes(): Uint8Array {
32
+ return fixedBytesView(this.backingBuffer(), this.backingOffset(${field.offset}), ${field.byteLength});
33
+ }`;
34
+ case "fixed-string":
35
+ return method `
36
+ ${field.name}Text(): string {
37
+ return decodeFixedText(this.backingBuffer(), this.backingOffset(${field.offset}), ${field.byteLength}, ${encodingLiteral(field.encoding)});
38
+ }
39
+ ${field.name}Bytes(): Uint8Array {
40
+ return fixedBytesView(this.backingBuffer(), this.backingOffset(${field.offset}), ${field.byteLength});
41
+ }`;
42
+ case "dynamic-string":
43
+ return method `
44
+ ${field.name}View(): Utf8SpanView {
45
+ return new Utf8SpanView(this.view, ${field.offset}, this.baseOffset, this.littleEndian, ${encodingLiteral(field.encoding)});
46
+ }`;
47
+ case "dynamic-bytes":
48
+ return method `
49
+ ${field.name}View(): BytesSpanView {
50
+ return new BytesSpanView(this.view, ${field.offset}, this.baseOffset, this.littleEndian);
51
+ }
52
+ ${field.name}Bytes(): Uint8Array {
53
+ return this.${field.name}View().bytes();
54
+ }`;
55
+ case "struct":
56
+ return method `
57
+ ${field.name}View(): ${field.typeName}View {
58
+ return new ${field.typeName}View(this.view, this.absoluteOffset(${field.offset}), this.littleEndian);
59
+ }`;
60
+ case "pointer": {
61
+ return emitPointerField(layout, field);
62
+ }
63
+ case "fixed-array":
64
+ return emitFixedArrayFieldAccessor(field, encodingLiteral);
65
+ case "vector":
66
+ switch (field.element.kind) {
67
+ case "scalar":
68
+ return method `
69
+ ${field.name}View(): ScalarVectorView<${scalarTsType(field.element.scalar)}> {
70
+ return new ScalarVectorView(this.view, ${field.offset}, "${field.element.scalar}", this.baseOffset, this.littleEndian);
71
+ }`;
72
+ case "dynamic-string":
73
+ return method `
74
+ ${field.name}View(): Utf8VectorView {
75
+ return new Utf8VectorView(this.view, ${field.offset}, this.baseOffset, this.littleEndian, ${encodingLiteral(field.element.encoding)});
76
+ }`;
77
+ case "dynamic-bytes":
78
+ return method `
79
+ ${field.name}View(): BytesVectorView {
80
+ return new BytesVectorView(this.view, ${field.offset}, this.baseOffset, this.littleEndian);
81
+ }`;
82
+ case "fixed-bytes":
83
+ return method `
84
+ ${field.name}View(): FixedBytesVectorView {
85
+ return new FixedBytesVectorView(this.view, ${field.offset}, ${field.element.byteLength}, this.baseOffset, this.littleEndian);
86
+ }`;
87
+ case "fixed-string":
88
+ return method `
89
+ ${field.name}View(): FixedStringVectorView {
90
+ return new FixedStringVectorView(this.view, ${field.offset}, ${field.element.byteLength}, this.baseOffset, this.littleEndian, ${encodingLiteral(field.element.encoding)});
91
+ }`;
92
+ case "struct":
93
+ return method `
94
+ ${field.name}View(): StructVectorView<${field.element.typeName}View> {
95
+ return new StructVectorView(this.view, ${field.offset}, ${field.element.byteLength}, (view, baseOffset, littleEndian) => new ${field.element.typeName}View(view, baseOffset, littleEndian), this.baseOffset, this.littleEndian);
96
+ }`;
97
+ case "dynamic-struct":
98
+ return method `
99
+ ${field.name}View(): DynamicStructVectorView<${field.element.typeName}View> {
100
+ return new DynamicStructVectorView(this.view, ${field.offset}, (view, baseOffset, littleEndian) => new ${field.element.typeName}View(view, baseOffset, littleEndian), this.baseOffset, this.littleEndian);
101
+ }`;
102
+ case "pointer":
103
+ return method `
104
+ ${field.name}View(): PointerVectorView<${field.element.targetTypeName}View> {
105
+ return new PointerVectorView(this.view, ${field.offset}, ${field.element.targetTypeName}View.byteLength, (view, baseOffset, littleEndian) => new ${field.element.targetTypeName}View(view, baseOffset, littleEndian), this.baseOffset, this.littleEndian);
106
+ }`;
107
+ }
108
+ }
109
+ }
110
+ function emitPointerField(layout, field) {
111
+ const pascalName = toPascalCase(field.name);
112
+ return method `
113
+ get raw${pascalName}RelativeOffset(): number {
114
+ return this.view.getUint32(this.baseOffset + ${field.offset}, this.littleEndian);
115
+ }
116
+ get ${field.name}RelativeOffset(): number | null {
117
+ const rawValue = this.raw${pascalName}RelativeOffset;
118
+ if (rawValue === 0xffffffff) {
119
+ return null;
120
+ }
121
+ return this.view.getInt32(this.baseOffset + ${field.offset}, this.littleEndian);
122
+ }
123
+ set ${field.name}RelativeOffset(value: number | null) {
124
+ if (value === null) {
125
+ this.view.setUint32(this.baseOffset + ${field.offset}, 0xffffffff, this.littleEndian);
126
+ return;
127
+ }
128
+ if (!Number.isInteger(value) || value < -0x80000000 || value > 0x7fffffff || value === -1) {
129
+ throw new RangeError(\`pointer32 target offset must encode to signed i32 except -1: \${value}\`);
130
+ }
131
+ this.view.setInt32(this.baseOffset + ${field.offset}, value, this.littleEndian);
132
+ }
133
+ get unchecked${pascalName}TargetOffset(): number | null {
134
+ const relativeOffset = this.${field.name}RelativeOffset;
135
+ if (relativeOffset === null) {
136
+ return null;
137
+ }
138
+ return this.baseOffset + ${field.offset} + relativeOffset;
139
+ }
140
+ get ${field.name}TargetOffset(): number | null {
141
+ const targetOffset = this.unchecked${pascalName}TargetOffset;
142
+ if (targetOffset === null) {
143
+ return null;
144
+ }
145
+ ${layout.name}View.assertPointerTargetRange(this.view, targetOffset, ${field.targetTypeName}View.byteLength);
146
+ return targetOffset;
147
+ }
148
+ set unchecked${pascalName}TargetOffset(targetOffset: number | null) {
149
+ if (targetOffset === null) {
150
+ this.${field.name}RelativeOffset = null;
151
+ return;
152
+ }
153
+ const relativeOffset = targetOffset - (this.baseOffset + ${field.offset});
154
+ this.${field.name}RelativeOffset = relativeOffset;
155
+ }
156
+ set ${field.name}TargetOffset(targetOffset: number | null) {
157
+ if (targetOffset !== null) {
158
+ ${layout.name}View.assertPointerTargetRange(this.view, targetOffset, ${field.targetTypeName}View.byteLength);
159
+ }
160
+ this.unchecked${pascalName}TargetOffset = targetOffset;
161
+ }
162
+ ${field.name}View(): ${field.targetTypeName}View | null {
163
+ const targetOffset = this.${field.name}TargetOffset;
164
+ if (targetOffset === null) {
165
+ return null;
166
+ }
167
+ const target = new ${field.targetTypeName}View(this.view, 0, this.littleEndian);
168
+ target.moveToOffset(targetOffset, ${field.targetTypeName}View.byteLength);
169
+ return target;
170
+ }
171
+ ${field.name}Into(out: ${field.targetTypeName}View): boolean {
172
+ const targetOffset = this.${field.name}TargetOffset;
173
+ if (targetOffset === null) {
174
+ return false;
175
+ }
176
+ out.moveToOffset(targetOffset, ${field.targetTypeName}View.byteLength);
177
+ return true;
178
+ }`;
179
+ }
180
+ //# sourceMappingURL=emitter-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-fields.js","sourceRoot":"","sources":["../src/emitter-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type StructLayout } from "@exornea/zeno-schema";
2
+ export declare function emitInputInterface(layout: StructLayout): string[];
3
+ //# sourceMappingURL=emitter-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-input.d.ts","sourceRoot":"","sources":["../src/emitter-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CASjE"}
@@ -0,0 +1,45 @@
1
+ import { scalarTsType } from "@exornea/zeno-schema";
2
+ import { fixedArrayInputElementType } from "./emitter-fixed-array.js";
3
+ export function emitInputInterface(layout) {
4
+ const lines = [`export interface ${layout.name}ViewInput {`];
5
+ for (const field of layout.fields) {
6
+ lines.push(` readonly ${field.name}: ${fieldInputType(field)};`);
7
+ }
8
+ lines.push("}");
9
+ return lines;
10
+ }
11
+ function fieldInputType(field) {
12
+ switch (field.kind) {
13
+ case "scalar":
14
+ return scalarTsType(field.scalar);
15
+ case "fixed-bytes":
16
+ case "dynamic-bytes":
17
+ return "ArrayLike<number> | Uint8Array";
18
+ case "fixed-string":
19
+ case "dynamic-string":
20
+ return "string";
21
+ case "struct":
22
+ return `${field.typeName}ViewInput`;
23
+ case "pointer":
24
+ return "number | null";
25
+ case "fixed-array":
26
+ return `readonly ${fixedArrayInputElementType(field.element)}[]`;
27
+ case "vector":
28
+ switch (field.element.kind) {
29
+ case "scalar":
30
+ return `readonly ${scalarTsType(field.element.scalar)}[]`;
31
+ case "fixed-bytes":
32
+ case "dynamic-bytes":
33
+ return "readonly (ArrayLike<number> | Uint8Array)[]";
34
+ case "fixed-string":
35
+ case "dynamic-string":
36
+ return "readonly string[]";
37
+ case "struct":
38
+ case "dynamic-struct":
39
+ return `readonly ${field.element.typeName}ViewInput[]`;
40
+ case "pointer":
41
+ return "readonly (number | null)[]";
42
+ }
43
+ }
44
+ }
45
+ //# sourceMappingURL=emitter-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-input.js","sourceRoot":"","sources":["../src/emitter-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuC,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,KAAK,GAAG,CAAC,oBAAoB,MAAM,CAAC,IAAI,aAAa,CAAC,CAAC;IAE7D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAkB;IACxC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,aAAa,CAAC;QACnB,KAAK,eAAe;YAClB,OAAO,gCAAgC,CAAC;QAC1C,KAAK,cAAc,CAAC;QACpB,KAAK,gBAAgB;YACnB,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,GAAG,KAAK,CAAC,QAAQ,WAAW,CAAC;QACtC,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,YAAY,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACnE,KAAK,QAAQ;YACX,QAAQ,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC3B,KAAK,QAAQ;oBACX,OAAO,YAAY,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5D,KAAK,aAAa,CAAC;gBACnB,KAAK,eAAe;oBAClB,OAAO,6CAA6C,CAAC;gBACvD,KAAK,cAAc,CAAC;gBACpB,KAAK,gBAAgB;oBACnB,OAAO,mBAAmB,CAAC;gBAC7B,KAAK,QAAQ,CAAC;gBACd,KAAK,gBAAgB;oBACnB,OAAO,YAAY,KAAK,CAAC,OAAO,CAAC,QAAQ,aAAa,CAAC;gBACzD,KAAK,SAAS;oBACZ,OAAO,4BAA4B,CAAC;YACxC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { StructLayout } from "@exornea/zeno-schema";
2
+ export declare function toPascalCase(name: string): string;
3
+ export declare function toLittleEndianLiteral(layout: StructLayout): "true" | "false";
4
+ export declare function encodingLiteral(encoding: "ascii" | "utf8"): '"ascii"' | '"utf8"';
5
+ //# sourceMappingURL=emitter-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-names.d.ts","sourceRoot":"","sources":["../src/emitter-names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO,CAE5E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAEhF"}
@@ -0,0 +1,10 @@
1
+ export function toPascalCase(name) {
2
+ return name.slice(0, 1).toUpperCase() + name.slice(1);
3
+ }
4
+ export function toLittleEndianLiteral(layout) {
5
+ return layout.endianness === "little" ? "true" : "false";
6
+ }
7
+ export function encodingLiteral(encoding) {
8
+ return encoding === "ascii" ? '"ascii"' : '"utf8"';
9
+ }
10
+ //# sourceMappingURL=emitter-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-names.js","sourceRoot":"","sources":["../src/emitter-names.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA0B;IACxD,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StructLayout } from "@exornea/zeno-schema";
2
+ export declare function collectRuntimeImports(layouts: readonly StructLayout[]): string[];
3
+ //# sourceMappingURL=emitter-runtime-imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-runtime-imports.d.ts","sourceRoot":"","sources":["../src/emitter-runtime-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAuB,MAAM,sBAAsB,CAAC;AAK3F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,EAAE,CAehF"}
@@ -0,0 +1,73 @@
1
+ import { hasTailWriterFields } from "./emitter-capabilities.js";
2
+ import { collectFixedArrayRuntimeImports } from "./emitter-fixed-array.js";
3
+ export function collectRuntimeImports(layouts) {
4
+ const imports = new Set(["ProjectionView"]);
5
+ const layoutMap = new Map(layouts.map((layout) => [layout.name, layout]));
6
+ for (const layout of layouts) {
7
+ if (hasTailWriterFields(layout, layoutMap)) {
8
+ imports.add("DynamicLayoutWriter");
9
+ }
10
+ for (const field of layout.fields) {
11
+ collectFieldRuntimeImports(field, imports);
12
+ }
13
+ }
14
+ return Array.from(imports).sort();
15
+ }
16
+ function collectFieldRuntimeImports(field, imports) {
17
+ switch (field.kind) {
18
+ case "fixed-bytes":
19
+ imports.add("fixedBytesView");
20
+ imports.add("writeFixedBytes");
21
+ return;
22
+ case "fixed-string":
23
+ imports.add("decodeFixedText");
24
+ imports.add("fixedBytesView");
25
+ imports.add("writeFixedText");
26
+ return;
27
+ case "dynamic-string":
28
+ imports.add("Utf8SpanView");
29
+ return;
30
+ case "dynamic-bytes":
31
+ imports.add("BytesSpanView");
32
+ return;
33
+ case "vector":
34
+ collectVectorRuntimeImports(field.element.kind, imports);
35
+ return;
36
+ case "fixed-array":
37
+ collectFixedArrayRuntimeImports(field.element, imports);
38
+ return;
39
+ default:
40
+ return;
41
+ }
42
+ }
43
+ function collectVectorRuntimeImports(elementKind, imports) {
44
+ switch (elementKind) {
45
+ case "scalar":
46
+ imports.add("ScalarVectorView");
47
+ return;
48
+ case "dynamic-string":
49
+ imports.add("Utf8VectorView");
50
+ return;
51
+ case "dynamic-bytes":
52
+ imports.add("BytesVectorView");
53
+ return;
54
+ case "fixed-bytes":
55
+ imports.add("FixedBytesVectorView");
56
+ return;
57
+ case "fixed-string":
58
+ imports.add("FixedStringVectorView");
59
+ return;
60
+ case "struct":
61
+ imports.add("StructVectorView");
62
+ return;
63
+ case "dynamic-struct":
64
+ imports.add("DynamicStructVectorView");
65
+ return;
66
+ case "pointer":
67
+ imports.add("PointerVectorView");
68
+ return;
69
+ default:
70
+ return;
71
+ }
72
+ }
73
+ //# sourceMappingURL=emitter-runtime-imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-runtime-imports.js","sourceRoot":"","sources":["../src/emitter-runtime-imports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAE3E,MAAM,UAAU,qBAAqB,CAAC,OAAgC;IACpE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAE1E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAkB,EAAE,OAAoB;IAC1E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,aAAa;YAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO;QACT,KAAK,cAAc;YACjB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO;QACT,KAAK,gBAAgB;YACnB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO;QACT,KAAK,eAAe;YAClB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO;QACT,KAAK,QAAQ;YACX,2BAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO;QACT,KAAK,aAAa;YAChB,+BAA+B,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO;QACT;YACE,OAAO;IACX,CAAC;AACH,CAAC;AAED,SAAS,2BAA2B,CAClC,WAAwC,EACxC,OAAoB;IAEpB,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,KAAK,gBAAgB;YACnB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO;QACT,KAAK,eAAe;YAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO;QACT,KAAK,aAAa;YAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;QACT,KAAK,cAAc;YACjB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,KAAK,gBAAgB;YACnB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO;QACT,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO;QACT;YACE,OAAO;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type FieldLayout, type StructLayout } from "@exornea/zeno-schema";
2
+ export type ScanKernelMode = "none" | "sum" | "basic" | "full";
3
+ export declare function normalizeScanKernelMode(mode: ScanKernelMode | undefined): ScanKernelMode;
4
+ export declare function parseScanKernelMode(value: string): ScanKernelMode | null;
5
+ export declare function hasScanKernels(layout: StructLayout, mode: ScanKernelMode): boolean;
6
+ export declare function emitScanRangeHelper(layout: StructLayout): string[];
7
+ export declare function emitScalarScanKernels(layout: StructLayout, field: Extract<FieldLayout, {
8
+ kind: "scalar";
9
+ }>, getterMethod: string, littleEndianDefault: "true" | "false", pascalName: string, mode: ScanKernelMode): string[];
10
+ //# sourceMappingURL=emitter-scan-kernels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-scan-kernels.d.ts","sourceRoot":"","sources":["../src/emitter-scan-kernels.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAI9B,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/D,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,cAAc,CAExF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAUxE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAQlF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAuBlE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,EAC/C,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,GAAG,OAAO,EACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,GACnB,MAAM,EAAE,CAiBV"}
@@ -0,0 +1,174 @@
1
+ import { scalarTsType, } from "@exornea/zeno-schema";
2
+ import { method } from "./emitter-template.js";
3
+ export function normalizeScanKernelMode(mode) {
4
+ return mode ?? "full";
5
+ }
6
+ export function parseScanKernelMode(value) {
7
+ switch (value) {
8
+ case "none":
9
+ case "sum":
10
+ case "basic":
11
+ case "full":
12
+ return value;
13
+ default:
14
+ return null;
15
+ }
16
+ }
17
+ export function hasScanKernels(layout, mode) {
18
+ if (mode === "none") {
19
+ return false;
20
+ }
21
+ return layout.fields.some((field) => {
22
+ return field.kind === "scalar" && canEmitScalarScanKernel(field, mode);
23
+ });
24
+ }
25
+ export function emitScanRangeHelper(layout) {
26
+ return method `
27
+ private static assertScanRange(
28
+ view: DataView,
29
+ count: number,
30
+ baseOffset: number,
31
+ fieldOffset: number,
32
+ fieldByteLength: number,
33
+ ): void {
34
+ if (!Number.isInteger(count) || count < 0) {
35
+ throw new RangeError(\`Invalid record count: \${count}\`);
36
+ }
37
+ if (!Number.isFinite(baseOffset) || !Number.isInteger(baseOffset) || baseOffset < 0) {
38
+ throw new RangeError(\`Invalid base offset: \${baseOffset}\`);
39
+ }
40
+ if (count === 0) {
41
+ return;
42
+ }
43
+ const lastByte = baseOffset + fieldOffset + (count - 1) * ${layout.name}View.byteLength + fieldByteLength;
44
+ if (lastByte > view.byteLength) {
45
+ throw new RangeError(\`scan range exceeds DataView length \${view.byteLength}\`);
46
+ }
47
+ }`;
48
+ }
49
+ export function emitScalarScanKernels(layout, field, getterMethod, littleEndianDefault, pascalName, mode) {
50
+ if (mode === "none") {
51
+ return [];
52
+ }
53
+ return [
54
+ ...emitScalarSumKernel(layout, field, getterMethod, littleEndianDefault, pascalName, mode),
55
+ ...emitScalarMinMaxKernels(layout, field, getterMethod, littleEndianDefault, pascalName, mode),
56
+ ...emitScalarEqualityKernels(layout, field, getterMethod, littleEndianDefault, pascalName, mode),
57
+ ];
58
+ }
59
+ function emitScalarSumKernel(layout, field, getterMethod, littleEndianDefault, pascalName, mode) {
60
+ if (!canEmitSumKernel(field.scalar, mode)) {
61
+ return [];
62
+ }
63
+ const endianArg = field.byteLength === 1 ? "" : ", littleEndian";
64
+ return method `
65
+ static sum${pascalName}(view: DataView, count: number, baseOffset = 0, littleEndian = ${littleEndianDefault}): number {
66
+ ${layout.name}View.assertScanRange(view, count, baseOffset, ${field.offset}, ${field.byteLength});
67
+ if (count === 0) {
68
+ return 0;
69
+ }
70
+ const start = baseOffset + ${field.offset};
71
+ const limit = start + count * ${layout.byteLength};
72
+ let sum = 0;
73
+ for (let offset = start; offset < limit; offset += ${layout.byteLength}) {
74
+ sum += view.${getterMethod}(offset${endianArg});
75
+ }
76
+ return sum;
77
+ }`;
78
+ }
79
+ function emitScalarMinMaxKernels(layout, field, getterMethod, littleEndianDefault, pascalName, mode) {
80
+ if (!canEmitMinMaxKernel(field.scalar, mode)) {
81
+ return [];
82
+ }
83
+ const endianArg = field.byteLength === 1 ? "" : ", littleEndian";
84
+ return method `
85
+ static min${pascalName}(view: DataView, count: number, baseOffset = 0, littleEndian = ${littleEndianDefault}): number {
86
+ ${layout.name}View.assertScanRange(view, count, baseOffset, ${field.offset}, ${field.byteLength});
87
+ if (count === 0) {
88
+ return Number.POSITIVE_INFINITY;
89
+ }
90
+ const start = baseOffset + ${field.offset};
91
+ const limit = start + count * ${layout.byteLength};
92
+ let minimum = Number.POSITIVE_INFINITY;
93
+ for (let offset = start; offset < limit; offset += ${layout.byteLength}) {
94
+ const value = view.${getterMethod}(offset${endianArg});
95
+ if (value < minimum) {
96
+ minimum = value;
97
+ }
98
+ }
99
+ return minimum;
100
+ }
101
+ static max${pascalName}(view: DataView, count: number, baseOffset = 0, littleEndian = ${littleEndianDefault}): number {
102
+ ${layout.name}View.assertScanRange(view, count, baseOffset, ${field.offset}, ${field.byteLength});
103
+ if (count === 0) {
104
+ return Number.NEGATIVE_INFINITY;
105
+ }
106
+ const start = baseOffset + ${field.offset};
107
+ const limit = start + count * ${layout.byteLength};
108
+ let maximum = Number.NEGATIVE_INFINITY;
109
+ for (let offset = start; offset < limit; offset += ${layout.byteLength}) {
110
+ const value = view.${getterMethod}(offset${endianArg});
111
+ if (value > maximum) {
112
+ maximum = value;
113
+ }
114
+ }
115
+ return maximum;
116
+ }`;
117
+ }
118
+ function emitScalarEqualityKernels(layout, field, getterMethod, littleEndianDefault, pascalName, mode) {
119
+ if (!canEmitEqualityKernel(field.scalar, mode)) {
120
+ return [];
121
+ }
122
+ const typeName = scalarTsType(field.scalar);
123
+ const endianArg = field.byteLength === 1 || field.scalar === "bool" ? "" : ", littleEndian";
124
+ const readExpression = field.scalar === "bool"
125
+ ? `view.${getterMethod}(offset) !== 0`
126
+ : `view.${getterMethod}(offset${endianArg})`;
127
+ return method `
128
+ static count${pascalName}WhereEq(view: DataView, count: number, expected: ${typeName}, baseOffset = 0, littleEndian = ${littleEndianDefault}): number {
129
+ ${layout.name}View.assertScanRange(view, count, baseOffset, ${field.offset}, ${field.byteLength});
130
+ let matched = 0;
131
+ const start = baseOffset + ${field.offset};
132
+ const limit = start + count * ${layout.byteLength};
133
+ for (let offset = start; offset < limit; offset += ${layout.byteLength}) {
134
+ if (${readExpression} === expected) {
135
+ matched += 1;
136
+ }
137
+ }
138
+ return matched;
139
+ }
140
+ static findFirst${pascalName}WhereEq(view: DataView, count: number, expected: ${typeName}, baseOffset = 0, littleEndian = ${littleEndianDefault}): number {
141
+ ${layout.name}View.assertScanRange(view, count, baseOffset, ${field.offset}, ${field.byteLength});
142
+ const start = baseOffset + ${field.offset};
143
+ const limit = start + count * ${layout.byteLength};
144
+ let index = 0;
145
+ for (let offset = start; offset < limit; offset += ${layout.byteLength}) {
146
+ if (${readExpression} === expected) {
147
+ return index;
148
+ }
149
+ index += 1;
150
+ }
151
+ return -1;
152
+ }`;
153
+ }
154
+ function canEmitScalarScanKernel(field, mode) {
155
+ return (canEmitSumKernel(field.scalar, mode) ||
156
+ canEmitMinMaxKernel(field.scalar, mode) ||
157
+ canEmitEqualityKernel(field.scalar, mode));
158
+ }
159
+ function canEmitSumKernel(kind, mode) {
160
+ return mode !== "none" && isNumberSumScalar(kind);
161
+ }
162
+ function canEmitMinMaxKernel(kind, mode) {
163
+ return (mode === "basic" || mode === "full") && isNumberSumScalar(kind);
164
+ }
165
+ function canEmitEqualityKernel(kind, mode) {
166
+ return mode === "full" && isEqualityKernelScalar(kind);
167
+ }
168
+ function isNumberSumScalar(kind) {
169
+ return kind !== "i64" && kind !== "u64" && kind !== "bool";
170
+ }
171
+ function isEqualityKernelScalar(kind) {
172
+ return kind !== "i64" && kind !== "u64" && kind !== "f32" && kind !== "f64";
173
+ }
174
+ //# sourceMappingURL=emitter-scan-kernels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-scan-kernels.js","sourceRoot":"","sources":["../src/emitter-scan-kernels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type FieldLayout, type StructLayout } from "@exornea/zeno-schema";
2
+ import { type ScanKernelMode } from "./emitter-scan-kernels.js";
3
+ export declare function emitStaticFieldAccessor(layout: StructLayout, field: FieldLayout, scanKernelMode: ScanKernelMode): string[];
4
+ //# sourceMappingURL=emitter-static-accessors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter-static-accessors.d.ts","sourceRoot":"","sources":["../src/emitter-static-accessors.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGvF,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,cAAc,GAC7B,MAAM,EAAE,CAMV"}