Skip to content

feat(resolver): resolve calls through Object.defineProperty / defineProperties / create #1320

@carlos-alm

Description

@carlos-alm

Source

Jelly micro-test benchmark (PR #1304). defineProperty scores 0% recall (0/6 named edges).

Pattern

function defProp() {
    const obj = {};
    Object.defineProperty(obj, "f", { value: f1 });
    obj.f();  // ← should resolve to f1
}
defProp();  // Edge: defProp → f1 (missed)

function defProps() {
    const obj = {};
    Object.defineProperties(obj, {
        "f1": { value: f1 },
        "f2": { value: f2 },
    });
    obj.f1(); obj.f2();  // ← should resolve to f1, f2
}

function create() {
    const obj = Object.create({ f1, f2 });
    obj.f1(); obj.f2();  // ← should resolve via prototype
}

Named edges missed:

  • f1 → defProp, f1 → defProps, f1 → create (6 total)

What's needed

When the resolver sees Object.defineProperty(obj, "key", { value: expr }):

  1. Record that obj.key resolves to expr
  2. Propagate to call sites obj.key()

Similarly for Object.defineProperties(obj, { key: { value: expr } }) and Object.create({ key: expr }).

This is primarily a lookup-table issue at the WASM extractor level — the property descriptor's value field needs to be tracked as a property assignment.

Impact

  • 6 named edges in defineProperty fixture
  • Object.defineProperty is used heavily in polyfills, Vue reactivity, class field transpilation

Fixture

tests/benchmarks/resolution/fixtures/jelly-micro/defineProperty/defineProperty.js

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions