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
Rust编程语言群 1036955113
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
java新手自学群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/开发/运维)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
单片机嵌入式/电子电路入门群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系统研发群:15375777
汇编/辅助/破解新手群:755783453
大数据 elasticsearch 群 481975850
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。