为了统计方法执行时候,我用ASM在方法开始的时候插入一个变量startLocal记录开始执行的时间,然后在结束的时间用当前时间去差这个开始时间,为了调试,我同时又插入了一个endLocal
注意这段有bug的代码竟然可以正确地执行了。但是当我去掉调示后,改成这样:
却得不到正确的结果了。于是反复查看地,终于发现了
this.startLocal = this.newLocal(Type.getType(Long.class));
应该是:
this.startLocal = this.newLocal(Type.LONG_TYPE);
如果开始分配的栈不对,两个object的栈相当于一个long的栈,但在LSUB的时候为什么是正确的?
两个Long对象进行lsub,虽然java源码在编译的时候可以自动插入转换指令,但在上面的字节码指令中
仍然可以正确LSUB,虽然栈中的值是正确的,但却越过了类型检查。