From ccad7492d5fc0d67261cdf54e036738fac4aa746 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Thu, 24 Aug 2023 06:16:11 +0200 Subject: [PATCH] Turn abnormal CompilerError into regular Panic --- .../enso/interpreter/node/MethodRootNode.java | 23 +++++++++++++++---- .../org/enso/compiler/ExecCompilerTest.java | 19 +++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/MethodRootNode.java b/engine/runtime/src/main/java/org/enso/interpreter/node/MethodRootNode.java index 55c71f9905a0..3c24b43a2457 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/MethodRootNode.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/node/MethodRootNode.java @@ -1,16 +1,22 @@ package org.enso.interpreter.node; +import java.util.function.Supplier; + +import org.enso.compiler.core.CompilerError; +import org.enso.interpreter.EnsoLanguage; +import org.enso.interpreter.runtime.EnsoContext; +import org.enso.interpreter.runtime.data.Type; +import org.enso.interpreter.runtime.data.text.Text; +import org.enso.interpreter.runtime.error.PanicException; +import org.enso.interpreter.runtime.scope.LocalScope; +import org.enso.interpreter.runtime.scope.ModuleScope; + import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.ReportPolymorphism; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.NodeInfo; import com.oracle.truffle.api.source.SourceSection; -import java.util.function.Supplier; -import org.enso.interpreter.EnsoLanguage; -import org.enso.interpreter.runtime.data.Type; -import org.enso.interpreter.runtime.scope.LocalScope; -import org.enso.interpreter.runtime.scope.ModuleScope; @ReportPolymorphism @NodeInfo(shortName = "Method", description = "A root node for Enso methods.") @@ -142,9 +148,16 @@ public Object executeGeneric(VirtualFrame frame) { @CompilerDirectives.TruffleBoundary final ExpressionNode replaceItself() { + try { ExpressionNode newNode = replace(provider.get()); notifyInserted(newNode); return newNode; + } catch (CompilerError abnormalException) { + var ctx = EnsoContext.get(this); + var msg = Text.create(abnormalException.getMessage()); + var load = ctx.getBuiltins().error().makeCompileError(msg); + throw new PanicException(load, this); + } } } public boolean isSubjectToInstrumentation() { diff --git a/engine/runtime/src/test/java/org/enso/compiler/ExecCompilerTest.java b/engine/runtime/src/test/java/org/enso/compiler/ExecCompilerTest.java index 8b5a5e0af2b1..3b901fdd1817 100644 --- a/engine/runtime/src/test/java/org/enso/compiler/ExecCompilerTest.java +++ b/engine/runtime/src/test/java/org/enso/compiler/ExecCompilerTest.java @@ -2,6 +2,7 @@ import java.io.OutputStream; import java.nio.file.Paths; + import org.enso.polyglot.RuntimeOptions; import org.graalvm.polyglot.Context; import org.graalvm.polyglot.PolyglotException; @@ -100,6 +101,24 @@ public void testRecursiveDefinition() throws Exception { assertTrue("The error value also represents null", error.isNull()); assertEquals("(Error: Uninitialized value)", error.toString()); } + @Test + public void dotUnderscore() throws Exception { + var module = ctx.eval("enso", """ + run op = + op._ + """); + var run = module.invokeMember("eval_expression", "run"); + try { + var error = run.execute("false_hope"); + fail("Should never return, but: " + error); + } catch (PolyglotException e) { + assertTrue("It is exception", e.getGuestObject().isException()); + assertEquals("Panic", e.getGuestObject().getMetaObject().getMetaSimpleName()); + if (!e.getMessage().contains("Compiler Internal Error")) { + fail("Expecting Compiler Internal Error, but was: " + e.getMessage()); + } + } + } @Test public void testInvalidEnsoProjectRef() throws Exception {