Skip to content

Commit

Permalink
RD-9462 propagation uncovered-case (#121)
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
alexzerntev authored Aug 28, 2023
1 parent 4af158d commit c6c4f8d
Show file tree
Hide file tree
Showing 14 changed files with 459 additions and 412 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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())
)
}

Expand Down Expand Up @@ -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())
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"))

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Loading

0 comments on commit c6c4f8d

Please sign in to comment.