Skip to content

Commit 9bff83c

Browse files
committed
optimization - migrate from INVOKEINTERFACE to INVOKEVIRTUAL
1 parent 7d3cd5a commit 9bff83c

14 files changed

+30
-38
lines changed

src/main/java/org/perlonjava/codegen/EmitLiteral.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,8 @@ private static void addElementToList(MethodVisitor mv, Node element, int context
427427
"addToList", "(" + RuntimeTypeConstants.LIST_TYPE + ")V", false);
428428
} else {
429429
// Fall back to interface call for unknown types
430-
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, RuntimeTypeConstants.DATA_PROVIDER_INTERFACE,
431-
"addToList", "(" + RuntimeTypeConstants.LIST_TYPE + ")V", true);
430+
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, RuntimeTypeConstants.BASE_CLASS,
431+
"addToList", "(" + RuntimeTypeConstants.LIST_TYPE + ")V", false);
432432
}
433433
}
434434

src/main/java/org/perlonjava/codegen/EmitOperator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ static void handleReadlineOperator(EmitterVisitor emitterVisitor, BinaryOperator
9393
// Push call context for SCALAR or LIST context.
9494
emitterVisitor.pushCallContext();
9595
// Invoke the static method for the operator.
96-
emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/perlonjava/operators/Readline", operator, "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;", false);
96+
emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/perlonjava/operators/Readline", operator, "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;", false);
9797
} else {
9898
// Invoke the static method for the operator without context.
9999
emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/perlonjava/operators/Operator", operator, "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;", false);
@@ -253,7 +253,7 @@ static void handleDiamondBuiltin(EmitterVisitor emitterVisitor, OperatorNode nod
253253
mv.visitMethodInsn(Opcodes.INVOKESTATIC,
254254
"org/perlonjava/runtime/DiamondIO",
255255
"readline",
256-
"(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;", false);
256+
"(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;", false);
257257
// If the context is VOID, pop the result from the stack.
258258
handleVoidContext(emitterVisitor);
259259
} else {
@@ -284,7 +284,7 @@ static void handleGlobBuiltin(EmitterVisitor emitterVisitor, OperatorNode node)
284284
// Generate unique IDs for this glob instance
285285
int globId = ScalarGlobOperator.currentId++;
286286

287-
// public static RuntimeDataProvider evaluate(id, patternArg, ctx)
287+
// public static RuntimeBaseEntity evaluate(id, patternArg, ctx)
288288
mv.visitLdcInsn(globId);
289289
// Accept the operand in SCALAR context.
290290
node.operand.accept(emitterVisitor.with(RuntimeContextType.SCALAR));
@@ -322,7 +322,7 @@ static void handleRepeat(EmitterVisitor emitterVisitor, BinaryOperatorNode node)
322322
// Invoke the static method for the 'repeat' operator.
323323
emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC, "org/perlonjava/operators/Operator",
324324
"repeat",
325-
"(Lorg/perlonjava/runtime/RuntimeDataProvider;Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;", false);
325+
"(Lorg/perlonjava/runtime/RuntimeDataProvider;Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;", false);
326326

