Tcl_ConvertToType(3)
Tcl_ObjType(3) Tcl Library Procedures Tcl_ObjType(3)
_________________________________________________________________
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 allo-
cated.
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
Tcl Last change: 8.0 1
Tcl_ObjType(3) Tcl Library Procedures Tcl_ObjType(3)
The procedures in this man page manage Tcl object types.
They 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 that Tcl_GetObjType can look up by
name. There are other object types supported by Tcl as
well, which Tcl chooses not to register. Extensions can
likewise choose to register the object types they create or
not. The argument typePtr points to a Tcl_ObjType structure
that describes the new type by giving its name and by sup-
plying 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 registered
Tcl_ObjType with name typeName. It returns NULL if no type
with that name is registered.
Tcl_AppendAllObjTypes appends the name of each registered
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 representa-
tion for objPtr appropriate for the target type typePtr and
sets its typePtr member as determined by calling the
typePtr->setFromAnyProc routine. 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. Oth-
erwise, 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). |
In many cases, the typePtr->setFromAnyProc routine will set |
objPtr->typePtr to the argument value typePtr, but that is |
no longer guaranteed. The setFromAnyProc is free to set the |
internal representation for objPtr to make use of another |
related Tcl_ObjType, if it sees fit.
THE TCL_OBJTYPE STRUCTURE
Extension writers can define new object types by defining
four procedures and initializing a Tcl_ObjType structure to
describe the type. Extension writers may also pass a
pointer to their Tcl_ObjType structure to
Tcl_RegisterObjType if they wish to permit other extensions
to look up their Tcl_ObjType by name with the Tcl_GetObjType
Tcl Last change: 8.0 2
Tcl_ObjType(3) Tcl Library Procedures Tcl_ObjType(3)
routine. 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 FIELD
The name member describes the name of the type, e.g. int.
When a type is registered, this is the name used by callers
of Tcl_GetObjType to lookup the type. For unregistered
types, the name field is primarily of value for debugging.
The remaining four members are pointers to procedures called
by the generic Tcl object code:
THE SETFROMANYPROC FIELD
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 cannot 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 the Tcl_ObjType struct corresponding to the new
internal representation, 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 built-in Tcl list
type gets an up-to-date string representation for objPtr by
calling Tcl_GetStringFromObj. It parses the string to ver-
ify it is in a valid list format and to obtain each element
value in the list, and, if this succeeds, stores the list
elements in objPtr's internal representation and sets
objPtr's typePtr member to point to the list 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.
Tcl Last change: 8.0 3
Tcl_ObjType(3) Tcl Library Procedures Tcl_ObjType(3)
The setFromAnyProc member may be set to NULL, if the rou-
tines making use of the internal representation have no need
to derive that internal representation from an arbitrary
string value. However, in this case, passing a pointer to
the type to Tcl_ConvertToType() will lead to a panic, so to
avoid this possibility, the type should not be registered.
THE UPDATESTRINGPROC FIELD
The updateStringProc member contains the address of a func-
tion 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, and to have no null bytes
before that; this allows string representations to be
treated as conventional null character-terminated C strings.
These restrictions are easily met by using Tcl's internal
UTF encoding for the string representation, same as one
would do for other Tcl routines accepting string values as
arguments. Storage for the byte array must be allocated in
the heap by Tcl_Alloc or ckalloc. Note that updateS-
tringProcs must allocate enough storage for the string's
bytes and the terminating null byte.
The updateStringProc for Tcl's built-in double type, for
example, calls Tcl_PrintDouble to write to a buffer of size
TCL_DOUBLE_SPACE, then allocates and copies the string
representation to just enough space to hold it. A pointer
to the allocated space is stored in the bytes member.
The updateStringProc member may be set to NULL, if the rou-
tines making use of the internal representation are written
so that the string representation is never invalidated.
Failure to meet this obligation will lead to panics or
crashes when Tcl_GetStringFromObj or other similar routines
ask for the string representation.
THE DUPINTREPPROC FIELD
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
Tcl Last change: 8.0 4
Tcl_ObjType(3) Tcl Library Procedures Tcl_ObjType(3)
object type determines what copying its internal representa-
tion means.
For example, the dupIntRepProc for the Tcl integer type sim-
ply copies an integer. The built-in list type's dupIntRep-
Proc uses a far more sophisticated scheme to continue shar-
ing storage as much as it reasonably can.
THE FREEINTREPPROC FIELD
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, the list type's freeIntRepProc respects the
storage sharing scheme established by the dupIntRepProc so
that it only frees storage when the last object sharing it
is being freed.
The freeIntRepProc member can be set to NULL to indicate
that the internal representation does not require freeing.
The freeIntRepProc implementation must not access the bytes
member of the object, since Tcl makes its own internal uses
of that field during object deletion. The defined tasks for
the freeIntRepProc have no need to consult the bytes member.
SEE ALSO
Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount
KEYWORDS
internal representation, object, object type, string
representation, type conversion
Tcl Last change: 8.0 5
Man(1) output converted with
man2html