Skip to content

Commit

Permalink
WIP using MethodHandles
Browse files Browse the repository at this point in the history
  • Loading branch information
prdoyle committed Dec 26, 2023
1 parent c809647 commit 501ad30
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions bosk-core/src/main/java/io/vena/bosk/bytecode/ClassBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.lang.reflect.Method;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
import java.util.Objects;
Expand All @@ -17,6 +18,7 @@
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Type;
import org.objectweb.asm.util.Textifier;
import org.objectweb.asm.util.TraceClassVisitor;

import static io.vena.bosk.util.ReflectionHelpers.setAccessible;
Expand Down Expand Up @@ -350,13 +352,14 @@ public void invoke(MethodHandle mh) {
String descriptor = mh.type().descriptorString();

// Insert the MethodHandle before the arguments
Deque<LocalVariable> args = new ArrayDeque<>(mh.type().parameterCount());
for (int i = 0; i < mh.type().parameterCount(); i++) {
args.addFirst(popToLocal(ASTORE));
List<Class<?>> parameters = mh.type().parameterList();
Deque<LocalVariable> args = new ArrayDeque<>(parameters.size());
for (int i = parameters.size()-1; i >= 0; i--) {
args.addFirst(popToLocal(Type.getType(parameters.get(i))));
}
pushObject(mh);
for (LocalVariable arg: args) {
pushLocal(ALOAD, arg);
pushLocal(arg);
}

methodVisitor().visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact", descriptor, false);
Expand Down Expand Up @@ -466,5 +469,5 @@ public Class<?> loadThemBytes(String dottyName, byte[] b) {

public static final Type OBJECT_TYPE = Type.getType(Object.class);

private final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
}

0 comments on commit 501ad30

Please sign in to comment.