c-next 0.1.69 → 0.1.71
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 +1 -1
- package/src/lib/__tests__/parseCHeader.mocked.test.ts +69 -54
- package/src/lib/parseCHeader.ts +56 -23
- package/src/lib/parseWithSymbols.ts +195 -53
- package/src/transpiler/Transpiler.ts +173 -60
- package/src/transpiler/logic/analysis/FunctionCallAnalyzer.ts +240 -205
- package/src/transpiler/logic/analysis/InitializationAnalyzer.ts +1 -2
- package/src/transpiler/logic/analysis/PassByValueAnalyzer.ts +742 -0
- package/src/transpiler/logic/analysis/__tests__/FunctionCallAnalyzer.test.ts +102 -15
- package/src/transpiler/logic/analysis/__tests__/InitializationAnalyzer.test.ts +9 -9
- package/src/transpiler/logic/analysis/__tests__/runAnalyzers.test.ts +5 -5
- package/src/transpiler/{output/codegen → logic/analysis}/helpers/AssignmentTargetExtractor.ts +1 -1
- package/src/transpiler/{output/codegen → logic/analysis}/helpers/ChildStatementCollector.ts +1 -1
- package/src/transpiler/{output/codegen → logic/analysis}/helpers/StatementExpressionCollector.ts +1 -1
- package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/AssignmentTargetExtractor.test.ts +2 -2
- package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/ChildStatementCollector.test.ts +2 -2
- package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/StatementExpressionCollector.test.ts +2 -2
- package/src/transpiler/logic/symbols/SymbolTable.ts +676 -258
- package/src/transpiler/logic/symbols/SymbolUtils.ts +2 -2
- package/src/transpiler/logic/symbols/__tests__/SymbolTable.test.ts +290 -782
- package/src/transpiler/logic/symbols/c/__tests__/CResolver.integration.test.ts +573 -0
- package/src/transpiler/logic/symbols/c/__tests__/testHelpers.ts +20 -0
- package/src/transpiler/logic/symbols/c/collectors/EnumCollector.ts +82 -0
- package/src/transpiler/logic/symbols/c/collectors/FunctionCollector.ts +106 -0
- package/src/transpiler/logic/symbols/c/collectors/StructCollector.ts +173 -0
- package/src/transpiler/logic/symbols/c/collectors/TypedefCollector.ts +35 -0
- package/src/transpiler/logic/symbols/c/collectors/VariableCollector.ts +80 -0
- package/src/transpiler/logic/symbols/c/index.ts +333 -0
- package/src/transpiler/logic/symbols/c/utils/DeclaratorUtils.ts +269 -0
- package/src/transpiler/logic/symbols/cnext/__tests__/BitmapCollector.test.ts +50 -11
- package/src/transpiler/logic/symbols/cnext/__tests__/CNextResolver.integration.test.ts +45 -34
- package/src/transpiler/logic/symbols/cnext/__tests__/EnumCollector.test.ts +30 -13
- package/src/transpiler/logic/symbols/cnext/__tests__/FunctionCollector.test.ts +279 -64
- package/src/transpiler/logic/symbols/cnext/__tests__/RegisterCollector.test.ts +60 -13
- package/src/transpiler/logic/symbols/cnext/__tests__/ScopeCollector.test.ts +40 -37
- package/src/transpiler/logic/symbols/cnext/__tests__/StructCollector.test.ts +131 -45
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolInfoAdapter.test.ts +223 -139
- package/src/transpiler/logic/symbols/cnext/__tests__/VariableCollector.test.ts +79 -25
- package/src/transpiler/logic/symbols/cnext/__tests__/testUtils.ts +53 -0
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolInfoAdapter.ts +83 -43
- package/src/transpiler/logic/symbols/cnext/collectors/BitmapCollector.ts +14 -13
- package/src/transpiler/logic/symbols/cnext/collectors/EnumCollector.ts +11 -10
- package/src/transpiler/logic/symbols/cnext/collectors/FunctionCollector.ts +83 -34
- package/src/transpiler/logic/symbols/cnext/collectors/RegisterCollector.ts +22 -18
- package/src/transpiler/logic/symbols/cnext/collectors/ScopeCollector.ts +53 -35
- package/src/transpiler/logic/symbols/cnext/collectors/StructCollector.ts +30 -23
- package/src/transpiler/logic/symbols/cnext/collectors/VariableCollector.ts +18 -19
- package/src/transpiler/logic/symbols/cnext/index.ts +36 -14
- package/src/transpiler/logic/symbols/cnext/types/IScopeCollectorResult.ts +2 -2
- package/src/transpiler/logic/symbols/cnext/utils/SymbolNameUtils.ts +27 -0
- package/src/transpiler/logic/symbols/cpp/__tests__/CppResolver.integration.test.ts +270 -0
- package/src/transpiler/logic/symbols/cpp/__tests__/testHelpers.ts +20 -0
- package/src/transpiler/logic/symbols/cpp/collectors/ClassCollector.ts +317 -0
- package/src/transpiler/logic/symbols/cpp/collectors/EnumCollector.ts +71 -0
- package/src/transpiler/logic/symbols/cpp/collectors/FunctionCollector.ts +155 -0
- package/src/transpiler/logic/symbols/cpp/collectors/NamespaceCollector.ts +65 -0
- package/src/transpiler/logic/symbols/cpp/collectors/TypeAliasCollector.ts +46 -0
- package/src/transpiler/logic/symbols/cpp/collectors/VariableCollector.ts +54 -0
- package/src/transpiler/logic/symbols/cpp/index.ts +366 -0
- package/src/transpiler/logic/symbols/cpp/utils/DeclaratorUtils.ts +248 -0
- package/src/transpiler/logic/symbols/shared/IExtractedParameter.ts +18 -0
- package/src/transpiler/logic/symbols/shared/ParameterExtractorUtils.ts +73 -0
- package/src/transpiler/output/codegen/CodeGenerator.ts +310 -2288
- package/src/transpiler/output/codegen/TypeRegistrationUtils.ts +4 -6
- package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
- package/src/transpiler/output/codegen/TypeValidator.ts +5 -5
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +7 -1
- package/src/transpiler/output/codegen/__tests__/TypeRegistrationUtils.test.ts +36 -51
- package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +20 -17
- package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +3 -3
- 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 +9 -9
- package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +12 -12
- package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +13 -12
- package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +23 -17
- package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +2 -2
- package/src/transpiler/output/codegen/assignment/handlers/AssignmentHandlerUtils.ts +7 -1
- package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +3 -3
- package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +9 -5
- package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +2 -1
- package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +4 -4
- package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +5 -5
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +23 -25
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +20 -36
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +18 -18
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +42 -32
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +5 -4
- package/src/transpiler/output/codegen/generators/declarationGenerators/ScopeGenerator.ts +21 -8
- package/src/transpiler/output/codegen/generators/declarationGenerators/ScopedRegisterGenerator.ts +3 -2
- package/src/transpiler/output/codegen/generators/expressions/CallExprGenerator.ts +14 -6
- package/src/transpiler/output/codegen/generators/expressions/CallExprUtils.ts +9 -3
- package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +19 -16
- package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprGenerator.test.ts +24 -8
- package/src/transpiler/output/codegen/generators/expressions/__tests__/CallExprUtils.test.ts +4 -8
- package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +15 -2
- package/src/transpiler/output/codegen/helpers/ArgumentGenerator.ts +236 -0
- package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +2 -1
- package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +2 -2
- package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +3 -3
- package/src/transpiler/output/codegen/helpers/CppConstructorHelper.ts +3 -3
- package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/FunctionContextManager.ts +435 -0
- package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +2 -2
- package/src/transpiler/output/codegen/helpers/StringOperationsHelper.ts +203 -0
- package/src/transpiler/output/codegen/helpers/SymbolLookupHelper.ts +8 -12
- package/src/transpiler/output/codegen/helpers/TypeRegistrationEngine.ts +520 -0
- package/src/transpiler/output/codegen/helpers/VariableDeclHelper.ts +735 -0
- package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/ArgumentGenerator.test.ts +521 -0
- package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +7 -7
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +7 -7
- package/src/transpiler/output/codegen/helpers/__tests__/CppConstructorHelper.test.ts +4 -5
- package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +2 -2
- package/src/transpiler/output/codegen/helpers/__tests__/FunctionContextManager.test.ts +983 -0
- package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +4 -4
- package/src/transpiler/output/codegen/helpers/__tests__/StringOperationsHelper.test.ts +269 -0
- package/src/transpiler/output/codegen/helpers/__tests__/SymbolLookupHelper.test.ts +31 -32
- package/src/transpiler/output/codegen/helpers/__tests__/TypeRegistrationEngine.test.ts +186 -0
- package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclHelper.test.ts +460 -0
- package/src/transpiler/output/codegen/helpers/types/IArgumentGeneratorCallbacks.ts +32 -0
- package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +7 -3
- package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +5 -5
- package/src/transpiler/output/codegen/types/IFunctionContextCallbacks.ts +12 -0
- package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +1 -1
- package/src/transpiler/output/codegen/utils/QualifiedNameGenerator.ts +114 -0
- package/src/transpiler/output/codegen/utils/__tests__/QualifiedNameGenerator.test.ts +183 -0
- package/src/transpiler/output/headers/BaseHeaderGenerator.ts +4 -4
- package/src/transpiler/output/headers/ExternalTypeHeaderBuilder.ts +7 -7
- package/src/transpiler/output/headers/HeaderGenerator.ts +9 -7
- package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +19 -20
- package/src/transpiler/output/headers/__tests__/BaseHeaderGenerator.test.ts +15 -18
- package/src/transpiler/output/headers/__tests__/CHeaderGenerator.test.ts +63 -64
- package/src/transpiler/output/headers/__tests__/CppHeaderGenerator.test.ts +36 -32
- package/src/transpiler/output/headers/__tests__/ExternalTypeHeaderBuilder.test.ts +26 -26
- package/src/transpiler/output/headers/__tests__/HeaderGenerator.test.ts +87 -59
- package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +57 -58
- package/src/transpiler/output/headers/adapters/HeaderSymbolAdapter.ts +222 -0
- package/src/transpiler/output/headers/adapters/__tests__/HeaderSymbolAdapter.test.ts +538 -0
- package/src/transpiler/output/headers/types/IGroupedSymbols.ts +8 -8
- package/src/transpiler/output/headers/types/IHeaderSymbol.ts +62 -0
- package/src/transpiler/state/CodeGenState.ts +109 -4
- package/src/transpiler/state/SymbolRegistry.ts +181 -0
- package/src/transpiler/{types → state}/TranspilerState.ts +1 -1
- package/src/transpiler/state/__tests__/CodeGenState.test.ts +277 -1
- package/src/transpiler/state/__tests__/SymbolRegistry.test.ts +249 -0
- package/src/transpiler/{types → state}/__tests__/TranspilerState.test.ts +1 -1
- package/src/transpiler/types/ICachedFileEntry.ts +1 -1
- package/src/transpiler/types/IConflict.ts +14 -0
- package/src/transpiler/types/ISerializedSymbol.ts +11 -0
- package/src/transpiler/types/TPrimitiveKind.ts +20 -0
- package/src/transpiler/types/TType.ts +103 -0
- package/src/transpiler/types/TVisibility.ts +6 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKind.ts +10 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKindC.ts +12 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKindCNext.ts +16 -0
- package/src/transpiler/types/symbol-kinds/TSymbolKindCpp.ts +14 -0
- package/src/transpiler/types/symbols/IBaseSymbol.ts +31 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IBitmapFieldInfo.ts +2 -2
- package/src/transpiler/types/symbols/IBitmapSymbol.ts +21 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IEnumSymbol.ts +5 -6
- package/src/transpiler/types/symbols/IFieldInfo.ts +26 -0
- package/src/transpiler/types/symbols/IFunctionSymbol.ts +30 -0
- package/src/transpiler/types/symbols/IParameterInfo.ts +26 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IRegisterMemberInfo.ts +4 -4
- package/src/transpiler/types/symbols/IRegisterSymbol.ts +18 -0
- package/src/transpiler/types/symbols/IScopeSymbol.ts +32 -0
- package/src/transpiler/{logic/symbols/types → types/symbols}/IStructFieldInfo.ts +2 -1
- package/src/transpiler/types/symbols/IStructSymbol.ts +15 -0
- package/src/transpiler/types/symbols/IVariableSymbol.ts +30 -0
- package/src/transpiler/types/symbols/SymbolGuards.ts +43 -0
- package/src/transpiler/types/symbols/TAnySymbol.ts +22 -0
- package/src/transpiler/types/symbols/TSymbol.ts +32 -0
- package/src/transpiler/types/symbols/__tests__/IBaseSymbol.test.ts +56 -0
- package/src/transpiler/types/symbols/__tests__/SymbolGuards.test.ts +57 -0
- package/src/transpiler/types/symbols/c/ICBaseSymbol.ts +28 -0
- package/src/transpiler/types/symbols/c/ICEnumMemberSymbol.ts +17 -0
- package/src/transpiler/types/symbols/c/ICEnumSymbol.ts +17 -0
- package/src/transpiler/types/symbols/c/ICFieldInfo.ts +16 -0
- package/src/transpiler/types/symbols/c/ICFunctionSymbol.ts +21 -0
- package/src/transpiler/types/symbols/c/ICParameterInfo.ts +19 -0
- package/src/transpiler/types/symbols/c/ICStructSymbol.ts +21 -0
- package/src/transpiler/types/symbols/c/ICTypedefSymbol.ts +14 -0
- package/src/transpiler/types/symbols/c/ICVariableSymbol.ts +26 -0
- package/src/transpiler/types/symbols/c/TCSymbol.ts +26 -0
- package/src/transpiler/types/symbols/cpp/ICppBaseSymbol.ts +31 -0
- package/src/transpiler/types/symbols/cpp/ICppClassSymbol.ts +15 -0
- package/src/transpiler/types/symbols/cpp/ICppEnumMemberSymbol.ts +14 -0
- package/src/transpiler/types/symbols/cpp/ICppEnumSymbol.ts +14 -0
- package/src/transpiler/types/symbols/cpp/ICppFieldInfo.ts +16 -0
- package/src/transpiler/types/symbols/cpp/ICppFunctionSymbol.ts +21 -0
- package/src/transpiler/types/symbols/cpp/ICppNamespaceSymbol.ts +11 -0
- package/src/transpiler/types/symbols/cpp/ICppParameterInfo.ts +19 -0
- package/src/transpiler/types/symbols/cpp/ICppStructSymbol.ts +16 -0
- package/src/transpiler/types/symbols/cpp/ICppTypeAliasSymbol.ts +14 -0
- package/src/transpiler/types/symbols/cpp/ICppVariableSymbol.ts +23 -0
- package/src/transpiler/types/symbols/cpp/TCppSymbol.ts +30 -0
- package/src/utils/CppNamespaceUtils.ts +3 -4
- package/src/utils/FunctionUtils.ts +92 -0
- package/src/utils/ParameterUtils.ts +55 -0
- package/src/utils/PrimitiveKindUtils.ts +33 -0
- package/src/utils/ScopeUtils.ts +105 -0
- package/src/utils/TTypeUtils.ts +159 -0
- package/src/utils/TypeResolver.ts +132 -0
- package/src/utils/__tests__/CppNamespaceUtils.test.ts +92 -99
- package/src/utils/__tests__/FunctionUtils.test.ts +284 -0
- package/src/utils/__tests__/ParameterUtils.test.ts +174 -0
- package/src/utils/__tests__/PrimitiveKindUtils.test.ts +59 -0
- package/src/utils/__tests__/ScopeUtils.test.ts +53 -0
- package/src/utils/__tests__/TTypeUtils.test.ts +245 -0
- package/src/utils/__tests__/TypeResolver.test.ts +332 -0
- package/src/utils/cache/CacheManager.ts +91 -50
- package/src/utils/cache/__tests__/CacheManager.test.ts +180 -114
- package/src/transpiler/logic/symbols/AutoConstUpdater.ts +0 -93
- package/src/transpiler/logic/symbols/CSymbolCollector.ts +0 -648
- package/src/transpiler/logic/symbols/CppSymbolCollector.ts +0 -874
- package/src/transpiler/logic/symbols/SymbolCollectorContext.ts +0 -68
- package/src/transpiler/logic/symbols/__tests__/AutoConstUpdater.test.ts +0 -418
- package/src/transpiler/logic/symbols/__tests__/CSymbolCollector.test.ts +0 -685
- package/src/transpiler/logic/symbols/__tests__/CppSymbolCollector.test.ts +0 -1146
- package/src/transpiler/logic/symbols/__tests__/SymbolCollectorContext.test.ts +0 -290
- package/src/transpiler/logic/symbols/__tests__/cTestHelpers.ts +0 -43
- package/src/transpiler/logic/symbols/__tests__/cppTestHelpers.ts +0 -40
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +0 -595
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +0 -345
- package/src/transpiler/logic/symbols/types/IBaseSymbol.ts +0 -27
- package/src/transpiler/logic/symbols/types/IBitmapSymbol.ts +0 -23
- package/src/transpiler/logic/symbols/types/ICollectorContext.ts +0 -19
- package/src/transpiler/logic/symbols/types/IConflict.ts +0 -20
- package/src/transpiler/logic/symbols/types/IFieldInfo.ts +0 -18
- package/src/transpiler/logic/symbols/types/IFunctionSymbol.ts +0 -25
- package/src/transpiler/logic/symbols/types/IParameterInfo.ts +0 -24
- package/src/transpiler/logic/symbols/types/IRegisterSymbol.ts +0 -20
- package/src/transpiler/logic/symbols/types/IScopeSymbol.ts +0 -19
- package/src/transpiler/logic/symbols/types/IStructSymbol.ts +0 -16
- package/src/transpiler/logic/symbols/types/IVariableSymbol.ts +0 -30
- package/src/transpiler/logic/symbols/types/TSymbol.ts +0 -36
- package/src/transpiler/logic/symbols/types/__tests__/SymbolGuards.test.ts +0 -244
- package/src/transpiler/logic/symbols/types/typeGuards.ts +0 -44
- package/src/utils/types/ESymbolKind.ts +0 -19
- package/src/utils/types/ISymbol.ts +0 -64
- /package/src/transpiler/{types → constants}/BITMAP_BACKING_TYPE.ts +0 -0
- /package/src/transpiler/{types → constants}/BITMAP_SIZE.ts +0 -0
- /package/src/transpiler/{output/codegen → logic/analysis}/helpers/TransitiveModificationPropagator.ts +0 -0
- /package/src/transpiler/{output/codegen → logic/analysis}/helpers/__tests__/TransitiveModificationPropagator.test.ts +0 -0
|
@@ -183,9 +183,9 @@ describe("ArrayHandlers", () => {
|
|
|
183
183
|
});
|
|
184
184
|
|
|
185
185
|
it("performs bounds checking when type info available", () => {
|
|
186
|
-
|
|
186
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
187
187
|
["matrix", { arrayDimensions: [10, 10], baseType: "i32" }],
|
|
188
|
-
])
|
|
188
|
+
]);
|
|
189
189
|
mockCheckArrayBounds.mockClear();
|
|
190
190
|
HandlerTestUtils.setupMockGenerator({
|
|
191
191
|
generateExpression: vi
|
|
@@ -242,9 +242,9 @@ describe("ArrayHandlers", () => {
|
|
|
242
242
|
arrayHandlers.find(([kind]) => kind === AssignmentKind.ARRAY_SLICE)?.[1];
|
|
243
243
|
|
|
244
244
|
it("generates memcpy for valid slice assignment", () => {
|
|
245
|
-
|
|
245
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
246
246
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
247
|
-
])
|
|
247
|
+
]);
|
|
248
248
|
HandlerTestUtils.setupMockGenerator({
|
|
249
249
|
tryEvaluateConstant: vi
|
|
250
250
|
.fn()
|
|
@@ -267,7 +267,7 @@ describe("ArrayHandlers", () => {
|
|
|
267
267
|
});
|
|
268
268
|
|
|
269
269
|
it("generates memcpy for string slice", () => {
|
|
270
|
-
|
|
270
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
271
271
|
[
|
|
272
272
|
"str",
|
|
273
273
|
{
|
|
@@ -277,7 +277,7 @@ describe("ArrayHandlers", () => {
|
|
|
277
277
|
baseType: "string",
|
|
278
278
|
},
|
|
279
279
|
],
|
|
280
|
-
])
|
|
280
|
+
]);
|
|
281
281
|
HandlerTestUtils.setupMockGenerator({
|
|
282
282
|
tryEvaluateConstant: vi
|
|
283
283
|
.fn()
|
|
@@ -299,9 +299,9 @@ describe("ArrayHandlers", () => {
|
|
|
299
299
|
});
|
|
300
300
|
|
|
301
301
|
it("throws on compound assignment", () => {
|
|
302
|
-
|
|
302
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
303
303
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
304
|
-
])
|
|
304
|
+
]);
|
|
305
305
|
HandlerTestUtils.setupMockGenerator({
|
|
306
306
|
tryEvaluateConstant: vi
|
|
307
307
|
.fn()
|
|
@@ -323,9 +323,9 @@ describe("ArrayHandlers", () => {
|
|
|
323
323
|
});
|
|
324
324
|
|
|
325
325
|
it("throws on multi-dimensional array", () => {
|
|
326
|
-
|
|
326
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
327
327
|
["matrix", { arrayDimensions: [10, 10], baseType: "u8" }],
|
|
328
|
-
])
|
|
328
|
+
]);
|
|
329
329
|
const ctx = createMockContext({
|
|
330
330
|
identifiers: ["matrix"],
|
|
331
331
|
subscripts: [
|
|
@@ -340,9 +340,9 @@ describe("ArrayHandlers", () => {
|
|
|
340
340
|
});
|
|
341
341
|
|
|
342
342
|
it("throws on non-constant offset", () => {
|
|
343
|
-
|
|
343
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
344
344
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
345
|
-
])
|
|
345
|
+
]);
|
|
346
346
|
HandlerTestUtils.setupMockGenerator({
|
|
347
347
|
tryEvaluateConstant: vi.fn().mockReturnValue(undefined),
|
|
348
348
|
});
|
|
@@ -359,9 +359,9 @@ describe("ArrayHandlers", () => {
|
|
|
359
359
|
});
|
|
360
360
|
|
|
361
361
|
it("throws on non-constant length", () => {
|
|
362
|
-
|
|
362
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
363
363
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
364
|
-
])
|
|
364
|
+
]);
|
|
365
365
|
HandlerTestUtils.setupMockGenerator({
|
|
366
366
|
tryEvaluateConstant: vi
|
|
367
367
|
.fn()
|
|
@@ -381,9 +381,9 @@ describe("ArrayHandlers", () => {
|
|
|
381
381
|
});
|
|
382
382
|
|
|
383
383
|
it("throws on out of bounds access", () => {
|
|
384
|
-
|
|
384
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
385
385
|
["buffer", { arrayDimensions: [50], baseType: "u8" }],
|
|
386
|
-
])
|
|
386
|
+
]);
|
|
387
387
|
HandlerTestUtils.setupMockGenerator({
|
|
388
388
|
tryEvaluateConstant: vi
|
|
389
389
|
.fn()
|
|
@@ -404,9 +404,9 @@ describe("ArrayHandlers", () => {
|
|
|
404
404
|
});
|
|
405
405
|
|
|
406
406
|
it("throws on negative offset", () => {
|
|
407
|
-
|
|
407
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
408
408
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
409
|
-
])
|
|
409
|
+
]);
|
|
410
410
|
HandlerTestUtils.setupMockGenerator({
|
|
411
411
|
tryEvaluateConstant: vi
|
|
412
412
|
.fn()
|
|
@@ -427,9 +427,9 @@ describe("ArrayHandlers", () => {
|
|
|
427
427
|
});
|
|
428
428
|
|
|
429
429
|
it("throws on zero length", () => {
|
|
430
|
-
|
|
430
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
431
431
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
432
|
-
])
|
|
432
|
+
]);
|
|
433
433
|
HandlerTestUtils.setupMockGenerator({
|
|
434
434
|
tryEvaluateConstant: vi
|
|
435
435
|
.fn()
|
|
@@ -450,9 +450,9 @@ describe("ArrayHandlers", () => {
|
|
|
450
450
|
});
|
|
451
451
|
|
|
452
452
|
it("throws on negative length", () => {
|
|
453
|
-
|
|
453
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
454
454
|
["buffer", { arrayDimensions: [100], baseType: "u8" }],
|
|
455
|
-
])
|
|
455
|
+
]);
|
|
456
456
|
HandlerTestUtils.setupMockGenerator({
|
|
457
457
|
tryEvaluateConstant: vi
|
|
458
458
|
.fn()
|
|
@@ -473,9 +473,7 @@ describe("ArrayHandlers", () => {
|
|
|
473
473
|
});
|
|
474
474
|
|
|
475
475
|
it("throws when buffer size cannot be determined", () => {
|
|
476
|
-
|
|
477
|
-
["unknown", { baseType: "u8" }],
|
|
478
|
-
]) as any;
|
|
476
|
+
HandlerTestUtils.setupMockTypeRegistry([["unknown", { baseType: "u8" }]]);
|
|
479
477
|
HandlerTestUtils.setupMockGenerator({
|
|
480
478
|
tryEvaluateConstant: vi
|
|
481
479
|
.fn()
|
package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts
CHANGED
|
@@ -76,9 +76,7 @@ describe("BitAccessHandlers", () => {
|
|
|
76
76
|
)?.[1];
|
|
77
77
|
|
|
78
78
|
it("generates single bit read-modify-write", () => {
|
|
79
|
-
|
|
80
|
-
["flags", { baseType: "u32" }],
|
|
81
|
-
]) as any;
|
|
79
|
+
HandlerTestUtils.setupMockTypeRegistry([["flags", { baseType: "u32" }]]);
|
|
82
80
|
HandlerTestUtils.setupMockGenerator({
|
|
83
81
|
generateExpression: vi.fn().mockReturnValue("3"),
|
|
84
82
|
});
|
|
@@ -92,9 +90,7 @@ describe("BitAccessHandlers", () => {
|
|
|
92
90
|
});
|
|
93
91
|
|
|
94
92
|
it("uses 1ULL for 64-bit types", () => {
|
|
95
|
-
|
|
96
|
-
["flags", { baseType: "u64" }],
|
|
97
|
-
]) as any;
|
|
93
|
+
HandlerTestUtils.setupMockTypeRegistry([["flags", { baseType: "u64" }]]);
|
|
98
94
|
HandlerTestUtils.setupMockGenerator({
|
|
99
95
|
generateExpression: vi.fn().mockReturnValue("32"),
|
|
100
96
|
});
|
|
@@ -108,9 +104,7 @@ describe("BitAccessHandlers", () => {
|
|
|
108
104
|
});
|
|
109
105
|
|
|
110
106
|
it("uses 1ULL for signed 64-bit types", () => {
|
|
111
|
-
|
|
112
|
-
["flags", { baseType: "i64" }],
|
|
113
|
-
]) as any;
|
|
107
|
+
HandlerTestUtils.setupMockTypeRegistry([["flags", { baseType: "i64" }]]);
|
|
114
108
|
HandlerTestUtils.setupMockGenerator({
|
|
115
109
|
generateExpression: vi.fn().mockReturnValue("bit"),
|
|
116
110
|
});
|
|
@@ -123,9 +117,7 @@ describe("BitAccessHandlers", () => {
|
|
|
123
117
|
});
|
|
124
118
|
|
|
125
119
|
it("converts true to 1", () => {
|
|
126
|
-
|
|
127
|
-
["flags", { baseType: "u8" }],
|
|
128
|
-
]) as any;
|
|
120
|
+
HandlerTestUtils.setupMockTypeRegistry([["flags", { baseType: "u8" }]]);
|
|
129
121
|
HandlerTestUtils.setupMockGenerator({
|
|
130
122
|
generateExpression: vi.fn().mockReturnValue("0"),
|
|
131
123
|
});
|
|
@@ -139,9 +131,7 @@ describe("BitAccessHandlers", () => {
|
|
|
139
131
|
});
|
|
140
132
|
|
|
141
133
|
it("converts false to 0", () => {
|
|
142
|
-
|
|
143
|
-
["flags", { baseType: "u8" }],
|
|
144
|
-
]) as any;
|
|
134
|
+
HandlerTestUtils.setupMockTypeRegistry([["flags", { baseType: "u8" }]]);
|
|
145
135
|
HandlerTestUtils.setupMockGenerator({
|
|
146
136
|
generateExpression: vi.fn().mockReturnValue("0"),
|
|
147
137
|
});
|
|
@@ -155,7 +145,7 @@ describe("BitAccessHandlers", () => {
|
|
|
155
145
|
});
|
|
156
146
|
|
|
157
147
|
it("delegates to float bit write for float types", () => {
|
|
158
|
-
|
|
148
|
+
HandlerTestUtils.setupMockTypeRegistry([["f", { baseType: "f32" }]]);
|
|
159
149
|
const generateFloatBitWrite = vi
|
|
160
150
|
.fn()
|
|
161
151
|
.mockReturnValue("float_bit_write_result");
|
|
@@ -192,9 +182,7 @@ describe("BitAccessHandlers", () => {
|
|
|
192
182
|
)?.[1];
|
|
193
183
|
|
|
194
184
|
it("generates bit range read-modify-write", () => {
|
|
195
|
-
|
|
196
|
-
["flags", { baseType: "u32" }],
|
|
197
|
-
]) as any;
|
|
185
|
+
HandlerTestUtils.setupMockTypeRegistry([["flags", { baseType: "u32" }]]);
|
|
198
186
|
HandlerTestUtils.setupMockGenerator({
|
|
199
187
|
generateExpression: vi
|
|
200
188
|
.fn()
|
|
@@ -214,9 +202,7 @@ describe("BitAccessHandlers", () => {
|
|
|
214
202
|
});
|
|
215
203
|
|
|
216
204
|
it("uses correct mask for bit range", () => {
|
|
217
|
-
|
|
218
|
-
["data", { baseType: "u16" }],
|
|
219
|
-
]) as any;
|
|
205
|
+
HandlerTestUtils.setupMockTypeRegistry([["data", { baseType: "u16" }]]);
|
|
220
206
|
HandlerTestUtils.setupMockGenerator({
|
|
221
207
|
generateExpression: vi
|
|
222
208
|
.fn()
|
|
@@ -237,9 +223,7 @@ describe("BitAccessHandlers", () => {
|
|
|
237
223
|
});
|
|
238
224
|
|
|
239
225
|
it("uses ULL suffix for 64-bit bit range mask", () => {
|
|
240
|
-
|
|
241
|
-
["flags", { baseType: "u64" }],
|
|
242
|
-
]) as any;
|
|
226
|
+
HandlerTestUtils.setupMockTypeRegistry([["flags", { baseType: "u64" }]]);
|
|
243
227
|
HandlerTestUtils.setupMockGenerator({
|
|
244
228
|
generateExpression: vi
|
|
245
229
|
.fn()
|
|
@@ -261,7 +245,7 @@ describe("BitAccessHandlers", () => {
|
|
|
261
245
|
});
|
|
262
246
|
|
|
263
247
|
it("delegates to float bit write for float types", () => {
|
|
264
|
-
|
|
248
|
+
HandlerTestUtils.setupMockTypeRegistry([["f", { baseType: "f32" }]]);
|
|
265
249
|
const generateFloatBitWrite = vi
|
|
266
250
|
.fn()
|
|
267
251
|
.mockReturnValue("float_range_write_result");
|
|
@@ -344,9 +328,9 @@ describe("BitAccessHandlers", () => {
|
|
|
344
328
|
)?.[1];
|
|
345
329
|
|
|
346
330
|
it("generates array element bit assignment for 1D array", () => {
|
|
347
|
-
|
|
331
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
348
332
|
["arr", { baseType: "u32", arrayDimensions: [10] }],
|
|
349
|
-
])
|
|
333
|
+
]);
|
|
350
334
|
HandlerTestUtils.setupMockGenerator({
|
|
351
335
|
generateExpression: vi
|
|
352
336
|
.fn()
|
|
@@ -368,9 +352,9 @@ describe("BitAccessHandlers", () => {
|
|
|
368
352
|
});
|
|
369
353
|
|
|
370
354
|
it("generates array element bit assignment for 2D array", () => {
|
|
371
|
-
|
|
355
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
372
356
|
["matrix", { baseType: "u16", arrayDimensions: [10, 10] }],
|
|
373
|
-
])
|
|
357
|
+
]);
|
|
374
358
|
HandlerTestUtils.setupMockGenerator({
|
|
375
359
|
generateExpression: vi
|
|
376
360
|
.fn()
|
|
@@ -394,9 +378,9 @@ describe("BitAccessHandlers", () => {
|
|
|
394
378
|
});
|
|
395
379
|
|
|
396
380
|
it("uses 1ULL for 64-bit array element", () => {
|
|
397
|
-
|
|
381
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
398
382
|
["arr", { baseType: "u64", arrayDimensions: [5] }],
|
|
399
|
-
])
|
|
383
|
+
]);
|
|
400
384
|
HandlerTestUtils.setupMockGenerator({
|
|
401
385
|
generateExpression: vi
|
|
402
386
|
.fn()
|
|
@@ -414,9 +398,9 @@ describe("BitAccessHandlers", () => {
|
|
|
414
398
|
});
|
|
415
399
|
|
|
416
400
|
it("throws when variable is not an array", () => {
|
|
417
|
-
|
|
401
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
418
402
|
["notArray", { baseType: "u32" }],
|
|
419
|
-
])
|
|
403
|
+
]);
|
|
420
404
|
const ctx = createMockContext({
|
|
421
405
|
identifiers: ["notArray"],
|
|
422
406
|
});
|
|
@@ -425,9 +409,9 @@ describe("BitAccessHandlers", () => {
|
|
|
425
409
|
});
|
|
426
410
|
|
|
427
411
|
it("throws on compound assignment", () => {
|
|
428
|
-
|
|
412
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
429
413
|
["arr", { baseType: "u32", arrayDimensions: [10] }],
|
|
430
|
-
])
|
|
414
|
+
]);
|
|
431
415
|
const ctx = createMockContext({
|
|
432
416
|
isCompound: true,
|
|
433
417
|
cnextOp: "+<-",
|
|
@@ -89,9 +89,9 @@ describe("BitmapHandlers", () => {
|
|
|
89
89
|
)?.[1];
|
|
90
90
|
|
|
91
91
|
it("generates single-bit read-modify-write", () => {
|
|
92
|
-
|
|
92
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
93
93
|
["flags", { bitmapTypeName: "StatusFlags", baseType: "u8" }],
|
|
94
|
-
])
|
|
94
|
+
]);
|
|
95
95
|
HandlerTestUtils.setupMockSymbols({
|
|
96
96
|
bitmapFields: new Map([
|
|
97
97
|
["StatusFlags", new Map([["Running", { offset: 0, width: 1 }]])],
|
|
@@ -107,9 +107,9 @@ describe("BitmapHandlers", () => {
|
|
|
107
107
|
});
|
|
108
108
|
|
|
109
109
|
it("generates single-bit write with correct offset", () => {
|
|
110
|
-
|
|
110
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
111
111
|
["flags", { bitmapTypeName: "StatusFlags", baseType: "u8" }],
|
|
112
|
-
])
|
|
112
|
+
]);
|
|
113
113
|
HandlerTestUtils.setupMockSymbols({
|
|
114
114
|
bitmapFields: new Map([
|
|
115
115
|
["StatusFlags", new Map([["Active", { offset: 3, width: 1 }]])],
|
|
@@ -125,9 +125,9 @@ describe("BitmapHandlers", () => {
|
|
|
125
125
|
});
|
|
126
126
|
|
|
127
127
|
it("throws on unknown bitmap field", () => {
|
|
128
|
-
|
|
128
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
129
129
|
["flags", { bitmapTypeName: "StatusFlags", baseType: "u8" }],
|
|
130
|
-
])
|
|
130
|
+
]);
|
|
131
131
|
HandlerTestUtils.setupMockSymbols({
|
|
132
132
|
bitmapFields: new Map([["StatusFlags", new Map()]]),
|
|
133
133
|
});
|
|
@@ -141,9 +141,9 @@ describe("BitmapHandlers", () => {
|
|
|
141
141
|
});
|
|
142
142
|
|
|
143
143
|
it("throws on compound assignment", () => {
|
|
144
|
-
|
|
144
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
145
145
|
["flags", { bitmapTypeName: "StatusFlags", baseType: "u8" }],
|
|
146
|
-
])
|
|
146
|
+
]);
|
|
147
147
|
HandlerTestUtils.setupMockSymbols({
|
|
148
148
|
bitmapFields: new Map([
|
|
149
149
|
["StatusFlags", new Map([["Running", { offset: 0, width: 1 }]])],
|
|
@@ -160,9 +160,9 @@ describe("BitmapHandlers", () => {
|
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
it("validates bitmap field literal", () => {
|
|
163
|
-
|
|
163
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
164
164
|
["flags", { bitmapTypeName: "StatusFlags", baseType: "u8" }],
|
|
165
|
-
])
|
|
165
|
+
]);
|
|
166
166
|
HandlerTestUtils.setupMockSymbols({
|
|
167
167
|
bitmapFields: new Map([
|
|
168
168
|
["StatusFlags", new Map([["Running", { offset: 0, width: 1 }]])],
|
|
@@ -188,9 +188,9 @@ describe("BitmapHandlers", () => {
|
|
|
188
188
|
)?.[1];
|
|
189
189
|
|
|
190
190
|
it("generates multi-bit read-modify-write with mask", () => {
|
|
191
|
-
|
|
191
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
192
192
|
["flags", { bitmapTypeName: "StatusFlags", baseType: "u8" }],
|
|
193
|
-
])
|
|
193
|
+
]);
|
|
194
194
|
HandlerTestUtils.setupMockSymbols({
|
|
195
195
|
bitmapFields: new Map([
|
|
196
196
|
["StatusFlags", new Map([["Mode", { offset: 4, width: 3 }]])],
|
|
@@ -210,9 +210,9 @@ describe("BitmapHandlers", () => {
|
|
|
210
210
|
});
|
|
211
211
|
|
|
212
212
|
it("generates correct mask for 2-bit field", () => {
|
|
213
|
-
|
|
213
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
214
214
|
["config", { bitmapTypeName: "Config", baseType: "u8" }],
|
|
215
|
-
])
|
|
215
|
+
]);
|
|
216
216
|
HandlerTestUtils.setupMockSymbols({
|
|
217
217
|
bitmapFields: new Map([
|
|
218
218
|
["Config", new Map([["Priority", { offset: 0, width: 2 }]])],
|
|
@@ -236,9 +236,9 @@ describe("BitmapHandlers", () => {
|
|
|
236
236
|
)?.[1];
|
|
237
237
|
|
|
238
238
|
it("generates array element bitmap field assignment", () => {
|
|
239
|
-
|
|
239
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
240
240
|
["flagsArray", { bitmapTypeName: "StatusFlags", baseType: "u8" }],
|
|
241
|
-
])
|
|
241
|
+
]);
|
|
242
242
|
HandlerTestUtils.setupMockGenerator({
|
|
243
243
|
generateExpression: vi.fn().mockReturnValue("i"),
|
|
244
244
|
});
|
|
@@ -266,9 +266,9 @@ describe("BitmapHandlers", () => {
|
|
|
266
266
|
)?.[1];
|
|
267
267
|
|
|
268
268
|
it("generates struct member bitmap field assignment", () => {
|
|
269
|
-
|
|
269
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
270
270
|
["device", { baseType: "Device" }],
|
|
271
|
-
])
|
|
271
|
+
]);
|
|
272
272
|
HandlerTestUtils.setupMockSymbols({
|
|
273
273
|
bitmapFields: new Map([
|
|
274
274
|
["StatusFlags", new Map([["Active", { offset: 2, width: 1 }]])],
|
|
@@ -71,9 +71,9 @@ describe("SpecialHandlers", () => {
|
|
|
71
71
|
specialHandlers.find(([kind]) => kind === AssignmentKind.ATOMIC_RMW)?.[1];
|
|
72
72
|
|
|
73
73
|
it("delegates to generateAtomicRMW for simple identifier", () => {
|
|
74
|
-
|
|
74
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
75
75
|
["counter", { baseType: "u32", isAtomic: true }],
|
|
76
|
-
])
|
|
76
|
+
]);
|
|
77
77
|
const generateAtomicRMW = vi.fn().mockReturnValue("LDREX/STREX pattern");
|
|
78
78
|
const generateAssignmentTarget = vi.fn().mockReturnValue("counter");
|
|
79
79
|
HandlerTestUtils.setupMockGenerator({
|
|
@@ -84,18 +84,23 @@ describe("SpecialHandlers", () => {
|
|
|
84
84
|
|
|
85
85
|
const result = getHandler()!(ctx);
|
|
86
86
|
|
|
87
|
-
expect(generateAtomicRMW).toHaveBeenCalledWith(
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
expect(generateAtomicRMW).toHaveBeenCalledWith(
|
|
88
|
+
"counter",
|
|
89
|
+
"+=",
|
|
90
|
+
"1",
|
|
91
|
+
expect.objectContaining({
|
|
92
|
+
baseType: "u32",
|
|
93
|
+
isAtomic: true,
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
91
96
|
expect(result).toBe("LDREX/STREX pattern");
|
|
92
97
|
});
|
|
93
98
|
|
|
94
99
|
it("handles this.member atomic variable", () => {
|
|
95
100
|
CodeGenState.currentScope = "Motor";
|
|
96
|
-
|
|
101
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
97
102
|
["Motor_count", { baseType: "u32", isAtomic: true }],
|
|
98
|
-
])
|
|
103
|
+
]);
|
|
99
104
|
const generateAtomicRMW = vi.fn().mockReturnValue("atomic result");
|
|
100
105
|
const generateAssignmentTarget = vi.fn().mockReturnValue("Motor_count");
|
|
101
106
|
HandlerTestUtils.setupMockGenerator({
|
|
@@ -110,17 +115,22 @@ describe("SpecialHandlers", () => {
|
|
|
110
115
|
|
|
111
116
|
const result = getHandler()!(ctx);
|
|
112
117
|
|
|
113
|
-
expect(generateAtomicRMW).toHaveBeenCalledWith(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
118
|
+
expect(generateAtomicRMW).toHaveBeenCalledWith(
|
|
119
|
+
"Motor_count",
|
|
120
|
+
"+=",
|
|
121
|
+
"1",
|
|
122
|
+
expect.objectContaining({
|
|
123
|
+
baseType: "u32",
|
|
124
|
+
isAtomic: true,
|
|
125
|
+
}),
|
|
126
|
+
);
|
|
117
127
|
expect(result).toBe("atomic result");
|
|
118
128
|
});
|
|
119
129
|
|
|
120
130
|
it("handles global.member atomic variable", () => {
|
|
121
|
-
|
|
131
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
122
132
|
["globalCounter", { baseType: "u32", isAtomic: true }],
|
|
123
|
-
])
|
|
133
|
+
]);
|
|
124
134
|
const generateAtomicRMW = vi.fn().mockReturnValue("global atomic result");
|
|
125
135
|
const generateAssignmentTarget = vi.fn().mockReturnValue("globalCounter");
|
|
126
136
|
HandlerTestUtils.setupMockGenerator({
|
|
@@ -139,9 +149,9 @@ describe("SpecialHandlers", () => {
|
|
|
139
149
|
});
|
|
140
150
|
|
|
141
151
|
it("handles subtract operation", () => {
|
|
142
|
-
|
|
152
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
143
153
|
["counter", { baseType: "u32", isAtomic: true }],
|
|
144
|
-
])
|
|
154
|
+
]);
|
|
145
155
|
const generateAtomicRMW = vi.fn().mockReturnValue("atomic sub");
|
|
146
156
|
const generateAssignmentTarget = vi.fn().mockReturnValue("counter");
|
|
147
157
|
HandlerTestUtils.setupMockGenerator({
|
|
@@ -171,9 +181,9 @@ describe("SpecialHandlers", () => {
|
|
|
171
181
|
)?.[1];
|
|
172
182
|
|
|
173
183
|
it("generates clamp add helper for u8", () => {
|
|
174
|
-
|
|
184
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
175
185
|
["saturated", { baseType: "u8", overflowBehavior: "clamp" }],
|
|
176
|
-
])
|
|
186
|
+
]);
|
|
177
187
|
const generateAssignmentTarget = vi.fn().mockReturnValue("saturated");
|
|
178
188
|
HandlerTestUtils.setupMockGenerator({
|
|
179
189
|
generateAssignmentTarget,
|
|
@@ -190,9 +200,9 @@ describe("SpecialHandlers", () => {
|
|
|
190
200
|
});
|
|
191
201
|
|
|
192
202
|
it("generates clamp sub helper for u16", () => {
|
|
193
|
-
|
|
203
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
194
204
|
["value", { baseType: "u16", overflowBehavior: "clamp" }],
|
|
195
|
-
])
|
|
205
|
+
]);
|
|
196
206
|
const generateAssignmentTarget = vi.fn().mockReturnValue("value");
|
|
197
207
|
HandlerTestUtils.setupMockGenerator({
|
|
198
208
|
generateAssignmentTarget,
|
|
@@ -211,9 +221,9 @@ describe("SpecialHandlers", () => {
|
|
|
211
221
|
});
|
|
212
222
|
|
|
213
223
|
it("generates clamp mul helper for u32", () => {
|
|
214
|
-
|
|
224
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
215
225
|
["result", { baseType: "u32", overflowBehavior: "clamp" }],
|
|
216
|
-
])
|
|
226
|
+
]);
|
|
217
227
|
const generateAssignmentTarget = vi.fn().mockReturnValue("result");
|
|
218
228
|
HandlerTestUtils.setupMockGenerator({
|
|
219
229
|
generateAssignmentTarget,
|
|
@@ -232,9 +242,9 @@ describe("SpecialHandlers", () => {
|
|
|
232
242
|
});
|
|
233
243
|
|
|
234
244
|
it("uses native arithmetic for float types", () => {
|
|
235
|
-
|
|
245
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
236
246
|
["f", { baseType: "f32", overflowBehavior: "clamp" }],
|
|
237
|
-
])
|
|
247
|
+
]);
|
|
238
248
|
const generateAssignmentTarget = vi.fn().mockReturnValue("f");
|
|
239
249
|
HandlerTestUtils.setupMockGenerator({
|
|
240
250
|
generateAssignmentTarget,
|
|
@@ -251,9 +261,9 @@ describe("SpecialHandlers", () => {
|
|
|
251
261
|
});
|
|
252
262
|
|
|
253
263
|
it("uses native arithmetic for f64 type", () => {
|
|
254
|
-
|
|
264
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
255
265
|
["d", { baseType: "f64", overflowBehavior: "clamp" }],
|
|
256
|
-
])
|
|
266
|
+
]);
|
|
257
267
|
const generateAssignmentTarget = vi.fn().mockReturnValue("d");
|
|
258
268
|
HandlerTestUtils.setupMockGenerator({
|
|
259
269
|
generateAssignmentTarget,
|
|
@@ -270,9 +280,9 @@ describe("SpecialHandlers", () => {
|
|
|
270
280
|
});
|
|
271
281
|
|
|
272
282
|
it("falls back to native for unsupported operators", () => {
|
|
273
|
-
|
|
283
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
274
284
|
["value", { baseType: "u32", overflowBehavior: "clamp" }],
|
|
275
|
-
])
|
|
285
|
+
]);
|
|
276
286
|
const generateAssignmentTarget = vi.fn().mockReturnValue("value");
|
|
277
287
|
HandlerTestUtils.setupMockGenerator({
|
|
278
288
|
generateAssignmentTarget,
|
|
@@ -292,9 +302,9 @@ describe("SpecialHandlers", () => {
|
|
|
292
302
|
|
|
293
303
|
it("handles this.member with clamp", () => {
|
|
294
304
|
CodeGenState.currentScope = "Motor";
|
|
295
|
-
|
|
305
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
296
306
|
["Motor_speed", { baseType: "u8", overflowBehavior: "clamp" }],
|
|
297
|
-
])
|
|
307
|
+
]);
|
|
298
308
|
const generateAssignmentTarget = vi.fn().mockReturnValue("Motor_speed");
|
|
299
309
|
HandlerTestUtils.setupMockGenerator({
|
|
300
310
|
generateAssignmentTarget,
|
|
@@ -313,9 +323,9 @@ describe("SpecialHandlers", () => {
|
|
|
313
323
|
});
|
|
314
324
|
|
|
315
325
|
it("handles global.member with clamp", () => {
|
|
316
|
-
|
|
326
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
317
327
|
["globalValue", { baseType: "i16", overflowBehavior: "clamp" }],
|
|
318
|
-
])
|
|
328
|
+
]);
|
|
319
329
|
const generateAssignmentTarget = vi.fn().mockReturnValue("globalValue");
|
|
320
330
|
HandlerTestUtils.setupMockGenerator({
|
|
321
331
|
generateAssignmentTarget,
|
|
@@ -141,15 +141,16 @@ function createTypeInfo(overrides: Partial<TTypeInfo> = {}): TTypeInfo {
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
/**
|
|
144
|
-
* Set up CodeGenState
|
|
144
|
+
* Set up CodeGenState type registry with typed entries.
|
|
145
145
|
* Entries only need to specify the fields relevant to the test.
|
|
146
|
+
* Uses setVariableTypeInfo to properly populate the registry.
|
|
146
147
|
*/
|
|
147
148
|
function setupMockTypeRegistry(
|
|
148
149
|
entries: Array<[string, Partial<TTypeInfo>]>,
|
|
149
150
|
): void {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
for (const [name, partial] of entries) {
|
|
152
|
+
CodeGenState.setVariableTypeInfo(name, createTypeInfo(partial));
|
|
153
|
+
}
|
|
153
154
|
}
|
|
154
155
|
|
|
155
156
|
export default class HandlerTestUtils {
|