diff --git a/runtime/src/main/java/dev/ionfusion/fusion/CompiledForm.java b/runtime/src/main/java/dev/ionfusion/fusion/CompiledForm.java index bf84e934..1376ea7e 100644 --- a/runtime/src/main/java/dev/ionfusion/fusion/CompiledForm.java +++ b/runtime/src/main/java/dev/ionfusion/fusion/CompiledForm.java @@ -18,6 +18,8 @@ interface CompiledForm * Evaluates a compiled form using the given dynamic context. *
* Do not call this directly! Go through the evaluator. + * + * @return not null. */ Object doEval(Evaluator eval, Store store) throws FusionException; diff --git a/runtime/src/main/java/dev/ionfusion/fusion/Evaluator.java b/runtime/src/main/java/dev/ionfusion/fusion/Evaluator.java index 276df0b7..0f771136 100644 --- a/runtime/src/main/java/dev/ionfusion/fusion/Evaluator.java +++ b/runtime/src/main/java/dev/ionfusion/fusion/Evaluator.java @@ -505,12 +505,15 @@ Object eval(Store store, CompiledForm form) throw e; } + if (result == null) + { + return voidValue(this); + } + continue checkingResult; } - if (result == null) - { - result = voidValue(this); - } + + assert result != null; return result; } } @@ -566,6 +569,7 @@ Object callNonTail(Procedure proc, Object... args) throw new FusionInterrupt(); } + // Closures bounce their body form to eliminate a stack frame: if (result instanceof TailForm) { TailForm tail = (TailForm) result; @@ -654,6 +658,8 @@ private static final class TailForm * Wraps an expression for evaluation in tail-position. MUST not be called from a * procedure. The result MUST be immediately returned to this evaluator, it's not a * normal value! + * + * @return not null */ Object bounceTailForm(Store store, CompiledForm form) {