aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/util/asm/StackManipulationLookupTable.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-11 22:05:58 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-12 22:20:03 +0100
commite6fbc62eb5e7531b74859df02ec6b06d09a8db5a (patch)
treecf145f468c6bdfbc567ac256d63c83d4a4be35d6 /src/main/java/org/zwobble/couscous/util/asm/StackManipulationLookupTable.java
parent80cd27b6b9c79829d19ad6a1a04b037241fd0105 (diff)
Generate dynamic visitor
Diffstat (limited to 'src/main/java/org/zwobble/couscous/util/asm/StackManipulationLookupTable.java')
-rw-r--r--src/main/java/org/zwobble/couscous/util/asm/StackManipulationLookupTable.java30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/util/asm/StackManipulationLookupTable.java b/src/main/java/org/zwobble/couscous/util/asm/StackManipulationLookupTable.java
new file mode 100644
index 0000000..f3fc2c2
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/util/asm/StackManipulationLookupTable.java
@@ -0,0 +1,30 @@
+package org.zwobble.couscous.util.asm;
+
+import net.bytebuddy.implementation.Implementation;
+import net.bytebuddy.implementation.bytecode.StackManipulation;
+import net.bytebuddy.implementation.bytecode.StackSize;
+import net.bytebuddy.jar.asm.Label;
+import net.bytebuddy.jar.asm.MethodVisitor;
+
+public class StackManipulationLookupTable implements StackManipulation {
+ private final Label dflt;
+ private final int[] keys;
+ private final Label[] labels;
+
+ public StackManipulationLookupTable(Label dflt, int[] keys, Label[] labels) {
+ this.dflt = dflt;
+ this.keys = keys;
+ this.labels = labels;
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public Size apply(MethodVisitor methodVisitor, Implementation.Context implementationContext) {
+ methodVisitor.visitLookupSwitchInsn(dflt, keys, labels);
+ return StackSize.SINGLE.toDecreasingSize();
+ }
+}