TCL变量保存在何处/如何保存?

TCL变量保存在何处/如何保存?,tcl,Tcl,我正在查看TCL源代码,并试图理解如何在内部管理TCL变量的机制。例如,给定以下TCL脚本: set a 1 set b 2 我研究了Tcl_SetObjCmd()函数,它将一个对象设置为解释器,就是它。因此,当第一行运行时,有一个Tcl_Obj被设置为值为“1”的解释器,但我找不到从何处检索该对象,这导致了我的最终目标,该对象存储在何处 非常感谢您的指点 它比表面上看起来更复杂。简单的版本是,那里的Tcl表达式将调用类似于Tcl_SetVar2Ex(interp,“a”,NULL,Tcl_N

我正在查看TCL源代码,并试图理解如何在内部管理TCL变量的机制。例如,给定以下TCL脚本:

set a 1
set b 2
我研究了Tcl_SetObjCmd()函数,它将一个对象设置为解释器,就是它。因此,当第一行运行时,有一个Tcl_Obj被设置为值为“1”的解释器,但我找不到从何处检索该对象,这导致了我的最终目标,该对象存储在何处


非常感谢您的指点

它比表面上看起来更复杂。简单的版本是,那里的Tcl表达式将调用类似于
Tcl_SetVar2Ex(interp,“a”,NULL,Tcl_NewIntObj(1),0)
的内容,在解释器中设置一个名为“a”的变量,并使用给定的值。它还将使用将其分配给解释器的结果

然而,现代Tcl进行字节编译并执行其他操作。我们可以按如下所示进行检查:

% tcl::unsupported::disassemble script {set a 1}
ByteCode 0x0x10e0110, refCt 1, epoch 3, interp 0x0xde9d00 (epoch 3)
  Source "set a 1"
  Cmds 1, src 7, inst 6, litObjs 2, aux 0, stkDepth 2, code/src 0.00
  Commands 1:
      1: pc 0-4, src 0-6
  Command 1: "set a 1"
    (0) push1 0     # "a"
    (2) push1 1     # "1"
    (4) storeScalarStk 
    (5) done
因此,字节编译版本实际上将名称和值推送到堆栈上,然后调用这个storeScalarStk函数。对源代码的一些挖掘显示,它在generic/tclExecute.c中作为
INST_STORE_SCALAR_STK
执行,它基本上只是跳转到
doCallPtrSetVar
,在那里调用
TclPtrSetVar
,这与公共API中的Tcl_SetVar2Ex函数的工作类似。字节编译的主要优点是在重复运行时,在重复运行时已经处理了语法解析,因此后续执行函数的速度比第一次运行快得多


您的基本问题似乎是关于如何将值返回给解释器。interp结构有一个结果槽,该槽由
Tcl\u SetObjResult
Tcl\u GetObjResult
操作。要将结果返回到脚本级别的函数将Tcl_Obj分配给interp结果。

谢谢。这很有帮助。我要处理的问题是,当TCL无法分配内存(ckalloc失败)时,TCL只是恐慌。我喜欢使用setjmp/longjmp尽可能干净地退出,这需要取消分配已经分配的变量。我将跟踪tcleexecute.c以获取线索。但是建议是很感激的@我的问题是,如果ckalloc在一个小的分配中失败了,那么你就完全被卡住了:没有内存了。不要太担心清理工作,因为您的资源太少,恢复的可能性非常小。这是在交付给客户的实时代码中发生的,还是仅仅在测试中发生的?