NAME¶
Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType -
manipulate Tcl object types
SYNOPSIS¶
#include <tcl.h>
Tcl_RegisterObjType(typePtr)
Tcl_ObjType *
Tcl_GetObjType(typeName)
int
Tcl_AppendAllObjTypes(interp, objPtr)
int
Tcl_ConvertToType(interp, objPtr, typePtr)
ARGUMENTS¶
- Tcl_ObjType *typePtr (in)
- Points to the structure containing information about the
Tcl object type. This storage must live forever, typically by being
statically allocated.
- CONST char *typeName (in)
- The name of a Tcl object type that Tcl_GetObjType
should look up.
- Tcl_Interp *interp (in)
- Interpreter to use for error reporting.
- Tcl_Obj *objPtr (in)
- For Tcl_AppendAllObjTypes, this points to the object
onto which it appends the name of each object type as a list element. For
Tcl_ConvertToType, this points to an object that must have been the
result of a previous call to Tcl_NewObj.
DESCRIPTION¶
The procedures in this man page manage Tcl object types. The are used to
register new object types, look up types, and force conversions from one type
to another.
Tcl_RegisterObjType registers a new Tcl object type in the table of all
object types supported by Tcl. The argument
typePtr points to a
Tcl_ObjType structure that describes the new type by giving its name and by
supplying pointers to four procedures that implement the type. If the type
table already contains a type with the same name as in
typePtr, it is
replaced with the new type. The Tcl_ObjType structure is described in the
section
THE TCL_OBJTYPE STRUCTURE below.
Tcl_GetObjType returns a pointer to the Tcl_ObjType with name
typeName. It returns NULL if no type with that name is registered.
Tcl_AppendAllObjTypes appends the name of each object type as a list
element onto the Tcl object referenced by
objPtr. The return value is
TCL_OK unless there was an error converting
objPtr to a list
object; in that case
TCL_ERROR is returned.
Tcl_ConvertToType converts an object from one type to another if
possible. It creates a new internal representation for
objPtr
appropriate for the target type
typePtr and sets its
typePtr
member to that type. Any internal representation for
objPtr's old type
is freed. If an error occurs during conversion, it returns
TCL_ERROR
and leaves an error message in the result object for
interp unless
interp is NULL. Otherwise, it returns
TCL_OK. Passing a NULL
interp allows this procedure to be used as a test whether the
conversion can be done (and in fact was done).
THE TCL_OBJTYPE STRUCTURE¶
Extension writers can define new object types by defining four procedures,
initializing a Tcl_ObjType structure to describe the type, and calling
Tcl_RegisterObjType. The
Tcl_ObjType structure is defined as
follows:
typedef struct Tcl_ObjType {
char * name;
Tcl_FreeInternalRepProc * freeIntRepProc;
Tcl_DupInternalRepProc * dupIntRepProc;
Tcl_UpdateStringProc * updateStringProc;
Tcl_SetFromAnyProc * setFromAnyProc;
} Tcl_ObjType;
The
name member describes the name of the type, e.g.
int.
Extension writers can look up an object type using its name with the
Tcl_GetObjType procedure. The remaining four members are pointers to
procedures called by the generic Tcl object code:
The
setFromAnyProc member contains the address of a function called to
create a valid internal representation from an object's string representation.
typedef int (Tcl_SetFromAnyProc) (Tcl_Interp * interp, Tcl_Obj *objPtr);
If an internal representation can't be created from the string, it returns
TCL_ERROR and puts a message describing the error in the result object
for
interp unless
interp is NULL. If
setFromAnyProc is
successful, it stores the new internal representation, sets
objPtr's
typePtr member to point to
setFromAnyProc's
Tcl_ObjType,
and returns
TCL_OK. Before setting the new internal representation, the
setFromAnyProc must free any internal representation of
objPtr's
old type; it does this by calling the old type's
freeIntRepProc if it
is not NULL. As an example, the
setFromAnyProc for the builtin Tcl
integer type gets an up-to-date string representation for
objPtr by
calling
Tcl_GetStringFromObj. It parses the string to obtain an integer
and, if this succeeds, stores the integer in
objPtr's internal
representation and sets
objPtr's
typePtr member to point to the
integer type's Tcl_ObjType structure. Do not release
objPtr's old
internal representation unless you replace it with a new one or reset the
typePtr member to NULL.
The
updateStringProc member contains the address of a function called to
create a valid string representation from an object's internal representation.
typedef void (Tcl_UpdateStringProc) (Tcl_Obj * objPtr);
objPtr's
bytes member is always NULL when it is called. It must
always set
bytes non-NULL before returning. We require the string
representation's byte array to have a null after the last byte, at offset
length; this allows string representations that do not contain null
bytes to be treated as conventional null character-terminated C strings.
Storage for the byte array must be allocated in the heap by
Tcl_Alloc
or
ckalloc. Note that
updateStringProcs must allocate enough
storage for the string's bytes and the terminating null byte. The
updateStringProc for Tcl's builtin list type, for example, builds an
array of strings for each element object and then calls
Tcl_Merge to
construct a string with proper Tcl list structure. It stores this string as
the list object's string representation.
The
dupIntRepProc member contains the address of a function called to
copy an internal representation from one object to another.
typedef void (Tcl_DupInternalRepProc) (Tcl_Obj * srcPtr, Tcl_Obj *dupPtr);
dupPtr's internal representation is made a copy of
srcPtr's
internal representation. Before the call,
srcPtr's internal
representation is valid and
dupPtr's is not.
srcPtr's object
type determines what copying its internal representation means. For example,
the
dupIntRepProc for the Tcl integer type simply copies an integer.
The builtin list type's
dupIntRepProc allocates a new array that points
at the original element objects; the elements are shared between the two lists
(and their reference counts are incremented to reflect the new references).
The
freeIntRepProc member contains the address of a function that is
called when an object is freed.
typedef void (Tcl_FreeInternalRepProc) (Tcl_Obj * objPtr);
The
freeIntRepProc function can deallocate the storage for the object's
internal representation and do other type-specific processing necessary when
an object is freed. For example, Tcl list objects have an
internalRep.otherValuePtr that points to an array of pointers to each
element in the list. The list type's
freeIntRepProc decrements the
reference count for each element object (since the list will no longer refer
to those objects), then deallocates the storage for the array of pointers. The
freeIntRepProc member can be set to NULL to indicate that the internal
representation does not require freeing.
SEE ALSO¶
Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount
KEYWORDS¶
internal representation, object, object type, string representation, type
conversion