Skip to content

Commit

Permalink
Added further advice implementation.
Browse files Browse the repository at this point in the history
  • Loading branch information
raphw committed Mar 4, 2016
1 parent 23529bc commit b209c41
Showing 1 changed file with 33 additions and 17 deletions.
50 changes: 33 additions & 17 deletions byte-buddy-dep/src/main/java/net/bytebuddy/asm/advice/Advice.java
Expand Up @@ -148,11 +148,20 @@ public MethodVisitor visitMethod(int modifiers, String internalName, String desc


protected class TransferingVisitor extends MethodVisitor { protected class TransferingVisitor extends MethodVisitor {


private final MethodDescription inlinedMethod; private final Map<Integer, ParameterDescription> parameters;

private final int offsetCorrection;

private final Label endOfMethod;


protected TransferingVisitor(MethodVisitor methodVisitor, MethodDescription inlinedMethod) { protected TransferingVisitor(MethodVisitor methodVisitor, MethodDescription inlinedMethod) {
super(Opcodes.ASM5, methodVisitor); super(Opcodes.ASM5, methodVisitor);
this.inlinedMethod = inlinedMethod; parameters = new HashMap<Integer, ParameterDescription>();
for (ParameterDescription parameter : inlinedMethod.getParameters()) {
parameters.put(parameter.getOffset(), parameter);
}
offsetCorrection = instrumentedMethod.getStackSize() - inlinedMethod.getStackSize();
endOfMethod = new Label();
} }


@Override @Override
Expand Down Expand Up @@ -204,44 +213,50 @@ public void visitEnd() {
public void visitMaxs(int maxStack, int maxLocals) { public void visitMaxs(int maxStack, int maxLocals) {
AsmAdvice.this.maxStack = maxStack + stackIncrement; AsmAdvice.this.maxStack = maxStack + stackIncrement;
AsmAdvice.this.maxLocals = maxLocals; AsmAdvice.this.maxLocals = maxLocals;
super.visitLabel(endOfMethod);
} }


@Override @Override
public void visitInsn(int opcode) { public void visitInsn(int opcode) {
switch (opcode) { switch (opcode) {
case Opcodes.RETURN: case Opcodes.RETURN:
super.visitJumpInsn(Opcodes.GOTO, endOfMethod);
break; break;
case Opcodes.IRETURN: case Opcodes.IRETURN:
case Opcodes.FRETURN: case Opcodes.FRETURN:
case Opcodes.ARETURN:
super.visitInsn(Opcodes.POP); super.visitInsn(Opcodes.POP);
super.visitJumpInsn(Opcodes.GOTO, endOfMethod);
break; break;
case Opcodes.LRETURN: case Opcodes.LRETURN:
case Opcodes.DRETURN: case Opcodes.DRETURN:
super.visitInsn(Opcodes.POP2); super.visitInsn(Opcodes.POP2);
super.visitJumpInsn(Opcodes.GOTO, endOfMethod);
break; break;
case Opcodes.ARETURN:
default: default:
super.visitInsn(opcode); super.visitInsn(opcode);
} }
} }


@Override @Override
public void visitVarInsn(int opcode, int variableOffset) { public void visitVarInsn(int opcode, int offset) {
for (ParameterDescription parameter : inlinedMethod.getParameters()) { ParameterDescription parameterDescription = parameters.get(offset);
int parameterOffset = parameter.getOffset(); if (parameterDescription != null) {
if (parameterOffset == variableOffset) { AnnotationDescription.Loadable<Argument> argument = parameterDescription.getDeclaredAnnotations().ofType(Argument.class);
AnnotationDescription.Loadable<Argument> argument = parameter.getDeclaredAnnotations().ofType(Argument.class); int targetIndex = argument == null
int instrumentedIndex = argument == null ? parameterDescription.getIndex()
? parameter.getIndex() : argument.loadSilent().value();
: argument.loadSilent().value(); ParameterList<?> targetParameters = instrumentedMethod.getParameters();
ParameterList<?> instrumentedParameters = instrumentedMethod.getParameters(); if (targetIndex >= targetParameters.size()) {
if (instrumentedIndex > instrumentedParameters.size()) { throw new IllegalStateException(instrumentedMethod + " does not define a parameter with index " + targetIndex);
throw new IllegalStateException(instrumentedMethod + " does not define a parameter with index " + instrumentedIndex); } else if (!targetParameters.get(targetIndex).getType().asErasure().isAssignableTo(parameterDescription.getType().asErasure())) {
} throw new IllegalStateException("Cannot assign " + targetParameters.get(targetIndex) + " to " + parameterDescription);
variableOffset = instrumentedParameters.get(instrumentedIndex).getOffset();
} }
offset = targetParameters.get(targetIndex).getOffset();
} else {
offset += offsetCorrection;
} }
super.visitVarInsn(opcode, variableOffset); super.visitVarInsn(opcode, offset);
} }
} }
} }
Expand All @@ -265,6 +280,7 @@ public void visitVarInsn(int opcode, int variableOffset) {
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER) @Target(ElementType.PARAMETER)
public @interface Argument { public @interface Argument {

int value(); int value();
} }
} }

0 comments on commit b209c41

Please sign in to comment.