diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Errors/Illegal_Argument.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Errors/Illegal_Argument.enso index 020a576e9a94..da3af9ab0775 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Errors/Illegal_Argument.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Errors/Illegal_Argument.enso @@ -5,7 +5,6 @@ import project.Panic.Panic polyglot java import java.lang.IllegalArgumentException -@Builtin_Type type Illegal_Argument ## PRIVATE UNSTABLE diff --git a/distribution/lib/Standard/Base/0.0.0-dev/src/Runtime/Managed_Resource.enso b/distribution/lib/Standard/Base/0.0.0-dev/src/Runtime/Managed_Resource.enso index 04a8b75362e2..d57e805c3366 100644 --- a/distribution/lib/Standard/Base/0.0.0-dev/src/Runtime/Managed_Resource.enso +++ b/distribution/lib/Standard/Base/0.0.0-dev/src/Runtime/Managed_Resource.enso @@ -1,10 +1,15 @@ ## An API for manual resource management. import project.Any.Any +import project.Data.Text.Text +import project.Error.Error import project.Errors.Common.Uninitialized_State +import project.Errors.Illegal_Argument.Illegal_Argument import project.Meta import project.Nothing.Nothing +import project.Panic.Panic from project.Data.Boolean import Boolean, False, True +from project.Data.Text.Extensions import all ## Resource provides an API for manual management of computation resources. @@ -47,7 +52,7 @@ type Managed_Resource ! Multiple `Managed_Resource`s for the same resource Using the same underlying resource with multiple managed resource - instances is an error and will result in a `Forbidden_Operation` panic. + instances is an error and will result in an `Illegal_Argument` panic. ! Values Eligible to be `Managed_Resource`s @@ -64,7 +69,8 @@ type Managed_Resource A `Managed_Resource` object that can be used to access the resource. register : Any -> (Any -> Nothing) -> Boolean -> Managed_Resource register resource function system_finalization_allowed=False = - @Tail_Call register_builtin resource function system_finalization_allowed + _handle_double_registration <| + @Tail_Call register_builtin resource function system_finalization_allowed ## PRIVATE ADVANCED @@ -115,3 +121,13 @@ register_builtin r fn sys:Boolean = @Builtin_Method "Managed_Resource.register_b ## PRIVATE with_builtin r fn = @Builtin_Method "Managed_Resource.with_builtin" + +## PRIVATE + Catch a double-registration panic and re-raise it as an `Illegal_Argument`. +_handle_double_registration ~action = + handler caught = + payload = caught.payload + is_double_registration = payload.is_a Text && payload.starts_with "Object is already registered as a ManagedResource" + if is_double_registration.not then Panic.throw caught else + Panic.throw (Illegal_Argument.Error payload) + Panic.catch Any action handler diff --git a/docs/semantics/managed-resources.md b/docs/semantics/managed-resources.md index fbdcea82c94d..d69d6f7679c4 100644 --- a/docs/semantics/managed-resources.md +++ b/docs/semantics/managed-resources.md @@ -97,7 +97,7 @@ be finalized as soon as the first managed resource is garbage collected. Moreover, the finalizer will be called for each garbage collected managed resource, leading to multiple-finalization of the underlying object. Therefore, using the same underlying resource with multiple managed resource instances -is an error and will result in a `Forbidden_Operation` panic. +is an error and will result in an `Illegal_Argument` panic. ### Objects Eligible to be a Managed Resource diff --git a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/IllegalArgument.java b/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/IllegalArgument.java deleted file mode 100644 index 683b926e1b54..000000000000 --- a/engine/runtime/src/main/java/org/enso/interpreter/node/expression/builtin/error/IllegalArgument.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.enso.interpreter.node.expression.builtin.error; - -import java.util.List; -import org.enso.interpreter.dsl.BuiltinType; -import org.enso.interpreter.node.expression.builtin.UniquelyConstructibleBuiltin; - -@BuiltinType -public class IllegalArgument extends UniquelyConstructibleBuiltin { - @Override - protected String getConstructorName() { - return "Error"; - } - - @Override - protected List getConstructorParamNames() { - return List.of("message"); - } -} diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/ResourceManager.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/ResourceManager.java index 3f7f6096c83f..9d6337a91b7d 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/ResourceManager.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/ResourceManager.java @@ -25,7 +25,7 @@ * Allows the context to attach garbage collection hooks on the removal of certain objects. * *

Truly atomic values such as integer `2` cannot be managed resources. */ @@ -156,8 +156,7 @@ public synchronized ManagedResource register( if (alreadyRegistered(object)) { var error = context.getBuiltins().error(); var msg = "Object is already registered as a ManagedResource: " + object; - var payload = error.makeIllegalArgument(msg); - throw new PanicException(payload, null); + throw new PanicException(msg, null); } if (CLOSED == processor) { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java index 1d2420164d03..175787e0b5ab 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/builtin/Error.java @@ -9,7 +9,6 @@ import org.enso.interpreter.node.expression.builtin.error.CaughtPanic; import org.enso.interpreter.node.expression.builtin.error.CompileError; import org.enso.interpreter.node.expression.builtin.error.ForbiddenOperation; -import org.enso.interpreter.node.expression.builtin.error.IllegalArgument; import org.enso.interpreter.node.expression.builtin.error.IncomparableValues; import org.enso.interpreter.node.expression.builtin.error.IndexOutOfBounds; import org.enso.interpreter.node.expression.builtin.error.InexhaustivePatternMatch; @@ -59,7 +58,6 @@ public final class Error { private final ArithmeticError arithmeticError; private final InvalidArrayIndex invalidArrayIndex; private final ArityError arityError; - private final IllegalArgument illegalArgument; private final IncomparableValues incomparableValues; private final UnsupportedArgumentTypes unsupportedArgumentsError; private final ModuleDoesNotExist moduleDoesNotExistError; @@ -100,7 +98,6 @@ public Error(Builtins builtins, EnsoContext context) { arithmeticError = builtins.getBuiltinType(ArithmeticError.class); invalidArrayIndex = builtins.getBuiltinType(InvalidArrayIndex.class); arityError = builtins.getBuiltinType(ArityError.class); - illegalArgument = builtins.getBuiltinType(IllegalArgument.class); incomparableValues = builtins.getBuiltinType(IncomparableValues.class); unsupportedArgumentsError = builtins.getBuiltinType(UnsupportedArgumentTypes.class); moduleDoesNotExistError = builtins.getBuiltinType(ModuleDoesNotExist.class); @@ -133,10 +130,6 @@ public Atom makeIndexOutOfBounds(long index, long length) { return indexOutOfBounds.newInstance(index, length); } - public Atom makeIllegalArgument(Object message) { - return illegalArgument.newInstance(message); - } - public Atom makeIncomparableValues(Object leftOperand, Object rightOperand) { return incomparableValues.newInstance(leftOperand, rightOperand); } @@ -364,8 +357,8 @@ public Atom makePrivateAccessError( thisProjName, targetProjName, Text.create(targetMethodName)); } - public Atom makeForbiddenOperation(String message) { - return forbiddenOperation.newInstance(Text.create(message)); + public ForbiddenOperation getForbiddenOperation() { + return forbiddenOperation; } public Atom makeUnimplemented(String operation) { diff --git a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java index 8173a82af680..3ef24c455a76 100644 --- a/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java +++ b/engine/runtime/src/main/java/org/enso/interpreter/runtime/data/ManagedResource.java @@ -37,7 +37,7 @@ * ProcessItems} processor. * *

Truly atomic values such as integer `2` cannot be managed resources. */