far语言方法返回值处理的设计

far的所有方法,静态和动态方法,包括调用原生java的方法,在far编译器生成字节码的时候,会判断这个方法是否处于取值状态,如果不是,栈顶的返回值就会被POP掉

什么是方法的取值状态

//赋值
var x = test();
//作为另一个方法的返回值
call(test());

上面的test方法处于取值表达式,所以栈顶的返回值,不会被POP,但如果是这样

test();

上面的调用,test的栈顶的返回值,肯定会被POP掉

为什么要POP掉栈顶的值?

问了保持栈平衡

问题来了

try{
test();
test2();
test1();
}catch(e){
  println(e);
}

上面是很正常的业务代码,如果test2()有异常,异常的对象信息会被JVM存到栈顶,按照far编译器现在的处理,肯定会POP掉栈顶的异常对象,直接就导致println这一行报错。
如何在不改变目前编译器逻辑的情况下,完成异常捕获这个任务?如果是你,你想如何捕获异常?

目前想到的方案

target.currMethodMv().visitInsn(POP); 前面检查栈顶的值是不是异常对象类型,如果是就不POP

posted @ 2025-04-17 07:47  方东信  阅读(162)  评论(0)    收藏  举报