Index: generic/xotcl.c =================================================================== diff -u -rcfee325944ac90fe94485cba109a7e99465073b5 -r4e4a884ea235a004a6126e59aaf2593d899ba3f3 --- generic/xotcl.c (.../xotcl.c) (revision cfee325944ac90fe94485cba109a7e99465073b5) +++ generic/xotcl.c (.../xotcl.c) (revision 4e4a884ea235a004a6126e59aaf2593d899ba3f3) @@ -6306,6 +6306,7 @@ fprintf(stderr, "convertViaCmd converts %s to '%s'\n", ObjStr(objPtr), ObjStr(Tcl_GetObjResult(interp))); *clientData = (ClientData)Tcl_GetObjResult(interp); } + fprintf(stderr, "convertViaCmd returns %d\n",result); return result; } @@ -6566,7 +6567,7 @@ ObjStr(paramPtr->converterName), objectName(paramObj)); paramPtr->flags |= XOTCL_ARG_CURRENTLY_UNKNOWN; /* TODO: for the time being, we do not return an error here */ - } + } } /* @@ -12230,7 +12231,12 @@ result = ParamParse(interp, "valuecheck", fullParamObj, XOTCL_DISALLOWED_ARG_VALUEECHECK /* disallowed options */, paramPtr, &possibleUnknowns, &plainParams); - if (result == TCL_OK) { + /* Here, we want to treat currently unknown user level converters as + error. + */ + if (paramPtr->flags & XOTCL_ARG_CURRENTLY_UNKNOWN) { + result = TCL_ERROR; + } else if (result == TCL_OK) { TclFreeIntRep(objPtr); objPtr->internalRep.twoPtrValue.ptr1 = (void *)paramPtr; objPtr->internalRep.twoPtrValue.ptr2 = NULL; @@ -12265,6 +12271,7 @@ } result = ArgumentCheck(interp, value, paramPtr, &checkedData); + Tcl_SetIntObj(Tcl_GetObjResult(interp), (result == TCL_OK)); return TCL_OK; } Index: tests/parameters.xotcl =================================================================== diff -u -rcfee325944ac90fe94485cba109a7e99465073b5 -r4e4a884ea235a004a6126e59aaf2593d899ba3f3 --- tests/parameters.xotcl (.../parameters.xotcl) (revision cfee325944ac90fe94485cba109a7e99465073b5) +++ tests/parameters.xotcl (.../parameters.xotcl) (revision 4e4a884ea235a004a6126e59aaf2593d899ba3f3) @@ -437,6 +437,7 @@ if {$value ni [split $arg |]} { error "Value '$value' of parameter $name not in permissible values $arg" } + return $value } D method foo {a:in,arg=a|b|c} { @@ -463,6 +464,7 @@ if {$value < $min || $value > $max} { error "Value '$value' of parameter $name not between $min and $max" } + return $value } D method foo {a:range,arg=1-3 {-b:range,arg=2-6 3} c:range,arg=5-10} { @@ -485,6 +487,7 @@ # ::xotcl::methodParameterSlot method type=list {name value arg} { #puts $value/$arg + return $value } # handling spaces in "arg" is not not particular nice