Repository navigation
[TS] Model property presence and mutations on symbolic objects (#425) - #458
Open
CaelmBleidd wants to merge 18 commits into
Open
CaelmBleidd wants to merge 18 commits into
CaelmBleidd wants to merge 18 commits into
Conversation
CaelmBleidd
force-pushed
the
caelmbleidd/ts-425-in-operator
branch
from
October 2, 2026 22:49
ad924e9 to
15babc4
Compare
in (#425)
CaelmBleidd
changed the base branch from
main
to
caelmbleidd/ts-426-delete-property
October 2, 2026 22:50
CaelmBleidd
force-pushed
the
caelmbleidd/ts-425-in-operator
branch
2 times, most recently
from
October 3, 2026 00:02
7d41c41 to
f28d30c
Compare
CaelmBleidd
force-pushed
the
caelmbleidd/ts-426-delete-property
branch
from
October 3, 2026 05:28
8add94d to
3a06f16
Compare
CaelmBleidd
force-pushed
the
caelmbleidd/ts-425-in-operator
branch
2 times, most recently
from
October 3, 2026 05:54
a69dc98 to
a7cf800
Compare
CaelmBleidd
marked this pull request as ready for review
October 3, 2026 06:43
CaelmBleidd
force-pushed
the
caelmbleidd/ts-426-delete-property
branch
from
October 7, 2026 22:16
b33728a to
2f50d8e
Compare
CaelmBleidd
force-pushed
the
caelmbleidd/ts-425-in-operator
branch
from
October 7, 2026 22:16
39e51e9 to
ffe2cb8
Compare
CaelmBleidd
force-pushed
the
caelmbleidd/ts-426-delete-property
branch
from
October 9, 2026 12:54
2f50d8e to
36e6d55
Compare
CaelmBleidd
force-pushed
the
caelmbleidd/ts-425-in-operator
branch
from
October 9, 2026 13:27
ffe2cb8 to
4e4f174
Compare
Use the standard forker for conditional heap references and share literal and prototype helpers. Separate field read stages, reuse unresolved-value joins, and name the write/delete region after property mutations. Replace the empty structural object filter with an explicit runtime object type and retain the default Object candidate when enumerating virtual receivers.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #425.
Object literals and symbolic input objects now track property presence separately from the stored value. After
obj.fresh = undefined,"fresh" in objis true; afterdelete obj.fresh, it is false and reads returnundefined. Writes can add undeclared fields and change their runtime kind without requiring the receiver's nominal type to declare that field.TsOptions.inputPropertyPresencecontrols initial own-property assumptions for symbolic inputs:DECLARED_FIELDS(default)SYMBOLICASSUME_PRESENTASSUME_ABSENTWrites and deletions override every policy. A present optional property may still contain
undefined.Supported behavior:
inkeys, including numeric, empty, and Unicode names.typeof, strict equality, string length/concatenation, and before/after snapshots for the covered scenarios.Conditional heap references use
StepScope.fork: the cached model orders the branches, and every other feasible receiver is scheduled at the same statement. Array storage lookup consumes the resulting leaf reference. Shared helpers resolve an object literal's own declaration, check unsupported prototype behavior, and join unresolved payloads with their kind selectors. Field reads separate presence, storage selection, initial annotation constraints, and value materialization; initial string constraints apply only while the initial value is active. An explicit internal runtime-object type replaces the empty structural-type filter. Mutation regions are named for both writes and deletions.The one-line core fix forwards
ignoreNullRefswhen splitting conditional references. Without it, copying an absent field loses its undefined branch; both the core round-trip regression and a Node-replayed unknown-value copy reproduce the defect.Symbolic keys, prototype lookup/mutation (including class prototype methods), named input-array properties, and
inon arrays remain explicit unsupported outcomes. Arrays stored in object properties support element reads and writes.Validation on
ff1890aa4:usvm-ts: 1035 passed, 142 skipped, 0 failures.usvm-ts-calls: 13 passed, 0 failures.discoverPropertiesand replay; unsupported outcomes retain separate checks.git diff --checkpassed.Remote CI is reported separately on the PR.