From 441d1f0b3488bdcc66c7153bf9ddde281b4e95f9 Mon Sep 17 00:00:00 2001 From: "Todd V. Jonker" Date: Sat, 23 Nov 2024 15:31:05 -0800 Subject: [PATCH] Enforce that CompiledForm.doEval doesn't return null. I did a manual verification of all 40(!) implementations, and all are currently non-null per contract. --- .../java/dev/ionfusion/fusion/CompiledForm.java | 2 ++ .../main/java/dev/ionfusion/fusion/Evaluator.java | 14 ++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) 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) {