Skip to content

perf: O(1) upvalue access by storing upvalues as a tuple#155

Merged
davydog187 merged 1 commit intomainfrom
perf/upvalue-tuple-access
Feb 27, 2026
Merged

perf: O(1) upvalue access by storing upvalues as a tuple#155
davydog187 merged 1 commit intomainfrom
perf/upvalue-tuple-access

Conversation

@davydog187
Copy link
Contributor

Summary

Convert the upvalue list stored in {:lua_closure, proto, upvalues} from a list to an Erlang tuple, replacing O(N) Enum.at/2 accesses with O(1) elem/2.

Changes:

  • executor.ex :closure handler: wrap captured_upvalues with List.to_tuple/1 before building the closure
  • executor.ex get_upvalue / set_upvalue handlers: Enum.at(upvalues, index)elem(upvalues, index)
  • executor.ex :parent_upvalue case (inside closure capture): Enum.atelem
  • stdlib.ex lua_load: empty upvalues %{}{}
  • test/support/lua_test_case.ex dofile helper: empty upvalues []{}

For deeply nested closures with many upvalues (e.g. fib capturing outer-scope variables), every upvalue read/write was O(N) in the number of upvalues. This makes it O(1).

Test plan

  • All 1273 existing tests pass with 0 failures

🤖 Generated with Claude Code

Convert the upvalue list stored in lua_closure tuples to an Erlang
tuple, enabling O(1) indexed access via elem/2 instead of O(N)
linear scans via Enum.at/2.

Changes:
- executor.ex :closure handler: wrap captured_upvalues with
  List.to_tuple/1 before building the closure
- executor.ex get_upvalue/set_upvalue: Enum.at -> elem
- executor.ex :parent_upvalue case: Enum.at -> elem
- stdlib.ex lua_load: empty upvalues %{} -> {}
- test/support/lua_test_case.ex dofile helper: empty upvalues [] -> {}

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@davydog187 davydog187 force-pushed the perf/upvalue-tuple-access branch from 16ecec4 to 4d4a145 Compare February 27, 2026 01:43
@davydog187 davydog187 merged commit bac48ef into main Feb 27, 2026
2 checks passed
@davydog187 davydog187 deleted the perf/upvalue-tuple-access branch February 27, 2026 01:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant