* Space Lua: Add AST block type label/goto and duplicated label bools
* Space Lua: Add label/goto resolution and evaluation
Add per block map of labels metadata, per function block metadata cache
and `processBlock` to track AST blocks (`If`, `While`, `Repeat`, `For`
and `ForIn`, and `Do`) while recording labels and their positions.
Align with Lua scoping rules (_e.g._, a `goto` can not jump into the
scope of a local). Also allow the super-special "safe" end of block
cases (except inside `Repeat`). Duplicated labels are detected (error
`label 'foo' is already defined` etc.). The AST context for error
reporting is preserved. The `WeakMap` caches map any block to its
function's metadata.
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: The `goto` parse flags and eval path
At parser mark each block with `hasLabel`/`hasGoto` and record the first
duplicated label. Flags then propagate through blocks and control flow.
If no `goto`, run the block in a simple loop and raise duplicate label
error if any is present. If `goto` exists, jump via a label map.
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Add labels and `goto` statement test suite
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Minor `goto`/labels improvement and test hotfix
- The `getBlockGotoMeta` now called only when a block has either
`hasGoto` or `hasLabel`.
- Add `BlocksFlags` type to get rid of some `(... as any)`s by view.
- Add `blockMetaOrThrow` helper.
- Fix test to reflect standard Lua semantics.
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Goto: Add missing Lua semantics checks
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Goto: Add Lua semantics checks also covered in Lua tests
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Goto: Fix semantic divergence revealed by fixing unfinished test
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Fix typo
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Optimize block env creation and cache goto metadata
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Avoid using the venomous snake case
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Add comment for WeakMap use
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Block Label Fast-path Optimization
Add block flag `hasLabelHere` during parsing and use it in eval to skip
expensive metadata generation for blocks and entire functions without
label or goto.
Refactor eval logic:
- early fast path when a function is known to have no label/goto,
- later fast path for blocks in functions with goto.
Fetch metadata only when needed.
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Space Lua: Remove `BlockFlags` indirection from eval
- Add `hasLabelHere` flag to `LuaBlock`.
- Remove `BlockFlags` indirection from eval.
- Set `hasLabelHere` directly.
- Add some "guards".
- Improve consistency of child filtering.
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Remove redundant return statement
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
---------
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
* Add result-or-promise (RP) exec model to interpreter (async-first).
* Add centralized table property access with fast misses.
* Update table string keys to be object map.
* Update error contexts to be more consistent and precise.
* Update evaluator to return either values or _Promises_.
* Update func calls, unary and bin operations, and expression lists.
* Update _stdlib_ to the changes and improve errors.
* Add tests to validate async control flow and error contexts.
* Add dedicated benches that isolate the _runtime_ from parsing.
* Make fallback accept only strings and numbers (as per standard Lua).
* Remove `luaToString` from the fallback. It fits well presentation
purposes but is too complicated for strict semantic checking in the
evaluator and also wrongly coersed non-string and non-number value.
It may also return a promise but we require synchronous error path.
* Concatenating `nil` now throws "attempt to concatenate nil value" as
per standard Lua.
* Other types throw "attempt to concatenate a non-string or non-number"
which is simplified message diverting from standard Lua which throws
typed error but we do not strictly need that for Space Lua (and can be
easily added anytime in the future).
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
In Lua, only the last expression in an argument list preserves multiple
results and all earlier expressions yield exactly one value (their first).
For example:
```
f(a(), b(), c())
```
where
```
a -> (1,2)
b -> (3,4)
c -> (5,6)
```
becomes
```
f(1, 3, 5, 6)
```
which matches Lua behaviour (tested in version 5.4).
Changes:
* Function argument lists keep multiple results only from the last
argument.
* Fixes failing truthiness tests (`true and ret_one_two()`).
Sidenote: the `truthiness_test.lua` was not called at all because of
my obvious copy/paste typo (the `arithmetical_test.lua` was called twice
instead; now fixed too and both test suites pass ok).
* Align Space Lua arithmetic model with standard Lua
* Add missing __unm and __bnot metamethods
- add new basic tests
- add helper for negative tests
* Add comments for ASCII numeric constants
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
This patch fixes the Lua arithmetic model at parser level only. Runtime
level fixtures are left for future work.
MOTIVATION
Space Lua treats all numbers as IEEE-754 doubles (JS semantics), so it
preserves negative zero. Lua uses integers and floats. The literal "-0"
in Lua is parsed as unary minus applied to the integer literal "0",
which yields the integer "0" (no sign). This difference flips the sign
of the divisor in "1/-0" and "-1/-0". Although it could be fixed without
touching the parser by changing only unary minus evaluation, this commit
goes a little further and provides integer vs float differenciating at
the parser level as well uses it to fix the unary minus evaluation.
Extensive tests are added to test this exact change works and the Space
Lua arithmetic model is aligned with Lua. Note that things like `-(expr)`
in general may still produce results inconsistent with Lua. This cannot
be fixed at parser level and must be fixed at runtime level which will
need far more complex change to the Space Lua interpreter code. Therefor
these cases we omitted from the tests.
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
The Lua 5.4 compatible `tonumber` implementation completely reworked
- custom char-by-char parser (no regexes)
- proper Lua space handling
- support for heximal integers and floats
- support for scientific float notation
- extended tests
- updated website docs
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>