Tcl Source Code

Artifact [f9284911b3]
Login

Artifact f9284911b307fca852de228e524c077582fd0321:

Ticket change [f9284911b3] - Ticket [578155d5a1] Very rare bug (segfault) if set variable (with error case) using self-releasable object as new value status still Open with 3 other changes by sebres 2017-07-14 10:20:42.
D 2017-07-14T10:20:42.759
J icomment Still\sone\sargument\sagainst\sthis\scode\sat\sall\s-\sif\scaller\swant\sto\srelease\sownership\sof\sthe\sobject\s(should\snot\shold\sown\sreference\sanymore\safter\sset\svariable,\sthe\scaller\sshould\scurrently\stake\scare\sby\sthe\sdecreasing\sof\sit.<br/>\r\nEspecially\sin\sthe\serror\scase\sof\s<code>Tcl_ObjSetVar2</code>\s(because\sthis\stime\sit\sshould\sthen\salways\sdo\sit).\sHow\sit\scan\sbe\ssure,\sthat\s<code>Tcl_ObjSetVar2</code>\sdid\sit\snot\salready?\r\nSo\sfor\sexample:\r\n<code><pre>\r\n/*\swe\sget\ssomeValue\sfrom\ssomewhere\sand\stake\sownership\sof\sreference\snow\s*/\r\nsomeValue\s=\sTransmitObjFromSomewhere(...);\r\n...\r\nif\s(!Tcl_ObjSetVar2(interp,\svarName,\sNULL,\ssomeValue,\s...))\s{\r\n\s\s/*\s[**BAD**]\serror\scase\s-\sdecrease\sand\sreturn\s*/\r\n\s\sTcl_DecrRefCount(someValue);\r\n\s\s/*\s[**/BAD**]\s*/\r\n\s\sreturn\s...;\r\n}\r\n/*\sdo\ssomewhat\selse\salso,\se.\sg.\susing\sthis\sobject,\sfor\sexample:\s*/\r\n...\sTcl_GetString(someValue)\s...\r\n\r\n/*\swe\sare\sready\shere,\srelease\sour\sownership\s(further\sin\svar)\s*/\r\nTcl_DecrRefCount(someValue);\r\nreturn\s...;\r\n\r\n</pre></code>\r\n\r\nBut\scurrently\swe\scannot\sdo\sthis\ssane...<br/>\r\nI\smean\sthe\scode\senclosed\sbetween\s<code>[**BAD**]...[**/BAD**]</code>.<br/>\r\nBecause\swe\scan\sbe\snot\ssure\swhat\shappens\swith\sreference\sin\s<code>Tcl_ObjSetVar2</code>.\r\n\r\nPossibly\swe\sshould\sintroduce\sa\snew\sflag\s(TCL_OWN_OBJREF)\slike\shere:\r\n<code><pre>\r\n<b\sstyle="color:gray">//\stcl.h:</b>\r\n\r\n<b\sstyle="color:green">+\s/*\sIndicate\sthe\sobject\sreference\ssupplied\sto\sTcl_ObjSetVar2\setc\sshould\sbe\snot\sowned\sby\scaller\sanymore\s*/</b>\r\n<b\sstyle="color:green">+\s#define\sTCL_OWN_OBJREF\s\s\s\s\s\s\s\s\s\s\s0x800000</b>\r\n\r\n<b\sstyle="color:gray">//\severywhere\swhere\sexpected\sto\stransmit\sthe\sreference\sownership\sto\svar:</b>\r\n\r\n<b\sstyle="color:red">-\sTcl_ObjSetVar2(interp,\svarName,\sNULL,\ssomeValue,\sTCL_LEAVE_ERR_MSG);</b>\r\n<b\sstyle="color:red">-\sTcl_DecrRefCount(someValue);</b>\r\n<b\sstyle="color:green">+\sTcl_ObjSetVar2(interp,\svarName,\sNULL,\ssomeValue,\sTCL_OWN_OBJREF\s|\sTCL_LEAVE_ERR_MSG);</b>\r\n</pre></code>\r\n\r\nIt\scould\sthen\sset\sthe\svariable\svalue\swith\sdecreasing\sof\sthe\srefCount\sby\svariable\sassignment\sroutines\s(but\salways,\snot\sonly\sin\serror\scase\sif\srefCount\swas\s0).\r\n\r\nIMHO\sonly\sthis\swould\sbe\sthe\sright\sway,\sto\smake\sit\ssane.
J login sebres
J mimetype text/x-fossil-wiki
K 578155d5a19b348dc1a9fe96cc2c067a59326a89
U sebres
Z 417480f1e3c207768088ad064b4afc40