Skip to content

Commit 98b6fc9

Browse files
committed
Use new frame generation abstraction and add more tests.
1 parent f83e348 commit 98b6fc9

File tree

6 files changed

+400
-231
lines changed

6 files changed

+400
-231
lines changed

byte-buddy-dep/src/main/java/net/bytebuddy/asm/ClassVisitorFactory.java

Lines changed: 62 additions & 75 deletions
Large diffs are not rendered by default.

byte-buddy-dep/src/main/java/net/bytebuddy/build/AccessControllerPlugin.java

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import net.bytebuddy.description.modifier.FieldManifestation;
2222
import net.bytebuddy.description.modifier.Ownership;
2323
import net.bytebuddy.description.modifier.Visibility;
24+
import net.bytebuddy.description.type.TypeDefinition;
2425
import net.bytebuddy.description.type.TypeDescription;
2526
import net.bytebuddy.dynamic.ClassFileLocator;
2627
import net.bytebuddy.dynamic.DynamicType;
@@ -40,6 +41,7 @@
4041
import java.security.Permission;
4142
import java.security.PrivilegedAction;
4243
import java.security.PrivilegedExceptionAction;
44+
import java.util.Collections;
4345
import java.util.HashMap;
4446
import java.util.Map;
4547

@@ -273,51 +275,22 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context implementa
273275
methodVisitor.visitLabel(end);
274276
methodVisitor.visitJumpInsn(Opcodes.GOTO, complete);
275277
methodVisitor.visitLabel(classNotFound);
276-
switch (implementationContext.getFrameGeneration()) {
277-
case GENERATE:
278-
methodVisitor.visitFrame(Opcodes.F_SAME1, EMPTY.length, EMPTY, 1, new Object[]{Type.getInternalName(ClassNotFoundException.class)});
279-
break;
280-
case EXPAND:
281-
methodVisitor.visitFrame(Opcodes.F_NEW, EMPTY.length, EMPTY, 1, new Object[]{Type.getInternalName(ClassNotFoundException.class)});
282-
break;
283-
case DISABLED:
284-
break;
285-
default:
286-
throw new IllegalStateException();
287-
}
278+
implementationContext.getFrameGeneration().same1(methodVisitor,
279+
TypeDescription.ForLoadedType.of(ClassNotFoundException.class),
280+
Collections.<TypeDefinition>emptyList());
288281
methodVisitor.visitInsn(Opcodes.POP);
289282
methodVisitor.visitInsn(Opcodes.ICONST_0);
290283
methodVisitor.visitFieldInsn(Opcodes.PUTSTATIC, instrumentedType.getInternalName(), name, Type.getDescriptor(boolean.class));
291284
methodVisitor.visitJumpInsn(Opcodes.GOTO, complete);
292285
methodVisitor.visitLabel(securityException);
293-
switch (implementationContext.getFrameGeneration()) {
294-
case GENERATE:
295-
methodVisitor.visitFrame(Opcodes.F_SAME1, EMPTY.length, EMPTY, 1, new Object[]{Type.getInternalName(SecurityException.class)});
296-
break;
297-
case EXPAND:
298-
methodVisitor.visitFrame(Opcodes.F_NEW, EMPTY.length, EMPTY, 1, new Object[]{Type.getInternalName(SecurityException.class)});
299-
break;
300-
case DISABLED:
301-
break;
302-
default:
303-
throw new IllegalStateException();
304-
}
286+
implementationContext.getFrameGeneration().same1(methodVisitor,
287+
TypeDescription.ForLoadedType.of(SecurityException.class),
288+
Collections.<TypeDefinition>emptyList());
305289
methodVisitor.visitInsn(Opcodes.POP);
306290
methodVisitor.visitInsn(Opcodes.ICONST_1);
307291
methodVisitor.visitFieldInsn(Opcodes.PUTSTATIC, instrumentedType.getInternalName(), name, Type.getDescriptor(boolean.class));
308292
methodVisitor.visitLabel(complete);
309-
switch (implementationContext.getFrameGeneration()) {
310-
case GENERATE:
311-
methodVisitor.visitFrame(Opcodes.F_SAME, EMPTY.length, EMPTY, EMPTY.length, EMPTY);
312-
break;
313-
case EXPAND:
314-
methodVisitor.visitFrame(Opcodes.F_NEW, EMPTY.length, EMPTY, EMPTY.length, EMPTY);
315-
break;
316-
case DISABLED:
317-
break;
318-
default:
319-
throw new IllegalStateException();
320-
}
293+
implementationContext.getFrameGeneration().same(methodVisitor, Collections.<TypeDefinition>emptyList());
321294
return new Size(Math.max(3, size), 0);
322295
}
323296

