Skip to content

Commit

Permalink
fix: analysis of method type and method handle constants
Browse files Browse the repository at this point in the history
  • Loading branch information
jumanji144 committed Feb 4, 2024
1 parent 27ace7e commit 5d7601b
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package me.darknet.assembler.compile.analysis.jvm;

import dev.xdark.blw.code.CodeElement;
import dev.xdark.blw.type.ArrayType;
import dev.xdark.blw.type.ObjectType;
import dev.xdark.blw.type.*;
import me.darknet.assembler.ast.primitive.ASTInstruction;
import me.darknet.assembler.compile.analysis.AnalysisException;
import me.darknet.assembler.compile.analysis.AnalysisResults;
Expand Down Expand Up @@ -41,6 +40,9 @@ public abstract class JvmAnalysisEngine<F extends Frame> implements ExecutionEng
protected AnalysisException analysisFailure;
protected F frame;

protected static InstanceType METHOD_TYPE = Types.instanceType(MethodType.class);
protected static InstanceType METHOD_HANDLE = Types.instanceType(MethodHandle.class);

public JvmAnalysisEngine(@NotNull VariableNameLookup variableNameLookup) {
this.variableNameLookup = variableNameLookup;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package me.darknet.assembler.compile.analysis.jvm;

import dev.xdark.blw.type.ArrayType;
import dev.xdark.blw.type.*;
import me.darknet.assembler.compile.analysis.Local;
import me.darknet.assembler.compile.analysis.VariableNameLookup;
import me.darknet.assembler.compile.analysis.frame.FrameOps;
Expand All @@ -9,9 +9,6 @@

import dev.xdark.blw.code.instruction.*;
import dev.xdark.blw.constant.*;
import dev.xdark.blw.type.ClassType;
import dev.xdark.blw.type.MethodType;
import dev.xdark.blw.type.Types;
import org.jetbrains.annotations.NotNull;

import java.util.List;
Expand Down Expand Up @@ -172,11 +169,17 @@ public void execute(ConstantInstruction<?> instruction) {
} else if (constant instanceof OfString) {
frame.pushType(Types.type(String.class));
} else if (constant instanceof OfMethodHandle mh) {
frame.pushType(Types.methodType(mh.value().type().descriptor()).returnType());
// push java/lang/invoke/MethodHandle
frame.pushType(METHOD_HANDLE);
} else if (constant instanceof OfDynamic dyn) {
frame.pushType(dyn.value().type());
} else if (constant instanceof OfType tp) {
frame.pushType((ClassType) tp.value());
Type type = tp.value();
if (type instanceof ClassType ct)
frame.pushType(ct);
else if (type instanceof MethodType mt)
// push java/lang/invoke/MethodType
frame.pushType(METHOD_TYPE);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -329,11 +329,17 @@ public void execute(ConstantInstruction<?> instruction) {
} else if (constant instanceof OfString cString) {
frame.push(Values.valueOfString(cString.value()));
} else if (constant instanceof OfMethodHandle mh) {
frame.pushType(Types.methodType(mh.value().type().descriptor()).returnType());
// push java/lang/invoke/MethodHandle
frame.pushType(METHOD_HANDLE);
} else if (constant instanceof OfDynamic dyn) {
frame.pushType(dyn.value().type());
} else if (constant instanceof OfType tp) {
frame.pushType((ClassType) tp.value());
Type type = tp.value();
if (type instanceof ClassType ct)
frame.pushType(ct);
else if (type instanceof MethodType mt)
// push java/lang/invoke/MethodType
frame.pushType(METHOD_TYPE);
}
}

Expand Down

0 comments on commit 5d7601b

Please sign in to comment.