Index: generic/xotcl.c =================================================================== diff -u -r3a8922005bda5bd8555a66706019bec9d9cfb239 -r782b1f820f03b0f09c3e333a5e03f9ad2808fcac --- generic/xotcl.c (.../xotcl.c) (revision 3a8922005bda5bd8555a66706019bec9d9cfb239) +++ generic/xotcl.c (.../xotcl.c) (revision 782b1f820f03b0f09c3e333a5e03f9ad2808fcac) @@ -8465,12 +8465,13 @@ static int -GetInstVarIntoCurrentScope(Tcl_Interp *interp, XOTclObject *object, +GetInstVarIntoCurrentScope(Tcl_Interp *interp, const char *cmdName, XOTclObject *object, Tcl_Obj *varName, Tcl_Obj *newName) { Var *varPtr = NULL, *otherPtr = NULL, *arrayPtr; int new = 0, flgs = TCL_LEAVE_ERR_MSG; Tcl_CallFrame *varFramePtr; Tcl_CallFrame frame, *framePtr = &frame; + char *varNameString; XOTcl_PushFrameObj(interp, object, framePtr); if (object->nsPtr) { @@ -8482,8 +8483,8 @@ XOTcl_PopFrameObj(interp, framePtr); if (otherPtr == NULL) { - return XOTclVarErrMsg(interp, "can't make instvar ", ObjStr(varName), - ": can't find variable on ", objectName(object), + return XOTclVarErrMsg(interp, "can't import variable ", ObjStr(varName), + " into method scope: can't find variable on ", objectName(object), (char *) NULL); } @@ -8505,21 +8506,22 @@ newName = varName; } -#if 0 - if (strstr(newName, "::")) { - return XOTclVarErrMsg(interp, "variable name \"", newName, - "\" illegal: must not contain namespace separator", + varNameString = ObjStr(newName); + + if (strstr(varNameString, "::") || *varNameString == ':') { + return XOTclVarErrMsg(interp, "variable name \"", varNameString, + "\" must not contain namespace separator or colon prefix", (char *) NULL); } -#endif + varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); /* * If we are executing inside a Tcl procedure, create a local * variable linked to the new namespace variable "varName". */ if (varFramePtr && (Tcl_CallFrame_isProcCallFrame(varFramePtr) & FRAME_IS_PROC)) { - varPtr = (Var *)CompiledLocalsLookup((CallFrame *)varFramePtr, ObjStr(newName)); + varPtr = (Var *)CompiledLocalsLookup((CallFrame *)varFramePtr, varNameString); if (varPtr == NULL) { /* look in frame's local var hashtable */ @@ -8566,10 +8568,10 @@ } } else if (!TclIsVarUndefined(varPtr)) { - return XOTclVarErrMsg(interp, "variable '", ObjStr(newName), + return XOTclVarErrMsg(interp, "variable '", varNameString, "' exists already", (char *) NULL); } else if (TclIsVarTraced(varPtr)) { - return XOTclVarErrMsg(interp, "variable '", ObjStr(newName), + return XOTclVarErrMsg(interp, "variable '", varNameString, "' has traces: can't use for instvar", (char *) NULL); } } @@ -8585,6 +8587,10 @@ varPtr->flags, TclIsVarLink(varPtr), TclIsVarTraced(varPtr), TclIsVarUndefined(varPtr)); */ + } else { + return XOTclVarErrMsg(interp, cmdName, + " cannot import variable '", varNameString, + "' into method scope; not called from a method frame", (char *) NULL); } return TCL_OK; } @@ -11065,10 +11071,10 @@ } */ static int -XOTclImportvarCmd(Tcl_Interp *interp, XOTclObject *object, int objc, Tcl_Obj *CONST objv[]) { +XOTclImportvar(Tcl_Interp *interp, XOTclObject *object, const char *cmdName, int objc, Tcl_Obj *CONST objv[]) { int i, result = TCL_OK; - for (i=0; i