Răsfoiți Sursa

Change operation interface

boono 11 luni în urmă
părinte
comite
a8bd7877d3

+ 2 - 4
src/main/java/xyz/kwiecien/jfuck/operation/Initialization.java

@@ -3,7 +3,6 @@ package xyz.kwiecien.jfuck.operation;
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.TypeKind;
 import java.lang.classfile.TypeKind;
 import java.lang.constant.MethodTypeDesc;
 import java.lang.constant.MethodTypeDesc;
-import java.util.function.Consumer;
 
 
 import static java.lang.constant.ConstantDescs.CD_void;
 import static java.lang.constant.ConstantDescs.CD_void;
 import static java.lang.constant.ConstantDescs.INIT_NAME;
 import static java.lang.constant.ConstantDescs.INIT_NAME;
@@ -11,9 +10,8 @@ import static xyz.kwiecien.jfuck.operation.BytecodeConstants.*;
 
 
 public class Initialization implements Operation {
 public class Initialization implements Operation {
     @Override
     @Override
-    public Consumer<CodeBuilder> appendBytecode() {
-        return c -> c
-                .iconst_0().istore(PTR_VAR_INDEX) // Pointer init
+    public void appendBytecode(CodeBuilder cb) {
+        cb.iconst_0().istore(PTR_VAR_INDEX) // Pointer init
                 .sipush(DATA_SIZE).newarray(TypeKind.BYTE).astore(DATA_VAR_INDEX) // Initialize array of 30k bytes
                 .sipush(DATA_SIZE).newarray(TypeKind.BYTE).astore(DATA_VAR_INDEX) // Initialize array of 30k bytes
                 .new_(SCANNER_DESC).dup() //dup, because we will be initializing it and then setting a field
                 .new_(SCANNER_DESC).dup() //dup, because we will be initializing it and then setting a field
                 .getstatic(SYSTEM_DESC, "in", INPUT_STREAM_DESC)
                 .getstatic(SYSTEM_DESC, "in", INPUT_STREAM_DESC)

+ 3 - 4
src/main/java/xyz/kwiecien/jfuck/operation/Loop.java

@@ -2,19 +2,18 @@ package xyz.kwiecien.jfuck.operation;
 
 
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.CodeBuilder;
 import java.util.List;
 import java.util.List;
-import java.util.function.Consumer;
 
 
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.PTR_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.PTR_VAR_INDEX;
 
 
 public record Loop(List<Operation> innerOperations) implements Operation {
 public record Loop(List<Operation> innerOperations) implements Operation {
     @Override
     @Override
-    public Consumer<CodeBuilder> appendBytecode() {
-        return c -> c.block(bc -> {
+    public void appendBytecode(CodeBuilder cb) {
+        cb.block(bc -> {
                     bc.aload(DATA_VAR_INDEX).iload(PTR_VAR_INDEX).baload() //Get data from pointer
                     bc.aload(DATA_VAR_INDEX).iload(PTR_VAR_INDEX).baload() //Get data from pointer
                             .ifeq(bc.endLabel()); //Jump out of loop if data == 0
                             .ifeq(bc.endLabel()); //Jump out of loop if data == 0
                     for (var innerOperation : innerOperations) {
                     for (var innerOperation : innerOperations) {
-                        innerOperation.appendBytecode().accept(bc);
+                        innerOperation.appendBytecode(bc);
                     }
                     }
                     bc.goto_(bc.startLabel());
                     bc.goto_(bc.startLabel());
                 }
                 }

+ 2 - 3
src/main/java/xyz/kwiecien/jfuck/operation/ModifyPointerOperation.java

@@ -1,15 +1,14 @@
 package xyz.kwiecien.jfuck.operation;
 package xyz.kwiecien.jfuck.operation;
 
 
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.CodeBuilder;
-import java.util.function.Consumer;
 
 
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_SIZE;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_SIZE;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.PTR_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.PTR_VAR_INDEX;
 
 
 public record ModifyPointerOperation(int value) implements Operation {
 public record ModifyPointerOperation(int value) implements Operation {
     @Override
     @Override
-    public Consumer<CodeBuilder> appendBytecode() {
-        return c -> c.iload(PTR_VAR_INDEX)
+    public void appendBytecode(CodeBuilder cb) {
+        cb.iload(PTR_VAR_INDEX)
                 .ldc(value).iadd() // ptr = ptr + value
                 .ldc(value).iadd() // ptr = ptr + value
                 .ldc(DATA_SIZE).iadd().ldc(DATA_SIZE).irem() // ptr = (ptr + DATA_SIZE) % DATA_SIZE
                 .ldc(DATA_SIZE).iadd().ldc(DATA_SIZE).irem() // ptr = (ptr + DATA_SIZE) % DATA_SIZE
                 .istore(PTR_VAR_INDEX);
                 .istore(PTR_VAR_INDEX);

+ 2 - 3
src/main/java/xyz/kwiecien/jfuck/operation/ModifyStackValueOperation.java

@@ -1,15 +1,14 @@
 package xyz.kwiecien.jfuck.operation;
 package xyz.kwiecien.jfuck.operation;
 
 
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.CodeBuilder;
-import java.util.function.Consumer;
 
 
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.PTR_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.PTR_VAR_INDEX;
 
 
 public record ModifyStackValueOperation(byte value) implements Operation {
 public record ModifyStackValueOperation(byte value) implements Operation {
     @Override
     @Override
-    public Consumer<CodeBuilder> appendBytecode() {
-        return c -> c.aload(DATA_VAR_INDEX).iload(PTR_VAR_INDEX).dup2() // dup2, because will be used to read value and then store incremented
+    public void appendBytecode(CodeBuilder cb) {
+        cb.aload(DATA_VAR_INDEX).iload(PTR_VAR_INDEX).dup2() // dup2, because will be used to read value and then store incremented
                 .baload()
                 .baload()
                 .bipush(value)
                 .bipush(value)
                 .iadd()
                 .iadd()

+ 1 - 2
src/main/java/xyz/kwiecien/jfuck/operation/Operation.java

@@ -1,8 +1,7 @@
 package xyz.kwiecien.jfuck.operation;
 package xyz.kwiecien.jfuck.operation;
 
 
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.CodeBuilder;
-import java.util.function.Consumer;
 
 
 public interface Operation {
 public interface Operation {
-    Consumer<CodeBuilder> appendBytecode();
+    void appendBytecode(CodeBuilder cb);
 }
 }

+ 2 - 3
src/main/java/xyz/kwiecien/jfuck/operation/ReadOperation.java

@@ -2,15 +2,14 @@ package xyz.kwiecien.jfuck.operation;
 
 
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.CodeBuilder;
 import java.lang.constant.MethodTypeDesc;
 import java.lang.constant.MethodTypeDesc;
-import java.util.function.Consumer;
 
 
 import static java.lang.constant.ConstantDescs.*;
 import static java.lang.constant.ConstantDescs.*;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.*;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.*;
 
 
 public class ReadOperation implements Operation {
 public class ReadOperation implements Operation {
     @Override
     @Override
-    public Consumer<CodeBuilder> appendBytecode() {
-        return c -> c.aload(DATA_VAR_INDEX).iload(PTR_VAR_INDEX)
+    public void appendBytecode(CodeBuilder cb) {
+        cb.aload(DATA_VAR_INDEX).iload(PTR_VAR_INDEX)
                 .aload(SCANNER_VAR_INDEX)
                 .aload(SCANNER_VAR_INDEX)
                 .invokevirtual(SCANNER_DESC, "next", MethodTypeDesc.of(CD_String))
                 .invokevirtual(SCANNER_DESC, "next", MethodTypeDesc.of(CD_String))
                 .iconst_0()
                 .iconst_0()

+ 2 - 3
src/main/java/xyz/kwiecien/jfuck/operation/WriteOperation.java

@@ -3,7 +3,6 @@ package xyz.kwiecien.jfuck.operation;
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.CodeBuilder;
 import java.lang.classfile.TypeKind;
 import java.lang.classfile.TypeKind;
 import java.lang.constant.MethodTypeDesc;
 import java.lang.constant.MethodTypeDesc;
-import java.util.function.Consumer;
 
 
 import static java.lang.constant.ConstantDescs.*;
 import static java.lang.constant.ConstantDescs.*;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_VAR_INDEX;
 import static xyz.kwiecien.jfuck.operation.BytecodeConstants.DATA_VAR_INDEX;
@@ -11,8 +10,8 @@ import static xyz.kwiecien.jfuck.operation.BytecodeConstants.PTR_VAR_INDEX;
 
 
 public class WriteOperation implements Operation {
 public class WriteOperation implements Operation {
     @Override
     @Override
-    public Consumer<CodeBuilder> appendBytecode() {
-        return c -> c.getstatic(BytecodeConstants.SYSTEM_DESC, "out", BytecodeConstants.PRINT_STREAM_DESC)
+    public void appendBytecode(CodeBuilder cb) {
+        cb.getstatic(BytecodeConstants.SYSTEM_DESC, "out", BytecodeConstants.PRINT_STREAM_DESC)
                 .new_(BytecodeConstants.STRING_CLASS_DESC).dup() // dup, because we will be initializing it and then using as an argument for print
                 .new_(BytecodeConstants.STRING_CLASS_DESC).dup() // dup, because we will be initializing it and then using as an argument for print
                 .iconst_1().newarray(TypeKind.BYTE).dup() // dup, because we will be filling it with data and then passing to String.<init>
                 .iconst_1().newarray(TypeKind.BYTE).dup() // dup, because we will be filling it with data and then passing to String.<init>
                 .iconst_0() // index of byte array to set
                 .iconst_0() // index of byte array to set

+ 9 - 9
src/test/java/OperationsTest.java

@@ -23,25 +23,25 @@ public class OperationsTest {
                 .invokespecial(CD_Object, INIT_NAME, MTD_void).return_();
                 .invokespecial(CD_Object, INIT_NAME, MTD_void).return_();
 
 
         Consumer<CodeBuilder> addCode = cb -> {
         Consumer<CodeBuilder> addCode = cb -> {
-            new Initialization().appendBytecode().accept(cb);
-            new ReadOperation().appendBytecode().accept(cb);
-            new ModifyPointerOperation(1).appendBytecode().accept(cb);
-            new ModifyStackValueOperation((byte) 6).appendBytecode().accept(cb);
+            new Initialization().appendBytecode(cb);
+            new ReadOperation().appendBytecode(cb);
+            new ModifyPointerOperation(1).appendBytecode(cb);
+            new ModifyStackValueOperation((byte) 6).appendBytecode(cb);
             new Loop(List.of(
             new Loop(List.of(
                     new ModifyPointerOperation(-1),
                     new ModifyPointerOperation(-1),
                     new ModifyStackValueOperation((byte) -8),
                     new ModifyStackValueOperation((byte) -8),
                     new ModifyPointerOperation(1),
                     new ModifyPointerOperation(1),
                     new ModifyStackValueOperation((byte) -1)
                     new ModifyStackValueOperation((byte) -1)
-            )).appendBytecode().accept(cb);
-            new ReadOperation().appendBytecode().accept(cb);
+            )).appendBytecode(cb);
+            new ReadOperation().appendBytecode(cb);
             new Loop(List.of(
             new Loop(List.of(
                     new ModifyPointerOperation(-1),
                     new ModifyPointerOperation(-1),
                     new ModifyStackValueOperation((byte) 1),
                     new ModifyStackValueOperation((byte) 1),
                     new ModifyPointerOperation(1),
                     new ModifyPointerOperation(1),
                     new ModifyStackValueOperation((byte) -1)
                     new ModifyStackValueOperation((byte) -1)
-            )).appendBytecode().accept(cb);
-            new ModifyPointerOperation(-1).appendBytecode().accept(cb);
-            new WriteOperation().appendBytecode().accept(cb);
+            )).appendBytecode(cb);
+            new ModifyPointerOperation(-1).appendBytecode(cb);
+            new WriteOperation().appendBytecode(cb);
             cb.return_();
             cb.return_();
         };
         };