Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Attempt to make code say clearly what it does, instead of achieving so much with namespace context games. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | experiment |
Files: | files | file ages | folders |
SHA1: |
4af9618d9bbb632791f9aa411b1459c6 |
User & Date: | dgp 2017-07-25 20:35:54 |
Context
2017-07-27
| ||
16:31 | Similar changes to the PropagatePublicVariable machinery. check-in: 0bd0be830c user: dgp tags: experiment | |
2017-07-25
| ||
20:35 | Attempt to make code say clearly what it does, instead of achieving so much with namespace context games. check-in: 4af9618d9b user: dgp tags: experiment | |
2017-07-10
| ||
18:32 | [6acb6a8363] When Itk_AddOptionPart() fails, be sure no remnant of the failed attempt remains to lead to nasty double free. check-in: 46e858f9ac user: dgp tags: dgp-method-type | |
Changes
Changes to generic/itkArchBase.c.
︙ | ︙ | |||
1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 | CONST char *v; char *lastval; Tcl_HashEntry *entry; ArchOption *archOpt; Itcl_ListElem *part; ArchOptionPart *optPart; Itcl_InterpState istate; /* * Query the "itk_option" array to get the current setting. */ entry = Tcl_FindHashEntry(&info->options, name); if (!entry) { /* Bug 227876 * Ensure that the interp result is unshared. */ Tcl_ResetResult (interp); Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "unknown option \"", name, "\"", (char*)NULL); return TCL_ERROR; } archOpt = (ArchOption*)Tcl_GetHashValue(entry); v = Tcl_GetVar2(interp, "itk_option", archOpt->switchName, 0); if (v) { lastval = (char*)ckalloc((unsigned)(strlen(v)+1)); strcpy(lastval, v); } else { lastval = NULL; } /* * Update the "itk_option" array with the new setting. */ if (!Tcl_SetVar2(interp, "itk_option", archOpt->switchName, value, 0)) { Itk_ArchOptAccessError(interp, info, archOpt); result = TCL_ERROR; goto configDone; } /* * Scan through all option parts to handle the new setting. | > > > > > > > > > > > > > > > | 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 | CONST char *v; char *lastval; Tcl_HashEntry *entry; ArchOption *archOpt; Itcl_ListElem *part; ArchOptionPart *optPart; Itcl_InterpState istate; ItclClass *iclsPtr; ItclObject *ioPtr; /* * Query the "itk_option" array to get the current setting. */ entry = Tcl_FindHashEntry(&info->options, name); if (!entry) { /* Bug 227876 * Ensure that the interp result is unshared. */ Tcl_ResetResult (interp); Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "unknown option \"", name, "\"", (char*)NULL); return TCL_ERROR; } archOpt = (ArchOption*)Tcl_GetHashValue(entry); #if 0 v = Tcl_GetVar2(interp, "itk_option", archOpt->switchName, 0); #else Itcl_GetContext(interp, &iclsPtr, &ioPtr); v = ItclGetInstanceVar(interp, "itk_option", archOpt->switchName, ioPtr, iclsPtr); #endif if (v) { lastval = (char*)ckalloc((unsigned)(strlen(v)+1)); strcpy(lastval, v); } else { lastval = NULL; } /* * Update the "itk_option" array with the new setting. */ #if 0 if (!Tcl_SetVar2(interp, "itk_option", archOpt->switchName, value, 0)) { #else if (!ItclSetInstanceVar(interp, "itk_option", archOpt->switchName, value, ioPtr, iclsPtr)) { #endif Itk_ArchOptAccessError(interp, info, archOpt); result = TCL_ERROR; goto configDone; } /* * Scan through all option parts to handle the new setting. |
︙ | ︙ | |||
1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 | * If the option configuration failed, then set the option * back to its previous settings. Scan back through all of * the option parts and sync them up with the old value. */ if (result == TCL_ERROR) { istate = Itcl_SaveInterpState(interp, result); Tcl_SetVar2(interp, "itk_option", archOpt->switchName, lastval, 0); part = Itcl_FirstListElem(&archOpt->parts); while (part) { optPart = (ArchOptionPart*)Itcl_GetListValue(part); (*optPart->configProc)(interp, info->itclObj, optPart->clientData, lastval); | > > > > > | 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 | * If the option configuration failed, then set the option * back to its previous settings. Scan back through all of * the option parts and sync them up with the old value. */ if (result == TCL_ERROR) { istate = Itcl_SaveInterpState(interp, result); #if 0 Tcl_SetVar2(interp, "itk_option", archOpt->switchName, lastval, 0); #else ItclSetInstanceVar(interp, "itk_option", archOpt->switchName, lastval, ioPtr, iclsPtr); #endif part = Itcl_FirstListElem(&archOpt->parts); while (part) { optPart = (ArchOptionPart*)Itcl_GetListValue(part); (*optPart->configProc)(interp, info->itclObj, optPart->clientData, lastval); |
︙ | ︙ |
Changes to generic/itkArchetype.c.
︙ | ︙ | |||
1064 1065 1066 1067 1068 1069 1070 | } } ItclShowArgs(1, "Itk_ArchConfigureCmd2", objc, objv); if (objc == 1) { Tcl_DStringInit(&buffer); for (i=0; i < info->order.len; i++) { | < < | < > | 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 | } } ItclShowArgs(1, "Itk_ArchConfigureCmd2", objc, objv); if (objc == 1) { Tcl_DStringInit(&buffer); for (i=0; i < info->order.len; i++) { archOpt = (ArchOption*)Tcl_GetHashValue(info->order.list[i]); val = ItclGetInstanceVar(interp, "itk_option", archOpt->switchName, contextObj, contextClass); if (!val) { Itk_ArchOptAccessError(interp, info, archOpt); Tcl_DStringFree(&buffer); return TCL_ERROR; } Tcl_DStringStartSublist(&buffer); |
︙ | ︙ | |||
1098 1099 1100 1101 1102 1103 1104 | /* * If there is just one argument, then query the information * for that one argument and return: * {name resName resClass init value} */ if (objc == 2) { | < | | | | 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 | /* * If there is just one argument, then query the information * for that one argument and return: * {name resName resClass init value} */ if (objc == 2) { token = Tcl_GetString(objv[1]); entry = Tcl_FindHashEntry(&info->options, token); if (!entry) { Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "unknown option \"", token, "\"", (char*)NULL); return TCL_ERROR; } archOpt = (ArchOption*)Tcl_GetHashValue(entry); val = ItclGetInstanceVar(interp, "itk_option", archOpt->switchName, contextObj, contextClass); if (!val) { Itk_ArchOptAccessError(interp, info, archOpt); return TCL_ERROR; } Tcl_AppendElement(interp, archOpt->switchName); Tcl_AppendElement(interp, |
︙ | ︙ | |||
1136 1137 1138 1139 1140 1141 1142 | /* * Otherwise, it must be a series of "-option value" assignments. * Look up each option and assign the new value. */ for (objc--,objv++; objc > 0; objc-=2, objv+=2) { char *value; int code; | | | | | 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 | /* * Otherwise, it must be a series of "-option value" assignments. * Look up each option and assign the new value. */ for (objc--,objv++; objc > 0; objc-=2, objv+=2) { char *value; int code; // Tcl_Namespace *save = Tcl_GetCurrentNamespace(interp); token = Tcl_GetString(objv[0]); if (objc < 2) { Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "value for \"", token, "\" missing", (char*)NULL); return TCL_ERROR; } value = Tcl_GetString(objv[1]); // Itcl_SetCallFrameNamespace(interp, contextObj->iclsPtr->nsPtr); code = Itk_ArchConfigOption(interp, info, token, value); // Itcl_SetCallFrameNamespace(interp, save); if (code != TCL_OK) { return TCL_ERROR; } } Tcl_ResetResult(interp); return TCL_OK; |
︙ | ︙ |
Changes to generic/itkOption.c.
︙ | ︙ | |||
213 214 215 216 217 218 219 220 221 222 223 224 225 226 | ItclObject *contextObj, /* object being configured */ ClientData cdata, /* class option */ CONST char *newval) /* new value for this option */ { ItkClassOption *opt = (ItkClassOption*)cdata; int result = TCL_OK; ItclMemberCode *mcode; /* * If the option has any config code, execute it now. * Make sure that the namespace context is set up correctly. */ mcode = opt->codePtr; if (mcode && mcode->bodyPtr) { | > | < | | | < | > > | 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | ItclObject *contextObj, /* object being configured */ ClientData cdata, /* class option */ CONST char *newval) /* new value for this option */ { ItkClassOption *opt = (ItkClassOption*)cdata; int result = TCL_OK; ItclMemberCode *mcode; Tcl_CallFrame frame; /* * If the option has any config code, execute it now. * Make sure that the namespace context is set up correctly. */ mcode = opt->codePtr; if (mcode && mcode->bodyPtr) { Itcl_PushCallFrame(interp, &frame, opt->iclsPtr->nsPtr, 1); Itcl_SetContext(interp, contextObj); result = Tcl_EvalObjEx(interp, mcode->bodyPtr, 0); Itcl_UnsetContext(interp); Itcl_PopCallFrame(interp); /* * Here we engage in some ugly hackery workaround until * someone has time to come back and implement this * properly. * * In Itcl/Itk 3, the same machinery was used to implement |
︙ | ︙ |