From 49c628ef1f06e4b4659512964e8c806fe9d9cf12 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 5 Dec 2024 11:24:49 +0100 Subject: [PATCH] Propagate Error ASAP instead of ignoring it --- CHANGELOG.md | 8 ++++++++ .../test/semantic/DataflowErrorPropagationTest.java | 11 ++++++++--- .../interpreter/node/callable/function/BlockNode.java | 11 ++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9010c33189b1..4dcdceac1a51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# Next Next Release + +#### Enso Language & Runtime + +- [Propagate Error ASAP instead of ignoring it][11777]. + +[11777]: https://github.com/enso-org/enso/pull/11777 + # Next Release #### Enso IDE diff --git a/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java index 46f466abdb8e..f5facc9d72d1 100644 --- a/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java +++ b/engine/runtime-integration-tests/src/test/java/org/enso/interpreter/test/semantic/DataflowErrorPropagationTest.java @@ -7,6 +7,7 @@ import org.enso.common.MethodNames; import org.enso.test.utils.ContextUtils; import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.PolyglotException; import org.graalvm.polyglot.Value; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -59,9 +60,13 @@ public void noErrorReturnValue() { @Test public void propagateErrorImmediatelly() { var value = suppressError.execute(true, 42); - assertTrue("It is a number", value.isNumber()); - assertFalse("Not an error", value.isException()); - assertEquals(42, value.asInt()); + assertFalse("It is not a number", value.isNumber()); + assertTrue("It is an error", value.isException()); + try { + throw value.throwException(); + } catch (PolyglotException ex) { + assertEquals("Yielding an error", ex.getMessage()); + } } @Test diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java index 994b68b34149..a50ccedbbdbb 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/callable/function/BlockNode.java @@ -9,6 +9,8 @@ import com.oracle.truffle.api.source.SourceSection; import java.util.Set; import org.enso.interpreter.node.ExpressionNode; +import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.error.DataflowError; /** * This node defines the body of a function for execution, as well as the protocol for executing the @@ -55,8 +57,15 @@ public static BlockNode buildSilent(ExpressionNode[] expressions, ExpressionNode @Override @ExplodeLoop public Object executeGeneric(VirtualFrame frame) { + var ctx = EnsoContext.get(this); + var nothing = ctx.getBuiltins().nothing(); for (ExpressionNode statement : statements) { - statement.executeGeneric(frame); + var result = statement.executeGeneric(frame); + if (result != nothing) { + if (result instanceof DataflowError err) { + return err; + } + } } return returnExpr.executeGeneric(frame); }