Tcl_NewObj & manual bytes/length setting vs Tcl_NewStringObj
Hello.
I have some strangeness with string representation of a value. It is truncated to (length - 1) if i use "set" command. The code:
```
Tcl_CreateObjCommand(interp, "ulist", ulist, NULL, NULL);
...
static int
ulist(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
{
Tcl_Obj *str_o;
if (objc != 2) {
Tcl_SetObjResult(interp, Tcl_NewStringObj("Wrong number of arguments", -1));
return TCL_ERROR;
}
str_o = Tcl_NewObj();
Tcl_InvalidateStringRep(str_o);
str_o->typePtr = &ulist_type;
str_o->bytes = ckalloc(6);
strcat(str_o->bytes, "ulist");
str_o->length = 5;
fprintf(stderr, "mk: len=%d, bytes=%s\n", str_o->length, str_o->bytes);
Tcl_SetObjResult(interp, str_o);
return TCL_OK;
}
```
tclsh:
% load libulist.so
% ulist 0
mk: len=5, bytes=ulist
ulist
% set a [ulist 0]
mk: len=5, bytes=ulist
ulis
% puts $a
ulis
%
Note, "set" command returns "ulis" instead of "ulist".
If i replace Tcl_NewObj with Tcl_NewStringObj:
```
static int
ulist(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
{
Tcl_Obj *str_o;
if (objc != 2) {
Tcl_SetObjResult(interp, Tcl_NewStringObj("Wrong number of arguments", -1));
return TCL_ERROR;
}
str_o = Tcl_NewStringObj("ulist", 5);
str_o->typePtr = &ulist_type;
fprintf(stderr, "mk: len=%d, bytes=%s\n", str_o->length, str_o->bytes);
Tcl_SetObjResult(interp, str_o);
return TCL_OK;
}
```
tclsh:
% load libulist.so
% ulist 0
mk: len=5, bytes=ulist
ulist
% set a [ulist 0]
mk: len=5, bytes=ulist
ulist
% puts $a
ulist
%
Where i mistake?
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)