blob: 2558a273ac59b7aea1fd039a1cc5665802f60eaa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.presto.bytecode;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import static org.objectweb.asm.Opcodes.ASM5;
class AddFakeLineNumberClassVisitor
extends ClassVisitor
{
int methodCount;
AddFakeLineNumberClassVisitor(ClassVisitor cv)
{
super(ASM5, cv);
super.visitSource("FakeSource.java", null);
}
@Override
public void visitSource(String source, String debug)
{
super.visitSource(source, debug);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
{
MethodVisitor methodVisitor = cv.visitMethod(access, name, desc, signature, exceptions);
methodCount++;
return new AddFakeLineNumberMethodVisitor(methodVisitor, 1000 * methodCount);
}
private static class AddFakeLineNumberMethodVisitor
extends MethodVisitor
{
private int count;
AddFakeLineNumberMethodVisitor(MethodVisitor mv, int startLineNumber)
{
super(ASM5, mv);
this.count = startLineNumber;
}
private void addFakeLineNumber()
{
Label label = new Label();
mv.visitLabel(label);
mv.visitLineNumber(++count, label);
}
@Override
public void visitInsn(int opcode)
{
addFakeLineNumber();
super.visitInsn(opcode);
}
@Override
public void visitIntInsn(int opcode, int operand)
{
addFakeLineNumber();
super.visitIntInsn(opcode, operand);
}
@Override
public void visitVarInsn(int opcode, int var)
{
addFakeLineNumber();
super.visitVarInsn(opcode, var);
}
@Override
public void visitTypeInsn(int opcode, String type)
{
addFakeLineNumber();
super.visitTypeInsn(opcode, type);
}
@Override
public void visitFieldInsn(int opcode, String owner, String name, String desc)
{
addFakeLineNumber();
super.visitFieldInsn(opcode, owner, name, desc);
}
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf)
{
addFakeLineNumber();
super.visitMethodInsn(opcode, owner, name, desc, itf);
}
@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs)
{
addFakeLineNumber();
super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
}
@Override
public void visitJumpInsn(int opcode, Label label)
{
addFakeLineNumber();
super.visitJumpInsn(opcode, label);
}
@Override
public void visitLdcInsn(Object cst)
{
addFakeLineNumber();
super.visitLdcInsn(cst);
}
@Override
public void visitIincInsn(int var, int increment)
{
addFakeLineNumber();
super.visitIincInsn(var, increment);
}
@Override
public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels)
{
addFakeLineNumber();
super.visitTableSwitchInsn(min, max, dflt, labels);
}
@Override
public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels)
{
addFakeLineNumber();
super.visitLookupSwitchInsn(dflt, keys, labels);
}
@Override
public void visitMultiANewArrayInsn(String desc, int dims)
{
addFakeLineNumber();
super.visitMultiANewArrayInsn(desc, dims);
}
}
}