c-next 0.1.65 → 0.1.67
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 +5 -1
- package/src/transpiler/Transpiler.ts +49 -42
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +129 -0
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +27 -3
- package/src/transpiler/output/codegen/CodeGenerator.ts +131 -186
- package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
- package/src/transpiler/output/codegen/TypeValidator.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.coverage.test.ts +1087 -0
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +665 -1315
- package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/MemberChainAnalyzer.ts +1 -1
- package/src/transpiler/output/codegen/analysis/StringLengthCounter.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/MemberChainAnalyzer.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +1 -1
- package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/handlers/AccessPatternHandlers.ts +24 -27
- package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +25 -18
- package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +27 -33
- package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +39 -42
- package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +39 -97
- package/src/transpiler/output/codegen/assignment/handlers/RegisterUtils.ts +75 -0
- package/src/transpiler/output/codegen/assignment/handlers/SimpleHandler.ts +9 -6
- package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +30 -22
- package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +42 -50
- package/src/transpiler/output/codegen/assignment/handlers/TAssignmentHandler.ts +6 -5
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/AccessPatternHandlers.test.ts +81 -134
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +85 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +82 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +135 -297
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterHandlers.test.ts +105 -227
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterUtils.test.ts +214 -1
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +66 -127
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/StringHandlers.test.ts +37 -83
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +162 -0
- package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +618 -12
- package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +819 -0
- package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/CppModeHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/FloatBitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/ParameterInputAdapter.ts +337 -0
- package/src/transpiler/output/codegen/helpers/ParameterSignatureBuilder.ts +135 -0
- package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +118 -0
- package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/CppModeHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/FloatBitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/ParameterInputAdapter.test.ts +426 -0
- package/src/transpiler/output/codegen/helpers/__tests__/ParameterSignatureBuilder.test.ts +315 -0
- package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclarationFormatter.test.ts +333 -0
- package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/ScopeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/SizeofResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/SizeofResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/types/ICodeGenApi.ts +57 -0
- package/src/transpiler/output/codegen/types/IParameterInput.ts +58 -0
- package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +51 -0
- package/src/transpiler/output/headers/BaseHeaderGenerator.ts +20 -35
- package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +21 -48
- package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +0 -64
- package/src/transpiler/{output/codegen → state}/CodeGenState.ts +46 -26
- package/src/transpiler/{output/codegen → state}/__tests__/CodeGenState.test.ts +12 -2
- package/src/transpiler/output/codegen/assignment/handlers/IHandlerDeps.ts +0 -161
|
@@ -3,53 +3,24 @@
|
|
|
3
3
|
* Tests array assignment handler functions.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
7
|
+
|
|
8
|
+
// Mock TypeValidator before imports (use vi.hoisted for hoisted mock reference)
|
|
9
|
+
const { mockCheckArrayBounds } = vi.hoisted(() => ({
|
|
10
|
+
mockCheckArrayBounds: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
vi.mock("../../../TypeValidator", () => ({
|
|
14
|
+
default: {
|
|
15
|
+
checkArrayBounds: mockCheckArrayBounds,
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
18
|
+
|
|
7
19
|
import arrayHandlers from "../ArrayHandlers";
|
|
8
20
|
import AssignmentKind from "../../AssignmentKind";
|
|
9
21
|
import IAssignmentContext from "../../IAssignmentContext";
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Create mock dependencies for testing.
|
|
14
|
-
*/
|
|
15
|
-
function createMockDeps(overrides: Record<string, unknown> = {}): IHandlerDeps {
|
|
16
|
-
const base = {
|
|
17
|
-
typeRegistry: new Map(),
|
|
18
|
-
symbols: {
|
|
19
|
-
structFields: new Map(),
|
|
20
|
-
structFieldDimensions: new Map(),
|
|
21
|
-
bitmapFields: new Map(),
|
|
22
|
-
registerMemberAccess: new Map(),
|
|
23
|
-
registerBaseAddresses: new Map(),
|
|
24
|
-
registerMemberOffsets: new Map(),
|
|
25
|
-
registerMemberTypes: new Map(),
|
|
26
|
-
},
|
|
27
|
-
currentScope: null,
|
|
28
|
-
currentParameters: new Map(),
|
|
29
|
-
targetCapabilities: { hasLDREX: false },
|
|
30
|
-
generateAssignmentTarget: vi.fn().mockReturnValue("target"),
|
|
31
|
-
generateExpression: vi
|
|
32
|
-
.fn()
|
|
33
|
-
.mockImplementation((ctx) => ctx?.mockValue ?? "0"),
|
|
34
|
-
markNeedsString: vi.fn(),
|
|
35
|
-
markClampOpUsed: vi.fn(),
|
|
36
|
-
isKnownScope: vi.fn().mockReturnValue(false),
|
|
37
|
-
isKnownStruct: vi.fn().mockReturnValue(false),
|
|
38
|
-
validateCrossScopeVisibility: vi.fn(),
|
|
39
|
-
validateBitmapFieldLiteral: vi.fn(),
|
|
40
|
-
checkArrayBounds: vi.fn(),
|
|
41
|
-
analyzeMemberChainForBitAccess: vi
|
|
42
|
-
.fn()
|
|
43
|
-
.mockReturnValue({ isBitAccess: false }),
|
|
44
|
-
tryEvaluateConstant: vi.fn().mockReturnValue(undefined),
|
|
45
|
-
getMemberTypeInfo: vi.fn().mockReturnValue(null),
|
|
46
|
-
generateFloatBitWrite: vi.fn().mockReturnValue(null),
|
|
47
|
-
foldBooleanToInt: vi.fn().mockImplementation((expr) => expr),
|
|
48
|
-
generateAtomicRMW: vi.fn().mockReturnValue("atomic_rmw"),
|
|
49
|
-
...overrides,
|
|
50
|
-
};
|
|
51
|
-
return base as unknown as IHandlerDeps;
|
|
52
|
-
}
|
|
22
|
+
import CodeGenState from "../../../../../state/CodeGenState";
|
|
23
|
+
import HandlerTestUtils from "./handlerTestUtils";
|
|
53
24
|
|
|
54
25
|
/**
|
|
55
26
|
* Create mock context for testing.
|
|
@@ -80,6 +51,12 @@ function createMockContext(
|
|
|
80
51
|
}
|
|
81
52
|
|
|
82
53
|
describe("ArrayHandlers", () => {
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
CodeGenState.reset();
|
|
56
|
+
HandlerTestUtils.setupMockGenerator();
|
|
57
|
+
HandlerTestUtils.setupMockSymbols();
|
|
58
|
+
});
|
|
59
|
+
|
|
83
60
|
describe("handler registration", () => {
|
|
84
61
|
it("registers all expected array assignment kinds", () => {
|
|
85
62
|
const kinds = arrayHandlers.map(([kind]) => kind);
|
|
@@ -101,18 +78,18 @@ describe("ArrayHandlers", () => {
|
|
|
101
78
|
)?.[1];
|
|
102
79
|
|
|
103
80
|
it("generates simple array element assignment", () => {
|
|
104
|
-
|
|
81
|
+
HandlerTestUtils.setupMockGenerator({
|
|
105
82
|
generateExpression: vi.fn().mockReturnValue("i"),
|
|
106
83
|
});
|
|
107
84
|
const ctx = createMockContext();
|
|
108
85
|
|
|
109
|
-
const result = getHandler()!(ctx
|
|
86
|
+
const result = getHandler()!(ctx);
|
|
110
87
|
|
|
111
88
|
expect(result).toBe("arr[i] = value;");
|
|
112
89
|
});
|
|
113
90
|
|
|
114
91
|
it("handles compound assignment", () => {
|
|
115
|
-
|
|
92
|
+
HandlerTestUtils.setupMockGenerator({
|
|
116
93
|
generateExpression: vi.fn().mockReturnValue("0"),
|
|
117
94
|
});
|
|
118
95
|
const ctx = createMockContext({
|
|
@@ -121,20 +98,20 @@ describe("ArrayHandlers", () => {
|
|
|
121
98
|
cOp: "+=",
|
|
122
99
|
});
|
|
123
100
|
|
|
124
|
-
const result = getHandler()!(ctx
|
|
101
|
+
const result = getHandler()!(ctx);
|
|
125
102
|
|
|
126
103
|
expect(result).toBe("arr[0] += value;");
|
|
127
104
|
});
|
|
128
105
|
|
|
129
106
|
it("uses correct identifier", () => {
|
|
130
|
-
|
|
107
|
+
HandlerTestUtils.setupMockGenerator({
|
|
131
108
|
generateExpression: vi.fn().mockReturnValue("idx"),
|
|
132
109
|
});
|
|
133
110
|
const ctx = createMockContext({
|
|
134
111
|
identifiers: ["buffer"],
|
|
135
112
|
});
|
|
136
113
|
|
|
137
|
-
const result = getHandler()!(ctx
|
|
114
|
+
const result = getHandler()!(ctx);
|
|
138
115
|
|
|
139
116
|
expect(result).toBe("buffer[idx] = value;");
|
|
140
117
|
});
|
|
@@ -147,7 +124,7 @@ describe("ArrayHandlers", () => {
|
|
|
147
124
|
)?.[1];
|
|
148
125
|
|
|
149
126
|
it("generates multi-dimensional array access", () => {
|
|
150
|
-
|
|
127
|
+
HandlerTestUtils.setupMockGenerator({
|
|
151
128
|
generateExpression: vi
|
|
152
129
|
.fn()
|
|
153
130
|
.mockReturnValueOnce("i")
|
|
@@ -162,13 +139,13 @@ describe("ArrayHandlers", () => {
|
|
|
162
139
|
subscriptDepth: 2,
|
|
163
140
|
});
|
|
164
141
|
|
|
165
|
-
const result = getHandler()!(ctx
|
|
142
|
+
const result = getHandler()!(ctx);
|
|
166
143
|
|
|
167
144
|
expect(result).toBe("matrix[i][j] = value;");
|
|
168
145
|
});
|
|
169
146
|
|
|
170
147
|
it("handles 3D array access", () => {
|
|
171
|
-
|
|
148
|
+
HandlerTestUtils.setupMockGenerator({
|
|
172
149
|
generateExpression: vi
|
|
173
150
|
.fn()
|
|
174
151
|
.mockReturnValueOnce("x")
|
|
@@ -185,19 +162,17 @@ describe("ArrayHandlers", () => {
|
|
|
185
162
|
subscriptDepth: 3,
|
|
186
163
|
});
|
|
187
164
|
|
|
188
|
-
const result = getHandler()!(ctx
|
|
165
|
+
const result = getHandler()!(ctx);
|
|
189
166
|
|
|
190
167
|
expect(result).toBe("cube[x][y][z] = value;");
|
|
191
168
|
});
|
|
192
169
|
|
|
193
170
|
it("performs bounds checking when type info available", () => {
|
|
194
|
-
|
|
171
|
+
CodeGenState.typeRegistry = new Map([
|
|
195
172
|
["matrix", { arrayDimensions: [10, 10], baseType: "i32" }],
|
|
196
|
-
]);
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
typeRegistry,
|
|
200
|
-
checkArrayBounds,
|
|
173
|
+
]) as any;
|
|
174
|
+
mockCheckArrayBounds.mockClear();
|
|
175
|
+
HandlerTestUtils.setupMockGenerator({
|
|
201
176
|
generateExpression: vi
|
|
202
177
|
.fn()
|
|
203
178
|
.mockReturnValueOnce("5")
|
|
@@ -211,18 +186,19 @@ describe("ArrayHandlers", () => {
|
|
|
211
186
|
],
|
|
212
187
|
});
|
|
213
188
|
|
|
214
|
-
getHandler()!(ctx
|
|
189
|
+
getHandler()!(ctx);
|
|
215
190
|
|
|
216
|
-
expect(
|
|
191
|
+
expect(mockCheckArrayBounds).toHaveBeenCalledWith(
|
|
217
192
|
"matrix",
|
|
218
193
|
[10, 10],
|
|
219
194
|
ctx.subscripts,
|
|
220
195
|
10,
|
|
196
|
+
expect.any(Function), // tryEvaluateConstant callback
|
|
221
197
|
);
|
|
222
198
|
});
|
|
223
199
|
|
|
224
200
|
it("handles compound assignment", () => {
|
|
225
|
-
|
|
201
|
+
HandlerTestUtils.setupMockGenerator({
|
|
226
202
|
generateExpression: vi
|
|
227
203
|
.fn()
|
|
228
204
|
.mockReturnValueOnce("0")
|
|
@@ -238,7 +214,7 @@ describe("ArrayHandlers", () => {
|
|
|
238
214
|
cOp: "-=",
|
|
239
215
|
});
|
|
240
216
|
|
|
241
|
-
const result = getHandler()!(ctx
|
|
217
|
+
const result = getHandler()!(ctx);
|
|
242
218
|
|
|
243
219
|
expect(result).toBe("grid[0][1] -= value;");
|
|
244
220
|
});
|
|
@@ -249,13 +225,10 @@ describe("ArrayHandlers", () => {
|
|
|
249
225
|
arrayHandlers.find(([kind]) => kind === AssignmentKind.ARRAY_SLICE)?.[1];
|
|
250
226
|
|
|
251
227
|
it("generates memcpy for valid slice assignment", () => {
|
|
252
|
-
|
|
228
|
+
CodeGenState.typeRegistry = new Map([
|
|
253
229
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
254
|
-
]);
|
|
255
|
-
|
|
256
|
-
const deps = createMockDeps({
|
|
257
|
-
typeRegistry,
|
|
258
|
-
markNeedsString,
|
|
230
|
+
]) as any;
|
|
231
|
+
HandlerTestUtils.setupMockGenerator({
|
|
259
232
|
tryEvaluateConstant: vi
|
|
260
233
|
.fn()
|
|
261
234
|
.mockReturnValueOnce(0)
|
|
@@ -270,14 +243,14 @@ describe("ArrayHandlers", () => {
|
|
|
270
243
|
generatedValue: "source",
|
|
271
244
|
});
|
|
272
245
|
|
|
273
|
-
const result = getHandler()!(ctx
|
|
246
|
+
const result = getHandler()!(ctx);
|
|
274
247
|
|
|
275
248
|
expect(result).toBe("memcpy(&buffer[0], &source, 10);");
|
|
276
|
-
expect(
|
|
249
|
+
expect(CodeGenState.needsString).toBe(true);
|
|
277
250
|
});
|
|
278
251
|
|
|
279
252
|
it("generates memcpy for string slice", () => {
|
|
280
|
-
|
|
253
|
+
CodeGenState.typeRegistry = new Map([
|
|
281
254
|
[
|
|
282
255
|
"str",
|
|
283
256
|
{
|
|
@@ -287,9 +260,8 @@ describe("ArrayHandlers", () => {
|
|
|
287
260
|
baseType: "string",
|
|
288
261
|
},
|
|
289
262
|
],
|
|
290
|
-
]);
|
|
291
|
-
|
|
292
|
-
typeRegistry,
|
|
263
|
+
]) as any;
|
|
264
|
+
HandlerTestUtils.setupMockGenerator({
|
|
293
265
|
tryEvaluateConstant: vi
|
|
294
266
|
.fn()
|
|
295
267
|
.mockReturnValueOnce(5)
|
|
@@ -304,17 +276,16 @@ describe("ArrayHandlers", () => {
|
|
|
304
276
|
generatedValue: "data",
|
|
305
277
|
});
|
|
306
278
|
|
|
307
|
-
const result = getHandler()!(ctx
|
|
279
|
+
const result = getHandler()!(ctx);
|
|
308
280
|
|
|
309
281
|
expect(result).toBe("memcpy(&str[5], &data, 10);");
|
|
310
282
|
});
|
|
311
283
|
|
|
312
284
|
it("throws on compound assignment", () => {
|
|
313
|
-
|
|
285
|
+
CodeGenState.typeRegistry = new Map([
|
|
314
286
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
315
|
-
]);
|
|
316
|
-
|
|
317
|
-
typeRegistry,
|
|
287
|
+
]) as any;
|
|
288
|
+
HandlerTestUtils.setupMockGenerator({
|
|
318
289
|
tryEvaluateConstant: vi
|
|
319
290
|
.fn()
|
|
320
291
|
.mockReturnValueOnce(0)
|
|
@@ -329,18 +300,15 @@ describe("ArrayHandlers", () => {
|
|
|
329
300
|
],
|
|
330
301
|
});
|
|
331
302
|
|
|
332
|
-
expect(() => getHandler()!(ctx
|
|
303
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
333
304
|
"Compound assignment operators not supported for slice assignment",
|
|
334
305
|
);
|
|
335
306
|
});
|
|
336
307
|
|
|
337
308
|
it("throws on multi-dimensional array", () => {
|
|
338
|
-
|
|
309
|
+
CodeGenState.typeRegistry = new Map([
|
|
339
310
|
["matrix", { arrayDimensions: [10, 10], baseType: "u8" }],
|
|
340
|
-
]);
|
|
341
|
-
const deps = createMockDeps({
|
|
342
|
-
typeRegistry,
|
|
343
|
-
});
|
|
311
|
+
]) as any;
|
|
344
312
|
const ctx = createMockContext({
|
|
345
313
|
identifiers: ["matrix"],
|
|
346
314
|
subscripts: [
|
|
@@ -349,17 +317,16 @@ describe("ArrayHandlers", () => {
|
|
|
349
317
|
],
|
|
350
318
|
});
|
|
351
319
|
|
|
352
|
-
expect(() => getHandler()!(ctx
|
|
320
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
353
321
|
"Slice assignment is only valid on one-dimensional arrays",
|
|
354
322
|
);
|
|
355
323
|
});
|
|
356
324
|
|
|
357
325
|
it("throws on non-constant offset", () => {
|
|
358
|
-
|
|
326
|
+
CodeGenState.typeRegistry = new Map([
|
|
359
327
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
360
|
-
]);
|
|
361
|
-
|
|
362
|
-
typeRegistry,
|
|
328
|
+
]) as any;
|
|
329
|
+
HandlerTestUtils.setupMockGenerator({
|
|
363
330
|
tryEvaluateConstant: vi.fn().mockReturnValue(undefined),
|
|
364
331
|
});
|
|
365
332
|
const ctx = createMockContext({
|
|
@@ -369,17 +336,16 @@ describe("ArrayHandlers", () => {
|
|
|
369
336
|
],
|
|
370
337
|
});
|
|
371
338
|
|
|
372
|
-
expect(() => getHandler()!(ctx
|
|
339
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
373
340
|
"Slice assignment offset must be a compile-time constant",
|
|
374
341
|
);
|
|
375
342
|
});
|
|
376
343
|
|
|
377
344
|
it("throws on non-constant length", () => {
|
|
378
|
-
|
|
345
|
+
CodeGenState.typeRegistry = new Map([
|
|
379
346
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
380
|
-
]);
|
|
381
|
-
|
|
382
|
-
typeRegistry,
|
|
347
|
+
]) as any;
|
|
348
|
+
HandlerTestUtils.setupMockGenerator({
|
|
383
349
|
tryEvaluateConstant: vi
|
|
384
350
|
.fn()
|
|
385
351
|
.mockReturnValueOnce(0)
|
|
@@ -392,17 +358,16 @@ describe("ArrayHandlers", () => {
|
|
|
392
358
|
],
|
|
393
359
|
});
|
|
394
360
|
|
|
395
|
-
expect(() => getHandler()!(ctx
|
|
361
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
396
362
|
"Slice assignment length must be a compile-time constant",
|
|
397
363
|
);
|
|
398
364
|
});
|
|
399
365
|
|
|
400
366
|
it("throws on out of bounds access", () => {
|
|
401
|
-
|
|
367
|
+
CodeGenState.typeRegistry = new Map([
|
|
402
368
|
["buffer", { arrayDimensions: [50], baseType: "u8" }],
|
|
403
|
-
]);
|
|
404
|
-
|
|
405
|
-
typeRegistry,
|
|
369
|
+
]) as any;
|
|
370
|
+
HandlerTestUtils.setupMockGenerator({
|
|
406
371
|
tryEvaluateConstant: vi
|
|
407
372
|
.fn()
|
|
408
373
|
.mockReturnValueOnce(40)
|
|
@@ -416,17 +381,16 @@ describe("ArrayHandlers", () => {
|
|
|
416
381
|
],
|
|
417
382
|
});
|
|
418
383
|
|
|
419
|
-
expect(() => getHandler()!(ctx
|
|
384
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
420
385
|
"Slice assignment out of bounds",
|
|
421
386
|
);
|
|
422
387
|
});
|
|
423
388
|
|
|
424
389
|
it("throws on negative offset", () => {
|
|
425
|
-
|
|
390
|
+
CodeGenState.typeRegistry = new Map([
|
|
426
391
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
427
|
-
]);
|
|
428
|
-
|
|
429
|
-
typeRegistry,
|
|
392
|
+
]) as any;
|
|
393
|
+
HandlerTestUtils.setupMockGenerator({
|
|
430
394
|
tryEvaluateConstant: vi
|
|
431
395
|
.fn()
|
|
432
396
|
.mockReturnValueOnce(-1)
|
|
@@ -440,17 +404,16 @@ describe("ArrayHandlers", () => {
|
|
|
440
404
|
],
|
|
441
405
|
});
|
|
442
406
|
|
|
443
|
-
expect(() => getHandler()!(ctx
|
|
407
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
444
408
|
"Slice assignment offset cannot be negative",
|
|
445
409
|
);
|
|
446
410
|
});
|
|
447
411
|
|
|
448
412
|
it("throws on zero length", () => {
|
|
449
|
-
|
|
413
|
+
CodeGenState.typeRegistry = new Map([
|
|
450
414
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
451
|
-
]);
|
|
452
|
-
|
|
453
|
-
typeRegistry,
|
|
415
|
+
]) as any;
|
|
416
|
+
HandlerTestUtils.setupMockGenerator({
|
|
454
417
|
tryEvaluateConstant: vi
|
|
455
418
|
.fn()
|
|
456
419
|
.mockReturnValueOnce(0)
|
|
@@ -464,17 +427,16 @@ describe("ArrayHandlers", () => {
|
|
|
464
427
|
],
|
|
465
428
|
});
|
|
466
429
|
|
|
467
|
-
expect(() => getHandler()!(ctx
|
|
430
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
468
431
|
"Slice assignment length must be positive",
|
|
469
432
|
);
|
|
470
433
|
});
|
|
471
434
|
|
|
472
435
|
it("throws on negative length", () => {
|
|
473
|
-
|
|
436
|
+
CodeGenState.typeRegistry = new Map([
|
|
474
437
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
475
|
-
]);
|
|
476
|
-
|
|
477
|
-
typeRegistry,
|
|
438
|
+
]) as any;
|
|
439
|
+
HandlerTestUtils.setupMockGenerator({
|
|
478
440
|
tryEvaluateConstant: vi
|
|
479
441
|
.fn()
|
|
480
442
|
.mockReturnValueOnce(0)
|
|
@@ -488,15 +450,16 @@ describe("ArrayHandlers", () => {
|
|
|
488
450
|
],
|
|
489
451
|
});
|
|
490
452
|
|
|
491
|
-
expect(() => getHandler()!(ctx
|
|
453
|
+
expect(() => getHandler()!(ctx)).toThrow(
|
|
492
454
|
"Slice assignment length must be positive",
|
|
493
455
|
);
|
|
494
456
|
});
|
|
495
457
|
|
|
496
458
|
it("throws when buffer size cannot be determined", () => {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
459
|
+
CodeGenState.typeRegistry = new Map([
|
|
460
|
+
["unknown", { baseType: "u8" }],
|
|
461
|
+
]) as any;
|
|
462
|
+
HandlerTestUtils.setupMockGenerator({
|
|
500
463
|
tryEvaluateConstant: vi
|
|
501
464
|
.fn()
|
|
502
465
|
.mockReturnValueOnce(0)
|
|
@@ -510,9 +473,7 @@ describe("ArrayHandlers", () => {
|
|
|
510
473
|
],
|
|
511
474
|
});
|
|
512
475
|
|
|
513
|
-
expect(() => getHandler()!(ctx
|
|
514
|
-
"Cannot determine buffer size",
|
|
515
|
-
);
|
|
476
|
+
expect(() => getHandler()!(ctx)).toThrow("Cannot determine buffer size");
|
|
516
477
|
});
|
|
517
478
|
});
|
|
518
479
|
});
|