@@ -513,22 +486,7 @@ public void visitCode() {
513486
false);
514487
mv.visitInsn(Type.getType(token.getReturnType().getDescriptor()).getOpcode(Opcodes.IRETURN));
515488
mv.visitLabel(label);
516-
switch (frameGeneration) {
517-
case GENERATE:
518-
mv.visitFrame(Opcodes.F_SAME, EMPTY.length, EMPTY, EMPTY.length, EMPTY);
519-
break;
520-
case EXPAND:
521-
Object[] localVariable = new Object[token.getParameterTypes().size()];
522-
for (int index = 0; index < localVariable.length; index++) {
523-
localVariable[index] = token.getParameterTypes().get(index).getInternalName();
524-
}
525-
mv.visitFrame(Opcodes.F_NEW, localVariable.length, localVariable, EMPTY.length, EMPTY);
526-
break;
527-
case DISABLED:
528-
break;
529-
default:
530-
throw new IllegalStateException();
531-
}
489+
frameGeneration.same(mv, token.getParameterTypes());
532490
}
533491

534492
@Override

byte-buddy-dep/src/main/java/net/bytebuddy/implementation/EqualsMethod.java

Lines changed: 9 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.objectweb.asm.Label;
3737
import org.objectweb.asm.MethodVisitor;
3838
import org.objectweb.asm.Opcodes;
39-
import org.objectweb.asm.Type;
4039

4140
import java.util.*;
4241