327327
if (emitterVisitor.ctx.contextType == RuntimeContextType.SCALAR) {
328328
emitterVisitor.ctx.mv.visitTypeInsn(Opcodes.CHECKCAST, "org/perlonjava/runtime/RuntimeScalar");

src/main/java/org/perlonjava/codegen/EmitRegex.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ private static void emitMatchRegex(EmitterVisitor emitterVisitor) {
191191
// Invoke the regex matching operation
192192
emitterVisitor.ctx.mv.visitMethodInsn(Opcodes.INVOKESTATIC,
193193
"org/perlonjava/regex/RuntimeRegex", "matchRegex",
194-
"(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;", false);
194+
"(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;", false);
195195

196196
// Handle the result based on context type
197197
if (emitterVisitor.ctx.contextType == RuntimeContextType.SCALAR) {

src/main/java/org/perlonjava/operators/Directory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public static Set<PosixFilePermission> getPosixFilePermissions(int mode) {
140140
return permissions;
141141
}
142142

143-
public static RuntimeDataProvider readdir(RuntimeScalar dirHandle, int ctx) {
143+
public static RuntimeBaseEntity readdir(RuntimeScalar dirHandle, int ctx) {
144144
RuntimeIO runtimeIO = dirHandle.getRuntimeIO();
145145
if (runtimeIO.directoryIO != null) {
146146
return runtimeIO.directoryIO.readdir(ctx);

src/main/java/org/perlonjava/operators/Operator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,7 @@ public static RuntimeList splice(RuntimeArray runtimeArray, RuntimeList list) {
742742
* @param value The list of files to be deleted.
743743
* @return A RuntimeScalar indicating the result of the unlink operation.
744744
*/
745-
public static RuntimeDataProvider unlink(RuntimeDataProvider value, int ctx) {
745+
public static RuntimeBaseEntity unlink(RuntimeDataProvider value, int ctx) {
746746

747747
boolean allDeleted = true;
748748
RuntimeList fileList = value.getList();
@@ -765,7 +765,7 @@ public static RuntimeDataProvider unlink(RuntimeDataProvider value, int ctx) {
765765
return getScalarBoolean(allDeleted);
766766
}
767767

768-
public static RuntimeDataProvider reverse(RuntimeDataProvider value, int ctx) {
768+
public static RuntimeBaseEntity reverse(RuntimeDataProvider value, int ctx) {
769769
if (ctx == RuntimeContextType.SCALAR) {
770770
StringBuilder sb = new StringBuilder();
771771

@@ -801,7 +801,7 @@ public static RuntimeDataProvider reverse(RuntimeDataProvider value, int ctx) {
801801
}
802802
}
803803

804-
public static RuntimeDataProvider repeat(RuntimeDataProvider value, RuntimeScalar timesScalar, int ctx) {
804+
public static RuntimeBaseEntity repeat(RuntimeDataProvider value, RuntimeScalar timesScalar, int ctx) {
805805
int times = timesScalar.getInt();
806806
if (ctx == RuntimeContextType.SCALAR || value instanceof RuntimeScalar) {
807807
StringBuilder sb = new StringBuilder();

src/main/java/org/perlonjava/operators/OperatorHandler.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,12 @@ public class OperatorHandler {
105105
put("closedir", "closedir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;");
106106
put("rewinddir", "rewinddir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;");
107107
put("telldir", "telldir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;");
108-
put("readdir", "readdir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;");
108+
put("readdir", "readdir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;");
109109
put("mkdir", "mkdir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeList;)Lorg/perlonjava/runtime/RuntimeScalar;");
110110
put("seekdir", "seekdir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeList;)Lorg/perlonjava/runtime/RuntimeScalar;");
111111
put("chdir", "chdir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;");
112112
put("opendir", "opendir", "org/perlonjava/operators/Directory", "(Lorg/perlonjava/runtime/RuntimeList;)Lorg/perlonjava/runtime/RuntimeScalar;");
113-
put("glob", "evaluate", "org/perlonjava/operators/ScalarGlobOperator", "(ILorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;");
113+
put("glob", "evaluate", "org/perlonjava/operators/ScalarGlobOperator", "(ILorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;");
114114

115115
// Modules
116116
put("doFile", "doFile", "org/perlonjava/operators/ModuleOperators", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;");
@@ -124,12 +124,12 @@ public class OperatorHandler {
124124
put("select", "select", "org/perlonjava/operators/Operator", "(Lorg/perlonjava/runtime/RuntimeList;I)Lorg/perlonjava/runtime/RuntimeScalar;");
125125
put("caller", "caller", "org/perlonjava/runtime/RuntimeCode", "(Lorg/perlonjava/runtime/RuntimeList;I)Lorg/perlonjava/runtime/RuntimeList;");
126126
put("reset", "reset", "org/perlonjava/runtime/RuntimeScalar", "(Lorg/perlonjava/runtime/RuntimeList;I)Lorg/perlonjava/runtime/RuntimeList;");
127-
put("warn", "warn", "org/perlonjava/operators/WarnDie", "(Lorg/perlonjava/runtime/RuntimeDataProvider;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeDataProvider;");
128-
put("die", "die", "org/perlonjava/operators/WarnDie", "(Lorg/perlonjava/runtime/RuntimeDataProvider;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeDataProvider;");
127+
put("warn", "warn", "org/perlonjava/operators/WarnDie", "(Lorg/perlonjava/runtime/RuntimeDataProvider;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeBaseEntity;");
128+
put("die", "die", "org/perlonjava/operators/WarnDie", "(Lorg/perlonjava/runtime/RuntimeDataProvider;Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeBaseEntity;");
129129
put("exit", "exit", "org/perlonjava/operators/WarnDie", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeScalar;");
130-
put("reverse", "reverse", "org/perlonjava/operators/Operator", "(Lorg/perlonjava/runtime/RuntimeDataProvider;I)Lorg/perlonjava/runtime/RuntimeDataProvider;");
130+
put("reverse", "reverse", "org/perlonjava/operators/Operator", "(Lorg/perlonjava/runtime/RuntimeDataProvider;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;");
131131
put("crypt", "crypt", "org/perlonjava/operators/Crypt", "(Lorg/perlonjava/runtime/RuntimeList;)Lorg/perlonjava/runtime/RuntimeScalar;");
132-
put("unlink", "unlink", "org/perlonjava/operators/Operator", "(Lorg/perlonjava/runtime/RuntimeDataProvider;I)Lorg/perlonjava/runtime/RuntimeDataProvider;");
132+
put("unlink", "unlink", "org/perlonjava/operators/Operator", "(Lorg/perlonjava/runtime/RuntimeDataProvider;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;");
133133
put("stat", "stat", "org/perlonjava/operators/Stat", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeList;");
134134
put("lstat", "lstat", "org/perlonjava/operators/Stat", "(Lorg/perlonjava/runtime/RuntimeScalar;)Lorg/perlonjava/runtime/RuntimeList;");
135135
put("vec", "vec", "org/perlonjava/operators/Vec", "(Lorg/perlonjava/runtime/RuntimeList;)Lorg/perlonjava/runtime/RuntimeScalar;");
@@ -155,7 +155,7 @@ public class OperatorHandler {
155155
put("substr", "substr", "org/perlonjava/operators/Operator", "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeList;)Lorg/perlonjava/runtime/RuntimeScalar;");
156156
put("sprintf", "sprintf", "org/perlonjava/operators/SprintfOperator", "(Lorg/perlonjava/runtime/RuntimeScalar;Lorg/perlonjava/runtime/RuntimeList;)Lorg/perlonjava/runtime/RuntimeScalar;");
157157

158-
put("systemCommand", "systemCommand", "org/perlonjava/operators/SystemOperator", "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeDataProvider;");
158+
put("systemCommand", "systemCommand", "org/perlonjava/operators/SystemOperator", "(Lorg/perlonjava/runtime/RuntimeScalar;I)Lorg/perlonjava/runtime/RuntimeBaseEntity;");
159159
put("system", "system", "org/perlonjava/operators/SystemOperator", "(Lorg/perlonjava/runtime/RuntimeList;I)Lorg/perlonjava/runtime/RuntimeScalar;");
160160
put("exec", "exec", "org/perlonjava/operators/SystemOperator", "(Lorg/perlonjava/runtime/RuntimeList;I)Lorg/perlonjava/runtime/RuntimeScalar;");
161161
put("fork", "fork", "org/perlonjava/operators/SystemOperator", "(Lorg/perlonjava/runtime/RuntimeList;I)Lorg/perlonjava/runtime/RuntimeScalar;");

src/main/java/org/perlonjava/operators/Readline.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class Readline {
1414
* @param ctx The context (SCALAR or LIST).
1515
* @return A RuntimeDataProvider with the line(s).
1616
*/
17-
public static RuntimeDataProvider readline(RuntimeScalar fileHandle, int ctx) {
17+
public static RuntimeBaseEntity readline(RuntimeScalar fileHandle, int ctx) {
1818
RuntimeIO fh = fileHandle.getRuntimeIO();
1919
if (ctx == RuntimeContextType.LIST) {
2020
// Handle LIST context

src/main/java/org/perlonjava/operators/ScalarGlobOperator.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package org.perlonjava.operators;
22

3-
import org.perlonjava.runtime.RuntimeContextType;
4-
import org.perlonjava.runtime.RuntimeDataProvider;
5-
import org.perlonjava.runtime.RuntimeList;
6-
import org.perlonjava.runtime.RuntimeScalar;
3+
import org.perlonjava.runtime.*;
74

85
import java.io.File;
96
import java.nio.file.Path;
@@ -70,7 +67,7 @@ public ScalarGlobOperator(String pattern) {
7067
* @param ctx the runtime context (scalar or list)
7168
* @return RuntimeDataProvider containing the results
7269
*/
73-
public static RuntimeDataProvider evaluate(int id, RuntimeScalar patternArg, int ctx) {
70+
public static RuntimeBaseEntity evaluate(int id, RuntimeScalar patternArg, int ctx) {
7471
String pattern = patternArg.toString();
7572

7673
if (ctx == RuntimeContextType.SCALAR) {
@@ -83,7 +80,7 @@ public static RuntimeDataProvider evaluate(int id, RuntimeScalar patternArg, int
8380
/**
8481
* Evaluates glob in scalar context, returning one result per call.
8582
*/
86-
private static RuntimeDataProvider evaluateInScalarContext(int id, String pattern) {
83+
private static RuntimeBaseEntity evaluateInScalarContext(int id, String pattern) {
8784
ScalarGlobOperator globOperator = globOperators.get(id);
8885

8986
if (globOperator == null) {

src/main/java/org/perlonjava/operators/SystemOperator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class SystemOperator {
3434
* @return The output of the command as a RuntimeDataProvider.
3535
* @throws PerlCompilerException if an error occurs during command execution or stream handling.
3636
*/
37-
public static RuntimeDataProvider systemCommand(RuntimeScalar command, int ctx) {
37+
public static RuntimeBaseEntity systemCommand(RuntimeScalar command, int ctx) {
3838
CommandResult result = executeCommand(command.toString(), true);
3939

4040
// Set $? to the exit status
@@ -234,7 +234,7 @@ private static void closeQuietly(BufferedReader reader) {
234234
* @param ctx The context type, determining the return type (list or scalar).
235235
* @return The processed output as a RuntimeDataProvider.
236236
*/
237-
private static RuntimeDataProvider processOutput(String output, int ctx) {
237+
private static RuntimeBaseEntity processOutput(String output, int ctx) {
238238
if (ctx == RuntimeContextType.LIST) {
239239
RuntimeList list = new RuntimeList();
240240
List<RuntimeBaseEntity> result = list.elements;

src/main/java/org/perlonjava/operators/WarnDie.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class WarnDie {
2121
* @param where Additional context or location information to append to the message.
2222
* @return A RuntimeDataProvider representing the result of the warning operation.
2323
*/
24-
public static RuntimeDataProvider warn(RuntimeDataProvider message, RuntimeScalar where) {
24+
public static RuntimeBaseEntity warn(RuntimeDataProvider message, RuntimeScalar where) {
2525
String out = message.toString();
2626
if (out.isEmpty()) {
2727
RuntimeScalar err = getGlobalVariable("main::@");
@@ -71,7 +71,7 @@ public static RuntimeDataProvider warn(RuntimeDataProvider message, RuntimeScala
7171
* @return A RuntimeDataProvider representing the result of the die operation.
7272
* @throws PerlCompilerException if no custom die handler is defined.
7373
*/
74-
public static RuntimeDataProvider die(RuntimeDataProvider value, RuntimeScalar message) {
74+
public static RuntimeBaseEntity die(RuntimeDataProvider value, RuntimeScalar message) {
7575
String out = value.toString();
7676
if (out.isEmpty()) {
7777
RuntimeScalar err = getGlobalVariable("main::@");

0 commit comments

Comments
 (0)