Built-in Tcl types internal representation

时间:2016-02-12 21:59:34

标签: c tcl

I building a program that uses Tcl as its command interface. As part of the integration I have defined a few custom university_id's and a few commands implemented in C/C++ with Tcl_ObjType.

When parsing the command arguments I am not sure if my handling of the built in types is complete.

Is there a description somewhere of what the fields of an object(Tcl_CreateObjCommand) of any of the 6(?) built-in types looks like?

Thinking of a table like this, showing the Tcl_Obj field values:

Tcl_Obj

1 个答案:

答案 0 :(得分:0)

没有准确的文档,因为它是用户可扩展的类型。但是,我可以指出一些事情。

所有值都有非NULL bytes字段或非NULL typePtr字段,或两者都有。对于一个小整数,typePtr(如果您了解C ++,这是一种vtable)将表明它是intlongValue成员internalRep保持价值。当该小整数用作字符串时,其byteslength字段将被填充(通过调用updateStringProc的{​​{1}}。对于大整数,该值存储为指向typePtr的指针(在mp_int中)。对于浮点值,它是otherValuePtr字段。

列表和词典实际上都使用doubleValue;在更新期间使值树无效时使用辅助指针(否则为NULL)。主指针后面分别是指向twoPtrValueList结构的指针,这些结构在内部被重新计数和管理。

但是,字段的确切含义取决于Dict,并且通常只有知道如何讨论它们的小API以及其他所有(包括Tcl内部)才知道不要躲在窗帘后面。考虑在概念上为您的函数提供更严格的类型签名,然后使用typePtrTcl_GetIntFromObj等强制执行签名,这是一种很好的风格;这些函数强制执行并缓存类型。如果您自己创建自己,最简单的方法到目前为止是从字符串形式开始的(您始终可以使用Tcl_ListObjGetElements获取,这绝不会出错)然后从那里。最常见的第三方类型是允许通过哈希表或其他映射跳过查找的所有缓存。当然还有其他可能性。

我们没有完整的内部类型列表。最简单的事情可能是在Tcl 8.6中试验Tcl_GetStringFromObj,因为这样可以在不诉诸编写C代码的情况下以有限的方式查看正在发生的事情。请记住,偷看这种类型是非常糟糕的风格;它仅用作调试工具。