Index: ChangeLog =================================================================== diff -u -r570b5b8ea87572bdfd1460842ac333359800467b -r5fe13ad7f00106b9912ec8e78e9beb626ef9733d --- ChangeLog (.../ChangeLog) (revision 570b5b8ea87572bdfd1460842ac333359800467b) +++ ChangeLog (.../ChangeLog) (revision 5fe13ad7f00106b9912ec8e78e9beb626ef9733d) @@ -1,3 +1,25 @@ +2008-02-21: + * replaced Tcl_ObjSetVar2() with Tcl_SetVar2Ex() + + Tcl 8.5 seems to optimize variables away, which + are not directly referenced by the tcl proc body. + In the following example, "ot" is set from + C (via nonposargs, previously via Tcl_ObjSetVar2()) + and consumed via C (from the db-driver, using :ot). + + SomeClass instproc foo {-ot} { + #ns_log notice ot=$ot + return [db_string [my qn check_type] { + select 1 from acs_object_types where object_type = :ot + } -default 0] + } + + When the logging command is added, the statement + works fine. When the looging command was deactivated, + the variable ot was not seen from the consumer. + By changing the variable setting command to + Tcl_SetVar2Ex(), it works fine. + 2008-02-08: * New info option "-closure" for "info instmixin" with -guards and -closure support Index: generic/xotcl.c =================================================================== diff -u -r570b5b8ea87572bdfd1460842ac333359800467b -r5fe13ad7f00106b9912ec8e78e9beb626ef9733d --- generic/xotcl.c (.../xotcl.c) (revision 570b5b8ea87572bdfd1460842ac333359800467b) +++ generic/xotcl.c (.../xotcl.c) (revision 5fe13ad7f00106b9912ec8e78e9beb626ef9733d) @@ -12089,13 +12089,15 @@ return XOTclVarErrMsg(interp, "Non positional arg '", argStr, "': no boolean value", (char *) NULL); } - Tcl_ObjSetVar2(interp, var, NULL, Tcl_NewBooleanObj(!bool), 0); + Tcl_SetVar2Ex(interp, ObjStr(var), NULL, Tcl_NewBooleanObj(!bool), 0); + /*Tcl_ObjSetVar2(interp, var, NULL, Tcl_NewBooleanObj(!bool), 0); */ } else { i++; if (i >= argsc) return XOTclVarErrMsg(interp, "Non positional arg '", argStr, "': value missing", (char *) NULL); - Tcl_ObjSetVar2(interp, var, NULL, argsv[i], 0); + Tcl_SetVar2Ex(interp, ObjStr(var), NULL, argsv[i], 0); + /* Tcl_ObjSetVar2(interp, var, NULL, argsv[i], 0);*/ } } else { endOfNonposArgsReached = 1;