我试图了解THROW
期间异常帧在返回堆栈上的位置。
" jonesforth.f.txt"中的评论声明"当被调用时,THROW走向返回堆栈(该进程被称为'展开')直到它找到异常堆栈帧。"我不清楚(EXCEPTION-MARKER)
如何区别于返回堆栈上的其他数据(返回地址,使用>R
的用户值,以及do循环的指示)。
一般来说,各种Forth如何区分异常帧和返回堆栈上的其他数据?
答案 0 :(得分:4)
似乎Gforth没有使用这种'放卷'方法。
相反,它将活动异常帧的位置存储在全局变量中,同时将先前活动帧的位置保存在返回堆栈上的新帧中。抛出异常时,Gforth直接从全局变量读取最后一帧(最内部捕获)位置。
实际上,在我检查的其他多个方面,我没有看到'unwind'方法的这种实现。所有这些都使用了在链表中链接帧的相同想法,头指针存储在全局变量中。现在看起来很普遍:http://lars.nocrew.org/dpans/dpansa9.htm
也许Jones Forth依赖于假设返回堆栈在投掷时应该只包含返回地址。标记地址是唯一的,因为它是字典单词。并且典型的循环索引没有达到那么高以与返回地址混淆。
答案 1 :(得分:2)
关于如何在典型的FORTH系统中工作的解释是Milendorf的paper