Index: generic/xotcl.c =================================================================== diff -u -rb3fff4e39a7ffb6079d07aa0aef4e0bc8dd419a0 -rb1f416527fc1e567ff1db9ad5a720b3bbc5678ee --- generic/xotcl.c (.../xotcl.c) (revision b3fff4e39a7ffb6079d07aa0aef4e0bc8dd419a0) +++ generic/xotcl.c (.../xotcl.c) (revision b1f416527fc1e567ff1db9ad5a720b3bbc5678ee) @@ -12478,7 +12478,7 @@ ClientData checkedData; XOTclParam *paramPtr; Tcl_Obj *outObjPtr; - int result, flags; + int result, flags = 0; if (objPtr->typePtr == ¶mObjType) { paramPtr = (XOTclParam *) objPtr->internalRep.twoPtrValue.ptr1; @@ -12515,6 +12515,51 @@ return result; } + +/* +xotclCmd is2 XOTclIs2Cmd { + {-argName "constraint" -required 1 -type tclobj} + {-argName "value" -required 1 -type tclobj} + {-argName "arg" -required 0 -type tclobj} +} +*/ +static int XOTclIs2Cmd(Tcl_Interp *interp, Tcl_Obj *constraintObj, Tcl_Obj *value, Tcl_Obj *arg) { + int result = TCL_OK; + char *constraintString = ObjStr(constraintObj); + XOTclObject *object; + XOTclClass *cl; + + if (value == NULL) return XOTclObjErrArgCnt(interp, NULL, NULL, " ??"); + + if (isTypeString(constraintString)) { + int success; + if (arg== NULL) return XOTclObjErrArgCnt(interp, NULL, NULL, "type "); + success = (GetObjectFromObj(interp, value, &object) == TCL_OK) + && (GetClassFromObj(interp, arg, &cl, 0) == TCL_OK) + && isSubType(object->cl, cl); + + Tcl_SetIntObj(Tcl_GetObjResult(interp), success); + + } else if (arg != NULL) { + Tcl_Obj *paramObj = Tcl_DuplicateObj(value); + + INCR_REF_COUNT(paramObj); + Tcl_AppendToObj(paramObj, ",arg=", 5); + Tcl_AppendObjToObj(paramObj, arg); + + result = XOTclValuecheckCmd(interp, 1, paramObj, value); + DECR_REF_COUNT(paramObj); + } else { + result = XOTclValuecheckCmd(interp, 1, constraintObj, value); + } + + return result; +} + + + + + /*************************** * End generated XOTcl commands ***************************/