From 0e03fba6494c67047b006c27ddd8b42c61e5553e Mon Sep 17 00:00:00 2001 From: fglock Date: Mon, 21 Oct 2024 20:51:28 +0200 Subject: [PATCH] refactor --- .../org/perlonjava/codegen/EmitRegex.java | 112 +++++++++--------- .../codegen/EmitterMethodCreator.java | 26 ++-- .../perlonjava/codegen/EmitterVisitor.java | 33 ++---- 3 files changed, 80 insertions(+), 91 deletions(-) diff --git a/src/main/java/org/perlonjava/codegen/EmitRegex.java b/src/main/java/org/perlonjava/codegen/EmitRegex.java index 0f92c4c..b2cf161 100644 --- a/src/main/java/org/perlonjava/codegen/EmitRegex.java +++ b/src/main/java/org/perlonjava/codegen/EmitRegex.java @@ -57,67 +57,69 @@ static void handleRegex(EmitterVisitor emitterVisitor, OperatorNode node) { EmitterVisitor scalarVisitor = emitterVisitor.with(RuntimeContextType.SCALAR); Node variable = null; - if (node.operator.equals("qx")) { - // static RuntimeScalar systemCommand(RuntimeScalar command) - operand.elements.get(0).accept(scalarVisitor); - emitterVisitor.pushCallContext(); - emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, - "org/perlonjava/runtime/RuntimeIO", - "systemCommand", - "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;", false); - if (emitterVisitor.ctx.contextType == RuntimeContextType.VOID) { - emitterVisitor.ctx.mv.visitInsn(Opcodes.POP); - } - return; - } - - if (node.operator.equals("tr") || node.operator.equals("y")) { - // static RuntimeTransliterate compile(RuntimeScalar search, RuntimeScalar replace, RuntimeScalar modifiers) - operand.elements.get(0).accept(scalarVisitor); - operand.elements.get(1).accept(scalarVisitor); - operand.elements.get(2).accept(scalarVisitor); - if (operand.elements.size() > 3) { - variable = operand.elements.get(3); + switch (node.operator) { + case "qx" -> { + // static RuntimeScalar systemCommand(RuntimeScalar command) + operand.elements.getFirst().accept(scalarVisitor); + emitterVisitor.pushCallContext(); + emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, + "org/perlonjava/runtime/RuntimeIO", + "systemCommand", + "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;", false); + if (emitterVisitor.ctx.contextType == RuntimeContextType.VOID) { + emitterVisitor.ctx.mv.visitInsn(Opcodes.POP); + } + return; } - emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, - "org/perlonjava/runtime/RuntimeTransliterate", "compile", - "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeTransliterate;", false); + case "tr", "y" -> { + // static RuntimeTransliterate compile(RuntimeScalar search, RuntimeScalar replace, RuntimeScalar modifiers) + operand.elements.get(0).accept(scalarVisitor); + operand.elements.get(1).accept(scalarVisitor); + operand.elements.get(2).accept(scalarVisitor); + if (operand.elements.size() > 3) { + variable = operand.elements.get(3); + } + emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, + "org/perlonjava/runtime/RuntimeTransliterate", "compile", + "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeTransliterate;", false); - // RuntimeScalar transliterate(RuntimeScalar originalString) - if (variable == null) { - // use `$_` - variable = new OperatorNode("$", new IdentifierNode("_", node.tokenIndex), node.tokenIndex); - } - variable.accept(scalarVisitor); - emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/perlonjava/runtime/RuntimeTransliterate", "transliterate", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false); - if (emitterVisitor.ctx.contextType == RuntimeContextType.VOID) { - emitterVisitor.ctx.mv.visitInsn(Opcodes.POP); + // RuntimeScalar transliterate(RuntimeScalar originalString) + if (variable == null) { + // use `$_` + variable = new OperatorNode("$", new IdentifierNode("_", node.tokenIndex), node.tokenIndex); + } + variable.accept(scalarVisitor); + emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/perlonjava/runtime/RuntimeTransliterate", "transliterate", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false); + if (emitterVisitor.ctx.contextType == RuntimeContextType.VOID) { + emitterVisitor.ctx.mv.visitInsn(Opcodes.POP); + } + return; } - return; - - } else if (node.operator.equals("replaceRegex")) { - // RuntimeBaseEntity replaceRegex(RuntimeScalar quotedRegex, RuntimeScalar string, RuntimeScalar replacement, int ctx) - operand.elements.get(0).accept(scalarVisitor); - operand.elements.get(1).accept(scalarVisitor); - operand.elements.get(2).accept(scalarVisitor); - if (operand.elements.size() > 3) { - variable = operand.elements.get(3); + case "replaceRegex" -> { + // RuntimeBaseEntity replaceRegex(RuntimeScalar quotedRegex, RuntimeScalar string, RuntimeScalar replacement, int ctx) + operand.elements.get(0).accept(scalarVisitor); + operand.elements.get(1).accept(scalarVisitor); + operand.elements.get(2).accept(scalarVisitor); + if (operand.elements.size() > 3) { + variable = operand.elements.get(3); + } + emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, + "org/perlonjava/runtime/RuntimeRegex", "getReplacementRegex", + "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false); } - emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, - "org/perlonjava/runtime/RuntimeRegex", "getReplacementRegex", - "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false); - - } else { - // RuntimeRegex.getQuotedRegex(RuntimeScalar patternString, RuntimeScalar modifiers) - operand.elements.get(0).accept(scalarVisitor); - operand.elements.get(1).accept(scalarVisitor); - if (operand.elements.size() > 2) { - variable = operand.elements.get(2); + default -> { + // RuntimeRegex.getQuotedRegex(RuntimeScalar patternString, RuntimeScalar modifiers) + operand.elements.get(0).accept(scalarVisitor); + operand.elements.get(1).accept(scalarVisitor); + if (operand.elements.size() > 2) { + variable = operand.elements.get(2); + } + emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, + "org/perlonjava/runtime/RuntimeRegex", "getQuotedRegex", + "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false); } - emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, - "org/perlonjava/runtime/RuntimeRegex", "getQuotedRegex", - "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false); } + if (node.operator.equals("quoteRegex")) { // do not execute `qr//` return; diff --git a/src/main/java/org/perlonjava/codegen/EmitterMethodCreator.java b/src/main/java/org/perlonjava/codegen/EmitterMethodCreator.java index 81ae540..07ca3e3 100644 --- a/src/main/java/org/perlonjava/codegen/EmitterMethodCreator.java +++ b/src/main/java/org/perlonjava/codegen/EmitterMethodCreator.java @@ -44,14 +44,11 @@ public static String getVariableDescriptor(String varName) { char firstChar = varName.charAt(0); // Use a switch statement to determine the descriptor based on the first character - switch (firstChar) { - case '%': - return "Lorg/perlonjava/runtime/RuntimeHash;"; - case '@': - return "Lorg/perlonjava/runtime/RuntimeArray;"; - default: - return "Lorg/perlonjava/runtime/RuntimeScalar;"; - } + return switch (firstChar) { + case '%' -> "Lorg/perlonjava/runtime/RuntimeHash;"; + case '@' -> "Lorg/perlonjava/runtime/RuntimeArray;"; + default -> "Lorg/perlonjava/runtime/RuntimeScalar;"; + }; } /** @@ -71,14 +68,11 @@ public static String getVariableClassName(String varName) { char firstChar = varName.charAt(0); // Use a switch statement to determine the class name based on the first character - switch (firstChar) { - case '%': - return "org/perlonjava/runtime/RuntimeHash"; - case '@': - return "org/perlonjava/runtime/RuntimeArray"; - default: - return "org/perlonjava/runtime/RuntimeScalar"; - } + return switch (firstChar) { + case '%' -> "org/perlonjava/runtime/RuntimeHash"; + case '@' -> "org/perlonjava/runtime/RuntimeArray"; + default -> "org/perlonjava/runtime/RuntimeScalar"; + }; } /** diff --git a/src/main/java/org/perlonjava/codegen/EmitterVisitor.java b/src/main/java/org/perlonjava/codegen/EmitterVisitor.java index 3bafd3c..e55f9ab 100644 --- a/src/main/java/org/perlonjava/codegen/EmitterVisitor.java +++ b/src/main/java/org/perlonjava/codegen/EmitterVisitor.java @@ -317,7 +317,7 @@ private void handleArrayElementOperator(BinaryOperatorNode node) { ArrayLiteralNode right = (ArrayLiteralNode) node.right; if (right.elements.size() == 1) { // Optimization: Extract the single element if the list has only one item - Node elem = right.elements.get(0); + Node elem = right.elements.getFirst(); elem.accept(this.with(RuntimeContextType.SCALAR)); } else { // emit the [0] as a RuntimeList @@ -400,7 +400,7 @@ public void handleHashElementOperator(BinaryOperatorNode node, String hashOperat // emit the {x} as a RuntimeList ListNode nodeRight = ((HashLiteralNode) node.right).asListNode(); - Node nodeZero = nodeRight.elements.get(0); + Node nodeZero = nodeRight.elements.getFirst(); if (nodeRight.elements.size() == 1 && nodeZero instanceof IdentifierNode) { // Convert IdentifierNode to StringNode: {a} to {"a"} nodeRight.elements.set(0, new StringNode(((IdentifierNode) nodeZero).name, ((IdentifierNode) nodeZero).tokenIndex)); @@ -434,7 +434,7 @@ public void handleHashElementOperator(BinaryOperatorNode node, String hashOperat // emit the {x} as a RuntimeList ListNode nodeRight = ((HashLiteralNode) node.right).asListNode(); - Node nodeZero = nodeRight.elements.get(0); + Node nodeZero = nodeRight.elements.getFirst(); if (nodeRight.elements.size() == 1 && nodeZero instanceof IdentifierNode) { // Convert IdentifierNode to StringNode: {a} to {"a"} nodeRight.elements.set(0, new StringNode(((IdentifierNode) nodeZero).name, ((IdentifierNode) nodeZero).tokenIndex)); @@ -537,7 +537,7 @@ private void handleArrowArrayDeref(BinaryOperatorNode node, String arrayOperatio ArrayLiteralNode right = (ArrayLiteralNode) node.right; if (right.elements.size() == 1) { // Optimization: Extract the single element if the list has only one item - Node elem = right.elements.get(0); + Node elem = right.elements.getFirst(); elem.accept(this.with(RuntimeContextType.SCALAR)); } else { // emit the [0] as a RuntimeList @@ -570,7 +570,7 @@ public void handleArrowHashDeref(BinaryOperatorNode node, String hashOperation) // emit the {0} as a RuntimeList ListNode nodeRight = ((HashLiteralNode) node.right).asListNode(); - Node nodeZero = nodeRight.elements.get(0); + Node nodeZero = nodeRight.elements.getFirst(); if (nodeRight.elements.size() == 1 && nodeZero instanceof IdentifierNode) { // Convert IdentifierNode to StringNode: {a} to {"a"} nodeRight.elements.set(0, new StringNode(((IdentifierNode) nodeZero).name, ((IdentifierNode) nodeZero).tokenIndex)); @@ -579,20 +579,13 @@ public void handleArrowHashDeref(BinaryOperatorNode node, String hashOperation) ctx.logDebug("visit -> (HashLiteralNode) autoquote " + node.right); nodeRight.accept(this.with(RuntimeContextType.SCALAR)); - String methodName; - switch (hashOperation) { - case "get": - methodName = "hashDerefGet"; - break; - case "delete": - methodName = "hashDerefDelete"; - break; - case "exists": - methodName = "hashDerefExists"; - break; - default: - throw new PerlCompilerException(node.tokenIndex, "Not implemented: hash operation: " + hashOperation, ctx.errorUtil); - } + String methodName = switch (hashOperation) { + case "get" -> "hashDerefGet"; + case "delete" -> "hashDerefDelete"; + case "exists" -> "hashDerefExists"; + default -> + throw new PerlCompilerException(node.tokenIndex, "Not implemented: hash operation: " + hashOperation, ctx.errorUtil); + }; ctx.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/perlonjava/runtime/RuntimeScalar", methodName, "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false); } @@ -643,7 +636,7 @@ private void handleArrayUnaryBuiltin(OperatorNode node, String operator) { Node operand = node.operand; ctx.logDebug("handleArrayUnaryBuiltin " + operand); if (operand instanceof ListNode) { - operand = ((ListNode) operand).elements.get(0); + operand = ((ListNode) operand).elements.getFirst(); } operand.accept(this.with(RuntimeContextType.LIST)); ctx.mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/perlonjava/runtime/RuntimeArray", operator, "()Lorg/perlonjava/runtime/RuntimeScalar;", false);