From 05826c75df9680dbb07e0a0bf68a84d0e4b94052 Mon Sep 17 00:00:00 2001 From: maxonfjvipon Date: Sat, 6 Apr 2024 19:21:01 +0300 Subject: [PATCH] fix(#3057): cage.encaged --- .../EOeolang/EOcage$EOencaged$EOencage.java | 4 +- ...move.java => EOcage$EOencaged$EOfree.java} | 14 +++-- .../EOeolang/EOcage$EOencaged$EOfreed.java | 63 +++++++++++++++++++ .../EOorg/EOeolang/EOcage$EOencaged$EOit.java | 11 +++- .../EOorg/EOeolang/EOcage$EO\317\206.java" | 4 +- .../EOorg/EOeolang/EOmemory$EO\317\206.java" | 2 +- .../test/java/EOorg/EOeolang/EOcageTest.java | 32 ++++++---- 7 files changed, 104 insertions(+), 26 deletions(-) rename eo-runtime/src/main/java/EOorg/EOeolang/{EOcage$EOencaged$EOremove.java => EOcage$EOencaged$EOfree.java} (81%) create mode 100644 eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOfreed.java diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java index 6a37278c1e..6e61966153 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOencage.java @@ -43,7 +43,7 @@ */ @Versionized @XmirObject(oname = "cage.encaged.encage") -class EOcage$EOencaged$EOencage extends PhDefault implements Atom { +final class EOcage$EOencaged$EOencage extends PhDefault implements Atom { /** * Ctor. * @param sigma Sigma @@ -55,7 +55,7 @@ class EOcage$EOencaged$EOencage extends PhDefault implements Atom { @Override public Phi lambda() throws Exception { - Cages.INSTANCE.get().encage( + Cages.INSTANCE.encage( Math.toIntExact( new Param(this.take(Attr.RHO), "locator").strong(Long.class) ), diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOremove.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOfree.java similarity index 81% rename from eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOremove.java rename to eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOfree.java index 225ad94da9..2d70056179 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOremove.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOfree.java @@ -32,30 +32,32 @@ import org.eolang.Data; import org.eolang.Param; import org.eolang.PhDefault; +import org.eolang.PhTracedLocator; import org.eolang.Phi; import org.eolang.Versionized; import org.eolang.XmirObject; /** - * Cage.encaged.remove object. + * Cage.encaged.free object. * @since 0.36.0 */ @Versionized -@XmirObject(oname = "cage.encaged.remove") -public class EOcage$EOencaged$EOremove extends PhDefault implements Atom { +@XmirObject(oname = "cage.encaged.free") +final class EOcage$EOencaged$EOfree extends PhDefault implements Atom { /** * Ctor. * @param sigma Sigma */ - EOcage$EOencaged$EOremove(final Phi sigma) { + EOcage$EOencaged$EOfree(final Phi sigma) { super(sigma); } @Override public Phi lambda() throws Exception { - Cages.INSTANCE.get().remove( - Math.toIntExact(new Param(this.take(Attr.RHO), "locator").strong(Long.class)) + final int locator = Math.toIntExact( + new Param(this.take(Attr.RHO), "locator").strong(Long.class) ); + Cages.INSTANCE.remove(locator); return new Data.ToPhi(true); } } diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOfreed.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOfreed.java new file mode 100644 index 0000000000..d6997bbbad --- /dev/null +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOfreed.java @@ -0,0 +1,63 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2024 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * @checkstyle PackageNameCheck (4 lines) + */ +package EOorg.EOeolang; + +import org.eolang.Atom; +import org.eolang.Attr; +import org.eolang.Param; +import org.eolang.PhDefault; +import org.eolang.PhTracedLocator; +import org.eolang.Phi; +import org.eolang.Versionized; +import org.eolang.XmirObject; + +/** + * Cage.encaged.freed object. + * @since 0.36.0 + */ +@Versionized +@XmirObject(oname = "cage.encaged.freed") +final class EOcage$EOencaged$EOfreed extends PhDefault implements Atom { + /** + * Ctor. + * @param sigma Sigma + */ + EOcage$EOencaged$EOfreed(final Phi sigma) { + super(sigma); + } + + @Override + public Phi lambda() throws Exception { + final int locator = Math.toIntExact( + new Param(this.take(Attr.RHO), "locator").strong(Long.class) + ); + final Phi object = Cages.INSTANCE.get(locator); + Cages.INSTANCE.remove(locator); + return object; + } +} diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOit.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOit.java index 83a4ea891d..df00526903 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOit.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EOencaged$EOit.java @@ -31,6 +31,7 @@ import org.eolang.Attr; import org.eolang.Param; import org.eolang.PhDefault; +import org.eolang.PhTracedLocator; import org.eolang.Phi; import org.eolang.Versionized; import org.eolang.XmirObject; @@ -41,7 +42,7 @@ */ @Versionized @XmirObject(oname = "cage.encaged.it") -public class EOcage$EOencaged$EOit extends PhDefault implements Atom { +final class EOcage$EOencaged$EOit extends PhDefault implements Atom { /** * Ctor. * @param sigma Sigma @@ -52,8 +53,12 @@ public class EOcage$EOencaged$EOit extends PhDefault implements Atom { @Override public Phi lambda() throws Exception { - return Cages.INSTANCE.get().get( - Math.toIntExact(new Param(this.take(Attr.RHO), "locator").strong(Long.class)) + final int locator = Math.toIntExact( + new Param(this.take(Attr.RHO), "locator").strong(Long.class) + ); + return new PhTracedLocator( + Cages.INSTANCE.get(locator), + locator ); } } diff --git "a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java" "b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java" index 6b4cb8845d..54b390702e 100644 --- "a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java" +++ "b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage$EO\317\206.java" @@ -42,7 +42,7 @@ */ @Versionized @XmirObject(oname = "cage.@") -public final class EOcage$EOφ extends PhDefault implements Atom { +final class EOcage$EOφ extends PhDefault implements Atom { /** * Ctor. * @param sigma Sigma @@ -57,7 +57,7 @@ public Phi lambda() throws Exception { encaged.put( "locator", new Data.ToPhi( - (long) Cages.INSTANCE.get().encage( + (long) Cages.INSTANCE.init( this.take(Attr.RHO).take("object") ) ) diff --git "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory$EO\317\206.java" "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory$EO\317\206.java" index 56686bf90e..8a4e84d9ec 100644 --- "a/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory$EO\317\206.java" +++ "b/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory$EO\317\206.java" @@ -43,7 +43,7 @@ */ @Versionized @XmirObject(oname = "memory.@") -public final class EOmemory$EOφ extends PhDefault implements Atom { +final class EOmemory$EOφ extends PhDefault implements Atom { /** * Ctor. * @param sigma Sigma diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOcageTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOcageTest.java index f0cf6a1c3f..ca65ed5c87 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOcageTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOcageTest.java @@ -54,7 +54,7 @@ import org.junit.jupiter.api.parallel.ExecutionMode; /** - * Test cases for {@link EOcage} and {@link EOcage$EOnew}. + * Test cases for {@link EOcage} and {@link EOcage$EOφ}. * @since 0.19 */ final class EOcageTest { @@ -179,10 +179,9 @@ private static void encageTo(final Phi cage, final Phi obj) { * @return Cage.new object */ private static Phi encaged(final Phi obj) { - final Phi cage = Phi.Φ.take("org.eolang.cage"); - final Phi encaged = cage.take("new").copy(); - encaged.put(0, obj); - return encaged; + final Phi cage = Phi.Φ.take("org.eolang.cage").copy(); + cage.put(0, obj); + return cage.take("new"); } /** @@ -212,7 +211,7 @@ void clearDepth() { @Test void doesNotThrowIfDataizesConcurrently() { - final Phi cage = Phi.Φ.take("org.eolang.cage").take("new").copy(); + final Phi cage = EOcageTest.encaged(new RecursiveDummy()); EOcageTest.encageTo( cage, new RecursiveDummy(EOcageTest.RecursionTests.MAX_DEPTH, cage) @@ -261,7 +260,9 @@ void rewritesItselfToItselfViaDummy() { @Test void throwsExceptionIfRecursion() { - final Phi cage = Phi.Φ.take("org.eolang.cage").take("new").copy(); + final Phi cage = EOcageTest.encaged( + Phi.Φ.take("org.eolang.cage").take("encaged") + ); EOcageTest.encageTo(cage, cage); Assertions.assertThrows( ExAbstract.class, @@ -272,7 +273,7 @@ void throwsExceptionIfRecursion() { @Test void doesNotThrowExceptionIfSmallDepth() { - final Phi cage = Phi.Φ.take("org.eolang.cage").take("new").copy(); + final Phi cage = EOcageTest.encaged(new RecursiveDummy()); EOcageTest.encageTo( cage, new RecursiveDummy(EOcageTest.RecursionTests.MAX_DEPTH / 2, cage) @@ -293,7 +294,7 @@ void doesNotThrowExceptionIfSmallDepth() { */ @Test void doesNotThrowExceptionIfMaxDepth() { - final Phi cage = Phi.Φ.take("org.eolang.cage").take("new").copy(); + final Phi cage = EOcageTest.encaged(new RecursiveDummy()); EOcageTest.encageTo( cage, new RecursiveDummy(EOcageTest.RecursionTests.MAX_DEPTH, cage) @@ -311,7 +312,7 @@ void doesNotThrowExceptionIfMaxDepth() { @Test void throwsExceptionIfBigDepth() { - final Phi cage = Phi.Φ.take("org.eolang.cage").take("new").copy(); + final Phi cage = EOcageTest.encaged(new RecursiveDummy()); EOcageTest.encageTo( cage, new RecursiveDummy(EOcageTest.RecursionTests.MAX_DEPTH + 1, cage) @@ -337,7 +338,7 @@ private final class RecursiveDummy extends PhDefault implements Atom { /** * How many times should we met the cage while dataizing it eventually. */ - private final int depth; + private final Integer depth; /** * The cage. @@ -349,12 +350,19 @@ private final class RecursiveDummy extends PhDefault implements Atom { */ private final ThreadLocal counter; + /** + * Ctor for initialize cage. + */ + RecursiveDummy() { + this(null, null); + } + /** * Ctor. * @param depth Depth. * @param cage Cage. */ - RecursiveDummy(final int depth, final Phi cage) { + RecursiveDummy(final Integer depth, final Phi cage) { this.depth = depth; this.cage = cage; this.counter = ThreadLocal.withInitial(() -> 0);