Tcl_ObjType


HOME

Tcl_ObjType

NAME
SYNOPSIS
ARGUMENTS
DESCRIPTION
THE TCL_OBJTYPE STRUCTURE
SEE ALSO
KEYWORDS

___________________________

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. 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 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 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 representation 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. 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). │

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 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 verify 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.

The setFromAnyProc member may be set to NULL, if the routines 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 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, 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 updateStringProcs 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 routines 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 object type determines what copying its internal representation means.

For example, the dupIntRepProc for the Tcl integer type simply copies an integer. The built-in list type’s dupIntRepProc uses a far more sophisticated scheme to continue sharing 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



More Linux Commands

manpages/XtKeysymToKeycodeList.3.html
XtKeysymToKeycodeList(3) - query keysyms and keycodes.......
XtGetKeysymTable returns a pointer to the Intrinsics copy of the servers KeyCode-to-KeySym table. This table must not be modified. The XtKeysymToKeycodeList pro

manpages/MagickCore-config.1.html
MagickCore-config(1) - get information about the installed v
MagickCore-config prints the compiler and linker flags required to compile and link programs that use the ImageMagick Application Programmer Interface. EXAMPLES

manpages/optopt.3.html
optopt(3) - Parse command-line options - Linux manual page
The getopt() function parses the command-line arguments. Its arguments argc and argv are the argument count and array as passed to the main() function on progra

manpages/diff3.1.html
diff3(1) - compare three files line by line - Linux man page
Compare three files line by line. Mandatory arguments to long options are mandatory for short options too. -A, --show-all output all changes, bracketing conflic

manpages/getwchar.3.html
getwchar(3) - read a wide character from standard input.....
The getwchar() function is the wide-character equivalent of the getchar(3) function. It reads a wide character from stdin and returns it. If the end of stream i

manpages/bash.1.html
bash(1) - GNU Bourne-Again SHell (Commands - Linux man page)
Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates useful features

manpages/XmbTextEscapement.3.html
XmbTextEscapement(3) - obtain the escapement of text........
The XmbTextEscapement, XwcTextEscapement and Xutf8TextEscapement functions return the escapement in pixels of the specified string as a value, using the fonts l

manpages/sd-daemon.7.html
sd-daemon(7) - Reference implementation of APIs for new-styl
sd-daemon.c and sd-daemon.h provide a reference implementation of various APIs for new-style daemons, as implemented by the systemd(1) init system. See sd_liste

manpages/Tk_GetCursorFromObj.3.html
Tk_GetCursorFromObj(3) - maintain database of cursors.......
These procedures manage a collection of cursors being used by an application. The procedures allow cursors to be re-used efficiently, thereby avoiding server ov

manpages/netconfig.8.html
netconfig(8) - modular tool to modify network configuration
Netconfig is a modular tool to manage additional network configuration settings. It merges statically defined settings with settings provided by autoconfigurati

manpages/XML::RegExp.3pm.html
XML::RegExp(3pm) - Regular expressions for XML tokens.......
This package contains regular expressions for the following XML tokens: BaseChar, Ideographic, Letter, Digit, Extender, CombiningChar, NameChar, EntityRef, Char

manpages/localeconv.3.html
localeconv(3) - get numeric formatting information (ManPage)
The localeconv() function returns a pointer to a struct lconv for the current locale. This structure is shown in locale(7), and contains all values associated w





We can't live, work or learn in freedom unless the software we use is free.