Object.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:14k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1996-1997 Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" RCS: @(#) $Id: Object.3,v 1.6 2002/10/22 12:16:53 dkf Exp $
  8. '" 
  9. .so man.macros
  10. .TH Tcl_Obj 3 8.1 Tcl "Tcl Library Procedures"
  11. .BS
  12. .SH NAME
  13. Tcl_NewObj, Tcl_DuplicateObj, Tcl_IncrRefCount, Tcl_DecrRefCount, Tcl_IsShared, Tcl_InvalidateStringRep - manipulate Tcl objects
  14. .SH SYNOPSIS
  15. .nf
  16. fB#include <tcl.h>fR
  17. .sp
  18. Tcl_Obj *
  19. fBTcl_NewObjfR()
  20. .sp
  21. Tcl_Obj *
  22. fBTcl_DuplicateObjfR(fIobjPtrfR)
  23. .sp
  24. fBTcl_IncrRefCountfR(fIobjPtrfR)
  25. .sp
  26. fBTcl_DecrRefCountfR(fIobjPtrfR)
  27. .sp
  28. int
  29. fBTcl_IsSharedfR(fIobjPtrfR)
  30. .sp
  31. fBTcl_InvalidateStringRepfR(fIobjPtrfR)
  32. .SH ARGUMENTS
  33. .AS Tcl_Obj *objPtr in
  34. .AP Tcl_Obj *objPtr in
  35. Points to an object;
  36. must have been the result of a previous call to fBTcl_NewObjfR.
  37. .BE
  38. .SH INTRODUCTION
  39. .PP
  40. This man page presents an overview of Tcl objects and how they are used.
  41. It also describes generic procedures for managing Tcl objects.
  42. These procedures are used to create and copy objects,
  43. and increment and decrement the count of references (pointers) to objects.
  44. The procedures are used in conjunction with ones
  45. that operate on specific types of objects such as
  46. fBTcl_GetIntFromObjfR and fBTcl_ListObjAppendElementfR.
  47. The individual procedures are described along with the data structures
  48. they manipulate.
  49. .PP
  50. Tcl's fIdual-portedfR objects provide a general-purpose mechanism
  51. for storing and exchanging Tcl values.
  52. They largely replace the use of strings in Tcl.
  53. For example, they are used to store variable values,
  54. command arguments, command results, and scripts.
  55. Tcl objects behave like strings but also hold an internal representation
  56. that can be manipulated more efficiently.
  57. For example, a Tcl list is now represented as an object
  58. that holds the list's string representation
  59. as well as an array of pointers to the objects for each list element.
  60. Dual-ported objects avoid most runtime type conversions.
  61. They also improve the speed of many operations
  62. since an appropriate representation is immediately available.
  63. The compiler itself uses Tcl objects to
  64. cache the instruction bytecodes resulting from compiling scripts.
  65. .PP
  66. The two representations are a cache of each other and are computed lazily.
  67. That is, each representation is only computed when necessary,
  68. it is computed from the other representation,
  69. and, once computed, it is saved.
  70. In addition, a change in one representation invalidates the other one.
  71. As an example, a Tcl program doing integer calculations can
  72. operate directly on a variable's internal machine integer
  73. representation without having to constantly convert
  74. between integers and strings.
  75. Only when it needs a string representing the variable's value,
  76. say to print it,
  77. will the program regenerate the string representation from the integer.
  78. Although objects contain an internal representation,
  79. their semantics are defined in terms of strings:
  80. an up-to-date string can always be obtained,
  81. and any change to the object will be reflected in that string
  82. when the object's string representation is fetched.
  83. Because of this representation invalidation and regeneration,
  84. it is dangerous for extension writers to access
  85. fBTcl_ObjfR fields directly.
  86. It is better to access Tcl_Obj information using
  87. procedures like fBTcl_GetStringFromObjfR and fBTcl_GetStringfR.
  88. .PP
  89. Objects are allocated on the heap
  90. and are referenced using a pointer to their fBTcl_ObjfR structure.
  91. Objects are shared as much as possible.
  92. This significantly reduces storage requirements
  93. because some objects such as long lists are very large.
  94. Also, most Tcl values are only read and never modified.
  95. This is especially true for procedure arguments,
  96. which can be shared between the caller and the called procedure.
  97. Assignment and argument binding is done by
  98. simply assigning a pointer to the value. 
  99. Reference counting is used to determine when it is safe to
  100. reclaim an object's storage.
  101. .PP
  102. Tcl objects are typed.
  103. An object's internal representation is controlled by its type.
  104. Seven types are predefined in the Tcl core
  105. including integer, double, list, and bytecode.
  106. Extension writers can extend the set of types
  107. by using the procedure fBTcl_RegisterObjTypefR .
  108. .SH "THE TCL_OBJ STRUCTURE"
  109. .PP
  110. Each Tcl object is represented by a fBTcl_ObjfR structure
  111. which is defined as follows.
  112. .CS
  113. typedef struct Tcl_Obj {
  114. int fIrefCountfR;
  115. char *fIbytesfR;
  116. int fIlengthfR;
  117. Tcl_ObjType *fItypePtrfR;
  118. union {
  119. long fIlongValuefR;
  120. double fIdoubleValuefR;
  121. VOID *fIotherValuePtrfR;
  122. struct {
  123. VOID *fIptr1fR;
  124. VOID *fIptr2fR;
  125. } fItwoPtrValuefR;
  126. } fIinternalRepfR;
  127. } Tcl_Obj;
  128. .CE
  129. The fIbytesfR and the fIlengthfR members together hold
  130. .VS 8.1
  131. an object's UTF-8 string representation,
  132. which is a fIcounted stringfR not containing null bytes (UTF-8 null
  133. characters should be encoded as a two byte sequence: 192, 128.)
  134. fIbytesfR points to the first byte of the string representation.
  135. The fIlengthfR member gives the number of bytes.
  136. The byte array must always have a null byte after the last data byte,
  137. at offset fIlengthfR;
  138. this allows string representations
  139. to be treated as conventional null-terminated C strings.
  140. .VE 8.1
  141. C programs use fBTcl_GetStringFromObjfR and fBTcl_GetStringfR to get
  142. an object's string representation.
  143. If fIbytesfR is NULL,
  144. the string representation is invalid.
  145. .PP
  146. An object's type manages its internal representation.
  147. The member fItypePtrfR points to the Tcl_ObjType structure
  148. that describes the type.
  149. If fItypePtrfR is NULL,
  150. the internal representation is invalid.
  151. .PP
  152. The fIinternalRepfR union member holds
  153. an object's internal representation.
  154. This is either a (long) integer, a double-precision floating point number,
  155. a pointer to a value containing additional information
  156. needed by the object's type to represent the object,
  157. or two arbitrary pointers.
  158. .PP
  159. The fIrefCountfR member is used to tell when it is safe to free
  160. an object's storage.
  161. It holds the count of active references to the object.
  162. Maintaining the correct reference count is a key responsibility
  163. of extension writers.
  164. Reference counting is discussed below
  165. in the section fBSTORAGE MANAGEMENT OF OBJECTSfR.
  166. .PP
  167. Although extension writers can directly access
  168. the members of a Tcl_Obj structure,
  169. it is much better to use the appropriate procedures and macros.
  170. For example, extension writers should never
  171. read or update fIrefCountfR directly;
  172. they should use macros such as
  173. fBTcl_IncrRefCountfR and fBTcl_IsSharedfR instead.
  174. .PP
  175. A key property of Tcl objects is that they hold two representations.
  176. An object typically starts out containing only a string representation:
  177. it is untyped and has a NULL fItypePtrfR.
  178. An object containing an empty string or a copy of a specified string
  179. is created using fBTcl_NewObjfR or fBTcl_NewStringObjfR respectively.
  180. An object's string value is gotten with
  181. fBTcl_GetStringFromObjfR or fBTcl_GetStringfR
  182. and changed with fBTcl_SetStringObjfR.
  183. If the object is later passed to a procedure like fBTcl_GetIntFromObjfR
  184. that requires a specific internal representation,
  185. the procedure will create one and set the object's fItypePtrfR.
  186. The internal representation is computed from the string representation.
  187. An object's two representations are duals of each other:
  188. changes made to one are reflected in the other.
  189. For example, fBTcl_ListObjReplacefR will modify an object's
  190. internal representation and the next call to fBTcl_GetStringFromObjfR
  191. or fBTcl_GetStringfR will reflect that change.
  192. .PP
  193. Representations are recomputed lazily for efficiency.
  194. A change to one representation made by a procedure
  195. such as fBTcl_ListObjReplacefR is not reflected immediately
  196. in the other representation.
  197. Instead, the other representation is marked invalid
  198. so that it is only regenerated if it is needed later.
  199. Most C programmers never have to be concerned with how this is done
  200. and simply use procedures such as fBTcl_GetBooleanFromObjfR or
  201. fBTcl_ListObjIndexfR.
  202. Programmers that implement their own object types
  203. must check for invalid representations
  204. and mark representations invalid when necessary.
  205. The procedure fBTcl_InvalidateStringRepfR is used
  206. to mark an object's string representation invalid and to
  207. free any storage associated with the old string representation.
  208. .PP
  209. Objects usually remain one type over their life,
  210. but occasionally an object must be converted from one type to another.
  211. For example, a C program might build up a string in an object
  212. with repeated calls to fBTcl_AppendToObjfR,
  213. and then call fBTcl_ListObjIndexfR to extract a list element from
  214. the object.
  215. The same object holding the same string value
  216. can have several different internal representations
  217. at different times.
  218. Extension writers can also force an object to be converted from one type
  219. to another using the fBTcl_ConvertToTypefR procedure.
  220. Only programmers that create new object types need to be concerned
  221. about how this is done.
  222. A procedure defined as part of the object type's implementation
  223. creates a new internal representation for an object
  224. and changes its fItypePtrfR.
  225. See the man page for fBTcl_RegisterObjTypefR
  226. to see how to create a new object type.
  227. .SH "EXAMPLE OF THE LIFETIME OF AN OBJECT"
  228. .PP
  229. As an example of the lifetime of an object,
  230. consider the following sequence of commands:
  231. .CS
  232. fBset x 123fR
  233. .CE
  234. This assigns to fIxfR an untyped object whose
  235. fIbytesfR member points to fB123fR and fIlengthfR member contains 3.
  236. The object's fItypePtrfR member is NULL.
  237. .CS
  238. fBputs "x is $x"fR
  239. .CE
  240. fIxfR's string representation is valid (since fIbytesfR is non-NULL)
  241. and is fetched for the command.
  242. .CS
  243. fBincr xfR
  244. .CE
  245. The fBincrfR command first gets an integer from fIxfR's object
  246. by calling fBTcl_GetIntFromObjfR.
  247. This procedure checks whether the object is already an integer object.
  248. Since it is not, it converts the object
  249. by setting the object's fIinternalRep.longValuefR member
  250. to the integer fB123fR
  251. and setting the object's fItypePtrfR
  252. to point to the integer Tcl_ObjType structure.
  253. Both representations are now valid.
  254. fBincrfR increments the object's integer internal representation
  255. then invalidates its string representation
  256. (by calling fBTcl_InvalidateStringRepfR)
  257. since the string representation
  258. no longer corresponds to the internal representation.
  259. .CS
  260. fBputs "x is now $x"fR
  261. .CE
  262. The string representation of fIxfR's object is needed
  263. and is recomputed.
  264. The string representation is now fB124fR.
  265. and both representations are again valid.
  266. .SH "STORAGE MANAGEMENT OF OBJECTS"
  267. .PP
  268. Tcl objects are allocated on the heap and are shared as much as possible
  269. to reduce storage requirements.
  270. Reference counting is used to determine when an object is
  271. no longer needed and can safely be freed.
  272. An object just created by fBTcl_NewObjfR or fBTcl_NewStringObjfR
  273. has fIrefCountfR 0.
  274. The macro fBTcl_IncrRefCountfR increments the reference count
  275. when a new reference to the object is created.
  276. The macro fBTcl_DecrRefCountfR decrements the count
  277. when a reference is no longer needed and,
  278. if the object's reference count drops to zero, frees its storage.
  279. An object shared by different code or data structures has
  280. fIrefCountfR greater than 1.
  281. Incrementing an object's reference count ensures that
  282. it won't be freed too early or have its value change accidently.
  283. .PP
  284. As an example, the bytecode interpreter shares argument objects
  285. between calling and called Tcl procedures to avoid having to copy objects.
  286. It assigns the call's argument objects to the procedure's
  287. formal parameter variables.
  288. In doing so, it calls fBTcl_IncrRefCountfR to increment
  289. the reference count of each argument since there is now a new
  290. reference to it from the formal parameter.
  291. When the called procedure returns,
  292. the interpreter calls fBTcl_DecrRefCountfR to decrement
  293. each argument's reference count.
  294. When an object's reference count drops less than or equal to zero,
  295. fBTcl_DecrRefCountfR reclaims its storage.
  296. Most command procedures do not have to be concerned about
  297. reference counting since they use an object's value immediately
  298. and don't retain a pointer to the object after they return.
  299. However, if they do retain a pointer to an object in a data structure,
  300. they must be careful to increment its reference count
  301. since the retained pointer is a new reference.
  302. .PP
  303. Command procedures that directly modify objects
  304. such as those for fBlappendfR and fBlinsertfR must be careful to
  305. copy a shared object before changing it.
  306. They must first check whether the object is shared
  307. by calling fBTcl_IsSharedfR.
  308. If the object is shared they must copy the object
  309. by using fBTcl_DuplicateObjfR;
  310. this returns a new duplicate of the original object
  311. that has fIrefCountfR 0.
  312. If the object is not shared,
  313. the command procedure "owns" the object and can safely modify it directly.
  314. For example, the following code appears in the command procedure
  315. that implements fBlinsertfR.
  316. This procedure modifies the list object passed to it in fIobjv[1]fR
  317. by inserting fIobjc-3fR new elements before fIindexfR.
  318. .CS
  319. listPtr = objv[1];
  320. if (Tcl_IsShared(listPtr)) {
  321. listPtr = Tcl_DuplicateObj(listPtr);
  322. }
  323. result = Tcl_ListObjReplace(interp, listPtr, index, 0, (objc-3), &(objv[3]));
  324. .CE
  325. As another example, fBincrfR's command procedure
  326. must check whether the variable's object is shared before
  327. incrementing the integer in its internal representation.
  328. If it is shared, it needs to duplicate the object
  329. in order to avoid accidently changing values in other data structures.
  330. .SH "SEE ALSO"
  331. Tcl_ConvertToType, Tcl_GetIntFromObj, Tcl_ListObjAppendElement, Tcl_ListObjIndex, Tcl_ListObjReplace, Tcl_RegisterObjType
  332. .SH KEYWORDS
  333. internal representation, object, object creation, object type, reference counting, string representation, type conversion