This splits indexing into two phases:
* preindex (where only pages, space lua, space styles are indexed)
* index (where everything else is indexed)
The goal is to get to more-or-less operational state quicker this way,
because probably most functionality can already be enabled after the
pre-index phase.
accidentally writing to a read-only file and only finding out about it
after a sync.
Also removes redundant space primitive implementations that weren't used
* 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>
SilverBullet now has hard dependencies on APIs that are only available
via localhost and HTTPS URLs. A lot of people run into this, this
documents how to setup TLS and gives a more in-your-face message about
what's going on.
* 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>