@@ -401,16 +400,6 @@ public int getRequiredVariablePadding() {
401400
@HashCodeAndEqualsPlugin.Enhance
402401
class UsingJump implements NullValueGuard {
403402

404-
/**
405-
* An empty array.
406-
*/
407-
private static final Object[] EMPTY = new Object[0];
408-
409-
/**
410-
* An array containing a single reference value.
411-
*/
412-
private static final Object[] REFERENCE = new Object[]{Type.getInternalName(Object.class)};
413-
414403
/**
415404
* The instrumented method.
416405
*/
@@ -498,59 +487,18 @@ protected class AfterInstruction extends StackManipulation.AbstractBase {
498487
public Size apply(MethodVisitor methodVisitor, Context implementationContext) {
499488
methodVisitor.visitJumpInsn(Opcodes.GOTO, endOfBlock);
500489
methodVisitor.visitLabel(secondValueNull);
501-
switch (implementationContext.getFrameGeneration()) {
502-
case GENERATE:
503-
methodVisitor.visitFrame(Opcodes.F_SAME1, EMPTY.length, EMPTY, REFERENCE.length, REFERENCE);
504-
break;
505-
case EXPAND:
506-
methodVisitor.visitFrame(Opcodes.F_NEW,
507-
2,
508-
new Object[]{implementationContext.getInstrumentedType().getInternalName(), Type.getInternalName(Object.class)},
509-
REFERENCE.length,
510-
REFERENCE);
511-
break;
512-
case DISABLED:
513-
break;
514-
default:
515-
throw new IllegalStateException();
516-
}
490+
implementationContext.getFrameGeneration().same1(methodVisitor,
491+
TypeDescription.OBJECT,
492+
Arrays.asList(implementationContext.getInstrumentedType(), TypeDescription.OBJECT));
517493
methodVisitor.visitJumpInsn(Opcodes.IFNULL, endOfBlock);
518494
methodVisitor.visitLabel(firstValueNull);
519-
switch (implementationContext.getFrameGeneration()) {
520-
case GENERATE:
521-
methodVisitor.visitFrame(Opcodes.F_SAME, EMPTY.length, EMPTY, EMPTY.length, EMPTY);
522-
break;
523-
case EXPAND:
524-
methodVisitor.visitFrame(Opcodes.F_NEW,
525-
2,
526-
new Object[]{implementationContext.getInstrumentedType().getInternalName(), Type.getInternalName(Object.class)},
527-
EMPTY.length,
528-
EMPTY);
529-
break;
530-
case DISABLED:
531-
break;
532-
default:
533-
throw new IllegalStateException();
534-
}
495+
implementationContext.getFrameGeneration().same(methodVisitor,
496+
Arrays.asList(implementationContext.getInstrumentedType(), TypeDescription.OBJECT));
535497
methodVisitor.visitInsn(Opcodes.ICONST_0);
536498
methodVisitor.visitInsn(Opcodes.IRETURN);
537499
methodVisitor.visitLabel(endOfBlock);
538-
switch (implementationContext.getFrameGeneration()) {
539-
case GENERATE:
540-
methodVisitor.visitFrame(Opcodes.F_SAME, EMPTY.length, EMPTY, EMPTY.length, EMPTY);
541-
break;
542-
case EXPAND:
543-
methodVisitor.visitFrame(Opcodes.F_NEW,
544-
2,
545-
new Object[]{implementationContext.getInstrumentedType().getInternalName(), Type.getInternalName(Object.class)},
546-
EMPTY.length,
547-
EMPTY);
548-
break;
549-
case DISABLED:
550-
break;
551-
default:
552-
throw new IllegalStateException();
553-
}
500+
implementationContext.getFrameGeneration().same(methodVisitor,
501+
Arrays.asList(implementationContext.getInstrumentedType(), TypeDescription.OBJECT));
554502
return Size.ZERO;
555503
}
556504
}
@@ -949,22 +897,8 @@ public Size apply(MethodVisitor methodVisitor, Context implementationContext) {
949897
methodVisitor.visitInsn(value);
950898
methodVisitor.visitInsn(Opcodes.IRETURN);
951899
methodVisitor.visitLabel(label);
952-
switch (implementationContext.getFrameGeneration()) {
953-
case GENERATE:
954-
methodVisitor.visitFrame(Opcodes.F_SAME, EMPTY.length, EMPTY, EMPTY.length, EMPTY);
955-
break;
956-
case EXPAND:
957-
methodVisitor.visitFrame(Opcodes.F_NEW,
958-
2,
959-
new Object[]{implementationContext.getInstrumentedType().getInternalName(), Type.getInternalName(Object.class)},
960-
EMPTY.length,
961-
EMPTY);
962-
break;
963-
case DISABLED:
964-
break;
965-
default:
966-
throw new IllegalStateException();
967-
}
900+
implementationContext.getFrameGeneration().same(methodVisitor,
901+
Arrays.asList(implementationContext.getInstrumentedType(), TypeDescription.OBJECT));
968902
return new Size(-1, 1);
969903
}
970904
}

byte-buddy-dep/src/main/java/net/bytebuddy/implementation/HashCodeMethod.java

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.objectweb.asm.Opcodes;
3636

3737
import java.util.ArrayList;
38+
import java.util.Arrays;
3839
import java.util.List;
3940

4041
import static net.bytebuddy.matcher.ElementMatchers.*;
@@ -382,16 +383,6 @@ public int getRequiredVariablePadding() {
382383
@HashCodeAndEqualsPlugin.Enhance
383384
class UsingJump implements NullValueGuard {
384385

385-
/**
386-
* An empty array.
387-
*/
388-
private static final Object[] EMPTY = new Object[0];
389-
390-
/**
391-
* An array that only contains an integer stack map frame.
392-
*/
393-
private static final Object[] INTEGER = new Object[]{Opcodes.INTEGER};
394-
395386
/**
396387
* The instrumented method.
397388
*/
@@ -462,22 +453,9 @@ protected class AfterInstruction extends StackManipulation.AbstractBase {
462453
*/
463454
public Size apply(MethodVisitor methodVisitor, Context implementationContext) {
464455
methodVisitor.visitLabel(label);
465-
switch (implementationContext.getFrameGeneration()) {
466-
case GENERATE:
467-
methodVisitor.visitFrame(Opcodes.F_SAME1, EMPTY.length, EMPTY, INTEGER.length, INTEGER);
468-
break;
469-
case EXPAND:
470-
methodVisitor.visitFrame(Opcodes.F_NEW,
471-
1,
472-
new Object[]{implementationContext.getInstrumentedType().getInternalName()},
473-
INTEGER.length,
474-
INTEGER);
475-
break;
476-
case DISABLED:
477-
break;
478-
default:
479-
throw new IllegalStateException();
480-
}
456+
implementationContext.getFrameGeneration().same1(methodVisitor,
457+
TypeDescription.ForLoadedType.of(int.class),
458+
Arrays.asList(implementationContext.getInstrumentedType(), TypeDescription.OBJECT));
481459
return Size.ZERO;
482460
}
483461
}

0 commit comments

Comments
 (0)