v1.0.0
What's Changed
- feat: lexer / parser in Elixir by @davydog187 in #95
- feat: add comments to the AST by @davydog187 in #96
- feat: compiler and register-based VM (Phase 0: Arithmetic operations) by @davydog187 in #98
- Phase 2: Global variables with register assignment by @davydog187 in #99
- feat(vm): Local variables by @davydog187 in #100
- feat(vm): Conditionals by @davydog187 in #101
- feat(vm): Loops by @davydog187 in #102
- feat(vm): Basic Functions by @davydog187 in #103
- feat(vm): Closures by @davydog187 in #104
- feat(vm): Upvalues by @davydog187 in #105
- feat: add AGENTS.md and CLAUDE.md by @davydog187 in #107
- feat(vm): Tables by @davydog187 in #106
- feat(vm): Native Function Calls by @davydog187 in #108
- feat(vm): Generic For, Varargs, and Multiple Returns by @davydog187 in #109
- feat(vm): String Concatenation by @davydog187 in #110
- feat(vm): value encoding/decoding by @davydog187 in #111
- feat(vm): integrate new Parser / Compiler / VM by @davydog187 in #112
- feat(vm): Source Line Tracking & Call Stack by @davydog187 in #113
- feat: Beautiful Stack Traces & Error Messages by @davydog187 in #114
- feat: Type-safe arithmetic and comparison operations by @davydog187 in #116
- feat: Protected calls with pcall and xpcall by @davydog187 in #115
- feat: String standard library by @davydog187 in #117
- feat(phase-6): Math & Table Standard Libraries by @davydog187 in #119
- feat(phase-7): Metatables & Metamethods by @davydog187 in #120
- feat(phase-7): Metatables & Metamethods by @davydog187 in #121
- feat(phase-8): Add userdata support by @davydog187 in #122
- feat(phase-8): Add require/package system by @davydog187 in #123
- test: Add ArgumentError tests for setmetatable by @davydog187 in #124
- feat(phase-9): Add Lua 5.3 test suite integration by @davydog187 in #125
- feat: Implement select() stdlib function by @davydog187 in #126
- feat: Add shebang support in lexer by @davydog187 in #127
- feat: Add _G global table by @davydog187 in #128
- Add \z escape sequence to skip whitespace in strings by @davydog187 in #129
- Implement full varargs support for Lua 5.3 by @davydog187 in #130
- feat: integrate styler by @davydog187 in #131
- Implement load function by @davydog187 in #132
- Add Lua function call syntactic sugar and improve parser robustness by @davydog187 in #133
- feat(phase-10): Polish & Remaining TODOs by @davydog187 in #134
- feat(phase-13): String pattern matching engine by @davydog187 in #135
- feat(phase-16): Complete string.format with width/precision by @davydog187 in #136
- feat(phase-11): Compiler Fundamentals by @davydog187 in #137
- feat(phase-12): Complete metamethods support by @davydog187 in #138
- feat(phase-14a): Stubs, bitwise fixes, and math return types by @davydog187 in #140
- feat(phase-15): Debug library and module registration by @davydog187 in #139
- feat(phase-17): Vararg expansion, scope fixes, and suite triage by @davydog187 in #141
- feat: benchmark against Luerl and C Lua by @davydog187 in #143
- fix: LuaJIT in CI by @davydog187 in #150
- fix: test for loops with external variables by @davydog187 in #149
- refactor: split out lua_test language tests by @davydog187 in #151
- perf: right-size register tuple allocations by @davydog187 in #153
- perf: O(N²) → O(N) upvalue collection in closure handler by @davydog187 in #154
- perf: O(1) upvalue access by storing upvalues as a tuple by @davydog187 in #155
- perf: fully tail-recursive CPS executor with line tracking off heap by @davydog187 in #156
- fix: docs variable name by @kevinschweikert in #159
- fix: encode atom to string by @kevinschweikert in #158
- chore: agent orchestration scaffolding by @davydog187 in #160
- chore: link plans to GitHub issues, add A14 for regression by @davydog187 in #175
- chore: sync main and branch off in /next-plan workflow by @davydog187 in #176
- feat(A0): 64-bit integer overflow wrapping for arithmetic and bitwise ops by @davydog187 in #177
- chore(A0): post-merge cleanup by @davydog187 in #178
- test(A1): pin missing-key table read behaviour by @davydog187 in #179
- fix(lexer): handle multi-line comments at every bracket level and main.lua-style headers by @davydog187 in #180
- chore(skill): commit scope is the subsystem, not the plan id by @davydog187 in #181
- chore(skill): front-load commit-scope rule and add pre-push check by @davydog187 in #183
- fix(parser): skip comment tokens between expression-list elements by @davydog187 in #182
- feat(stdlib): pre-populate package.loaded with installed stdlib modules by @davydog187 in #184
- fix(compiler): assign function declaration to in-scope local by @davydog187 in #185
- chore(plan): block A8 on A16 _ENV semantics by @davydog187 in #187
- fix(pattern): unblock pm.lua through line 110 by @davydog187 in #188
- fix(vm): grow register tuple when multi-return expansion overflows by @davydog187 in #189
- fix(pattern): thread VM state through gsub callbacks and fix capture order by @davydog187 in #190
- fix(stdlib): set sentinel before executing required module by @davydog187 in #191
- chore: resolve in-source TODOs by @davydog187 in #194
- chore: upgrade to elixir 1.20, OTP 29 by @davydog187 in #192
- fix(compiler): bind for-loop variable per statement to fix register reuse by @davydog187 in #195
- fix(vm): handle missing upvalue cells in get/set_open_upvalue by @davydog187 in #196
- feat(vm): implement Lua 5.3 _ENV semantics for global access by @davydog187 in #197
- fix(vm): handle Lua 5.3 hex and string coercion for bitwise ops by @davydog187 in #198
- feat(stdlib): implement math.fmod for bitwise.lua bit32 verification by @davydog187 in #199
- fix(vm): align table key semantics with Lua 5.3 §3.4.11 by @davydog187 in #200
- chore(release): refresh README and CHANGELOG for 1.0.0-rc.1 by @davydog187 in #201
- fix(vm): track dead keys so pairs survives mid-iteration deletion by @davydog187 in #202
- fix(vm): pass operands through varargs to metamethod closures by @davydog187 in #203
- fix(vm): float division by zero yields ±math.huge, not raise by @davydog187 in #204
- fix(lexer): treat vertical tab and form feed as whitespace by @davydog187 in #206
- chore(plans): refill ready pipeline with verified-live A7/A8 follow-ups by @davydog187 in #207
- fix(stdlib): table library functions honor __index, __newindex, __len by @davydog187 in #208
- fix(vm): coerce string control values in numeric for (Lua 5.3 §3.3.5) by @davydog187 in #209
- fix(stdlib): expose io as a table of sandboxed stubs by @davydog187 in #210
- fix(vm): // and % with float-zero divisor return inf/nan, not raise by @davydog187 in #211
- fix(vm): route ~= opcode through __eq metamethod by @davydog187 in #212
- fix(vm): make <= and >= fall back through __lt per Lua 5.3 §3.4.4 by @davydog187 in #213
- feat(error): every runtime error carries line and source info by @davydog187 in #214
- fix(error): stdlib bad-arg raises auto-populate line and source by @davydog187 in #215
- test(suite): document deliberate non-goals in lua53 suite by @davydog187 in #216
- feat(stdlib): implement string.pack, string.unpack, string.packsize by @davydog187 in #217
- feat(vm): inspect protocol for VM values via boundary display structs by @davydog187 in #218
- feat(mix): add lua.eval, lua.suite, lua.bench mix tasks by @davydog187 in #220
- fix(parser): thread position through bare-expression and unexpected-end errors by @davydog187 in #222
- fix(error): prune internal frames from Lua.RuntimeException stack by @davydog187 in #221
- perf(vm): fast-path the executor dispatch loop by @davydog187 in #223
- fix: string pack warnings by @davydog187 in #224
- chore(plans): scope B4-B8 perf follow-ups after PR #223 by @davydog187 in #226
- build(benchmarks): add setup_luaport.sh to build luaport against lua@5.4 by @davydog187 in #225
- perf(vm): fast-path Numeric.to_signed_int64 for in-range integers by @davydog187 in #227
- build(bench): add quick mode + multi-n inputs to benchmark harness by @davydog187 in #230
- chore(B7): defer plan; tuple cost crossover makes large tables a regression by @davydog187 in #231
- feat(error): name the callee/target in attempt to call/index errors by @davydog187 in #228
- chore(B4): defer plan; PC+elem dispatch is 9-15% slower than list-cons by @davydog187 in #232
- docs(roadmap): consolidate B-series findings (B4, B6, B7, B8 + harness) by @davydog187 in #234
- plans(B5): pivot from BEAM codegen to dispatcher + bytecode by @davydog187 in #236
- feat(website): interactive Lua showcase site by @davydog187 in #239
- fix: line number attribution for first line by @davydog187 in #240
- perf(vm): add dense bytecode encoding + dispatcher for compiled prototypes by @davydog187 in #237
- fix(parser): canonicalize unexpected-token error shape across five sites by @davydog187 in #241
- fix(stdlib): convert dots to path separators in require() by @davydog187 in #242
- fix(vm): restore caller's open_upvalues after nested execution by @davydog187 in #245
- ci(dialyzer): cache PLT and split build/analyze steps by @davydog187 in #243
- feat(vm/errors): structured error data + fix nested prefix wrapping by @davydog187 in #246
- fix(compiler): expand multi-values in obj:method(...) calls by @davydog187 in #248
- feat(suite): line-range skipping for Lua 5.3 official tests by @davydog187 in #249
- chore: use 1.20.0-rc.6 by @davydog187 in #250
- suite: triage and promote literals/goto/events/nextvar files by @davydog187 in #251
- feat(stdlib): utf8 library + align integer-arith error wording by @davydog187 in #258
- errors: thread operand hints into arith & bitwise type errors by @davydog187 in #270
- fix(compiler): resolve FuncDecl head names at scope analysis by @davydog187 in #274
- perf(vm): dispatcher coverage for table opcodes and :numeric_for by @davydog187 in #275
- perf(vm): dispatcher coverage for closures, varargs, multi-return, loops, self, concat by @davydog187 in #277
- fix(parser): adjust parenthesised call/vararg to a single value by @davydog187 in #278
- feat(vm): configurable max call depth by @davydog187 in #283
- feat(debug): track upvalue names; implement getupvalue/setupvalue by @davydog187 in #285
- fix(vm): close open upvalues at do-block exit by @davydog187 in #286
- test(suite): narrow gc.lua skip to the collectgarbage no-op region by @davydog187 in #287
- feat(pattern): position capture () across find/match/gmatch/gsub by @davydog187 in #288
- fix(vm): match PUC-Lua integer divide/modulo by zero semantics by @davydog187 in #292
- test(vm): pin short-circuit depth-4 semantics; correct constructs skip by @davydog187 in #294
- test(suite): split pm.lua skip into precise sub-ranges by @davydog187 in #295
- fix(stdlib): table.unpack rejects oversized ranges by @davydog187 in #293
- feat(stdlib): implement the os standard library by @davydog187 in #289
- fix(pattern): validate gsub replacement string and value by @davydog187 in #291
- feat(vm): populate debug.getinfo name/namewhat from the call site by @davydog187 in #290
- chore(workflow): add Lua 5.3 suite triage orchestration scripts by @davydog187 in #296
- docs(stdlib): add @SPEC and type defs across the public API by @davydog187 in #301
- fix(vm): close open upvalues at if/while/for/repeat block exit by @davydog187 in #303
- perf(stdlib): iolist string.format and plain-table sort/concat fast paths by @davydog187 in #299
- docs(examples): add runnable embedding examples by @davydog187 in #300
- docs(readme): rewrite for 1.0 positioning, quickstart, and tour by @davydog187 in #298
- chore(suite): narrow constructs.lua skip with per-failure tracking by @davydog187 in #282
- chore(workflow): add PR-feedback-stabilize and ship-issue-batch orchestration scripts by @davydog187 in #315
- chore(workflow): post reviews to PRs and harden worktree git isolation by @davydog187 in #322
- feat(error): lead rendered errors with location and gate ANSI on TTY by @davydog187 in #304
- perf(vm): batch :set_list writes through Table.put_many/2 by @davydog187 in #321
- perf(stdlib): parse string.format flags once, dispatch on integer specifier by @davydog187 in #317
- perf(stdlib): use io_lib.format for string.format float conversion by @davydog187 in #319
- perf(stdlib): batch write-back in table.sort plain fast path by @davydog187 in #318
- perf(stdlib): defer string.format width padding to iolist by @davydog187 in #316
- feat(vm): harden against allocation-bomb DoS and document sandboxing by @davydog187 in #305
- chore(release): v1.0.0-rc.1 by @davydog187 in #323
- perf(vm): document why depth-1 upvalues cannot be inlined in the closure tuple by @davydog187 in #325
- perf(vm): split-storage tables (Erlang :array + map) by @davydog187 in #328
- chore: use elixir 1.20 in CI by @davydog187 in #329
- feat: add posthog by @davydog187 in #332
- fix(vm): keep heap effects across protected-call error unwinding by @davydog187 in #333
- fix(vm): pass raw error values through pcall and add §6.1 position prefix by @davydog187 in #335
- chore(website): refresh OG image layout by @davydog187 in #339
- test(vm): silence unused variable warning in pcall error-value test by @davydog187 in #338
- fix(vm): return terse Lua error value from call_function, not terminal render (#336) by @davydog187 in #337
- feat(os): seed os.clock origin at install, add os.time_ms/os.time_us by @davydog187 in #340
- fix(api): deflua/2 preserves function name for guarded heads by @davydog187 in #344
- chore(release): 1.0.0-rc.2 by @davydog187 in #345
- ci(deploy): deploy deflua.com to Fly.io on merge to main by @davydog187 in #346
- chore: roadmap hygiene, settle 1.0.0 suite gate (20/29), tostring(fn) fix by @davydog187 in #353
- perf(vm): compile bitwise ops and set_list multi-return tails by @davydog187 in #347
- perf(table): O(1)-per-step hash iteration via memoized order index by @davydog187 in #349
- fix(stdlib): route cache_module_result through Table.put so required modules appear in pairs(package.loaded) by @davydog187 in #356
- perf(table): cache array border for O(1) #t on no-hole tables by @davydog187 in #350
- fix(vm): return terse error value for ArgumentError at protected-call boundary by @davydog187 in #354
- feat(vm): plumb per-call source lines through the compiled dispatcher by @davydog187 in #355
- fix(parser): report syntax errors at the real offending token by @davydog187 in #357
- test: make default
mix testpass quietly and deterministically by @davydog187 in #358 - perf(vm): size dispatcher register files from emitted bytecode by @davydog187 in #359
- perf(vm): honest max_registers — drop register slack on both VM engines by @davydog187 in #327
- perf(vm): close the fibonacci gap with Luerl — register reclaim + lazy call frames by @davydog187 in #360
- feat(bytecode): coverage guard + drop dead :set_global opcode by @davydog187 in #362
- feat(parser): expose structured parse errors (parse_structured + Error.to_map) by @davydog187 in #363
- fix(parser): blame the opener for unclosed tables and empty bracket lists by @davydog187 in #365
- fix(parser): propagate deep errors past function-call argument lists by @davydog187 in #366
- feat(vm): conformant goto/label on both engines by @davydog187 in #364
- feat(vm): add configurable :max_instructions instruction budget by @davydog187 in #320
- chore(release): 1.0.0-rc.3 by @davydog187 in #367
- fix(stdlib): Lua 5.3 suite conformance for strings, sort, math (20/29) by @davydog187 in #368
- docs(release): roadmap refresh, perf baseline, 1.0 finish-line scope by @davydog187 in #370
- perf(stdlib): close the Luerl gap on string.format and table.sort by @davydog187 in #369
- fix(vm): encode Elixir nil to Lua nil instead of the string "nil" by @smn in #375
- fix(string.rep): allocate proportionally to result, not repeat count by @smn in #376
- fix(lua): hand callbacks Lua.t regardless of entry point by @davydog187 in #379
- docs: curate the HexDocs module sidebar for 1.0 by @davydog187 in #378
- fix(api): tighten public surface before the 1.0 freeze by @davydog187 in #380
- docs(release): sync roadmap, changelog, guides, and README for 1.0.0 by @davydog187 in #381
- fix(api): name the callee in call_function/3 errors by @davydog187 in #383
- fix(parser): gate parse-error ANSI on IO.ANSI.enabled?/0 by @davydog187 in #385
- fix(errors): render exception messages lazily so ANSI gating holds by @davydog187 in #386
- docs: fix exception-handling examples and Lua.new option doctests by @davydog187 in #387
- docs: add brand logo to README and docs sidebar by @davydog187 in #388
- perf(table): sort from_data fold to avoid O(n^2) table builds by @smn in #389
- errors: unify public runtime exceptions around Lua.RuntimeException by @davydog187 in #390
- release: cut 1.0.0 by @davydog187 in #391
- errors: drop the :message field from public runtime exceptions by @davydog187 in #392
- errors: make Exception.message/1 plain; add Lua.format_exception/1 by @davydog187 in #393
New Contributors
Full Changelog: v0.4.0...v1.0.0