Replace the internal `foreignStackStart` pointer with a public `apiStack` field that tracks the base of available C API slots. Extract the static `ensureStack` helper into a non-static `wrenEnsureStack` function declared in the header, enabling `wrenEnsureSlots()` to create a fiber and stack when called outside a foreign method. Update `callForeign` to use `apiStack` and adjust `metaCompile` to write results through the new pointer. Add a `ensureOutsideForeign` test that allocates slots on a fresh VM, verifies slot count grows from 0 to 20, and exercises all 20 slots with double values to confirm the stack is correctly initialized and usable.
This contains the automated validation suite for the VM and built-in libraries.
-
benchmark/- Performance tests. These aren't strictly pass/fail, but let us compare performance both against other languages and against previous builds of Wren itself. -
core/- Tests for the built in core library, mainly methods on the core classes. If a bug is inwren_core.corwren_value.c, it will most likely break one of these tests. -
language/- Tests of the language itself, its grammar and runtime semantics. If a bug is inwren_compiler.corwren_vm.c, it will most likely break one of these tests. This includes tests for the syntax for the literal forms of the core classes. -
limit/- Tests for various hardcoded limits. The language doesn't officially specify these limits, but the Wren implementation has them. These tests ensure that limit behavior is well-defined and tested.