Index: generic/itkArchBase.c ================================================================== --- generic/itkArchBase.c +++ generic/itkArchBase.c @@ -389,34 +389,40 @@ * from its parent's component list. Avoid doing these things * for the "hull" component, since it is a special case and * these things are not really necessary. */ Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, "bindtags ", -1); + Tcl_DStringAppend(&buffer, "::bindtags ", -1); Tcl_DStringAppend(&buffer, path, -1); if (Tcl_Eval(interp, Tcl_DStringValue(&buffer)) != TCL_OK) { goto compFail; } + /* + * NOTE: We need the [::itcl::code] because the itk_component + * method is protected. + */ + Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, "bind itk-destroy-", -1); + Tcl_DStringAppend(&buffer, "::bind itk-destroy-", -1); Tcl_DStringAppend(&buffer, path, -1); - Tcl_DStringAppend(&buffer, " [itcl::code ", -1); + Tcl_DStringAppend(&buffer, " [::itcl::code ", -1); Tcl_DStringAppend(&buffer, Tcl_GetStringFromObj(objNamePtr,(int*)NULL), -1); Tcl_DStringAppend(&buffer, " itk_component delete ", -1); Tcl_DStringAppend(&buffer, name, -1); Tcl_DStringAppend(&buffer, "]\n", -1); - Tcl_DStringAppend(&buffer, "bindtags ", -1); + Tcl_DStringAppend(&buffer, "::bindtags ", -1); Tcl_DStringAppend(&buffer, path, -1); Tcl_DStringAppend(&buffer, " {itk-destroy-", -1); Tcl_DStringAppend(&buffer, path, -1); Tcl_DStringAppend(&buffer, " ", -1); Tcl_DStringAppend(&buffer, Tcl_GetStringResult(interp), -1); Tcl_DStringAppend(&buffer, "}", -1); + if (Tcl_Eval(interp, Tcl_DStringValue(&buffer)) != TCL_OK) { goto compFail; } } @@ -476,16 +482,13 @@ Tcl_IncrRefCount(objPtr); } else { objPtr = objv[3]; } - Tcl_Import(interp, NULL, "::itk::option-parser::*", 1); - - if (result == TCL_OK) { - result = Tcl_EvalObj(interp, objPtr); - Tcl_ForgetImport(interp, NULL, "::itk::option-parser::*"); - } + Tcl_Eval(interp, "::namespace path [::lreplace [::namespace path] end+1 end ::itk::option-parser]"); + result = Tcl_EvalObj(interp, objPtr); + Tcl_Eval(interp, "::namespace path [::lrange [::namespace path] 0 end-1]"); if (objc != 4) { Tcl_DecrRefCount(objPtr); } if (result != TCL_OK) { @@ -645,11 +648,11 @@ * Clean up the binding tag that causes the widget to * call this method automatically when destroyed. * Ignore errors if anything goes wrong. */ Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, "itk::remove_destroy_hook ", -1); + Tcl_DStringAppend(&buffer, "::itk::remove_destroy_hook ", -1); Tcl_DStringAppend(&buffer, archComp->pathName, -1); (void) Tcl_Eval(interp, Tcl_DStringValue(&buffer)); Tcl_ResetResult(interp); Tcl_DStringFree(&buffer); @@ -1595,12 +1598,18 @@ if (result == TCL_OK) { /* * Casting away CONST of newval only to satisfy Tcl 8.3 and * earlier headers. */ + +#if 1 + val = ItclSetInstanceVar(interp, Tcl_GetString(ivPtr->fullNamePtr), + NULL, newval, contextObj, ivPtr->iclsPtr); +#else val = Tcl_SetVar2(interp, Tcl_GetString(ivPtr->fullNamePtr), (char *) NULL, (char *) newval, TCL_LEAVE_ERR_MSG); +#endif if (!val) { result = TCL_ERROR; } } @@ -1618,16 +1627,19 @@ * NOTE: Invoke the "config" code in the class scope * containing the data member. */ mcode = ivPtr->codePtr; if (mcode && mcode->bodyPtr) { - Tcl_Namespace *saveNsPtr; - Itcl_SetCallFrameResolver(interp, ivPtr->iclsPtr->resolvePtr); - saveNsPtr = Tcl_GetCurrentNamespace(interp); - Itcl_SetCallFrameNamespace(interp, ivPtr->iclsPtr->nsPtr); + Tcl_CallFrame frame; + + Itcl_PushCallFrame(interp, &frame, ivPtr->iclsPtr->nsPtr, 1); + Itcl_SetContext(interp, contextObj); + result = Tcl_EvalObjEx(interp, mcode->bodyPtr, 0); - Itcl_SetCallFrameNamespace(interp, saveNsPtr); + + Itcl_UnsetContext(interp); + Itcl_PopCallFrame(interp); if (result == TCL_OK) { Tcl_ResetResult(interp); } else { char msg[256]; @@ -1723,10 +1735,12 @@ 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); @@ -1741,11 +1755,19 @@ (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; @@ -1752,11 +1774,16 @@ } /* * 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; } @@ -1784,11 +1811,16 @@ * 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, Index: generic/itkArchetype.c ================================================================== --- generic/itkArchetype.c +++ generic/itkArchetype.c @@ -164,11 +164,10 @@ Tcl_AddErrorInfo(interp, "\n (while initializing itk)"); return TCL_ERROR; } Itcl_PreserveData((ClientData)mergeInfo); Itcl_EventuallyFree((ClientData)mergeInfo, Itk_DelMergeInfo); - Tcl_Export(interp, parserNs, "[a-z]*", 1); Tcl_CreateObjCommand(interp, "::itk::option-parser::keep", Itk_ArchOptKeepCmd, (ClientData)mergeInfo, (Tcl_CmdDeleteProc*)NULL); @@ -1066,16 +1065,14 @@ ItclShowArgs(1, "Itk_ArchConfigureCmd2", objc, objv); if (objc == 1) { Tcl_DStringInit(&buffer); for (i=0; i < info->order.len; i++) { - Tcl_Namespace *save = Tcl_GetCurrentNamespace(interp); archOpt = (ArchOption*)Tcl_GetHashValue(info->order.list[i]); - Itcl_SetCallFrameNamespace(interp, contextObj->iclsPtr->nsPtr); - val = Tcl_GetVar2(interp, "itk_option", archOpt->switchName, 0); - Itcl_SetCallFrameNamespace(interp, save); + val = ItclGetInstanceVar(interp, "itk_option", archOpt->switchName, + contextObj, contextClass); if (!val) { Itk_ArchOptAccessError(interp, info, archOpt); Tcl_DStringFree(&buffer); return TCL_ERROR; } @@ -1100,11 +1097,10 @@ * If there is just one argument, then query the information * for that one argument and return: * {name resName resClass init value} */ if (objc == 2) { - Tcl_Namespace *save = Tcl_GetCurrentNamespace(interp); token = Tcl_GetString(objv[1]); entry = Tcl_FindHashEntry(&info->options, token); if (!entry) { Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "unknown option \"", token, "\"", @@ -1111,13 +1107,13 @@ (char*)NULL); return TCL_ERROR; } archOpt = (ArchOption*)Tcl_GetHashValue(entry); - Itcl_SetCallFrameNamespace(interp, contextObj->iclsPtr->nsPtr); - val = Tcl_GetVar2(interp, "itk_option", archOpt->switchName, 0); - Itcl_SetCallFrameNamespace(interp, save); + + val = ItclGetInstanceVar(interp, "itk_option", archOpt->switchName, + contextObj, contextClass); if (!val) { Itk_ArchOptAccessError(interp, info, archOpt); return TCL_ERROR; } @@ -1138,23 +1134,23 @@ * 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); +// 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); +// Itcl_SetCallFrameNamespace(interp, contextObj->iclsPtr->nsPtr); code = Itk_ArchConfigOption(interp, info, token, value); - Itcl_SetCallFrameNamespace(interp, save); +// Itcl_SetCallFrameNamespace(interp, save); if (code != TCL_OK) { return TCL_ERROR; } } Index: generic/itkOption.c ================================================================== --- generic/itkOption.c +++ generic/itkOption.c @@ -215,25 +215,26 @@ 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) { - Tcl_Namespace *saveNsPtr; -//fprintf(stderr, "EXE!%s!\n", Tcl_GetString(mcode->bodyPtr)); - Itcl_SetCallFrameResolver(interp, opt->iclsPtr->resolvePtr); - saveNsPtr = Tcl_GetCurrentNamespace(interp); -//fprintf(stderr, "MCNS!%s!\n", saveNsPtr->fullName); - Itcl_SetCallFrameNamespace(interp, opt->iclsPtr->nsPtr); + + Itcl_PushCallFrame(interp, &frame, opt->iclsPtr->nsPtr, 1); + Itcl_SetContext(interp, contextObj); + result = Tcl_EvalObjEx(interp, mcode->bodyPtr, 0); - Itcl_SetCallFrameNamespace(interp, saveNsPtr); + + 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.