semantifold 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -12
- package/build/index.js +2 -2
- package/build/src/acceptance.d.ts +10 -0
- package/build/src/acceptance.d.ts.map +1 -1
- package/build/src/acceptance.js +24 -5
- package/build/src/backends/c-runtime.d.ts +3 -0
- package/build/src/backends/c-runtime.d.ts.map +1 -0
- package/build/src/backends/c-runtime.js +151 -0
- package/build/src/backends/c-validation.d.ts +12 -0
- package/build/src/backends/c-validation.d.ts.map +1 -0
- package/build/src/backends/c-validation.js +85 -0
- package/build/src/backends/c.d.ts +31 -0
- package/build/src/backends/c.d.ts.map +1 -0
- package/build/src/backends/c.js +308 -0
- package/build/src/backends/cpp-runtime.d.ts +3 -0
- package/build/src/backends/cpp-runtime.d.ts.map +1 -0
- package/build/src/backends/cpp-runtime.js +99 -0
- package/build/src/backends/cpp-validation.d.ts +9 -0
- package/build/src/backends/cpp-validation.d.ts.map +1 -0
- package/build/src/backends/cpp-validation.js +74 -0
- package/build/src/backends/cpp.d.ts +16 -0
- package/build/src/backends/cpp.d.ts.map +1 -0
- package/build/src/backends/cpp.js +285 -0
- package/build/src/backends/csharp.d.ts +20 -0
- package/build/src/backends/csharp.d.ts.map +1 -0
- package/build/src/backends/csharp.js +259 -0
- package/build/src/backends/go.d.ts +20 -0
- package/build/src/backends/go.d.ts.map +1 -0
- package/build/src/backends/go.js +374 -0
- package/build/src/backends/identifiers.d.ts +12 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +71 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +9 -1
- package/build/src/backends/native-validation.d.ts +9 -0
- package/build/src/backends/native-validation.d.ts.map +1 -0
- package/build/src/backends/native-validation.js +59 -0
- package/build/src/backends/ordered-expressions.d.ts +74 -0
- package/build/src/backends/ordered-expressions.d.ts.map +1 -0
- package/build/src/backends/ordered-expressions.js +159 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +7 -2
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +59 -14
- package/build/src/frontends/c-parser.d.ts +20 -0
- package/build/src/frontends/c-parser.d.ts.map +1 -0
- package/build/src/frontends/c-parser.js +14 -0
- package/build/src/frontends/c.d.ts +220 -0
- package/build/src/frontends/c.d.ts.map +1 -0
- package/build/src/frontends/c.js +750 -0
- package/build/src/frontends/cpp-parser.d.ts +11 -0
- package/build/src/frontends/cpp-parser.d.ts.map +1 -0
- package/build/src/frontends/cpp-parser.js +15 -0
- package/build/src/frontends/cpp.d.ts +227 -0
- package/build/src/frontends/cpp.d.ts.map +1 -0
- package/build/src/frontends/cpp.js +784 -0
- package/build/src/frontends/csharp.d.ts +14 -0
- package/build/src/frontends/csharp.d.ts.map +1 -0
- package/build/src/frontends/csharp.js +708 -0
- package/build/src/frontends/go.d.ts +15 -0
- package/build/src/frontends/go.d.ts.map +1 -0
- package/build/src/frontends/go.js +712 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +16 -1
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +51 -2
- package/build/src/mapping.js +2 -2
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +4 -4
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +3 -3
- package/build/src/subprocess.d.ts +10 -1
- package/build/src/subprocess.d.ts.map +1 -1
- package/build/src/subprocess.js +29 -3
- package/build/src/toolchains.d.ts +24 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +6 -2
- package/docs/architecture.md +20 -6
- package/docs/c.md +60 -0
- package/docs/cpp.md +61 -0
- package/docs/goals.md +4 -2
- package/docs/language-support.md +27 -8
- package/docs/parser-qualification.md +153 -4
- package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
- package/docs/source-maps.md +11 -5
- package/docs/standard-library-portability.md +190 -0
- package/docs/testing.md +113 -4
- package/index.js +1 -1
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +95 -0
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +14 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +7250 -0
- package/node_modules/node-addon-api/napi.h +3463 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +481 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
- package/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/tree-sitter/binding.gyp +88 -0
- package/node_modules/tree-sitter/index.js +950 -0
- package/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/tree-sitter/src/language.cc +105 -0
- package/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/tree-sitter/src/parser.cc +332 -0
- package/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/tree-sitter/src/query.cc +425 -0
- package/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/package.json +21 -5
- package/src/acceptance.js +25 -4
- package/src/backends/c-runtime.js +151 -0
- package/src/backends/c-validation.js +83 -0
- package/src/backends/c.js +308 -0
- package/src/backends/cpp-runtime.js +99 -0
- package/src/backends/cpp-validation.js +70 -0
- package/src/backends/cpp.js +285 -0
- package/src/backends/csharp.js +270 -0
- package/src/backends/go.js +383 -0
- package/src/backends/identifiers.js +72 -1
- package/src/backends/index.js +7 -0
- package/src/backends/native-validation.js +64 -0
- package/src/backends/ordered-expressions.js +161 -0
- package/src/backends/scalars.js +7 -1
- package/src/backends/shared.js +56 -12
- package/src/frontends/c-parser.js +17 -0
- package/src/frontends/c.js +780 -0
- package/src/frontends/cpp-parser.js +18 -0
- package/src/frontends/cpp.js +816 -0
- package/src/frontends/csharp.js +759 -0
- package/src/frontends/go.js +770 -0
- package/src/frontends/scalars.js +15 -0
- package/src/language-registry.js +52 -1
- package/src/mapping.js +1 -1
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +2 -2
- package/src/subprocess.js +31 -2
- package/src/toolchains.js +5 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { unsupportedCapability } from "../diagnostic.js";
|
|
3
|
+
import { finalizeMapping, toSourceMapV3 } from "../mapping.js";
|
|
4
|
+
import { statementSignature, planNativeModule } from "./ordered-expressions.js";
|
|
5
|
+
import { cRuntimeHeader } from "./c-runtime.js";
|
|
6
|
+
import { maximumCSourceLength, validateCMemory } from "./c-validation.js";
|
|
7
|
+
import { validateNativeGraph } from "./native-validation.js";
|
|
8
|
+
import { emitScalarType } from "./scalars.js";
|
|
9
|
+
import { validateBackendModule } from "./shared.js";
|
|
10
|
+
import { SourceWriter } from "./writer.js";
|
|
11
|
+
/** @typedef {import("../semantic/types.js").SemanticModule} SemanticModule */
|
|
12
|
+
/** @typedef {import("../semantic/types.js").SemanticNode} SemanticNode */
|
|
13
|
+
/** @typedef {import("../semantic/types.js").Statement} Statement */
|
|
14
|
+
/** @typedef {import("../semantic/types.js").Block} Block */
|
|
15
|
+
/** @typedef {import("./ordered-expressions.js").PlannedValue} PlannedValue */
|
|
16
|
+
/** @typedef {import("./ordered-expressions.js").PlannedStep} PlannedStep */
|
|
17
|
+
/** @typedef {{id: string, steps: PlannedStep[], value: PlannedValue}} StatementPlan */
|
|
18
|
+
const binaryTokens = new Map([
|
|
19
|
+
["IntegerAdd", "semantifold_integer_add"], ["IntegerSubtract", "semantifold_integer_subtract"],
|
|
20
|
+
["IntegerMultiply", "semantifold_integer_multiply"], ["StringConcat", "semantifold_string_concat"],
|
|
21
|
+
["StringEqual", "semantifold_string_equal"], ["StringNotEqual", "semantifold_string_not_equal"],
|
|
22
|
+
["IntegerEqual", "=="], ["IntegerNotEqual", "!="], ["BooleanEqual", "=="], ["BooleanNotEqual", "!="],
|
|
23
|
+
["IntegerLessThan", "<"], ["IntegerLessThanOrEqual", "<="],
|
|
24
|
+
["IntegerGreaterThan", ">"], ["IntegerGreaterThanOrEqual", ">="]
|
|
25
|
+
]);
|
|
26
|
+
/**
|
|
27
|
+
* Produces a fully validated, deterministic C17 translation unit and owned support header.
|
|
28
|
+
* @param {{filename?: string, mapDirective?: unknown, module: SemanticModule, sourceMapFilename?: unknown, sources?: {filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]}} input - Backend request.
|
|
29
|
+
* @returns {{artifacts: import("../semantic/types.js").GeneratedSetArtifact[], target: string}} Complete candidate.
|
|
30
|
+
*/
|
|
31
|
+
export function generateCProgram({ filename, mapDirective, module, sourceMapFilename, sources }) {
|
|
32
|
+
validateNativeGraph(module);
|
|
33
|
+
validateBackendModule(module, "c");
|
|
34
|
+
validateCMemory(module);
|
|
35
|
+
if (filename !== undefined && filename != "program.c")
|
|
36
|
+
unsupportedCapability("c", "artifact filename other than program.c", module.location);
|
|
37
|
+
if (mapDirective !== undefined || sourceMapFilename !== undefined)
|
|
38
|
+
unsupportedCapability("c", "source-map filename or directive option", module.location);
|
|
39
|
+
const plans = planNativeModule(module);
|
|
40
|
+
new CEmitter(undefined, plans, module.location).program(module);
|
|
41
|
+
const writer = new SourceWriter({ filename: "program.c", language: "c", module, sources });
|
|
42
|
+
const emitter = new CEmitter(writer, plans, module.location);
|
|
43
|
+
emitter.program(module);
|
|
44
|
+
const mapping = finalizeMapping(writer.finish());
|
|
45
|
+
const root = mapping.nodes.find(({ path }) => path == "");
|
|
46
|
+
if (!root)
|
|
47
|
+
throw new Error("Validated C module omitted its root provenance.");
|
|
48
|
+
const relatedOrigins = root.origin.kind == "source"
|
|
49
|
+
? [{ location: root.origin.location, nodeId: root.id, role: "module", sourceId: root.origin.sourceId }]
|
|
50
|
+
: (root.origin.kind == "derived" ? root.origin.origins : root.origin.relatedOrigins).map((origin) => ({ ...origin, nodeId: origin.nodeId ?? root.id, role: origin.role ?? "module" }));
|
|
51
|
+
return { target: "c", artifacts: [{
|
|
52
|
+
content: mapping.generated.content, contentKind: "text", mediaType: "text/x-c", ownership: "generated", path: "program.c",
|
|
53
|
+
provenance: { kind: "text", mapping, sourceMap: toSourceMapV3(mapping) }, role: "entry"
|
|
54
|
+
}, {
|
|
55
|
+
content: cRuntimeHeader, contentKind: "text", mediaType: "text/x-c", ownership: "generated", path: "semantifold_runtime.h",
|
|
56
|
+
provenance: { kind: "synthetic", reason: "Canonical C17 scalar helpers and module-lifetime immutable UTF-8 arena.", relatedOrigins }, role: "support"
|
|
57
|
+
}] };
|
|
58
|
+
}
|
|
59
|
+
/** Writes only target syntax from validated semantic occurrences and private plans. */
|
|
60
|
+
class CEmitter {
|
|
61
|
+
/**
|
|
62
|
+
* Binds the writer and complete plan.
|
|
63
|
+
* @param {SourceWriter | undefined} writer - Provenance writer; omitted for exact size preflight.
|
|
64
|
+
* @param {Map<string, StatementPlan>} plans - Validated occurrence plans.
|
|
65
|
+
* @param {import("../semantic/types.js").SourceLocation} location - Root diagnostic location.
|
|
66
|
+
*/
|
|
67
|
+
constructor(writer, plans, location) {
|
|
68
|
+
this.writer = writer;
|
|
69
|
+
this.plans = plans;
|
|
70
|
+
this.location = location;
|
|
71
|
+
this.length = 0;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Writes generated scaffold with a related semantic origin.
|
|
75
|
+
* @param {string} text - C syntax.
|
|
76
|
+
* @param {SemanticNode} node - Related node.
|
|
77
|
+
* @param {string} path - Occurrence path.
|
|
78
|
+
* @returns {void}
|
|
79
|
+
*/
|
|
80
|
+
synthetic(text, node, path) {
|
|
81
|
+
this.checkSize(text, node);
|
|
82
|
+
this.writer?.synthetic(text, "C17 ordered-expression and lifetime scaffold", [node], [path]);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Writes an original semantic token or anchor.
|
|
86
|
+
* @param {string} text - Target token.
|
|
87
|
+
* @param {SemanticNode} node - Original node.
|
|
88
|
+
* @param {string} path - Occurrence path.
|
|
89
|
+
* @param {string} [role] - Parser token role.
|
|
90
|
+
* @returns {void}
|
|
91
|
+
*/
|
|
92
|
+
mapped(text, node, path, role) {
|
|
93
|
+
this.checkSize(text, node);
|
|
94
|
+
this.writer?.mapped(text, { mappingKind: role ? "exact" : "anchor", node, path, ...(role ? { role } : {}) });
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Bounds private emission before any artifact can escape the parser's proven input profile.
|
|
98
|
+
* @param {string} text - Next exact output chunk.
|
|
99
|
+
* @param {SemanticNode} node - Related semantic occurrence.
|
|
100
|
+
* @returns {void}
|
|
101
|
+
*/
|
|
102
|
+
checkSize(text, node) {
|
|
103
|
+
this.length += text.length;
|
|
104
|
+
if (this.length > maximumCSourceLength)
|
|
105
|
+
unsupportedCapability("c", "generated program exceeds the frozen C parser's 32767 UTF-16 input limit", "location" in node ? node.location : this.location);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Emits canonical prototypes, definitions, and the cleanup-owning main.
|
|
109
|
+
* @param {SemanticModule} module - Semantic module.
|
|
110
|
+
* @returns {void}
|
|
111
|
+
*/
|
|
112
|
+
program(module) {
|
|
113
|
+
this.synthetic('/* semantifold:program:c:v1 */\n#include "semantifold_runtime.h"\n\n', module, "");
|
|
114
|
+
module.functions.forEach((declaration, index) => {
|
|
115
|
+
const parameters = declaration.parameters.map((parameter) => `${emitScalarType("c", parameter.type)} ${parameter.name}`).join(", ");
|
|
116
|
+
this.synthetic(`static ${emitScalarType("c", declaration.returnType)} ${declaration.name}(${parameters});\n`, declaration, `/functions/${index}`);
|
|
117
|
+
});
|
|
118
|
+
module.functions.forEach((declaration, index) => {
|
|
119
|
+
const path = `/functions/${index}`;
|
|
120
|
+
this.synthetic("\nstatic ", declaration, path);
|
|
121
|
+
this.mapped(emitScalarType("c", declaration.returnType), declaration.returnType, `${path}/returnType`, "type");
|
|
122
|
+
this.synthetic(" ", declaration, path);
|
|
123
|
+
this.mapped(declaration.name, declaration, path, "name");
|
|
124
|
+
this.synthetic("(", declaration, path);
|
|
125
|
+
declaration.parameters.forEach((parameter, parameterIndex) => {
|
|
126
|
+
const parameterPath = `${path}/parameters/${parameterIndex}`;
|
|
127
|
+
if (parameterIndex)
|
|
128
|
+
this.synthetic(", ", parameter, parameterPath);
|
|
129
|
+
this.mapped(emitScalarType("c", parameter.type), parameter.type, `${parameterPath}/type`, "type");
|
|
130
|
+
this.synthetic(" ", parameter, parameterPath);
|
|
131
|
+
this.mapped(parameter.name, parameter, parameterPath, "name");
|
|
132
|
+
});
|
|
133
|
+
this.synthetic(") {\n", declaration, path);
|
|
134
|
+
declaration.parameters.forEach((parameter, parameterIndex) => this.synthetic(` (void)${parameter.name};\n`, parameter, `${path}/parameters/${parameterIndex}`));
|
|
135
|
+
this.block(declaration.body, `${path}/body`, " ");
|
|
136
|
+
this.synthetic("}\n", declaration, path);
|
|
137
|
+
});
|
|
138
|
+
this.synthetic("\nint main(void) {\n", module.entryPoint, "/entryPoint");
|
|
139
|
+
module.functions.forEach((declaration, index) => this.synthetic(` (void)${declaration.name};\n`, declaration, `/functions/${index}`));
|
|
140
|
+
this.block(module.entryPoint.body, "/entryPoint/body", " ");
|
|
141
|
+
this.synthetic(" semantifold_cleanup();\n return 0;\n}\n", module.entryPoint, "/entryPoint");
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Emits statements in semantic source order.
|
|
145
|
+
* @param {Block} block - Semantic block.
|
|
146
|
+
* @param {string} path - Occurrence path.
|
|
147
|
+
* @param {string} indent - Current indentation.
|
|
148
|
+
* @returns {void}
|
|
149
|
+
*/
|
|
150
|
+
block(block, path, indent) {
|
|
151
|
+
block.statements.forEach((statement, index) => this.statement(statement, `${path}/statements/${index}`, indent));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Emits one paired region with a pure final consumer.
|
|
155
|
+
* @param {Statement} statement - Original statement.
|
|
156
|
+
* @param {string} path - Occurrence path.
|
|
157
|
+
* @param {string} indent - Current indentation.
|
|
158
|
+
* @returns {void}
|
|
159
|
+
*/
|
|
160
|
+
statement(statement, path, indent) {
|
|
161
|
+
const plan = this.plans.get(path);
|
|
162
|
+
if (!plan)
|
|
163
|
+
throw new Error("Missing validated C statement plan.");
|
|
164
|
+
const marker = `semantifold:ordered-expression:c:v1`;
|
|
165
|
+
const signature = statementSignature(statement);
|
|
166
|
+
this.synthetic(`${indent}/* ${marker} begin ${plan.id} ${signature} */\n`, statement, path);
|
|
167
|
+
this.steps(plan.steps, indent);
|
|
168
|
+
this.synthetic(indent, statement, path);
|
|
169
|
+
if (statement.kind == "LocalDeclaration") {
|
|
170
|
+
if (!statement.mutable)
|
|
171
|
+
this.synthetic("const ", statement, path);
|
|
172
|
+
this.mapped(emitScalarType("c", statement.type), statement.type, `${path}/type`, "type");
|
|
173
|
+
this.synthetic(" ", statement, path);
|
|
174
|
+
this.mapped(statement.name, statement, path, "name");
|
|
175
|
+
this.synthetic(" ", statement, path);
|
|
176
|
+
this.mapped("=", statement, path, "operator");
|
|
177
|
+
this.synthetic(" ", statement, path);
|
|
178
|
+
}
|
|
179
|
+
else if (statement.kind == "AssignmentStatement") {
|
|
180
|
+
this.mapped(statement.target.name, statement.target, `${path}/target`, "name");
|
|
181
|
+
this.synthetic(" ", statement, path);
|
|
182
|
+
this.mapped("=", statement, path, "operator");
|
|
183
|
+
this.synthetic(" ", statement, path);
|
|
184
|
+
}
|
|
185
|
+
else if (statement.kind == "ReturnStatement")
|
|
186
|
+
this.mapped("return ", statement, path);
|
|
187
|
+
else if (statement.kind == "PrintStatement")
|
|
188
|
+
this.mapped(`semantifold_print_${plan.value.type}(`, statement, path);
|
|
189
|
+
else
|
|
190
|
+
this.mapped("if (", statement, path);
|
|
191
|
+
this.value(plan.value);
|
|
192
|
+
if (statement.kind == "IfStatement") {
|
|
193
|
+
this.synthetic(") {\n", statement, path);
|
|
194
|
+
this.block(statement.consequent, `${path}/consequent`, `${indent} `);
|
|
195
|
+
this.synthetic(`${indent}}`, statement, path);
|
|
196
|
+
if (statement.alternate) {
|
|
197
|
+
this.mapped(" else ", statement, path);
|
|
198
|
+
this.synthetic("{\n", statement, path);
|
|
199
|
+
this.block(statement.alternate, `${path}/alternate`, `${indent} `);
|
|
200
|
+
this.synthetic(`${indent}}`, statement, path);
|
|
201
|
+
}
|
|
202
|
+
this.synthetic("\n", statement, path);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this.synthetic(`${statement.kind == "PrintStatement" ? ")" : ""};\n`, statement, path);
|
|
206
|
+
if (statement.kind == "LocalDeclaration")
|
|
207
|
+
this.synthetic(`${indent}(void)${statement.name};\n`, statement, path);
|
|
208
|
+
}
|
|
209
|
+
this.synthetic(`${indent}/* ${marker} end ${plan.id} ${signature} */\n`, statement, path);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Emits each eager step or conditional RHS at its planned location.
|
|
213
|
+
* @param {PlannedStep[]} steps - Ordered private steps.
|
|
214
|
+
* @param {string} indent - Current indentation.
|
|
215
|
+
* @returns {void}
|
|
216
|
+
*/
|
|
217
|
+
steps(steps, indent) {
|
|
218
|
+
for (const step of steps) {
|
|
219
|
+
const { result, operands, rightSteps } = step;
|
|
220
|
+
const { expression, path, name } = result;
|
|
221
|
+
const type = emitScalarType("c", { kind: "TypeReference", name: result.type });
|
|
222
|
+
this.synthetic(`${indent}${type} ${name} = `, expression, path);
|
|
223
|
+
if (rightSteps) {
|
|
224
|
+
this.value(operands[0]);
|
|
225
|
+
this.synthetic(`;\n${indent}if (`, expression, path);
|
|
226
|
+
if (expression.kind != "BinaryExpression")
|
|
227
|
+
throw new Error("Invalid conditional C plan.");
|
|
228
|
+
this.synthetic(`${expression.operation == "BooleanOr" ? "!" : ""}${name}) {\n`, expression, path);
|
|
229
|
+
this.steps(rightSteps, `${indent} `);
|
|
230
|
+
this.synthetic(`${indent} ${name} = (${name} `, expression, path);
|
|
231
|
+
this.mapped(expression.operation == "BooleanOr" ? "||" : "&&", expression, path, "operator");
|
|
232
|
+
this.synthetic(" ", expression, path);
|
|
233
|
+
this.value(operands[1]);
|
|
234
|
+
this.synthetic(`);\n${indent}}\n`, expression, path);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
this.operation(step);
|
|
238
|
+
this.synthetic(";\n", expression, path);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Emits one nontrivial operation with pure operands.
|
|
244
|
+
* @param {PlannedStep} step - Eager step.
|
|
245
|
+
* @returns {void}
|
|
246
|
+
*/
|
|
247
|
+
operation({ result: { expression, path }, operands }) {
|
|
248
|
+
if (expression.kind == "CallExpression") {
|
|
249
|
+
this.mapped(expression.callee, expression, path, "callee");
|
|
250
|
+
this.synthetic("(", expression, path);
|
|
251
|
+
operands.forEach((operand, index) => {
|
|
252
|
+
if (index)
|
|
253
|
+
this.synthetic(", ", expression, path);
|
|
254
|
+
this.value(operand);
|
|
255
|
+
});
|
|
256
|
+
this.synthetic(")", expression, path);
|
|
257
|
+
}
|
|
258
|
+
else if (expression.kind == "UnaryExpression") {
|
|
259
|
+
this.mapped(expression.operation == "IntegerNegate" ? "semantifold_integer_negate" : "!", expression, path, "operator");
|
|
260
|
+
this.synthetic("(", expression, path);
|
|
261
|
+
this.value(operands[0]);
|
|
262
|
+
this.synthetic(")", expression, path);
|
|
263
|
+
}
|
|
264
|
+
else if (expression.kind == "BinaryExpression") {
|
|
265
|
+
const token = binaryTokens.get(expression.operation);
|
|
266
|
+
if (!token)
|
|
267
|
+
throw new Error("Unsupported operation passed C planning.");
|
|
268
|
+
const helper = token.startsWith("semantifold_");
|
|
269
|
+
if (helper)
|
|
270
|
+
this.mapped(token, expression, path, "operator");
|
|
271
|
+
this.synthetic("(", expression, path);
|
|
272
|
+
this.value(operands[0]);
|
|
273
|
+
if (helper)
|
|
274
|
+
this.synthetic(", ", expression, path);
|
|
275
|
+
else {
|
|
276
|
+
this.synthetic(" ", expression, path);
|
|
277
|
+
this.mapped(token, expression, path, "operator");
|
|
278
|
+
this.synthetic(" ", expression, path);
|
|
279
|
+
}
|
|
280
|
+
this.value(operands[1]);
|
|
281
|
+
this.synthetic(")", expression, path);
|
|
282
|
+
}
|
|
283
|
+
else
|
|
284
|
+
throw new Error("Pure expression was scheduled as a C operation.");
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Emits a pure operand with original token provenance or a synthetic temporary use.
|
|
288
|
+
* @param {PlannedValue} value - Planned pure operand.
|
|
289
|
+
* @returns {void}
|
|
290
|
+
*/
|
|
291
|
+
value({ expression, path, name }) {
|
|
292
|
+
if (name)
|
|
293
|
+
return this.synthetic(name, expression, path);
|
|
294
|
+
if (expression.kind == "IdentifierExpression")
|
|
295
|
+
return this.mapped(expression.name, expression, path, "name");
|
|
296
|
+
if (expression.kind == "BooleanLiteral")
|
|
297
|
+
return this.mapped(String(expression.value), expression, path, "literal");
|
|
298
|
+
if (expression.kind == "IntegerLiteral")
|
|
299
|
+
return this.mapped(`INT64_C(${expression.value})`, expression, path, "literal");
|
|
300
|
+
if (expression.kind == "StringLiteral") {
|
|
301
|
+
const bytes = new TextEncoder().encode(expression.value);
|
|
302
|
+
const literal = Array.from(bytes, (byte) => `\\${byte.toString(8).padStart(3, "0")}`).join("");
|
|
303
|
+
return this.mapped(`SEMANTIFOLD_STRING("${literal}")`, expression, path, "literal");
|
|
304
|
+
}
|
|
305
|
+
throw new Error("Unsequenced expression passed C planning.");
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kcy9jLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUM3RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUE7QUFDN0MsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3ZFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQzFELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFeEMsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUMxRSxvRUFBb0U7QUFDcEUsNERBQTREO0FBQzVELDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsdUZBQXVGO0FBRXZGLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNCLENBQUMsWUFBWSxFQUFFLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSw4QkFBOEIsQ0FBQztJQUM5RixDQUFDLGlCQUFpQixFQUFFLDhCQUE4QixDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsMkJBQTJCLENBQUM7SUFDbEcsQ0FBQyxhQUFhLEVBQUUsMEJBQTBCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLDhCQUE4QixDQUFDO0lBQy9GLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFF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QUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDeEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFOUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixPQUFPLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQ3JGLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFDOUQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7dW5zdXBwb3J0ZWRDYXBhYmlsaXR5fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2ZpbmFsaXplTWFwcGluZywgdG9Tb3VyY2VNYXBWM30gZnJvbSBcIi4uL21hcHBpbmcuanNcIlxuaW1wb3J0IHtzdGF0ZW1lbnRTaWduYXR1cmUsIHBsYW5OYXRpdmVNb2R1bGV9IGZyb20gXCIuL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIlxuaW1wb3J0IHtjUnVudGltZUhlYWRlcn0gZnJvbSBcIi4vYy1ydW50aW1lLmpzXCJcbmltcG9ydCB7bWF4aW11bUNTb3VyY2VMZW5ndGgsIHZhbGlkYXRlQ01lbW9yeX0gZnJvbSBcIi4vYy12YWxpZGF0aW9uLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVOYXRpdmVHcmFwaH0gZnJvbSBcIi4vbmF0aXZlLXZhbGlkYXRpb24uanNcIlxuaW1wb3J0IHtlbWl0U2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlQmFja2VuZE1vZHVsZX0gZnJvbSBcIi4vc2hhcmVkLmpzXCJcbmltcG9ydCB7U291cmNlV3JpdGVyfSBmcm9tIFwiLi93cml0ZXIuanNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBTZW1hbnRpY01vZHVsZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CbG9ja30gQmxvY2sgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9vcmRlcmVkLWV4cHJlc3Npb25zLmpzXCIpLlBsYW5uZWRWYWx1ZX0gUGxhbm5lZFZhbHVlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vb3JkZXJlZC1leHByZXNzaW9ucy5qc1wiKS5QbGFubmVkU3RlcH0gUGxhbm5lZFN0ZXAgKi9cbi8qKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcsIHN0ZXBzOiBQbGFubmVkU3RlcFtdLCB2YWx1ZTogUGxhbm5lZFZhbHVlfX0gU3RhdGVtZW50UGxhbiAqL1xuXG5jb25zdCBiaW5hcnlUb2tlbnMgPSBuZXcgTWFwKFtcbiAgW1wiSW50ZWdlckFkZFwiLCBcInNlbWFudGlmb2xkX2ludGVnZXJfYWRkXCJdLCBbXCJJbnRlZ2VyU3VidHJhY3RcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX3N1YnRyYWN0XCJdLFxuICBbXCJJbnRlZ2VyTXVsdGlwbHlcIiwgXCJzZW1hbnRpZm9sZF9pbnRlZ2VyX211bHRpcGx5XCJdLCBbXCJTdHJpbmdDb25jYXRcIiwgXCJzZW1hbnRpZm9sZF9zdHJpbmdfY29uY2F0XCJdLFxuICBbXCJTdHJpbmdFcXVhbFwiLCBcInNlbWFudGlmb2xkX3N0cmluZ19lcXVhbFwiXSwgW1wiU3RyaW5nTm90RXF1YWxcIiwgXCJzZW1hbnRpZm9sZF9zdHJpbmdfbm90X2VxdWFsXCJdLFxuICBbXCJJbnRlZ2VyRXF1YWxcIiwgXCI9PVwiXSwgW1wiSW50ZWdlck5vdEVxdWFsXCIsIFwiIT1cIl0sIFtcIkJvb2xlYW5FcXVhbFwiLCBcIj09XCJdLCBbXCJCb29sZWFuTm90RXF1YWxcIiwgXCIhPVwiXSxcbiAgW1wiSW50ZWdlckxlc3NUaGFuXCIsIFwiPFwiXSwgW1wiSW50ZWdlckxlc3NUaGFuT3JFcXVhbFwiLCBcIjw9XCJdLFxuICBbXCJJbnRlZ2VyR3JlYXRlclRoYW5cIiwgXCI+XCJdLCBbXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCIsIFwiPj1cIl1cbl0pXG5cbi8qKlxuICogUHJvZHVjZXMgYSBmdWxseSB2YWxpZGF0ZWQsIGRldGVybWluaXN0aWMgQzE3IHRyYW5zbGF0aW9uIHVuaXQgYW5kIG93bmVkIHN1cHBvcnQgaGVhZGVyLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU/OiBzdHJpbmcsIG1hcERpcmVjdGl2ZT86IHVua25vd24sIG1vZHVsZTogU2VtYW50aWNNb2R1bGUsIHNvdXJjZU1hcEZpbGVuYW1lPzogdW5rbm93biwgc291cmNlcz86IHtmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX19IGlucHV0IC0gQmFja2VuZCByZXF1ZXN0LlxuICogQHJldHVybnMge3thcnRpZmFjdHM6IGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkdlbmVyYXRlZFNldEFydGlmYWN0W10sIHRhcmdldDogc3RyaW5nfX0gQ29tcGxldGUgY2FuZGlkYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDUHJvZ3JhbSh7ZmlsZW5hbWUsIG1hcERpcmVjdGl2ZSwgbW9kdWxlLCBzb3VyY2VNYXBGaWxlbmFtZSwgc291cmNlc30pIHtcbiAgdmFsaWRhdGVOYXRpdmVHcmFwaChtb2R1bGUpXG4gIHZhbGlkYXRlQmFja2VuZE1vZHVsZShtb2R1bGUsIFwiY1wiKVxuICB2YWxpZGF0ZUNNZW1vcnkobW9kdWxlKVxuICBpZiAoZmlsZW5hbWUgIT09IHVuZGVmaW5lZCAmJiBmaWxlbmFtZSAhPSBcInByb2dyYW0uY1wiKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJjXCIsIFwiYXJ0aWZhY3QgZmlsZW5hbWUgb3RoZXIgdGhhbiBwcm9ncmFtLmNcIiwgbW9kdWxlLmxvY2F0aW9uKVxuICBpZiAobWFwRGlyZWN0aXZlICE9PSB1bmRlZmluZWQgfHwgc291cmNlTWFwRmlsZW5hbWUgIT09IHVuZGVmaW5lZCkgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiY1wiLCBcInNvdXJjZS1tYXAgZmlsZW5hbWUgb3IgZGlyZWN0aXZlIG9wdGlvblwiLCBtb2R1bGUubG9jYXRpb24pXG4gIGNvbnN0IHBsYW5zID0gcGxhbk5hdGl2ZU1vZHVsZShtb2R1bGUpXG5cbiAgbmV3IENFbWl0dGVyKHVuZGVmaW5lZCwgcGxhbnMsIG1vZHVsZS5sb2NhdGlvbikucHJvZ3JhbShtb2R1bGUpXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoe2ZpbGVuYW1lOiBcInByb2dyYW0uY1wiLCBsYW5ndWFnZTogXCJjXCIsIG1vZHVsZSwgc291cmNlc30pXG4gIGNvbnN0IGVtaXR0ZXIgPSBuZXcgQ0VtaXR0ZXIod3JpdGVyLCBwbGFucywgbW9kdWxlLmxvY2F0aW9uKVxuXG4gIGVtaXR0ZXIucHJvZ3JhbShtb2R1bGUpXG4gIGNvbnN0IG1hcHBpbmcgPSBmaW5hbGl6ZU1hcHBpbmcod3JpdGVyLmZpbmlzaCgpKVxuICBjb25zdCByb290ID0gbWFwcGluZy5ub2Rlcy5maW5kKCh7cGF0aH0pID0+IHBhdGggPT0gXCJcIilcblxuICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRlZCBDIG1vZHVsZSBvbWl0dGVkIGl0cyByb290IHByb3ZlbmFuY2UuXCIpXG4gIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcm9vdC5vcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiXG4gICAgPyBbe2xvY2F0aW9uOiByb290Lm9yaWdpbi5sb2NhdGlvbiwgbm9kZUlkOiByb290LmlkLCByb2xlOiBcIm1vZHVsZVwiLCBzb3VyY2VJZDogcm9vdC5vcmlnaW4uc291cmNlSWR9XVxuICAgIDogKHJvb3Qub3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIgPyByb290Lm9yaWdpbi5vcmlnaW5zIDogcm9vdC5vcmlnaW4ucmVsYXRlZE9yaWdpbnMpLm1hcCgob3JpZ2luKSA9PlxuICAgICAgKHsuLi5vcmlnaW4sIG5vZGVJZDogb3JpZ2luLm5vZGVJZCA/PyByb290LmlkLCByb2xlOiBvcmlnaW4ucm9sZSA/PyBcIm1vZHVsZVwifSkpXG5cbiAgcmV0dXJuIHt0YXJnZXQ6IFwiY1wiLCBhcnRpZmFjdHM6IFt7XG4gICAgY29udGVudDogbWFwcGluZy5nZW5lcmF0ZWQuY29udGVudCwgY29udGVudEtpbmQ6IFwidGV4dFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LWNcIiwgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLCBwYXRoOiBcInByb2dyYW0uY1wiLFxuICAgIHByb3ZlbmFuY2U6IHtraW5kOiBcInRleHRcIiwgbWFwcGluZywgc291cmNlTWFwOiB0b1NvdXJjZU1hcFYzKG1hcHBpbmcpfSwgcm9sZTogXCJlbnRyeVwiXG4gIH0sIHtcbiAgICBjb250ZW50OiBjUnVudGltZUhlYWRlciwgY29udGVudEtpbmQ6IFwidGV4dFwiLCBtZWRpYVR5cGU6IFwidGV4dC94LWNcIiwgb3duZXJzaGlwOiBcImdlbmVyYXRlZFwiLCBwYXRoOiBcInNlbWFudGlmb2xkX3J1bnRpbWUuaFwiLFxuICAgIHByb3ZlbmFuY2U6IHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IFwiQ2Fub25pY2FsIEMxNyBzY2FsYXIgaGVscGVycyBhbmQgbW9kdWxlLWxpZmV0aW1lIGltbXV0YWJsZSBVVEYtOCBhcmVuYS5cIiwgcmVsYXRlZE9yaWdpbnN9LCByb2xlOiBcInN1cHBvcnRcIlxuICB9XX1cbn1cblxuLyoqIFdyaXRlcyBvbmx5IHRhcmdldCBzeW50YXggZnJvbSB2YWxpZGF0ZWQgc2VtYW50aWMgb2NjdXJyZW5jZXMgYW5kIHByaXZhdGUgcGxhbnMuICovXG5jbGFzcyBDRW1pdHRlciB7XG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgd3JpdGVyIGFuZCBjb21wbGV0ZSBwbGFuLlxuICAgKiBAcGFyYW0ge1NvdXJjZVdyaXRlciB8IHVuZGVmaW5lZH0gd3JpdGVyIC0gUHJvdmVuYW5jZSB3cml0ZXI7IG9taXR0ZWQgZm9yIGV4YWN0IHNpemUgcHJlZmxpZ2h0LlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFN0YXRlbWVudFBsYW4+fSBwbGFucyAtIFZhbGlkYXRlZCBvY2N1cnJlbmNlIHBsYW5zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFJvb3QgZGlhZ25vc3RpYyBsb2NhdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHdyaXRlciwgcGxhbnMsIGxvY2F0aW9uKSB7XG4gICAgdGhpcy53cml0ZXIgPSB3cml0ZXJcbiAgICB0aGlzLnBsYW5zID0gcGxhbnNcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZ2VuZXJhdGVkIHNjYWZmb2xkIHdpdGggYSByZWxhdGVkIHNlbWFudGljIG9yaWdpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBDIHN5bnRheC5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBSZWxhdGVkIG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gT2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCBub2RlLCBwYXRoKSB7XG4gICAgdGhpcy5jaGVja1NpemUodGV4dCwgbm9kZSlcbiAgICB0aGlzLndyaXRlcj8uc3ludGhldGljKHRleHQsIFwiQzE3IG9yZGVyZWQtZXhwcmVzc2lvbiBhbmQgbGlmZXRpbWUgc2NhZmZvbGRcIiwgW25vZGVdLCBbcGF0aF0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGFuIG9yaWdpbmFsIHNlbWFudGljIHRva2VuIG9yIGFuY2hvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUYXJnZXQgdG9rZW4uXG4gICAqIEBwYXJhbSB7U2VtYW50aWNOb2RlfSBub2RlIC0gT3JpZ2luYWwgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcm9sZV0gLSBQYXJzZXIgdG9rZW4gcm9sZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwgbm9kZSwgcGF0aCwgcm9sZSkge1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQsIG5vZGUpXG4gICAgdGhpcy53cml0ZXI/Lm1hcHBlZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IHJvbGUgPyBcImV4YWN0XCIgOiBcImFuY2hvclwiLCBub2RlLCBwYXRoLCAuLi4ocm9sZSA/IHtyb2xlfSA6IHt9KX0pXG4gIH1cblxuICAvKipcbiAgICogQm91bmRzIHByaXZhdGUgZW1pc3Npb24gYmVmb3JlIGFueSBhcnRpZmFjdCBjYW4gZXNjYXBlIHRoZSBwYXJzZXIncyBwcm92ZW4gaW5wdXQgcHJvZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBOZXh0IGV4YWN0IG91dHB1dCBjaHVuay5cbiAgICogQHBhcmFtIHtTZW1hbnRpY05vZGV9IG5vZGUgLSBSZWxhdGVkIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2hlY2tTaXplKHRleHQsIG5vZGUpIHtcbiAgICB0aGlzLmxlbmd0aCArPSB0ZXh0Lmxlbmd0aFxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heGltdW1DU291cmNlTGVuZ3RoKSB1bnN1cHBvcnRlZENhcGFiaWxpdHkoXCJjXCIsIFwiZ2VuZXJhdGVkIHByb2dyYW0gZXhjZWVkcyB0aGUgZnJvemVuIEMgcGFyc2VyJ3MgMzI3NjcgVVRGLTE2IGlucHV0IGxpbWl0XCIsXG4gICAgICBcImxvY2F0aW9uXCIgaW4gbm9kZSA/IG5vZGUubG9jYXRpb24gOiB0aGlzLmxvY2F0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGNhbm9uaWNhbCBwcm90b3R5cGVzLCBkZWZpbml0aW9ucywgYW5kIHRoZSBjbGVhbnVwLW93bmluZyBtYWluLlxuICAgKiBAcGFyYW0ge1NlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJvZ3JhbShtb2R1bGUpIHtcbiAgICB0aGlzLnN5bnRoZXRpYygnLyogc2VtYW50aWZvbGQ6cHJvZ3JhbTpjOnYxICovXFxuI2luY2x1ZGUgXCJzZW1hbnRpZm9sZF9ydW50aW1lLmhcIlxcblxcbicsIG1vZHVsZSwgXCJcIilcbiAgICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IGAke2VtaXRTY2FsYXJUeXBlKFwiY1wiLCBwYXJhbWV0ZXIudHlwZSl9ICR7cGFyYW1ldGVyLm5hbWV9YCkuam9pbihcIiwgXCIpXG5cbiAgICAgIHRoaXMuc3ludGhldGljKGBzdGF0aWMgJHtlbWl0U2NhbGFyVHlwZShcImNcIiwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSl9ICR7ZGVjbGFyYXRpb24ubmFtZX0oJHtwYXJhbWV0ZXJzfSk7XFxuYCwgZGVjbGFyYXRpb24sIGAvZnVuY3Rpb25zLyR7aW5kZXh9YClcbiAgICB9KVxuICAgIG1vZHVsZS5mdW5jdGlvbnMuZm9yRWFjaCgoZGVjbGFyYXRpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG5cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuc3RhdGljIFwiLCBkZWNsYXJhdGlvbiwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY1wiLCBkZWNsYXJhdGlvbi5yZXR1cm5UeXBlKSwgZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgYCR7cGF0aH0vcmV0dXJuVHlwZWAsIFwidHlwZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24sIHBhdGgsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIoXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIHBhcmFtZXRlckluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGggPSBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJJbmRleCkgdGhpcy5zeW50aGV0aWMoXCIsIFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY1wiLCBwYXJhbWV0ZXIudHlwZSksIHBhcmFtZXRlci50eXBlLCBgJHtwYXJhbWV0ZXJQYXRofS90eXBlYCwgXCJ0eXBlXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKHBhcmFtZXRlci5uYW1lLCBwYXJhbWV0ZXIsIHBhcmFtZXRlclBhdGgsIFwibmFtZVwiKVxuICAgICAgfSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKSB7XFxuXCIsIGRlY2xhcmF0aW9uLCBwYXRoKVxuICAgICAgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIsIHBhcmFtZXRlckluZGV4KSA9PiB0aGlzLnN5bnRoZXRpYyhgICAgICh2b2lkKSR7cGFyYW1ldGVyLm5hbWV9O1xcbmAsIHBhcmFtZXRlciwgYCR7cGF0aH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWApKVxuICAgICAgdGhpcy5ibG9jayhkZWNsYXJhdGlvbi5ib2R5LCBgJHtwYXRofS9ib2R5YCwgXCIgICAgXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIn1cXG5cIiwgZGVjbGFyYXRpb24sIHBhdGgpXG4gICAgfSlcbiAgICB0aGlzLnN5bnRoZXRpYyhcIlxcbmludCBtYWluKHZvaWQpIHtcXG5cIiwgbW9kdWxlLmVudHJ5UG9pbnQsIFwiL2VudHJ5UG9pbnRcIilcbiAgICBtb2R1bGUuZnVuY3Rpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uLCBpbmRleCkgPT4gdGhpcy5zeW50aGV0aWMoYCAgICAodm9pZCkke2RlY2xhcmF0aW9uLm5hbWV9O1xcbmAsIGRlY2xhcmF0aW9uLCBgL2Z1bmN0aW9ucy8ke2luZGV4fWApKVxuICAgIHRoaXMuYmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgXCIvZW50cnlQb2ludC9ib2R5XCIsIFwiICAgIFwiKVxuICAgIHRoaXMuc3ludGhldGljKFwiICAgIHNlbWFudGlmb2xkX2NsZWFudXAoKTtcXG4gICAgcmV0dXJuIDA7XFxufVxcblwiLCBtb2R1bGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHN0YXRlbWVudHMgaW4gc2VtYW50aWMgc291cmNlIG9yZGVyLlxuICAgKiBAcGFyYW0ge0Jsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIE9jY3VycmVuY2UgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGVudCAtIEN1cnJlbnQgaW5kZW50YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYmxvY2soYmxvY2ssIHBhdGgsIGluZGVudCkge1xuICAgIGJsb2NrLnN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50LCBpbmRleCkgPT4gdGhpcy5zdGF0ZW1lbnQoc3RhdGVtZW50LCBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YCwgaW5kZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgcGFpcmVkIHJlZ2lvbiB3aXRoIGEgcHVyZSBmaW5hbCBjb25zdW1lci5cbiAgICogQHBhcmFtIHtTdGF0ZW1lbnR9IHN0YXRlbWVudCAtIE9yaWdpbmFsIHN0YXRlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBPY2N1cnJlbmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRlbWVudChzdGF0ZW1lbnQsIHBhdGgsIGluZGVudCkge1xuICAgIGNvbnN0IHBsYW4gPSB0aGlzLnBsYW5zLmdldChwYXRoKVxuXG4gICAgaWYgKCFwbGFuKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHZhbGlkYXRlZCBDIHN0YXRlbWVudCBwbGFuLlwiKVxuICAgIGNvbnN0IG1hcmtlciA9IGBzZW1hbnRpZm9sZDpvcmRlcmVkLWV4cHJlc3Npb246Yzp2MWBcbiAgICBjb25zdCBzaWduYXR1cmUgPSBzdGF0ZW1lbnRTaWduYXR1cmUoc3RhdGVtZW50KVxuXG4gICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fS8qICR7bWFya2VyfSBiZWdpbiAke3BsYW4uaWR9ICR7c2lnbmF0dXJlfSAqL1xcbmAsIHN0YXRlbWVudCwgcGF0aClcbiAgICB0aGlzLnN0ZXBzKHBsYW4uc3RlcHMsIGluZGVudClcbiAgICB0aGlzLnN5bnRoZXRpYyhpbmRlbnQsIHN0YXRlbWVudCwgcGF0aClcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGlmICghc3RhdGVtZW50Lm11dGFibGUpIHRoaXMuc3ludGhldGljKFwiY29uc3QgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKGVtaXRTY2FsYXJUeXBlKFwiY1wiLCBzdGF0ZW1lbnQudHlwZSksIHN0YXRlbWVudC50eXBlLCBgJHtwYXRofS90eXBlYCwgXCJ0eXBlXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoc3RhdGVtZW50Lm5hbWUsIHN0YXRlbWVudCwgcGF0aCwgXCJuYW1lXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgICAgdGhpcy5tYXBwZWQoXCI9XCIsIHN0YXRlbWVudCwgcGF0aCwgXCJvcGVyYXRvclwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHN0YXRlbWVudC50YXJnZXQsIGAke3BhdGh9L3RhcmdldGAsIFwibmFtZVwiKVxuICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIHRoaXMubWFwcGVkKFwiPVwiLCBzdGF0ZW1lbnQsIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB0aGlzLm1hcHBlZChcInJldHVybiBcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikgdGhpcy5tYXBwZWQoYHNlbWFudGlmb2xkX3ByaW50XyR7cGxhbi52YWx1ZS50eXBlfShgLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgZWxzZSB0aGlzLm1hcHBlZChcImlmIChcIiwgc3RhdGVtZW50LCBwYXRoKVxuICAgIHRoaXMudmFsdWUocGxhbi52YWx1ZSlcbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIikge1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICB0aGlzLmJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBgJHtwYXRofS9jb25zZXF1ZW50YCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fX1gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgICAgICB0aGlzLm1hcHBlZChcIiBlbHNlIFwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwie1xcblwiLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICAgIHRoaXMuYmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgYCR7cGF0aH0vYWx0ZXJuYXRlYCwgYCR7aW5kZW50fSAgICBgKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgJHtpbmRlbnR9fWAsIHN0YXRlbWVudCwgcGF0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuc3ludGhldGljKFwiXFxuXCIsIHN0YXRlbWVudCwgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7c3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiID8gXCIpXCIgOiBcIlwifTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHRoaXMuc3ludGhldGljKGAke2luZGVudH0odm9pZCkke3N0YXRlbWVudC5uYW1lfTtcXG5gLCBzdGF0ZW1lbnQsIHBhdGgpXG4gICAgfVxuICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0vKiAke21hcmtlcn0gZW5kICR7cGxhbi5pZH0gJHtzaWduYXR1cmV9ICovXFxuYCwgc3RhdGVtZW50LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGVhY2ggZWFnZXIgc3RlcCBvciBjb25kaXRpb25hbCBSSFMgYXQgaXRzIHBsYW5uZWQgbG9jYXRpb24uXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXBbXX0gc3RlcHMgLSBPcmRlcmVkIHByaXZhdGUgc3RlcHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmRlbnQgLSBDdXJyZW50IGluZGVudGF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0ZXBzKHN0ZXBzLCBpbmRlbnQpIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICAgIGNvbnN0IHtyZXN1bHQsIG9wZXJhbmRzLCByaWdodFN0ZXBzfSA9IHN0ZXBcbiAgICAgIGNvbnN0IHtleHByZXNzaW9uLCBwYXRoLCBuYW1lfSA9IHJlc3VsdFxuICAgICAgY29uc3QgdHlwZSA9IGVtaXRTY2FsYXJUeXBlKFwiY1wiLCB7a2luZDogXCJUeXBlUmVmZXJlbmNlXCIsIG5hbWU6IHJlc3VsdC50eXBlfSlcblxuICAgICAgdGhpcy5zeW50aGV0aWMoYCR7aW5kZW50fSR7dHlwZX0gJHtuYW1lfSA9IGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICBpZiAocmlnaHRTdGVwcykge1xuICAgICAgICB0aGlzLnZhbHVlKG9wZXJhbmRzWzBdKVxuICAgICAgICB0aGlzLnN5bnRoZXRpYyhgO1xcbiR7aW5kZW50fWlmIChgLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kICE9IFwiQmluYXJ5RXhwcmVzc2lvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmRpdGlvbmFsIEMgcGxhbi5cIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoYCR7ZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJCb29sZWFuT3JcIiA/IFwiIVwiIDogXCJcIn0ke25hbWV9KSB7XFxuYCwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgICAgdGhpcy5zdGVwcyhyaWdodFN0ZXBzLCBgJHtpbmRlbnR9ICAgIGApXG4gICAgICAgIHRoaXMuc3ludGhldGljKGAke2luZGVudH0gICAgJHtuYW1lfSA9ICgke25hbWV9IGAsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKGV4cHJlc3Npb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk9yXCIgPyBcInx8XCIgOiBcIiYmXCIsIGV4cHJlc3Npb24sIHBhdGgsIFwib3BlcmF0b3JcIilcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMV0pXG4gICAgICAgIHRoaXMuc3ludGhldGljKGApO1xcbiR7aW5kZW50fX1cXG5gLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24oc3RlcClcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCI7XFxuXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uZSBub250cml2aWFsIG9wZXJhdGlvbiB3aXRoIHB1cmUgb3BlcmFuZHMuXG4gICAqIEBwYXJhbSB7UGxhbm5lZFN0ZXB9IHN0ZXAgLSBFYWdlciBzdGVwLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9wZXJhdGlvbih7cmVzdWx0OiB7ZXhwcmVzc2lvbiwgcGF0aH0sIG9wZXJhbmRzfSkge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLmNhbGxlZSwgZXhwcmVzc2lvbiwgcGF0aCwgXCJjYWxsZWVcIilcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgb3BlcmFuZHMuZm9yRWFjaCgob3BlcmFuZCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4KSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMudmFsdWUob3BlcmFuZClcbiAgICAgIH0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB0aGlzLm1hcHBlZChleHByZXNzaW9uLm9wZXJhdGlvbiA9PSBcIkludGVnZXJOZWdhdGVcIiA/IFwic2VtYW50aWZvbGRfaW50ZWdlcl9uZWdhdGVcIiA6IFwiIVwiLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIilcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgdG9rZW4gPSBiaW5hcnlUb2tlbnMuZ2V0KGV4cHJlc3Npb24ub3BlcmF0aW9uKVxuXG4gICAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBvcGVyYXRpb24gcGFzc2VkIEMgcGxhbm5pbmcuXCIpXG4gICAgICBjb25zdCBoZWxwZXIgPSB0b2tlbi5zdGFydHNXaXRoKFwic2VtYW50aWZvbGRfXCIpXG5cbiAgICAgIGlmIChoZWxwZXIpIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICB0aGlzLnN5bnRoZXRpYyhcIihcIiwgZXhwcmVzc2lvbiwgcGF0aClcbiAgICAgIHRoaXMudmFsdWUob3BlcmFuZHNbMF0pXG4gICAgICBpZiAoaGVscGVyKSB0aGlzLnN5bnRoZXRpYyhcIiwgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zeW50aGV0aWMoXCIgXCIsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgICAgIHRoaXMubWFwcGVkKHRva2VuLCBleHByZXNzaW9uLCBwYXRoLCBcIm9wZXJhdG9yXCIpXG4gICAgICAgIHRoaXMuc3ludGhldGljKFwiIFwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgICAgfVxuICAgICAgdGhpcy52YWx1ZShvcGVyYW5kc1sxXSlcbiAgICAgIHRoaXMuc3ludGhldGljKFwiKVwiLCBleHByZXNzaW9uLCBwYXRoKVxuICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJQdXJlIGV4cHJlc3Npb24gd2FzIHNjaGVkdWxlZCBhcyBhIEMgb3BlcmF0aW9uLlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgcHVyZSBvcGVyYW5kIHdpdGggb3JpZ2luYWwgdG9rZW4gcHJvdmVuYW5jZSBvciBhIHN5bnRoZXRpYyB0ZW1wb3JhcnkgdXNlLlxuICAgKiBAcGFyYW0ge1BsYW5uZWRWYWx1ZX0gdmFsdWUgLSBQbGFubmVkIHB1cmUgb3BlcmFuZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB2YWx1ZSh7ZXhwcmVzc2lvbiwgcGF0aCwgbmFtZX0pIHtcbiAgICBpZiAobmFtZSkgcmV0dXJuIHRoaXMuc3ludGhldGljKG5hbWUsIGV4cHJlc3Npb24sIHBhdGgpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJldHVybiB0aGlzLm1hcHBlZChleHByZXNzaW9uLm5hbWUsIGV4cHJlc3Npb24sIHBhdGgsIFwibmFtZVwiKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSByZXR1cm4gdGhpcy5tYXBwZWQoU3RyaW5nKGV4cHJlc3Npb24udmFsdWUpLCBleHByZXNzaW9uLCBwYXRoLCBcImxpdGVyYWxcIilcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIikgcmV0dXJuIHRoaXMubWFwcGVkKGBJTlQ2NF9DKCR7ZXhwcmVzc2lvbi52YWx1ZX0pYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZXhwcmVzc2lvbi52YWx1ZSlcbiAgICAgIGNvbnN0IGxpdGVyYWwgPSBBcnJheS5mcm9tKGJ5dGVzLCAoYnl0ZSkgPT4gYFxcXFwke2J5dGUudG9TdHJpbmcoOCkucGFkU3RhcnQoMywgXCIwXCIpfWApLmpvaW4oXCJcIilcblxuICAgICAgcmV0dXJuIHRoaXMubWFwcGVkKGBTRU1BTlRJRk9MRF9TVFJJTkcoXCIke2xpdGVyYWx9XCIpYCwgZXhwcmVzc2lvbiwgcGF0aCwgXCJsaXRlcmFsXCIpXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuc2VxdWVuY2VkIGV4cHJlc3Npb24gcGFzc2VkIEMgcGxhbm5pbmcuXCIpXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Exact C++20 native support; owned scalar values never expose implementation lifetimes. */
|
|
2
|
+
export declare const cppRuntime = "#include <cstdint>\n#include <cstdio>\n#include <cstdlib>\n#include <string>\n#include <limits>\n#include <climits>\n\nstatic_assert(CHAR_BIT == 8 && sizeof(std::int64_t) == 8, \"Semantifold requires eight-bit bytes and int64\");\nstatic_assert(sizeof(std::size_t) == 8 && sizeof(std::ptrdiff_t) == 8, \"Semantifold requires the qualified 64-bit ABI\");\nstatic_assert(_GLIBCXX_USE_CXX11_ABI == 1, \"Semantifold requires libstdc++ C++11 string ABI\");\n\n[[noreturn]] inline void semantifold_fatal(const char *message, std::size_t length) {\n (void)std::fwrite(message, 1, length, stderr);\n std::exit(70);\n}\n\ninline std::int64_t semantifold_integer_add(std::int64_t left, std::int64_t right) {\n std::int64_t result;\n if (__builtin_add_overflow(left, right, &result)) {\n semantifold_fatal(\"semantifold: integer overflow\\n\", sizeof(\"semantifold: integer overflow\\n\") - 1);\n }\n return result;\n}\n\ninline std::int64_t semantifold_integer_subtract(std::int64_t left, std::int64_t right) {\n std::int64_t result;\n if (__builtin_sub_overflow(left, right, &result)) {\n semantifold_fatal(\"semantifold: integer overflow\\n\", sizeof(\"semantifold: integer overflow\\n\") - 1);\n }\n return result;\n}\n\ninline std::int64_t semantifold_integer_multiply(std::int64_t left, std::int64_t right) {\n std::int64_t result;\n if (__builtin_mul_overflow(left, right, &result)) {\n semantifold_fatal(\"semantifold: integer overflow\\n\", sizeof(\"semantifold: integer overflow\\n\") - 1);\n }\n return result;\n}\n\ninline std::int64_t semantifold_integer_negate(std::int64_t value) {\n return semantifold_integer_subtract(std::int64_t(0), value);\n}\n\ninline std::string semantifold_string_concat(std::string left, std::string right) {\n if (right.size() > left.max_size() - left.size()) {\n semantifold_fatal(\"semantifold: string size\\n\", sizeof(\"semantifold: string size\\n\") - 1);\n }\n return left + right;\n}\n\ninline bool semantifold_string_equal(std::string left, std::string right) {\n return left == right;\n}\n\ninline bool semantifold_string_not_equal(std::string left, std::string right) {\n return left != right;\n}\n\ninline void semantifold_write(const char *data, std::size_t length) {\n if (length != 0 && std::fwrite(data, 1, length, stdout) != length) {\n semantifold_fatal(\"semantifold: output failure\\n\", sizeof(\"semantifold: output failure\\n\") - 1);\n }\n}\n\ninline void semantifold_newline() {\n semantifold_write(\"\\n\", 1);\n if (std::fflush(stdout) != 0) semantifold_fatal(\"semantifold: output failure\\n\", sizeof(\"semantifold: output failure\\n\") - 1);\n}\n\ninline void semantifold_print_string(std::string value) {\n semantifold_write(value.data(), value.size());\n semantifold_newline();\n}\n\ninline void semantifold_print_boolean(bool value) {\n if (value) semantifold_write(\"true\", 4);\n else semantifold_write(\"false\", 5);\n semantifold_newline();\n}\n\ninline void semantifold_print_integer(std::int64_t value) {\n char digits[20];\n std::size_t position = sizeof(digits);\n std::uint64_t magnitude = static_cast<std::uint64_t>(value);\n if (value < 0) magnitude = std::uint64_t(0) - magnitude;\n do {\n digits[--position] = static_cast<char>(std::uint64_t(48) + magnitude % std::uint64_t(10));\n magnitude /= std::uint64_t(10);\n } while (magnitude != 0);\n if (value < 0) digits[--position] = '-';\n semantifold_write(digits + position, sizeof(digits) - position);\n semantifold_newline();\n}\n/* semantifold:runtime:cpp:v1 end */\n";
|
|
3
|
+
//# sourceMappingURL=cpp-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cpp-runtime.d.ts","sourceRoot":"","sources":["../../../src/backends/cpp-runtime.js"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,eAAO,MAAM,UAAU,8kHA+FtB,CAAA"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/** Exact C++20 native support; owned scalar values never expose implementation lifetimes. */
|
|
3
|
+
export const cppRuntime = `#include <cstdint>
|
|
4
|
+
#include <cstdio>
|
|
5
|
+
#include <cstdlib>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <limits>
|
|
8
|
+
#include <climits>
|
|
9
|
+
|
|
10
|
+
static_assert(CHAR_BIT == 8 && sizeof(std::int64_t) == 8, "Semantifold requires eight-bit bytes and int64");
|
|
11
|
+
static_assert(sizeof(std::size_t) == 8 && sizeof(std::ptrdiff_t) == 8, "Semantifold requires the qualified 64-bit ABI");
|
|
12
|
+
static_assert(_GLIBCXX_USE_CXX11_ABI == 1, "Semantifold requires libstdc++ C++11 string ABI");
|
|
13
|
+
|
|
14
|
+
[[noreturn]] inline void semantifold_fatal(const char *message, std::size_t length) {
|
|
15
|
+
(void)std::fwrite(message, 1, length, stderr);
|
|
16
|
+
std::exit(70);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
inline std::int64_t semantifold_integer_add(std::int64_t left, std::int64_t right) {
|
|
20
|
+
std::int64_t result;
|
|
21
|
+
if (__builtin_add_overflow(left, right, &result)) {
|
|
22
|
+
semantifold_fatal("semantifold: integer overflow\\n", sizeof("semantifold: integer overflow\\n") - 1);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
inline std::int64_t semantifold_integer_subtract(std::int64_t left, std::int64_t right) {
|
|
28
|
+
std::int64_t result;
|
|
29
|
+
if (__builtin_sub_overflow(left, right, &result)) {
|
|
30
|
+
semantifold_fatal("semantifold: integer overflow\\n", sizeof("semantifold: integer overflow\\n") - 1);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
inline std::int64_t semantifold_integer_multiply(std::int64_t left, std::int64_t right) {
|
|
36
|
+
std::int64_t result;
|
|
37
|
+
if (__builtin_mul_overflow(left, right, &result)) {
|
|
38
|
+
semantifold_fatal("semantifold: integer overflow\\n", sizeof("semantifold: integer overflow\\n") - 1);
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
inline std::int64_t semantifold_integer_negate(std::int64_t value) {
|
|
44
|
+
return semantifold_integer_subtract(std::int64_t(0), value);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
inline std::string semantifold_string_concat(std::string left, std::string right) {
|
|
48
|
+
if (right.size() > left.max_size() - left.size()) {
|
|
49
|
+
semantifold_fatal("semantifold: string size\\n", sizeof("semantifold: string size\\n") - 1);
|
|
50
|
+
}
|
|
51
|
+
return left + right;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
inline bool semantifold_string_equal(std::string left, std::string right) {
|
|
55
|
+
return left == right;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
inline bool semantifold_string_not_equal(std::string left, std::string right) {
|
|
59
|
+
return left != right;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
inline void semantifold_write(const char *data, std::size_t length) {
|
|
63
|
+
if (length != 0 && std::fwrite(data, 1, length, stdout) != length) {
|
|
64
|
+
semantifold_fatal("semantifold: output failure\\n", sizeof("semantifold: output failure\\n") - 1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
inline void semantifold_newline() {
|
|
69
|
+
semantifold_write("\\n", 1);
|
|
70
|
+
if (std::fflush(stdout) != 0) semantifold_fatal("semantifold: output failure\\n", sizeof("semantifold: output failure\\n") - 1);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
inline void semantifold_print_string(std::string value) {
|
|
74
|
+
semantifold_write(value.data(), value.size());
|
|
75
|
+
semantifold_newline();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
inline void semantifold_print_boolean(bool value) {
|
|
79
|
+
if (value) semantifold_write("true", 4);
|
|
80
|
+
else semantifold_write("false", 5);
|
|
81
|
+
semantifold_newline();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
inline void semantifold_print_integer(std::int64_t value) {
|
|
85
|
+
char digits[20];
|
|
86
|
+
std::size_t position = sizeof(digits);
|
|
87
|
+
std::uint64_t magnitude = static_cast<std::uint64_t>(value);
|
|
88
|
+
if (value < 0) magnitude = std::uint64_t(0) - magnitude;
|
|
89
|
+
do {
|
|
90
|
+
digits[--position] = static_cast<char>(std::uint64_t(48) + magnitude % std::uint64_t(10));
|
|
91
|
+
magnitude /= std::uint64_t(10);
|
|
92
|
+
} while (magnitude != 0);
|
|
93
|
+
if (value < 0) digits[--position] = '-';
|
|
94
|
+
semantifold_write(digits + position, sizeof(digits) - position);
|
|
95
|
+
semantifold_newline();
|
|
96
|
+
}
|
|
97
|
+
/* semantifold:runtime:cpp:v1 end */
|
|
98
|
+
`;
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BwLXJ1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZHMvY3BwLXJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLDZGQUE2RjtBQUM3RixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBK0Z6QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBFeGFjdCBDKysyMCBuYXRpdmUgc3VwcG9ydDsgb3duZWQgc2NhbGFyIHZhbHVlcyBuZXZlciBleHBvc2UgaW1wbGVtZW50YXRpb24gbGlmZXRpbWVzLiAqL1xuZXhwb3J0IGNvbnN0IGNwcFJ1bnRpbWUgPSBgI2luY2x1ZGUgPGNzdGRpbnQ+XG4jaW5jbHVkZSA8Y3N0ZGlvPlxuI2luY2x1ZGUgPGNzdGRsaWI+XG4jaW5jbHVkZSA8c3RyaW5nPlxuI2luY2x1ZGUgPGxpbWl0cz5cbiNpbmNsdWRlIDxjbGltaXRzPlxuXG5zdGF0aWNfYXNzZXJ0KENIQVJfQklUID09IDggJiYgc2l6ZW9mKHN0ZDo6aW50NjRfdCkgPT0gOCwgXCJTZW1hbnRpZm9sZCByZXF1aXJlcyBlaWdodC1iaXQgYnl0ZXMgYW5kIGludDY0XCIpO1xuc3RhdGljX2Fzc2VydChzaXplb2Yoc3RkOjpzaXplX3QpID09IDggJiYgc2l6ZW9mKHN0ZDo6cHRyZGlmZl90KSA9PSA4LCBcIlNlbWFudGlmb2xkIHJlcXVpcmVzIHRoZSBxdWFsaWZpZWQgNjQtYml0IEFCSVwiKTtcbnN0YXRpY19hc3NlcnQoX0dMSUJDWFhfVVNFX0NYWDExX0FCSSA9PSAxLCBcIlNlbWFudGlmb2xkIHJlcXVpcmVzIGxpYnN0ZGMrKyBDKysxMSBzdHJpbmcgQUJJXCIpO1xuXG5bW25vcmV0dXJuXV0gaW5saW5lIHZvaWQgc2VtYW50aWZvbGRfZmF0YWwoY29uc3QgY2hhciAqbWVzc2FnZSwgc3RkOjpzaXplX3QgbGVuZ3RoKSB7XG4gICAgKHZvaWQpc3RkOjpmd3JpdGUobWVzc2FnZSwgMSwgbGVuZ3RoLCBzdGRlcnIpO1xuICAgIHN0ZDo6ZXhpdCg3MCk7XG59XG5cbmlubGluZSBzdGQ6OmludDY0X3Qgc2VtYW50aWZvbGRfaW50ZWdlcl9hZGQoc3RkOjppbnQ2NF90IGxlZnQsIHN0ZDo6aW50NjRfdCByaWdodCkge1xuICAgIHN0ZDo6aW50NjRfdCByZXN1bHQ7XG4gICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobGVmdCwgcmlnaHQsICZyZXN1bHQpKSB7XG4gICAgICAgIHNlbWFudGlmb2xkX2ZhdGFsKFwic2VtYW50aWZvbGQ6IGludGVnZXIgb3ZlcmZsb3dcXFxcblwiLCBzaXplb2YoXCJzZW1hbnRpZm9sZDogaW50ZWdlciBvdmVyZmxvd1xcXFxuXCIpIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmlubGluZSBzdGQ6OmludDY0X3Qgc2VtYW50aWZvbGRfaW50ZWdlcl9zdWJ0cmFjdChzdGQ6OmludDY0X3QgbGVmdCwgc3RkOjppbnQ2NF90IHJpZ2h0KSB7XG4gICAgc3RkOjppbnQ2NF90IHJlc3VsdDtcbiAgICBpZiAoX19idWlsdGluX3N1Yl9vdmVyZmxvdyhsZWZ0LCByaWdodCwgJnJlc3VsdCkpIHtcbiAgICAgICAgc2VtYW50aWZvbGRfZmF0YWwoXCJzZW1hbnRpZm9sZDogaW50ZWdlciBvdmVyZmxvd1xcXFxuXCIsIHNpemVvZihcInNlbWFudGlmb2xkOiBpbnRlZ2VyIG92ZXJmbG93XFxcXG5cIikgLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuaW5saW5lIHN0ZDo6aW50NjRfdCBzZW1hbnRpZm9sZF9pbnRlZ2VyX211bHRpcGx5KHN0ZDo6aW50NjRfdCBsZWZ0LCBzdGQ6OmludDY0X3QgcmlnaHQpIHtcbiAgICBzdGQ6OmludDY0X3QgcmVzdWx0O1xuICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGxlZnQsIHJpZ2h0LCAmcmVzdWx0KSkge1xuICAgICAgICBzZW1hbnRpZm9sZF9mYXRhbChcInNlbWFudGlmb2xkOiBpbnRlZ2VyIG92ZXJmbG93XFxcXG5cIiwgc2l6ZW9mKFwic2VtYW50aWZvbGQ6IGludGVnZXIgb3ZlcmZsb3dcXFxcblwiKSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5pbmxpbmUgc3RkOjppbnQ2NF90IHNlbWFudGlmb2xkX2ludGVnZXJfbmVnYXRlKHN0ZDo6aW50NjRfdCB2YWx1ZSkge1xuICAgIHJldHVybiBzZW1hbnRpZm9sZF9pbnRlZ2VyX3N1YnRyYWN0KHN0ZDo6aW50NjRfdCgwKSwgdmFsdWUpO1xufVxuXG5pbmxpbmUgc3RkOjpzdHJpbmcgc2VtYW50aWZvbGRfc3RyaW5nX2NvbmNhdChzdGQ6OnN0cmluZyBsZWZ0LCBzdGQ6OnN0cmluZyByaWdodCkge1xuICAgIGlmIChyaWdodC5zaXplKCkgPiBsZWZ0Lm1heF9zaXplKCkgLSBsZWZ0LnNpemUoKSkge1xuICAgICAgICBzZW1hbnRpZm9sZF9mYXRhbChcInNlbWFudGlmb2xkOiBzdHJpbmcgc2l6ZVxcXFxuXCIsIHNpemVvZihcInNlbWFudGlmb2xkOiBzdHJpbmcgc2l6ZVxcXFxuXCIpIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBsZWZ0ICsgcmlnaHQ7XG59XG5cbmlubGluZSBib29sIHNlbWFudGlmb2xkX3N0cmluZ19lcXVhbChzdGQ6OnN0cmluZyBsZWZ0LCBzdGQ6OnN0cmluZyByaWdodCkge1xuICAgIHJldHVybiBsZWZ0ID09IHJpZ2h0O1xufVxuXG5pbmxpbmUgYm9vbCBzZW1hbnRpZm9sZF9zdHJpbmdfbm90X2VxdWFsKHN0ZDo6c3RyaW5nIGxlZnQsIHN0ZDo6c3RyaW5nIHJpZ2h0KSB7XG4gICAgcmV0dXJuIGxlZnQgIT0gcmlnaHQ7XG59XG5cbmlubGluZSB2b2lkIHNlbWFudGlmb2xkX3dyaXRlKGNvbnN0IGNoYXIgKmRhdGEsIHN0ZDo6c2l6ZV90IGxlbmd0aCkge1xuICAgIGlmIChsZW5ndGggIT0gMCAmJiBzdGQ6OmZ3cml0ZShkYXRhLCAxLCBsZW5ndGgsIHN0ZG91dCkgIT0gbGVuZ3RoKSB7XG4gICAgICAgIHNlbWFudGlmb2xkX2ZhdGFsKFwic2VtYW50aWZvbGQ6IG91dHB1dCBmYWlsdXJlXFxcXG5cIiwgc2l6ZW9mKFwic2VtYW50aWZvbGQ6IG91dHB1dCBmYWlsdXJlXFxcXG5cIikgLSAxKTtcbiAgICB9XG59XG5cbmlubGluZSB2b2lkIHNlbWFudGlmb2xkX25ld2xpbmUoKSB7XG4gICAgc2VtYW50aWZvbGRfd3JpdGUoXCJcXFxcblwiLCAxKTtcbiAgICBpZiAoc3RkOjpmZmx1c2goc3Rkb3V0KSAhPSAwKSBzZW1hbnRpZm9sZF9mYXRhbChcInNlbWFudGlmb2xkOiBvdXRwdXQgZmFpbHVyZVxcXFxuXCIsIHNpemVvZihcInNlbWFudGlmb2xkOiBvdXRwdXQgZmFpbHVyZVxcXFxuXCIpIC0gMSk7XG59XG5cbmlubGluZSB2b2lkIHNlbWFudGlmb2xkX3ByaW50X3N0cmluZyhzdGQ6OnN0cmluZyB2YWx1ZSkge1xuICAgIHNlbWFudGlmb2xkX3dyaXRlKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTtcbiAgICBzZW1hbnRpZm9sZF9uZXdsaW5lKCk7XG59XG5cbmlubGluZSB2b2lkIHNlbWFudGlmb2xkX3ByaW50X2Jvb2xlYW4oYm9vbCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkgc2VtYW50aWZvbGRfd3JpdGUoXCJ0cnVlXCIsIDQpO1xuICAgIGVsc2Ugc2VtYW50aWZvbGRfd3JpdGUoXCJmYWxzZVwiLCA1KTtcbiAgICBzZW1hbnRpZm9sZF9uZXdsaW5lKCk7XG59XG5cbmlubGluZSB2b2lkIHNlbWFudGlmb2xkX3ByaW50X2ludGVnZXIoc3RkOjppbnQ2NF90IHZhbHVlKSB7XG4gICAgY2hhciBkaWdpdHNbMjBdO1xuICAgIHN0ZDo6c2l6ZV90IHBvc2l0aW9uID0gc2l6ZW9mKGRpZ2l0cyk7XG4gICAgc3RkOjp1aW50NjRfdCBtYWduaXR1ZGUgPSBzdGF0aWNfY2FzdDxzdGQ6OnVpbnQ2NF90Pih2YWx1ZSk7XG4gICAgaWYgKHZhbHVlIDwgMCkgbWFnbml0dWRlID0gc3RkOjp1aW50NjRfdCgwKSAtIG1hZ25pdHVkZTtcbiAgICBkbyB7XG4gICAgICAgIGRpZ2l0c1stLXBvc2l0aW9uXSA9IHN0YXRpY19jYXN0PGNoYXI+KHN0ZDo6dWludDY0X3QoNDgpICsgbWFnbml0dWRlICUgc3RkOjp1aW50NjRfdCgxMCkpO1xuICAgICAgICBtYWduaXR1ZGUgLz0gc3RkOjp1aW50NjRfdCgxMCk7XG4gICAgfSB3aGlsZSAobWFnbml0dWRlICE9IDApO1xuICAgIGlmICh2YWx1ZSA8IDApIGRpZ2l0c1stLXBvc2l0aW9uXSA9ICctJztcbiAgICBzZW1hbnRpZm9sZF93cml0ZShkaWdpdHMgKyBwb3NpdGlvbiwgc2l6ZW9mKGRpZ2l0cykgLSBwb3NpdGlvbik7XG4gICAgc2VtYW50aWZvbGRfbmV3bGluZSgpO1xufVxuLyogc2VtYW50aWZvbGQ6cnVudGltZTpjcHA6djEgZW5kICovXG5gXG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Qualified frozen parser input bound, including the inline support. */
|
|
2
|
+
export declare const maximumCppSourceLength = 32767;
|
|
3
|
+
/**
|
|
4
|
+
* Rejects known unrepresentable values before target emission.
|
|
5
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Fully validated semantic module.
|
|
6
|
+
* @returns {void}
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateCppValues(module: import("../semantic/types.js").SemanticModule): void;
|
|
9
|
+
//# sourceMappingURL=cpp-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cpp-validation.d.ts","sourceRoot":"","sources":["../../../src/backends/cpp-validation.js"],"names":[],"mappings":"AAIA,yEAAyE;AACzE,eAAO,MAAM,sBAAsB,QAAQ,CAAA;AAsD3C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAH7B,OAAO,sBAAsB,EAAE,cAGF,GAF3B,IAAI,CAOhB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { unsupportedCapability } from "../diagnostic.js";
|
|
3
|
+
/** Qualified frozen parser input bound, including the inline support. */
|
|
4
|
+
export const maximumCppSourceLength = 32767;
|
|
5
|
+
/** Propagates proven UTF-8 value sizes without evaluating or rewriting semantic expressions. */
|
|
6
|
+
class CppValueValidator {
|
|
7
|
+
/**
|
|
8
|
+
* Checks every expression, including skipped-runtime candidates before generation.
|
|
9
|
+
* @param {import("../semantic/types.js").Expression} expression - Validated expression.
|
|
10
|
+
* @param {Map<string, bigint | undefined>} sizes - Visible value byte sizes.
|
|
11
|
+
* @returns {bigint | undefined} Statically known string size.
|
|
12
|
+
*/
|
|
13
|
+
size(expression, sizes) {
|
|
14
|
+
if (expression.kind == "StringLiteral")
|
|
15
|
+
return BigInt(Buffer.byteLength(expression.value, "utf8"));
|
|
16
|
+
if (expression.kind == "IdentifierExpression")
|
|
17
|
+
return sizes.get(expression.name);
|
|
18
|
+
if (expression.kind == "CallExpression") {
|
|
19
|
+
for (const argument of expression.arguments)
|
|
20
|
+
this.size(argument, sizes);
|
|
21
|
+
}
|
|
22
|
+
else if (expression.kind == "UnaryExpression")
|
|
23
|
+
this.size(expression.operand, sizes);
|
|
24
|
+
else if (expression.kind == "BinaryExpression") {
|
|
25
|
+
const left = this.size(expression.left, sizes);
|
|
26
|
+
const right = this.size(expression.right, sizes);
|
|
27
|
+
if (expression.operation == "StringConcat") {
|
|
28
|
+
if ((left ?? 0n) + (right ?? 0n) > 9223372036854775807n) {
|
|
29
|
+
unsupportedCapability("cpp", "known owned string size exceeds the qualified 64-bit object limit", expression.location);
|
|
30
|
+
}
|
|
31
|
+
if (left !== undefined && right !== undefined)
|
|
32
|
+
return left + right;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Follows value copies and merges only identical proven branch results.
|
|
39
|
+
* @param {import("../semantic/types.js").Block} block - Lexical block.
|
|
40
|
+
* @param {Map<string, bigint | undefined>} inherited - Visible byte sizes.
|
|
41
|
+
* @returns {Map<string, bigint | undefined>} Outgoing proven sizes.
|
|
42
|
+
*/
|
|
43
|
+
block(block, inherited) {
|
|
44
|
+
const sizes = new Map(inherited);
|
|
45
|
+
for (const statement of block.statements) {
|
|
46
|
+
if (statement.kind == "LocalDeclaration")
|
|
47
|
+
sizes.set(statement.name, this.size(statement.initializer, sizes));
|
|
48
|
+
else if (statement.kind == "AssignmentStatement")
|
|
49
|
+
sizes.set(statement.target.name, this.size(statement.expression, sizes));
|
|
50
|
+
else if (statement.kind == "IfStatement") {
|
|
51
|
+
this.size(statement.condition, sizes);
|
|
52
|
+
const left = this.block(statement.consequent, sizes);
|
|
53
|
+
const right = statement.alternate ? this.block(statement.alternate, sizes) : sizes;
|
|
54
|
+
for (const name of sizes.keys())
|
|
55
|
+
sizes.set(name, left.get(name) === right.get(name) ? left.get(name) : undefined);
|
|
56
|
+
}
|
|
57
|
+
else
|
|
58
|
+
this.size(statement.expression, sizes);
|
|
59
|
+
}
|
|
60
|
+
return sizes;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Rejects known unrepresentable values before target emission.
|
|
65
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Fully validated semantic module.
|
|
66
|
+
* @returns {void}
|
|
67
|
+
*/
|
|
68
|
+
export function validateCppValues(module) {
|
|
69
|
+
const validator = new CppValueValidator();
|
|
70
|
+
for (const declaration of module.functions)
|
|
71
|
+
validator.block(declaration.body, new Map());
|
|
72
|
+
validator.block(module.entryPoint.body, new Map());
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BwLXZhbGlkYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZHMvY3BwLXZhbGlkYXRpb24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRXRELHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUE7QUFFM0MsZ0dBQWdHO0FBQ2hHLE1BQU0saUJBQWlCO0lBQ3JCOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLO1FBQ3BCLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxlQUFlO1lBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDbEcsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHNCQUFzQjtZQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEYsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDeEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLENBQUMsU0FBUztnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN6RSxDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGlCQUFpQjtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQTthQUNoRixJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7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Q3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHt1bnN1cHBvcnRlZENhcGFiaWxpdHl9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcblxuLyoqIFF1YWxpZmllZCBmcm96ZW4gcGFyc2VyIGlucHV0IGJvdW5kLCBpbmNsdWRpbmcgdGhlIGlubGluZSBzdXBwb3J0LiAqL1xuZXhwb3J0IGNvbnN0IG1heGltdW1DcHBTb3VyY2VMZW5ndGggPSAzMjc2N1xuXG4vKiogUHJvcGFnYXRlcyBwcm92ZW4gVVRGLTggdmFsdWUgc2l6ZXMgd2l0aG91dCBldmFsdWF0aW5nIG9yIHJld3JpdGluZyBzZW1hbnRpYyBleHByZXNzaW9ucy4gKi9cbmNsYXNzIENwcFZhbHVlVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIENoZWNrcyBldmVyeSBleHByZXNzaW9uLCBpbmNsdWRpbmcgc2tpcHBlZC1ydW50aW1lIGNhbmRpZGF0ZXMgYmVmb3JlIGdlbmVyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFZhbGlkYXRlZCBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIGJpZ2ludCB8IHVuZGVmaW5lZD59IHNpemVzIC0gVmlzaWJsZSB2YWx1ZSBieXRlIHNpemVzLlxuICAgKiBAcmV0dXJucyB7YmlnaW50IHwgdW5kZWZpbmVkfSBTdGF0aWNhbGx5IGtub3duIHN0cmluZyBzaXplLlxuICAgKi9cbiAgc2l6ZShleHByZXNzaW9uLCBzaXplcykge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiBCaWdJbnQoQnVmZmVyLmJ5dGVMZW5ndGgoZXhwcmVzc2lvbi52YWx1ZSwgXCJ1dGY4XCIpKVxuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gc2l6ZXMuZ2V0KGV4cHJlc3Npb24ubmFtZSlcbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBleHByZXNzaW9uLmFyZ3VtZW50cykgdGhpcy5zaXplKGFyZ3VtZW50LCBzaXplcylcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB0aGlzLnNpemUoZXhwcmVzc2lvbi5vcGVyYW5kLCBzaXplcylcbiAgICBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLnNpemUoZXhwcmVzc2lvbi5sZWZ0LCBzaXplcylcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5zaXplKGV4cHJlc3Npb24ucmlnaHQsIHNpemVzKVxuXG4gICAgICBpZiAoZXhwcmVzc2lvbi5vcGVyYXRpb24gPT0gXCJTdHJpbmdDb25jYXRcIikge1xuICAgICAgICBpZiAoKGxlZnQgPz8gMG4pICsgKHJpZ2h0ID8/IDBuKSA+IDkyMjMzNzIwMzY4NTQ3NzU4MDduKSB7XG4gICAgICAgICAgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KFwiY3BwXCIsIFwia25vd24gb3duZWQgc3RyaW5nIHNpemUgZXhjZWVkcyB0aGUgcXVhbGlmaWVkIDY0LWJpdCBvYmplY3QgbGltaXRcIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdCAhPT0gdW5kZWZpbmVkICYmIHJpZ2h0ICE9PSB1bmRlZmluZWQpIHJldHVybiBsZWZ0ICsgcmlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEZvbGxvd3MgdmFsdWUgY29waWVzIGFuZCBtZXJnZXMgb25seSBpZGVudGljYWwgcHJvdmVuIGJyYW5jaCByZXN1bHRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIExleGljYWwgYmxvY2suXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgYmlnaW50IHwgdW5kZWZpbmVkPn0gaW5oZXJpdGVkIC0gVmlzaWJsZSBieXRlIHNpemVzLlxuICAgKiBAcmV0dXJucyB7TWFwPHN0cmluZywgYmlnaW50IHwgdW5kZWZpbmVkPn0gT3V0Z29pbmcgcHJvdmVuIHNpemVzLlxuICAgKi9cbiAgYmxvY2soYmxvY2ssIGluaGVyaXRlZCkge1xuICAgIGNvbnN0IHNpemVzID0gbmV3IE1hcChpbmhlcml0ZWQpXG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHNpemVzLnNldChzdGF0ZW1lbnQubmFtZSwgdGhpcy5zaXplKHN0YXRlbWVudC5pbml0aWFsaXplciwgc2l6ZXMpKVxuICAgICAgZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHNpemVzLnNldChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUsIHRoaXMuc2l6ZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2l6ZXMpKVxuICAgICAgZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgIHRoaXMuc2l6ZShzdGF0ZW1lbnQuY29uZGl0aW9uLCBzaXplcylcbiAgICAgICAgY29uc3QgbGVmdCA9IHRoaXMuYmxvY2soc3RhdGVtZW50LmNvbnNlcXVlbnQsIHNpemVzKVxuICAgICAgICBjb25zdCByaWdodCA9IHN0YXRlbWVudC5hbHRlcm5hdGUgPyB0aGlzLmJsb2NrKHN0YXRlbWVudC5hbHRlcm5hdGUsIHNpemVzKSA6IHNpemVzXG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHNpemVzLmtleXMoKSkgc2l6ZXMuc2V0KG5hbWUsIGxlZnQuZ2V0KG5hbWUpID09PSByaWdodC5nZXQobmFtZSkgPyBsZWZ0LmdldChuYW1lKSA6IHVuZGVmaW5lZClcbiAgICAgIH0gZWxzZSB0aGlzLnNpemUoc3RhdGVtZW50LmV4cHJlc3Npb24sIHNpemVzKVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZXNcbiAgfVxufVxuXG4vKipcbiAqIFJlamVjdHMga25vd24gdW5yZXByZXNlbnRhYmxlIHZhbHVlcyBiZWZvcmUgdGFyZ2V0IGVtaXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gRnVsbHkgdmFsaWRhdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDcHBWYWx1ZXMobW9kdWxlKSB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IG5ldyBDcHBWYWx1ZVZhbGlkYXRvcigpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSB2YWxpZGF0b3IuYmxvY2soZGVjbGFyYXRpb24uYm9keSwgbmV3IE1hcCgpKVxuICB2YWxpZGF0b3IuYmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgbmV3IE1hcCgpKVxufVxuIl19
|