@scriptc/compiler 0.3.3 → 0.3.5
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/ambient/scriptc-node-fallback.d.ts +844 -36
- package/dist/backend/cycle-mutability.d.ts +5 -0
- package/dist/backend/cycle-mutability.js +62 -3
- package/dist/backend/cycle-mutability.js.map +1 -1
- package/dist/backend/executable-features.js +1 -0
- package/dist/backend/executable-features.js.map +1 -1
- package/dist/backend/library-pack.js +1 -0
- package/dist/backend/library-pack.js.map +1 -1
- package/dist/backend/llvm/array-search.js +1 -1
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +11 -1
- package/dist/backend/llvm/call-lifetimes.js +30 -3
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +31 -1
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/common.d.ts +5 -0
- package/dist/backend/llvm/common.js +7 -0
- package/dist/backend/llvm/common.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -21
- package/dist/backend/llvm/constant-callbacks.js +36 -219
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +22 -0
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +9 -0
- package/dist/backend/llvm/dense-array-access.js +29 -3
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +46 -1
- package/dist/backend/llvm/dyn.js +218 -33
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +87 -1
- package/dist/backend/llvm/emitter.js +568 -61
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +17 -7
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +9 -0
- package/dist/backend/llvm/expr-bytes.js +159 -64
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +11 -0
- package/dist/backend/llvm/expr-callbacks.js +53 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.d.ts +3 -1
- package/dist/backend/llvm/expr-calls.js +137 -3
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +63 -29
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +9 -1
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +4 -0
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/integer-clones.d.ts +103 -0
- package/dist/backend/llvm/integer-clones.js +1336 -0
- package/dist/backend/llvm/integer-clones.js.map +1 -0
- package/dist/backend/llvm/integer-clones.test.d.ts +1 -0
- package/dist/backend/llvm/integer-clones.test.js +219 -0
- package/dist/backend/llvm/integer-clones.test.js.map +1 -0
- package/dist/backend/llvm/intern-tables.test.d.ts +1 -0
- package/dist/backend/llvm/intern-tables.test.js +77 -0
- package/dist/backend/llvm/intern-tables.test.js.map +1 -0
- package/dist/backend/llvm/lib-datagram.js +24 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +96 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +51 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +16 -0
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +24 -0
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.d.ts +5 -0
- package/dist/backend/llvm/lib-shared.js +114 -3
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +87 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +9 -0
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +6 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +1 -1
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +28 -0
- package/dist/backend/llvm/map-entry-fusion.js +233 -0
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -0
- package/dist/backend/llvm/map-entry-fusion.test.d.ts +1 -0
- package/dist/backend/llvm/map-entry-fusion.test.js +183 -0
- package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +6 -0
- package/dist/backend/llvm/map-number-lookup.js +23 -1
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +60 -5
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -0
- package/dist/backend/llvm/map-read-lifetimes.js +92 -1
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +131 -3
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +21 -0
- package/dist/backend/llvm/publish.js +101 -11
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.d.ts +1 -0
- package/dist/backend/llvm/publish.test.js +94 -0
- package/dist/backend/llvm/publish.test.js.map +1 -0
- package/dist/backend/llvm/record-results.js +76 -2
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/record-sources.d.ts +7 -0
- package/dist/backend/llvm/record-sources.js +14 -0
- package/dist/backend/llvm/record-sources.js.map +1 -0
- package/dist/backend/llvm/reference-writes.js +5 -2
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/regions.d.ts +4 -1
- package/dist/backend/llvm/regions.js +12 -3
- package/dist/backend/llvm/regions.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +9 -3
- package/dist/backend/llvm/shapes.js +18 -14
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +5 -3
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +75 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/string-reads.js +2 -2
- package/dist/backend/llvm/string-reads.js.map +1 -1
- package/dist/backend/llvm/string-slices.js +2 -2
- package/dist/backend/llvm/string-slices.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +17 -0
- package/dist/backend/llvm/walkers.js +123 -0
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +4 -0
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +5 -1
- package/dist/backend/native/executable.js +16 -6
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/native-codegen-core.d.ts +4 -4
- package/dist/backend/native-codegen-core.js +4 -6
- package/dist/backend/native-codegen-core.js.map +1 -1
- package/dist/backend/native-codegen.test.js +7 -8
- package/dist/backend/native-codegen.test.js.map +1 -1
- package/dist/backend/native-link-info-core.d.ts +3 -0
- package/dist/backend/native-link-info-core.js.map +1 -1
- package/dist/backend/publication.js +3 -1
- package/dist/backend/publication.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-targets.test.js +2 -1
- package/dist/backend/runtime-pack-targets.test.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +2 -1
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/target-diagnostics.js +7 -0
- package/dist/backend/target-diagnostics.js.map +1 -1
- package/dist/backend/warm-cache.js +1 -0
- package/dist/backend/warm-cache.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +1 -0
- package/dist/executable/executable-cache.js +1 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +1 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/experimental-import.d.ts +5 -1
- package/dist/frontend/experimental-import.js +28 -3
- package/dist/frontend/experimental-import.js.map +1 -1
- package/dist/frontend/lowering/assert-instances.d.ts +38 -0
- package/dist/frontend/lowering/assert-instances.js +269 -0
- package/dist/frontend/lowering/assert-instances.js.map +1 -0
- package/dist/frontend/lowering/builtin-calls.js +3 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/callable-aliases.js +54 -8
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.d.ts +8 -6
- package/dist/frontend/lowering/builtins/child-process-async.js +45 -29
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.d.ts +18 -0
- package/dist/frontend/lowering/builtins/compression.js +175 -2
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/constants.js +7 -2
- package/dist/frontend/lowering/builtins/constants.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.d.ts +6 -0
- package/dist/frontend/lowering/builtins/crypto.js +111 -1
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +23 -0
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +2 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +5 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.js +60 -0
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.d.ts +26 -0
- package/dist/frontend/lowering/builtins/fs-streams.js +131 -0
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +5 -1
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/timers.d.ts +3 -0
- package/dist/frontend/lowering/builtins/timers.js +109 -23
- package/dist/frontend/lowering/builtins/timers.js.map +1 -1
- package/dist/frontend/lowering/call-signatures.js +6 -0
- package/dist/frontend/lowering/call-signatures.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +216 -20
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/containers/bytes.js +33 -12
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/devirtualize.js +20 -7
- package/dist/frontend/lowering/devirtualize.js.map +1 -1
- package/dist/frontend/lowering/intern-tables.d.ts +13 -0
- package/dist/frontend/lowering/intern-tables.js +536 -0
- package/dist/frontend/lowering/intern-tables.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +700 -61
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-async-iteration.js +11 -2
- package/dist/frontend/lowering/lower-async-iteration.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +75 -6
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.d.ts +3 -0
- package/dist/frontend/lowering/lower-classes.js +43 -0
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +132 -67
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -1
- package/dist/frontend/lowering/lower-event-emitter.js +78 -0
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +4 -0
- package/dist/frontend/lowering/lower-exprs.js +144 -58
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +6 -0
- package/dist/frontend/lowering/lower-inspect.js +138 -39
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.d.ts +11 -0
- package/dist/frontend/lowering/lower-mock.js +504 -0
- package/dist/frontend/lowering/lower-mock.js.map +1 -0
- package/dist/frontend/lowering/lower-modules.js +7 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +4 -0
- package/dist/frontend/lowering/lower-server.js +448 -30
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +35 -8
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +10 -6
- package/dist/frontend/lowering/lower-stream.js +794 -27
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.js +86 -8
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +25 -1
- package/dist/frontend/lowering/lowerer.js +74 -9
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.d.ts +6 -0
- package/dist/frontend/lowering/pairs-snapshot.js +49 -0
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/record-sources.d.ts +15 -0
- package/dist/frontend/lowering/record-sources.js +46 -0
- package/dist/frontend/lowering/record-sources.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +4 -0
- package/dist/frontend/lowering/surfaces.js +94 -16
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/lowering/zlib-constants.d.ts +1 -0
- package/dist/frontend/lowering/zlib-constants.js +181 -0
- package/dist/frontend/lowering/zlib-constants.js.map +1 -0
- package/dist/frontend/mock-shapes.d.ts +10 -0
- package/dist/frontend/mock-shapes.js +76 -0
- package/dist/frontend/mock-shapes.js.map +1 -0
- package/dist/frontend/pipeline.js +5 -3
- package/dist/frontend/pipeline.js.map +1 -1
- package/dist/frontend/program.js +6 -1
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +4 -0
- package/dist/frontend/resolve.js +14 -0
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/tsc-codes.js +1 -0
- package/dist/frontend/tsc-codes.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +8 -0
- package/dist/frontend/type-mapper.js +155 -9
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +10 -0
- package/dist/ir/analysis.js +35 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +69 -1
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +72 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +238 -15
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/capture-values.d.ts +107 -0
- package/dist/ir/capture-values.js +850 -0
- package/dist/ir/capture-values.js.map +1 -0
- package/dist/ir/capture-values.test.d.ts +1 -0
- package/dist/ir/capture-values.test.js +268 -0
- package/dist/ir/capture-values.test.js.map +1 -0
- package/dist/ir/field-values.d.ts +16 -0
- package/dist/ir/field-values.js +128 -0
- package/dist/ir/field-values.js.map +1 -0
- package/dist/ir/field-values.test.d.ts +1 -0
- package/dist/ir/field-values.test.js +160 -0
- package/dist/ir/field-values.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +4 -1
- package/dist/ir/final-fields.js +11 -3
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.test.js +1 -1
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.d.ts +16 -0
- package/dist/ir/init-only-globals.js +121 -0
- package/dist/ir/init-only-globals.js.map +1 -0
- package/dist/ir/init-only-globals.test.d.ts +1 -0
- package/dist/ir/init-only-globals.test.js +115 -0
- package/dist/ir/init-only-globals.test.js.map +1 -0
- package/dist/ir/initializer-bindings.d.ts +18 -1
- package/dist/ir/initializer-bindings.js +91 -1
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/initializer-bindings.test.js +57 -2
- package/dist/ir/initializer-bindings.test.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +22 -0
- package/dist/ir/int32-slots.js +376 -13
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +91 -8
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +19 -1
- package/dist/ir/integer-loop-facts.js +155 -7
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +8 -5
- package/dist/ir/integer-ranges.js +147 -55
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +225 -7
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +29 -2
- package/dist/ir/ir.js +17 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/property-bags.d.ts +14 -0
- package/dist/ir/property-bags.js +121 -0
- package/dist/ir/property-bags.js.map +1 -0
- package/dist/ir/receiver-readers.d.ts +21 -0
- package/dist/ir/receiver-readers.js +217 -0
- package/dist/ir/receiver-readers.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +1 -0
- package/dist/ir/runtime-features.js +34 -2
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/validate.js +221 -5
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +21 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/int-infer.js +3 -0
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/ir-policy.js +1 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/dist/native/cli.js +1 -0
- package/dist/native/cli.js.map +1 -1
- package/dist/native/compiler.js +1 -3
- package/dist/native/compiler.js.map +1 -1
- package/dist/native/prepare.js +1 -0
- package/dist/native/prepare.js.map +1 -1
- package/dist/native/sanitizer.test.js +1 -0
- package/dist/native/sanitizer.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +896 -49
|
@@ -9,21 +9,40 @@ function increment(id, value) {
|
|
|
9
9
|
return null;
|
|
10
10
|
return value.op === "+" ? value.right.value : value.op === "-" ? -value.right.value : null;
|
|
11
11
|
}
|
|
12
|
+
/** The counter step `counter + s` (or `counter - s`) adds on each update
|
|
13
|
+
* when `s` is a binding: its operand and sign. A constant step is
|
|
14
|
+
* `increment`'s. */
|
|
15
|
+
function variableIncrement(id, value) {
|
|
16
|
+
if (value.kind !== "bin" ||
|
|
17
|
+
value.left.kind !== "varRef" ||
|
|
18
|
+
value.left.localId !== id ||
|
|
19
|
+
value.right.kind !== "varRef" ||
|
|
20
|
+
value.right.localId === id ||
|
|
21
|
+
(value.op !== "+" && value.op !== "-"))
|
|
22
|
+
return null;
|
|
23
|
+
return { localId: value.right.localId, sign: value.op === "+" ? 1 : -1 };
|
|
24
|
+
}
|
|
12
25
|
/** Bound secondary cursors by a finite ascending loop's maximum iteration
|
|
13
26
|
* count. Sum all syntactic updates, including both sides of branches, so
|
|
14
27
|
* filtering, breaks and continues can only reduce the budget. A nested
|
|
15
|
-
* loop or opaque control region invalidates the bindings it writes.
|
|
28
|
+
* loop or opaque control region invalidates the bindings it writes.
|
|
29
|
+
*
|
|
30
|
+
* The counter's step is a positive integer literal or a binding the loop
|
|
31
|
+
* never writes whose entry fact is a positive integer range (the sieve's
|
|
32
|
+
* `j += i`): every update then adds an exact integer in that range, so the
|
|
33
|
+
* counter climbs from its start to at most the limit plus the largest
|
|
34
|
+
* step. */
|
|
16
35
|
export function boundedIntegerLoopFacts(loop, locals, initial) {
|
|
17
36
|
const result = new Map();
|
|
18
37
|
if (loop.init?.kind !== "varDecl" || loop.update?.kind !== "assign" || loop.cond?.kind !== "bin")
|
|
19
38
|
return result;
|
|
20
39
|
const counter = loop.init.localId, start = initial.get(counter);
|
|
21
|
-
const
|
|
40
|
+
const constant = loop.update.localId === counter ? increment(counter, loop.update.value) : null;
|
|
41
|
+
const variable = loop.update.localId === counter ? variableIncrement(counter, loop.update.value) : null;
|
|
22
42
|
if (!start ||
|
|
23
43
|
start.min < 0 ||
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
step > 2147483647 ||
|
|
44
|
+
(constant === null && variable === null) ||
|
|
45
|
+
(constant !== null && (constant <= 0 || constant > 2147483647)) ||
|
|
27
46
|
loop.cond.left.kind !== "varRef" ||
|
|
28
47
|
loop.cond.left.localId !== counter ||
|
|
29
48
|
(loop.cond.op !== "<" && loop.cond.op !== "<="))
|
|
@@ -88,15 +107,31 @@ export function boundedIntegerLoopFacts(loop, locals, initial) {
|
|
|
88
107
|
return { min: 0, max: Number.MAX_SAFE_INTEGER };
|
|
89
108
|
return null;
|
|
90
109
|
}
|
|
110
|
+
let step;
|
|
111
|
+
if (constant !== null)
|
|
112
|
+
step = { min: constant, max: constant };
|
|
113
|
+
else {
|
|
114
|
+
// The step binding is read on every update; it must keep one value.
|
|
115
|
+
const operand = variable.localId;
|
|
116
|
+
const range = stable(operand) ? initial.get(operand) : undefined;
|
|
117
|
+
if (!range)
|
|
118
|
+
return result;
|
|
119
|
+
step =
|
|
120
|
+
variable.sign > 0
|
|
121
|
+
? { min: range.min, max: range.max }
|
|
122
|
+
: { min: -range.max, max: -range.min };
|
|
123
|
+
if (step.min <= 0 || step.max > 2147483647)
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
91
126
|
const limit = bound(loop.cond.right);
|
|
92
127
|
if (!limit || limit.max < start.min)
|
|
93
128
|
return result;
|
|
94
129
|
const distance = limit.max - start.min;
|
|
95
|
-
const iterations = Math.floor(distance / step) + 1;
|
|
130
|
+
const iterations = Math.floor(distance / step.min) + 1;
|
|
96
131
|
if (!Number.isSafeInteger(distance) || !Number.isSafeInteger(iterations))
|
|
97
132
|
return result;
|
|
98
133
|
// Header facts also cover the failing final condition and zero iterations.
|
|
99
|
-
const maximum = Math.max(start.max, limit.max + step);
|
|
134
|
+
const maximum = Math.max(start.max, limit.max + step.max);
|
|
100
135
|
if (Number.isSafeInteger(maximum))
|
|
101
136
|
result.set(counter, { min: start.min, max: maximum });
|
|
102
137
|
for (const [id, hi] of upper) {
|
|
@@ -114,6 +149,119 @@ export function boundedIntegerLoopFacts(loop, locals, initial) {
|
|
|
114
149
|
}
|
|
115
150
|
return result;
|
|
116
151
|
}
|
|
152
|
+
/** Bound counters of a while loop by its condition. A counter qualifies when
|
|
153
|
+
* the loop (condition and body) changes it only by increments of positive
|
|
154
|
+
* integer literals outside nested loops, switch and exception regions, and a
|
|
155
|
+
* conjunct of the condition compares it below a literal or a binding the loop
|
|
156
|
+
* never writes (`while (x * x + y * y <= 4 && it < MAX) it++`). The body runs
|
|
157
|
+
* only after that conjunct held, and the condition never writes the counter,
|
|
158
|
+
* so every pass starts at most at the conjunct's bound and climbs by at most
|
|
159
|
+
* the sum of the body's increments. The counter starts at its entry fact and
|
|
160
|
+
* only grows, so the range holds at every read inside and after the loop. */
|
|
161
|
+
export function guardedLoopCounterFacts(loop, locals, initial) {
|
|
162
|
+
const result = new Map();
|
|
163
|
+
const budget = new Map(), refused = new Set();
|
|
164
|
+
let opaque = 0;
|
|
165
|
+
const write = (id, delta) => {
|
|
166
|
+
if (opaque || delta === null || delta <= 0 || delta > 2147483647)
|
|
167
|
+
refused.add(id);
|
|
168
|
+
else
|
|
169
|
+
budget.set(id, (budget.get(id) ?? 0) + delta);
|
|
170
|
+
};
|
|
171
|
+
const expr = (e) => {
|
|
172
|
+
if (e.kind === "assignExpr")
|
|
173
|
+
write(e.localId, increment(e.localId, e.value));
|
|
174
|
+
if (e.kind === "incDec")
|
|
175
|
+
write(e.localId, e.op === "+" ? 1 : null);
|
|
176
|
+
return everyExprChild(e, expr, stmt);
|
|
177
|
+
};
|
|
178
|
+
const stmt = (s) => {
|
|
179
|
+
const region = s.kind === "for" ||
|
|
180
|
+
s.kind === "while" ||
|
|
181
|
+
s.kind === "doWhile" ||
|
|
182
|
+
s.kind === "forOf" ||
|
|
183
|
+
s.kind === "tryCatch" ||
|
|
184
|
+
s.kind === "switch";
|
|
185
|
+
if (region)
|
|
186
|
+
opaque++;
|
|
187
|
+
if (s.kind === "assign")
|
|
188
|
+
write(s.localId, increment(s.localId, s.value));
|
|
189
|
+
if (s.kind === "varDecl" || s.kind === "forOf")
|
|
190
|
+
write(s.localId, null);
|
|
191
|
+
if (s.kind === "tryCatch" && s.catchLocalId)
|
|
192
|
+
write(s.catchLocalId, null);
|
|
193
|
+
const completed = everyStmtChild(s, expr, stmt);
|
|
194
|
+
if (region)
|
|
195
|
+
opaque--;
|
|
196
|
+
return completed;
|
|
197
|
+
};
|
|
198
|
+
// The condition is evaluated before every pass; a write there would
|
|
199
|
+
// separate the compared value from the one the body sees.
|
|
200
|
+
const condition = new Set();
|
|
201
|
+
const conditionWrites = (e) => {
|
|
202
|
+
if (e.kind === "assignExpr" || e.kind === "incDec")
|
|
203
|
+
condition.add(e.localId);
|
|
204
|
+
return everyExprChild(e, conditionWrites, (s) => {
|
|
205
|
+
opaque++;
|
|
206
|
+
stmt(s);
|
|
207
|
+
opaque--;
|
|
208
|
+
return true;
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
conditionWrites(loop.cond);
|
|
212
|
+
for (const id of condition)
|
|
213
|
+
refused.add(id);
|
|
214
|
+
loop.body.every(stmt);
|
|
215
|
+
const stable = (id) => {
|
|
216
|
+
const local = locals.get(id);
|
|
217
|
+
return local !== undefined && !local.boxed && !local.tdz && !budget.has(id) && !refused.has(id);
|
|
218
|
+
};
|
|
219
|
+
const limit = (e) => {
|
|
220
|
+
if (e.kind === "numLit" && Number.isSafeInteger(e.value) && !Object.is(e.value, -0))
|
|
221
|
+
return { min: e.value, max: e.value };
|
|
222
|
+
if (e.kind === "varRef" && stable(e.localId))
|
|
223
|
+
return initial.get(e.localId) ?? null;
|
|
224
|
+
return null;
|
|
225
|
+
};
|
|
226
|
+
// Conjuncts that hold whenever the body runs.
|
|
227
|
+
const conjuncts = [];
|
|
228
|
+
const collect = (e) => {
|
|
229
|
+
if (e.kind === "toBool")
|
|
230
|
+
collect(e.operand);
|
|
231
|
+
else if (e.kind === "logical" && e.op === "&&") {
|
|
232
|
+
collect(e.left);
|
|
233
|
+
collect(e.right);
|
|
234
|
+
}
|
|
235
|
+
else
|
|
236
|
+
conjuncts.push(e);
|
|
237
|
+
};
|
|
238
|
+
collect(loop.cond);
|
|
239
|
+
const ceiling = new Map();
|
|
240
|
+
for (const c of conjuncts) {
|
|
241
|
+
if (c.kind !== "bin")
|
|
242
|
+
continue;
|
|
243
|
+
// `counter < bound` or `bound > counter` (and the inclusive forms).
|
|
244
|
+
const below = c.op === "<" || c.op === "<=", above = c.op === ">" || c.op === ">=";
|
|
245
|
+
const counter = below ? c.left : above ? c.right : null, other = below ? c.right : c.left;
|
|
246
|
+
if (counter?.kind !== "varRef")
|
|
247
|
+
continue;
|
|
248
|
+
const bound = limit(other);
|
|
249
|
+
if (!bound)
|
|
250
|
+
continue;
|
|
251
|
+
const hi = c.op === "<" || c.op === ">" ? bound.max - 1 : bound.max;
|
|
252
|
+
const previous = ceiling.get(counter.localId);
|
|
253
|
+
ceiling.set(counter.localId, previous === undefined ? hi : Math.min(previous, hi));
|
|
254
|
+
}
|
|
255
|
+
for (const [id, step] of budget) {
|
|
256
|
+
const local = locals.get(id), start = initial.get(id), hi = ceiling.get(id);
|
|
257
|
+
if (refused.has(id) || !local || local.boxed || local.tdz || !start || hi === undefined)
|
|
258
|
+
continue;
|
|
259
|
+
const max = Math.max(start.max, hi + step);
|
|
260
|
+
if (Number.isSafeInteger(start.min) && Number.isSafeInteger(max))
|
|
261
|
+
result.set(id, { min: start.min, max });
|
|
262
|
+
}
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
117
265
|
/** Recognize only exits whose target cannot be inside this statement list.
|
|
118
266
|
* Labeled blocks, loops, switch and exception regions retain the join. */
|
|
119
267
|
export function integerPathFallsThrough(body) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integer-loop-facts.js","sourceRoot":"","sources":["../../src/ir/integer-loop-facts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"integer-loop-facts.js","sourceRoot":"","sources":["../../src/ir/integer-loop-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export interface IntegerRange {
|
|
|
8
8
|
export type IntegerRanges = ReadonlyMap<IrExpr, IntegerRange | null>;
|
|
9
9
|
export declare function integerArithmeticRange(op: string, left: IntegerRange, right: IntegerRange): IntegerRange | null;
|
|
10
10
|
export declare const INT32_RANGE: IntegerRange;
|
|
11
|
+
export declare const NON_NEGATIVE_INT32_RANGE: IntegerRange;
|
|
11
12
|
export declare function withinInt32(range: IntegerRange | null | undefined): boolean;
|
|
12
13
|
export declare function withinUint32(range: IntegerRange | null | undefined): boolean;
|
|
13
14
|
export type BitwiseOp = "&" | "|" | "^" | "<<" | ">>" | ">>>";
|
|
@@ -43,9 +44,11 @@ export interface IntegerSlotFacts {
|
|
|
43
44
|
* but argument expressions can; unknown evaluation forms invalidate all
|
|
44
45
|
* syntactically written slots before their children are inspected. Loops
|
|
45
46
|
* discard loop-carried facts and retain only invariant or induction facts,
|
|
46
|
-
* except closed locals: a local whose region-entry value is
|
|
47
|
-
* uint32) and whose every write inside
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
47
|
+
* except closed locals: a local whose region-entry value is inside a fixed
|
|
48
|
+
* bound (int32, uint32 or non-negative int32) and whose every write inside
|
|
49
|
+
* the region evaluates inside it, assuming every such local is (bitwise
|
|
50
|
+
* results, exact `+ - * %` over in-range operands such as
|
|
51
|
+
* `v = (v * 31 + n) % 1000003`, literals and slots in range), keeps the
|
|
52
|
+
* range those writes and its entry value span across the region.
|
|
53
|
+
* Suspensions and captured bindings deliberately remain outside the proof. */
|
|
51
54
|
export declare function analyzeIntegerRanges(fn: IrFunction, slots?: IntegerSlotFacts): IntegerRanges;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { everyExprChild, everyStmtChild, everyStmtList } from "./traverse.js";
|
|
2
2
|
import { byteNumberAccess, byteNumberRange } from "./byte-numbers.js";
|
|
3
|
-
import { boundedIntegerLoopFacts, integerPathFallsThrough } from "./integer-loop-facts.js";
|
|
3
|
+
import { boundedIntegerLoopFacts, guardedLoopCounterFacts, integerPathFallsThrough, } from "./integer-loop-facts.js";
|
|
4
4
|
const SIGNED = { min: -2147483648, max: 2147483647 };
|
|
5
5
|
const UNSIGNED = { min: 0, max: 4294967295 };
|
|
6
|
+
/** Int32 and uint32 at once: the bound under which `%` (modeled only for
|
|
7
|
+
* non-negative dividends) can close a loop-carried local. */
|
|
8
|
+
const NON_NEGATIVE = { min: 0, max: 2147483647 };
|
|
6
9
|
const EXACT_LIMIT = 2 ** 53;
|
|
7
10
|
/** The most UTF-16 code units a runtime string holds: SCR_STR_MAX_CAP
|
|
8
11
|
* (scr_runtime.h) caps a string's UTF-8 bytes, and a UTF-16 length never
|
|
@@ -51,6 +54,7 @@ export function integerArithmeticRange(op, left, right) {
|
|
|
51
54
|
return Number.isSafeInteger(min) && Number.isSafeInteger(max) ? { min, max } : null;
|
|
52
55
|
}
|
|
53
56
|
export const INT32_RANGE = SIGNED;
|
|
57
|
+
export const NON_NEGATIVE_INT32_RANGE = NON_NEGATIVE;
|
|
54
58
|
export function withinInt32(range) {
|
|
55
59
|
return !!range && range.min >= SIGNED.min && range.max <= SIGNED.max;
|
|
56
60
|
}
|
|
@@ -181,11 +185,13 @@ export function bitwiseIdentityOperand(e) {
|
|
|
181
185
|
* but argument expressions can; unknown evaluation forms invalidate all
|
|
182
186
|
* syntactically written slots before their children are inspected. Loops
|
|
183
187
|
* discard loop-carried facts and retain only invariant or induction facts,
|
|
184
|
-
* except closed locals: a local whose region-entry value is
|
|
185
|
-
* uint32) and whose every write inside
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
188
|
+
* except closed locals: a local whose region-entry value is inside a fixed
|
|
189
|
+
* bound (int32, uint32 or non-negative int32) and whose every write inside
|
|
190
|
+
* the region evaluates inside it, assuming every such local is (bitwise
|
|
191
|
+
* results, exact `+ - * %` over in-range operands such as
|
|
192
|
+
* `v = (v * 31 + n) % 1000003`, literals and slots in range), keeps the
|
|
193
|
+
* range those writes and its entry value span across the region.
|
|
194
|
+
* Suspensions and captured bindings deliberately remain outside the proof. */
|
|
189
195
|
export function analyzeIntegerRanges(fn, slots = {}) {
|
|
190
196
|
const ranges = new Map();
|
|
191
197
|
if (fn.async || fn.generator)
|
|
@@ -253,22 +259,31 @@ export function analyzeIntegerRanges(fn, slots = {}) {
|
|
|
253
259
|
return { values, declared };
|
|
254
260
|
}
|
|
255
261
|
let functionWrites = null;
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
*
|
|
262
|
+
const noInvariants = new Map();
|
|
263
|
+
/** Locals that hold an exact integer inside a fixed bound (int32, uint32
|
|
264
|
+
* or non-negative int32) everywhere inside and after a region whose
|
|
265
|
+
* control flow this analysis does not follow, with a range inside that
|
|
266
|
+
* bound. A candidate either enters with a fact inside the bound or is
|
|
259
267
|
* declared inside the region and written only there (definite assignment:
|
|
260
|
-
* every read follows one of those writes). For each
|
|
261
|
-
* fixpoint keeps candidates whose every write
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
|
|
268
|
+
* every read follows one of those writes). For each bound, the greatest
|
|
269
|
+
* fixpoint keeps candidates whose every write evaluates inside it, by the
|
|
270
|
+
* same interval rules as `expr` (exact safe integers, never -0), while the
|
|
271
|
+
* candidates are assumed inside it; the closures are independent, so a
|
|
272
|
+
* local written both ways (`x | 0` and `x >>> 0`) closes under neither
|
|
273
|
+
* int32 nor uint32. `invariant` holds ranges of locals that hold at every
|
|
274
|
+
* read inside the region (an induction counter the body never writes).
|
|
275
|
+
*
|
|
276
|
+
* The closed range then narrows to the entry fact joined with the writes'
|
|
277
|
+
* values under the bound: by induction over the region's execution every
|
|
278
|
+
* candidate stays inside its narrowed range (itself inside the bound), so
|
|
279
|
+
* each write evaluates inside the hull the bound proved for it. */
|
|
280
|
+
function closedLocals(nodes, entry, invariant) {
|
|
265
281
|
const { values, declared } = regionWrites(nodes);
|
|
266
282
|
const result = new Map();
|
|
267
283
|
if (values.size === 0)
|
|
268
284
|
return result;
|
|
269
285
|
const within = (bound, range) => !!range && range.min >= bound.min && range.max <= bound.max;
|
|
270
286
|
const closure = (bound) => {
|
|
271
|
-
const signed = bound === SIGNED;
|
|
272
287
|
const closed = new Set();
|
|
273
288
|
for (const [id, list] of values) {
|
|
274
289
|
if (within(bound, entry.get(id)))
|
|
@@ -279,60 +294,114 @@ export function analyzeIntegerRanges(fn, slots = {}) {
|
|
|
279
294
|
closed.add(id);
|
|
280
295
|
}
|
|
281
296
|
}
|
|
282
|
-
|
|
297
|
+
// The values an expression can produce while every closed candidate
|
|
298
|
+
// holds a value inside `bound`, or null.
|
|
299
|
+
const value = (e) => {
|
|
283
300
|
if (e.type.kind !== "f64")
|
|
284
|
-
return
|
|
301
|
+
return null;
|
|
285
302
|
switch (e.kind) {
|
|
286
303
|
case "numLit":
|
|
287
|
-
return
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
case "bin":
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
case "
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
304
|
+
return Number.isSafeInteger(e.value) && !Object.is(e.value, -0)
|
|
305
|
+
? { min: e.value, max: e.value }
|
|
306
|
+
: null;
|
|
307
|
+
case "bin": {
|
|
308
|
+
const left = value(e.left), right = value(e.right);
|
|
309
|
+
if (isBitwiseOp(e.op))
|
|
310
|
+
return bitwiseRange(e.op, operandView(e.left, left), operandView(e.right, right));
|
|
311
|
+
return left && right ? integerArithmeticRange(e.op, left, right) : null;
|
|
312
|
+
}
|
|
313
|
+
case "unary": {
|
|
314
|
+
const operand = value(e.operand);
|
|
315
|
+
if (e.op === "~") {
|
|
316
|
+
const bits = int32View(operandView(e.operand, operand));
|
|
317
|
+
return { min: -bits.max - 1, max: -bits.min - 1 };
|
|
318
|
+
}
|
|
319
|
+
// -x is -0 for x = 0.
|
|
320
|
+
return e.op === "-" && operand && (operand.max < 0 || operand.min > 0)
|
|
321
|
+
? { min: -operand.max, max: -operand.min }
|
|
322
|
+
: null;
|
|
323
|
+
}
|
|
324
|
+
case "libCall": {
|
|
325
|
+
if (e.fn === "math.imul")
|
|
326
|
+
return SIGNED;
|
|
327
|
+
if (e.fn === "math.clz32")
|
|
328
|
+
return { min: 0, max: 32 };
|
|
329
|
+
if ((e.fn === "math.min" || e.fn === "math.max") && e.args.length > 0) {
|
|
330
|
+
const args = e.args.map(value);
|
|
331
|
+
if (args.some((a) => a === null))
|
|
332
|
+
return null;
|
|
333
|
+
const known = args;
|
|
334
|
+
const mins = known.map((a) => a.min), maxes = known.map((a) => a.max);
|
|
335
|
+
return e.fn === "math.min"
|
|
336
|
+
? { min: Math.min(...mins), max: Math.min(...maxes) }
|
|
337
|
+
: { min: Math.max(...mins), max: Math.max(...maxes) };
|
|
338
|
+
}
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
case "ternary": {
|
|
342
|
+
const yes = value(e.then), no = value(e.else_);
|
|
343
|
+
return yes && no ? union(yes, no) : null;
|
|
344
|
+
}
|
|
345
|
+
case "logical": {
|
|
346
|
+
const left = value(e.left), right = value(e.right);
|
|
347
|
+
return left && right ? union(left, right) : null;
|
|
348
|
+
}
|
|
302
349
|
case "assignExpr":
|
|
303
|
-
return
|
|
350
|
+
return value(e.value);
|
|
304
351
|
case "seqExpr":
|
|
305
|
-
return
|
|
306
|
-
case "varRef":
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
352
|
+
return value(e.result);
|
|
353
|
+
case "varRef": {
|
|
354
|
+
const known = invariant.get(e.localId);
|
|
355
|
+
if (known)
|
|
356
|
+
return known;
|
|
357
|
+
if (closed.has(e.localId))
|
|
358
|
+
return bound;
|
|
359
|
+
if (!values.has(e.localId) && entry.has(e.localId))
|
|
360
|
+
return entry.get(e.localId);
|
|
361
|
+
return boxedRange(e.localId);
|
|
362
|
+
}
|
|
310
363
|
case "fieldGet":
|
|
311
364
|
case "call":
|
|
312
|
-
return
|
|
365
|
+
return slotRange(e);
|
|
313
366
|
default:
|
|
314
|
-
return
|
|
367
|
+
return null;
|
|
315
368
|
}
|
|
316
369
|
};
|
|
370
|
+
const hulls = new Map();
|
|
317
371
|
for (let changed = true; changed;) {
|
|
318
372
|
changed = false;
|
|
319
|
-
for (const id of closed)
|
|
320
|
-
|
|
373
|
+
for (const id of closed) {
|
|
374
|
+
let hull = entry.get(id) ?? null;
|
|
375
|
+
for (const write of values.get(id)) {
|
|
376
|
+
const range = write && value(write);
|
|
377
|
+
if (!within(bound, range)) {
|
|
378
|
+
hull = null;
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
hull = hull ? union(hull, range) : range;
|
|
382
|
+
}
|
|
383
|
+
if (hull)
|
|
384
|
+
hulls.set(id, hull);
|
|
385
|
+
else {
|
|
321
386
|
closed.delete(id);
|
|
322
387
|
changed = true;
|
|
323
388
|
}
|
|
389
|
+
}
|
|
324
390
|
}
|
|
325
|
-
return closed;
|
|
391
|
+
return new Map([...closed].map((id) => [id, hulls.get(id)]));
|
|
326
392
|
};
|
|
327
|
-
const
|
|
393
|
+
const closures = [closure(SIGNED), closure(UNSIGNED), closure(NON_NEGATIVE)];
|
|
328
394
|
for (const id of entry.keys()) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
395
|
+
let range = null;
|
|
396
|
+
for (const closed of closures) {
|
|
397
|
+
const hull = closed.get(id);
|
|
398
|
+
if (hull)
|
|
399
|
+
range = range
|
|
400
|
+
? { min: Math.max(range.min, hull.min), max: Math.min(range.max, hull.max) }
|
|
401
|
+
: hull;
|
|
402
|
+
}
|
|
403
|
+
if (range)
|
|
404
|
+
result.set(id, range);
|
|
336
405
|
}
|
|
337
406
|
return result;
|
|
338
407
|
}
|
|
@@ -379,7 +448,11 @@ export function analyzeIntegerRanges(fn, slots = {}) {
|
|
|
379
448
|
* locals at their closed range. `entry` is the state before any of the
|
|
380
449
|
* region's writes can run. */
|
|
381
450
|
function havoc(facts, nodes, entry) {
|
|
382
|
-
|
|
451
|
+
havocWith(facts, nodes, entry, noInvariants);
|
|
452
|
+
}
|
|
453
|
+
/** `havoc` with ranges that hold at every read inside the region. */
|
|
454
|
+
function havocWith(facts, nodes, entry, invariant) {
|
|
455
|
+
const closed = closedLocals(nodes, entry, invariant);
|
|
383
456
|
invalidate(facts, nodes);
|
|
384
457
|
for (const [id, range] of closed)
|
|
385
458
|
facts.set(id, range);
|
|
@@ -697,7 +770,19 @@ export function analyzeIntegerRanges(fn, slots = {}) {
|
|
|
697
770
|
const counter = induction(s, facts);
|
|
698
771
|
const bounded = boundedIntegerLoopFacts(s, loopLocals, facts);
|
|
699
772
|
const loop = new Map(facts);
|
|
700
|
-
|
|
773
|
+
// Only the update writes the counter, so its header range holds at
|
|
774
|
+
// every read in the condition, the body and the update.
|
|
775
|
+
const invariant = new Map();
|
|
776
|
+
if (counter)
|
|
777
|
+
invariant.set(counter.id, counter.range);
|
|
778
|
+
if (s.init?.kind === "varDecl") {
|
|
779
|
+
const id = s.init.localId, range = bounded.get(id), other = invariant.get(id);
|
|
780
|
+
if (range)
|
|
781
|
+
invariant.set(id, other
|
|
782
|
+
? { min: Math.max(range.min, other.min), max: Math.min(range.max, other.max) }
|
|
783
|
+
: range);
|
|
784
|
+
}
|
|
785
|
+
havocWith(loop, [...s.body, ...(s.cond ? [s.cond] : []), ...(s.update ? [s.update] : [])], loop, invariant);
|
|
701
786
|
if (counter)
|
|
702
787
|
loop.set(counter.id, counter.range);
|
|
703
788
|
for (const [id, range] of bounded)
|
|
@@ -732,8 +817,13 @@ export function analyzeIntegerRanges(fn, slots = {}) {
|
|
|
732
817
|
}
|
|
733
818
|
case "while":
|
|
734
819
|
case "doWhile": {
|
|
820
|
+
// Counters the condition bounds keep their range at every read
|
|
821
|
+
// inside and after the loop.
|
|
822
|
+
const guarded = s.kind === "while" ? guardedLoopCounterFacts(s, loopLocals, facts) : noInvariants;
|
|
735
823
|
const loop = new Map(facts);
|
|
736
|
-
|
|
824
|
+
havocWith(loop, [s], loop, guarded);
|
|
825
|
+
for (const [id, range] of guarded)
|
|
826
|
+
set(loop, id, range);
|
|
737
827
|
const header = new Map(loop);
|
|
738
828
|
expr(s.cond, header);
|
|
739
829
|
if (s.kind === "while") {
|
|
@@ -742,7 +832,9 @@ export function analyzeIntegerRanges(fn, slots = {}) {
|
|
|
742
832
|
}
|
|
743
833
|
else
|
|
744
834
|
body(s.body, new Map(loop));
|
|
745
|
-
|
|
835
|
+
havocWith(facts, [s], facts, guarded);
|
|
836
|
+
for (const [id, range] of guarded)
|
|
837
|
+
set(facts, id, range);
|
|
746
838
|
break;
|
|
747
839
|
}
|
|
748
840
|
case "forOf": {
|