From 5d8f8cae458018ca76227127593bb3fc05d54563 Mon Sep 17 00:00:00 2001 From: Justus Garbe Date: Tue, 20 Aug 2024 15:45:39 +0200 Subject: [PATCH] fix: allow calls to methods on arrays --- .../analysis/jvm/TypedJvmAnalysisEngine.java | 2 -- .../analysis/jvm/ValuedJvmAnalysisEngine.java | 2 -- .../test/java/me/darknet/assembler/Test.java | 20 +++++++++++++++++++ .../jasm/Example-methods-on-arrays.jasm | 16 +++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 jasm-composition-jvm/src/test/java/me/darknet/assembler/Test.java create mode 100644 jasm-composition-jvm/src/test/resources/samples/jasm/Example-methods-on-arrays.jasm diff --git a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/TypedJvmAnalysisEngine.java b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/TypedJvmAnalysisEngine.java index 73cb78d..7cb5894 100644 --- a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/TypedJvmAnalysisEngine.java +++ b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/TypedJvmAnalysisEngine.java @@ -377,8 +377,6 @@ public void execute(MethodInstruction instruction) { warn(instruction, "Cannot invoke method of 'null' reference"); else if (contextType instanceof PrimitiveType) warn(instruction, "Cannot invoke method on primitive"); - else if (contextType instanceof ArrayType) - warn(instruction, "Cannot invoke method on array"); } if (methodType.returnType() != Types.VOID) frame.pushType(methodType.returnType()); diff --git a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java index 57e6712..666eab7 100644 --- a/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java +++ b/jasm-composition-jvm/src/main/java/me/darknet/assembler/compile/analysis/jvm/ValuedJvmAnalysisEngine.java @@ -670,8 +670,6 @@ public void execute(MethodInstruction instruction) { warn(instruction, "Cannot invoke method of 'null' reference"); else if (contextType instanceof PrimitiveType) warn(instruction, "Cannot invoke method on primitive"); - else if (contextType instanceof ArrayType) - warn(instruction, "Cannot invoke method on array"); } if (methodType.returnType() != Types.VOID) { diff --git a/jasm-composition-jvm/src/test/java/me/darknet/assembler/Test.java b/jasm-composition-jvm/src/test/java/me/darknet/assembler/Test.java new file mode 100644 index 0000000..039c8d9 --- /dev/null +++ b/jasm-composition-jvm/src/test/java/me/darknet/assembler/Test.java @@ -0,0 +1,20 @@ +package me.darknet.assembler; + +public class Test { + + public static void main(String[] args) { + exec(Test::example); + } + + // the code we want to run + static void example() { + System.out.println("hi"); + throw new RuntimeException(); + } + + // runs a runnable + static void exec(Runnable r) { + r.run(); + } + +} diff --git a/jasm-composition-jvm/src/test/resources/samples/jasm/Example-methods-on-arrays.jasm b/jasm-composition-jvm/src/test/resources/samples/jasm/Example-methods-on-arrays.jasm new file mode 100644 index 0000000..3882149 --- /dev/null +++ b/jasm-composition-jvm/src/test/resources/samples/jasm/Example-methods-on-arrays.jasm @@ -0,0 +1,16 @@ +.super java/lang/Object +.class public super Example { + .method callArrayMethod ()V { + parameters: { this }, + code: { + A: + iconst_1 + anewarray java/lang/String + // as a edge case, arrays are allowed to access all methods from Object + invokevirtual [Ljava/lang/String;.clone ()Ljava/lang/Object; + pop + return + B: + } + } +} \ No newline at end of file