带asm字节码操纵器的内联方法

时间:2018-12-09 11:02:23

标签: java inline java-bytecode-asm

我正在尝试进行内联优化,并且将本文用作参考文献http://modularity.info/conference/2007/program/industry/I5-UsingASMFramework.pdf(3.2.6)。我正在使用ASM 7,并且不推荐使用某些代码,因此,如果您可以将我引向较新的文章,我将不胜感激。

无论版本如何,我仍然无法确切了解其工作原理

public static class InliningAdapter extends RemappingMethodAdapter
{ 
    private final LocalVariablesSorter lvs; 
    private final Label end; 
    public InliningAdapter(LocalVariablesSorter mv, Label end, int acc, String desc, Remapper remapper) { 
        super(acc, desc, mv, remapper); 
        this.lvs = mv; 
        this.end = end; 
        // guess it's offset as it is written that way below
        int off = (acc & Opcodes.ACC_STATIC)!=0 ? 0 : 1; 
        Type[] args = Type.getArgumentTypes(desc); 
        for (int i = args.length-1; i >= 0; i--) { 
            super.visitVarInsn(args[i].getOpcode(Opcodes.ISTORE), i + offset); 
        } 
        if(offset>0) { 
            super.visitVarInsn(Opcodes.ASTORE, 0); 
        } 
    } 
    public void visitInsn(int opcode) { 
        if(opcode==Opcodes.RETURN) { 
            super.visitJumpInsn(Opcodes.GOTO, end); 
        } else { 
            super.visitInsn(opcode); 
        } 
    } 
    public void visitMaxs(int stack, int locals) {   } 

    protected int newLocalMapping(Type type) { 
        return lvs.newLocal(type); 
    } 
} 

我知道,由于我们是内联的,因此现在必须将存储在堆栈中并准备由方法调用使用的参数存储回本地重新映射的变量中。但是,在存储这些参数的for循环中,所使用的索引(i +偏移量)可以很好地为0.1 e.t.c,因此,通过LocalVariableSorter的remap方法,此值可能不会被重新映射,因为它们可能被视为方法参数。

this线程中,它声明了cosntructor中的super命令“ super(acc,desc,mv,remapper);”。必须更改为super(acc | Opcodes.ACC_STATIC,“()V”,mv,remapper);为了重新映射每个变量,包括索引小于参数数的变量。该论文的作者错了吗?是否需要此更改?

0 个答案:

没有答案