From c6c4f8df58d2632427e65b4507e0f6fc001800d0 Mon Sep 17 00:00:00 2001 From: Alex Zerntev Date: Mon, 28 Aug 2023 16:53:00 +0300 Subject: [PATCH] RD-9462 propagation uncovered-case (#121) - Made Error.Get to expect tryable regardless if it is a nullable (provided by @bgaidioz ) - Added exception on getting a failure and getting an error on success --- .../compiler/rql2/builtin/ErrorPackage.scala | 2 +- .../compiler/rql2/builtin/TryPackage.scala | 4 +- .../rql2/tests/builtin/ErrorPackageTest.scala | 3 + .../ast/expressions/option/OptionMapNode.java | 34 ++++--- .../runtime/tryable/BooleanTryable.java | 74 +++++++-------- .../truffle/runtime/tryable/ByteTryable.java | 89 ++++++++++--------- .../runtime/tryable/DoubleTryable.java | 89 ++++++++++--------- .../truffle/runtime/tryable/ErrorTryable.java | 73 +++++++-------- .../truffle/runtime/tryable/FloatTryable.java | 89 ++++++++++--------- .../truffle/runtime/tryable/IntTryable.java | 89 ++++++++++--------- .../truffle/runtime/tryable/LongTryable.java | 73 ++++++++------- .../runtime/tryable/ObjectTryable.java | 74 +++++++-------- .../truffle/runtime/tryable/ShortTryable.java | 89 ++++++++++--------- .../runtime/tryable/StringTryable.java | 89 ++++++++++--------- 14 files changed, 459 insertions(+), 412 deletions(-) diff --git a/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/ErrorPackage.scala b/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/ErrorPackage.scala index 4ae644438..5d0b4f61d 100644 --- a/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/ErrorPackage.scala +++ b/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/ErrorPackage.scala @@ -91,7 +91,7 @@ class ErrorGetEntry extends EntryExtension { override def nrMandatoryParams: Int = 1 override def getMandatoryParam(prevMandatoryArgs: Seq[Arg], idx: Int): Either[String, Param] = { - Right(ExpParam(HasTypeProperties(Set(Rql2IsTryableTypeProperty())))) + Right(ExpParam(IsTryable())) } override def returnType( diff --git a/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/TryPackage.scala b/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/TryPackage.scala index afc665f8d..d16bd9015 100644 --- a/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/TryPackage.scala +++ b/raw-compiler-rql2/src/main/scala/raw/compiler/rql2/builtin/TryPackage.scala @@ -78,7 +78,7 @@ class TryIsErrorEntry extends EntryExtension { override def getMandatoryParam(prevMandatoryArgs: Seq[Arg], idx: Int): Either[String, Param] = { Right( - ExpParam(HasTypeProperties(Set(Rql2IsTryableTypeProperty(), Rql2IsNullableTypeProperty()))) + ExpParam(IsTryable()) ) } @@ -113,7 +113,7 @@ class TryIsSuccessEntry extends EntryExtension { override def getMandatoryParam(prevMandatoryArgs: Seq[Arg], idx: Int): Either[String, Param] = { Right( - ExpParam(HasTypeProperties(Set(Rql2IsTryableTypeProperty(), Rql2IsNullableTypeProperty()))) + ExpParam(IsTryable()) ) } diff --git a/raw-compiler-rql2/src/test/scala/raw/compiler/rql2/tests/builtin/ErrorPackageTest.scala b/raw-compiler-rql2/src/test/scala/raw/compiler/rql2/tests/builtin/ErrorPackageTest.scala index 655ce0ab7..3697b953b 100644 --- a/raw-compiler-rql2/src/test/scala/raw/compiler/rql2/tests/builtin/ErrorPackageTest.scala +++ b/raw-compiler-rql2/src/test/scala/raw/compiler/rql2/tests/builtin/ErrorPackageTest.scala @@ -45,4 +45,7 @@ trait ErrorPackageTest extends CompilerTestContext { """[2, 1, Error.Build("a Y error"), Error.Build("a X error"), Error.Build("a X error")]""" ) ) + + test("""Error.Get("an error")""")(it => it should runErrorAs("not a failure")) + } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/ast/expressions/option/OptionMapNode.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/ast/expressions/option/OptionMapNode.java index 0e2ba7d21..17055a0f6 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/ast/expressions/option/OptionMapNode.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/ast/expressions/option/OptionMapNode.java @@ -27,23 +27,21 @@ @NodeChild("function") public abstract class OptionMapNode extends ExpressionNode { - @Specialization( - guards = {"options.isOption(option)"}, - limit = "1") - protected Object optionMap( - Object option, - Closure closure, - @CachedLibrary("option") OptionLibrary options, - @CachedLibrary(limit = "1") NullableTryableLibrary nullableTryables) { - if (options.isDefined(option)) { - Object v = options.get(option); - Object[] argumentValues = new Object[1]; - argumentValues[0] = v; - Object result = closure.call(argumentValues); - RuntimeNullableTryableHandler handler = new RuntimeNullableTryableHandler(); - return nullableTryables.boxOption(handler, result); - } else { - return option; + @Specialization(guards = {"options.isOption(option)"}, limit = "1") + protected Object optionMap( + Object option, + Closure closure, + @CachedLibrary("option") OptionLibrary options, + @CachedLibrary(limit = "1") NullableTryableLibrary nullableTryables) { + if (options.isDefined(option)) { + Object v = options.get(option); + Object[] argumentValues = new Object[1]; + argumentValues[0] = v; + Object result = closure.call(argumentValues); + RuntimeNullableTryableHandler handler = new RuntimeNullableTryableHandler(); + return nullableTryables.boxOption(handler, result); + } else { + return option; + } } - } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/BooleanTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/BooleanTryable.java index 8e3b24a5b..7c7d85bdd 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/BooleanTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/BooleanTryable.java @@ -14,51 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import raw.runtime.truffle.runtime.tryable.TryableLibrary; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class BooleanTryable { - private final boolean successValue; - private final String failureValue; + private final boolean successValue; + private final String failureValue; - public BooleanTryable(boolean successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } + public BooleanTryable(boolean successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } - public static BooleanTryable BuildSuccess(boolean successValue) { - return new BooleanTryable(successValue, null); - } + public static BooleanTryable BuildSuccess(boolean successValue) { + return new BooleanTryable(successValue, null); + } - public static BooleanTryable BuildFailure(String failureValue) { - return new BooleanTryable(false, failureValue); - } + public static BooleanTryable BuildFailure(String failureValue) { + return new BooleanTryable(false, failureValue); + } - @ExportMessage - boolean isTryable() { - return true; - } + @ExportMessage + boolean isTryable() { + return true; + } - @ExportMessage - public boolean success() { - // assert(isSuccess()); - return successValue; - } + @ExportMessage + public boolean success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ByteTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ByteTryable.java index 99f8de8ca..663ab08c7 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ByteTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ByteTryable.java @@ -14,50 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class ByteTryable { - private final byte successValue; - private final String failureValue; - - public ByteTryable(byte successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } - - public static ByteTryable BuildSuccess(byte successValue) { - return new ByteTryable(successValue, null); - } - - public static ByteTryable BuildFailure(String failureValue) { - return new ByteTryable((byte) 0, failureValue); - } - - @ExportMessage - boolean isTryable() { - return true; - } - - @ExportMessage - public byte success() { - // assert(isSuccess()); - return successValue; - } - - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } - - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } - - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + private final byte successValue; + private final String failureValue; + + public ByteTryable(byte successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } + + public static ByteTryable BuildSuccess(byte successValue) { + return new ByteTryable(successValue, null); + } + + public static ByteTryable BuildFailure(String failureValue) { + return new ByteTryable((byte) 0, failureValue); + } + + @ExportMessage + boolean isTryable() { + return true; + } + + @ExportMessage + public byte success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } + + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } + + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } + + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/DoubleTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/DoubleTryable.java index 3e8f29a4c..a3e404ea7 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/DoubleTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/DoubleTryable.java @@ -14,50 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class DoubleTryable { - private final double successValue; - private final String failureValue; - - public DoubleTryable(double successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } - - public static DoubleTryable BuildSuccess(double successValue) { - return new DoubleTryable(successValue, null); - } - - public static DoubleTryable BuildFailure(String failureValue) { - return new DoubleTryable(0, failureValue); - } - - @ExportMessage - boolean isTryable() { - return true; - } - - @ExportMessage - public double success() { - // assert(isSuccess()); - return successValue; - } - - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } - - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } - - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + private final double successValue; + private final String failureValue; + + public DoubleTryable(double successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } + + public static DoubleTryable BuildSuccess(double successValue) { + return new DoubleTryable(successValue, null); + } + + public static DoubleTryable BuildFailure(String failureValue) { + return new DoubleTryable(0, failureValue); + } + + @ExportMessage + boolean isTryable() { + return true; + } + + @ExportMessage + public double success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } + + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } + + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } + + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ErrorTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ErrorTryable.java index 7d9bc67a7..64d6f9d4d 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ErrorTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ErrorTryable.java @@ -14,42 +14,45 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class ErrorTryable { - private final String failureValue; - - private ErrorTryable(String failureValue) { - this.failureValue = failureValue; - } - - public static ErrorTryable BuildFailure(String failureValue) { - return new ErrorTryable(failureValue); - } - - @ExportMessage - boolean isTryable() { - return true; - } - - @ExportMessage - public boolean success() { - throw new AssertionError("Calling success get on ErrorTryable"); - } - - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } - - @ExportMessage - public boolean isSuccess() { - return false; - } - - @ExportMessage - public boolean isFailure() { - return true; - } + private final String failureValue; + + private ErrorTryable(String failureValue) { + this.failureValue = failureValue; + } + + public static ErrorTryable BuildFailure(String failureValue) { + return new ErrorTryable(failureValue); + } + + @ExportMessage + boolean isTryable() { + return true; + } + + @ExportMessage + public boolean success() { + throw new RawTruffleRuntimeException(failureValue); + } + + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } + + @ExportMessage + public boolean isSuccess() { + return false; + } + + @ExportMessage + public boolean isFailure() { + return true; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/FloatTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/FloatTryable.java index 7d03d8a80..4354cae78 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/FloatTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/FloatTryable.java @@ -14,50 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class FloatTryable { - private final float successValue; - private final String failureValue; - - public FloatTryable(float successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } - - public static FloatTryable BuildSuccess(float successValue) { - return new FloatTryable(successValue, null); - } - - public static FloatTryable BuildFailure(String failureValue) { - return new FloatTryable(0, failureValue); - } - - @ExportMessage - boolean isTryable() { - return true; - } - - @ExportMessage - public float success() { - // assert(isSuccess()); - return successValue; - } - - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } - - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } - - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + private final float successValue; + private final String failureValue; + + public FloatTryable(float successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } + + public static FloatTryable BuildSuccess(float successValue) { + return new FloatTryable(successValue, null); + } + + public static FloatTryable BuildFailure(String failureValue) { + return new FloatTryable(0, failureValue); + } + + @ExportMessage + boolean isTryable() { + return true; + } + + @ExportMessage + public float success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } + + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } + + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } + + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/IntTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/IntTryable.java index cb00733d1..50dee320f 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/IntTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/IntTryable.java @@ -14,50 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class IntTryable { - private final int successValue; - private final String failureValue; - - public IntTryable(int successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } - - public static IntTryable BuildSuccess(int successValue) { - return new IntTryable(successValue, null); - } - - public static IntTryable BuildFailure(String failureValue) { - return new IntTryable(0, failureValue); - } - - @ExportMessage - boolean isTryable() { - return true; - } - - @ExportMessage - public int success() { - // assert(isSuccess()); - return successValue; - } - - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } - - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } - - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + private final int successValue; + private final String failureValue; + + public IntTryable(int successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } + + public static IntTryable BuildSuccess(int successValue) { + return new IntTryable(successValue, null); + } + + public static IntTryable BuildFailure(String failureValue) { + return new IntTryable(0, failureValue); + } + + @ExportMessage + boolean isTryable() { + return true; + } + + @ExportMessage + public int success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } + + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } + + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } + + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/LongTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/LongTryable.java index c5557f1be..e4b8fdf9f 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/LongTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/LongTryable.java @@ -14,6 +14,7 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; // before anything else, looks like final tree is "too simple" // and misses the cast phase @@ -21,46 +22,50 @@ @ExportLibrary(TryableLibrary.class) public final class LongTryable { - private final long successValue; - private final String failureValue; + private final long successValue; + private final String failureValue; - public LongTryable(long successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } + public LongTryable(long successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } - public static LongTryable BuildSuccess(long successValue) { - return new LongTryable(successValue, null); - } + public static LongTryable BuildSuccess(long successValue) { + return new LongTryable(successValue, null); + } - public static LongTryable BuildFailure(String failureValue) { - return new LongTryable(0, failureValue); - } + public static LongTryable BuildFailure(String failureValue) { + return new LongTryable(0, failureValue); + } - @ExportMessage - boolean isTryable() { - return true; - } + @ExportMessage + boolean isTryable() { + return true; + } - @ExportMessage - long success() { - // assert(isSuccess()); - return successValue; - } + @ExportMessage + long success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } - @ExportMessage - String failure() { - // assert(isFailure()); - return failureValue; - } + @ExportMessage + String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } - @ExportMessage - boolean isSuccess() { - return failureValue == null; - } + @ExportMessage + boolean isSuccess() { + return failureValue == null; + } - @ExportMessage - boolean isFailure() { - return failureValue != null; - } + @ExportMessage + boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ObjectTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ObjectTryable.java index de9596ed9..f32db209b 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ObjectTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ObjectTryable.java @@ -14,51 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.library.LibraryFactory; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class ObjectTryable { - private final Object successValue; - private final String failureValue; + private final Object successValue; + private final String failureValue; - private ObjectTryable(Object successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } + private ObjectTryable(Object successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } - public static ObjectTryable BuildSuccess(Object successValue) { - return new ObjectTryable(successValue, null); - } + public static ObjectTryable BuildSuccess(Object successValue) { + return new ObjectTryable(successValue, null); + } - public static ObjectTryable BuildFailure(String failureValue) { - return new ObjectTryable(0, failureValue); - } + public static ObjectTryable BuildFailure(String failureValue) { + return new ObjectTryable(0, failureValue); + } - @ExportMessage - boolean isTryable() { - return true; - } + @ExportMessage + boolean isTryable() { + return true; + } - @ExportMessage - public Object success() { - // assert(isSuccess()); - return successValue; - } + @ExportMessage + public Object success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ShortTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ShortTryable.java index 9e96b775f..94a6480ae 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ShortTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/ShortTryable.java @@ -14,50 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public final class ShortTryable { - private final short successValue; - private final String failureValue; - - public ShortTryable(short successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } - - public static ShortTryable BuildSuccess(short successValue) { - return new ShortTryable(successValue, null); - } - - public static ShortTryable BuildFailure(String failureValue) { - return new ShortTryable((short) 0, failureValue); - } - - @ExportMessage - boolean isTryable() { - return true; - } - - @ExportMessage - public short success() { - // assert(isSuccess()); - return successValue; - } - - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } - - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } - - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + private final short successValue; + private final String failureValue; + + public ShortTryable(short successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } + + public static ShortTryable BuildSuccess(short successValue) { + return new ShortTryable(successValue, null); + } + + public static ShortTryable BuildFailure(String failureValue) { + return new ShortTryable((short) 0, failureValue); + } + + @ExportMessage + boolean isTryable() { + return true; + } + + @ExportMessage + public short success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } + + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } + + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } + + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } } diff --git a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/StringTryable.java b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/StringTryable.java index 0c9f61bd9..73234acab 100644 --- a/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/StringTryable.java +++ b/raw-runtime-rql2-truffle/src/main/java/raw/runtime/truffle/runtime/tryable/StringTryable.java @@ -14,50 +14,55 @@ import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import raw.runtime.truffle.runtime.exceptions.RawTruffleRuntimeException; @ExportLibrary(TryableLibrary.class) public class StringTryable { - private final String successValue; - private final String failureValue; - - public StringTryable(String successValue, String failureValue) { - this.successValue = successValue; - this.failureValue = failureValue; - } - - public static StringTryable BuildSuccess(String successValue) { - return new StringTryable(successValue, null); - } - - public static StringTryable BuildFailure(String failureValue) { - return new StringTryable(null, failureValue); - } - - @ExportMessage - boolean isTryable() { - return true; - } - - @ExportMessage - public String success() { - // assert(isSuccess()); - return successValue; - } - - @ExportMessage - public String failure() { - // assert(isFailure()); - return failureValue; - } - - @ExportMessage - public boolean isSuccess() { - return failureValue == null; - } - - @ExportMessage - public boolean isFailure() { - return failureValue != null; - } + private final String successValue; + private final String failureValue; + + public StringTryable(String successValue, String failureValue) { + this.successValue = successValue; + this.failureValue = failureValue; + } + + public static StringTryable BuildSuccess(String successValue) { + return new StringTryable(successValue, null); + } + + public static StringTryable BuildFailure(String failureValue) { + return new StringTryable(null, failureValue); + } + + @ExportMessage + boolean isTryable() { + return true; + } + + @ExportMessage + public String success() { + if (!isSuccess()) { + throw new RawTruffleRuntimeException(failureValue); + } + return successValue; + } + + @ExportMessage + public String failure() { + if (!isFailure()) { + throw new RawTruffleRuntimeException("not a failure"); + } + return failureValue; + } + + @ExportMessage + public boolean isSuccess() { + return failureValue == null; + } + + @ExportMessage + public boolean isFailure() { + return failureValue != null; + } }