exception-handling - 异常帧与返回堆栈上的其他数据有何区别?

标签 exception-handling stack forth gforth

我试图了解异常帧在 THROW 期间如何位于返回堆栈上.

“jonesforth.f.txt”中的注释断言“当被调用时,THROW 沿着返回栈向上走(这个过程被称为‘展开’),直到它找到异常栈帧。”我不清楚 (EXCEPTION-MARKER)与返回堆栈上的另一个其他数据(返回地址、使用 >R 的用户值以及 do 循环的索引)不同。

一般来说,各种 Forth 是如何区分异常帧和返回栈上的其他数据的呢?

最佳答案

似乎 Gforth 没有使用这种“展开”方法。

相反,它将事件异常帧的位置存储在全局变量中,同时将先前事件帧的位置保存在返回堆栈上的新帧中。当抛出异常时,Gforth 直接从全局变量中读取最后一帧(最内部捕获)的位置。

实际上,在我检查过的其他多个方面,我没有看到 'unwind' 方法的这种实现。所有这些都在 中使用了相同的链接框架的想法。链表 ,头指针存储在一个全局变量中。这看起来很典型:http://lars.nocrew.org/dpans/dpansa9.htm

也许 Jones Forth 依赖于一个假设,即返回堆栈应该只包含抛出时的返回地址。标记地址是唯一的,因为它是字典单词。并且典型的循环索引不会达到与返回地址混淆的那么高。

关于exception-handling - 异常帧与返回堆栈上的其他数据有何区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45027236/

相关文章:

java - 类实现了两个接口(interface),方法相同,检查异常不同

javascript - 浏览器 Javascript 堆栈大小限制

Java Stack peek() 行为

forth - "local variable"在 Forth 编程语言中是什么意思?

sockets - 如何使用 Forth 发送 GET/POST 请求

.net - 套接字异常 : No such host is known

c# - 异步方法中的异常处理未捕获异常的令人惊讶的情况

powershell - 测试路径返回权限被拒绝 - 如何进行错误处理

java - 多键、链接哈希

在 Forth 中对字符串数组进行排序