如何找到当前的堆栈?

时间:2009-11-20 13:25:39

标签: stack metaprogramming smalltalk pharo

在Pharo中,如何找到当前正在评估的堆栈?

2 个答案:

答案 0 :(得分:1)

您评估

thisContext contextStack

这里,thisContext实际上是一个指向当前活动堆栈帧的特殊变量。然后,contextStack返回一个包含整个堆栈的数组。

答案 1 :(得分:1)

嗯,实际上,问题就是简单:thisContext可能是一个非常昂贵的操作,与消息发送相比。

在Visualworks Smalltalk中,堆栈访问 extermly 昂贵,因为它使用本机C-stack,因此对thisContext的任何访问都必须将整个C-Stack重新整合到因果连接中 Smalltalk对象。也就是说,对于每个C堆栈帧,将创建Smalltalk对象(包括可能的JIT去优化),此外,对这些对象的所有更改必须反映回C堆栈。

在Pharo(和Squeak,就此而言)它不那么尴尬,因为它使用Smalltalk对象作为堆栈。但是仍然会在每次调用时刷新缓存堆栈帧的对象池。 (是的,除了例如在Java中,汇集对象确实提高了Squeak的性能......欢迎回到90年代:)