Index: TODO =================================================================== diff -u -r137f717b92ca826ee943e8c4e74d3151859c378a -r0d35d1ccd86f2b72296ff01d0d83747ca1c0de65 --- TODO (.../TODO) (revision 137f717b92ca826ee943e8c4e74d3151859c378a) +++ TODO (.../TODO) (revision 0d35d1ccd86f2b72296ff01d0d83747ca1c0de65) @@ -1675,7 +1675,14 @@ used for setter and attributes - call scripted converters without checking protection +- removed defaultMethodCallProtection from tests/parameters.tcl +- Implemented built-in-converter for "baseclass" and "metaclass". + Change in performance for this call. >8 times faster + before: parameters/parametercheck.007: 19.49 mms, ::nsf::is baseclass C + after: parameters/parametercheck.007: 2.32 mms, ::nsf::is baseclass C +- remove scripted definition of "baseclass" and "metaclass" + TODO: - cleanup of xotcl-aol @@ -1824,8 +1831,6 @@ 2) kein "modules" beim ns sudo cp /usr/local/aolserver/modules/tcl/xotcl.tcl /usr/local/ns/tcl/ -- implement built-in-converter for "baseclass" and "metaclass"? - - the two flags "-objscope" and "-nonleaf" are for adding frames, and they are mutual exclusive. Make them a single flag? check if both options are in every case sensible. Index: generic/nsf.c =================================================================== diff -u -r137f717b92ca826ee943e8c4e74d3151859c378a -r0d35d1ccd86f2b72296ff01d0d83747ca1c0de65 --- generic/nsf.c (.../nsf.c) (revision 137f717b92ca826ee943e8c4e74d3151859c378a) +++ generic/nsf.c (.../nsf.c) (revision 0d35d1ccd86f2b72296ff01d0d83747ca1c0de65) @@ -150,7 +150,7 @@ NsfObject *object; } ParseContext; -static NsfTypeConverter ConvertToNothing, ConvertViaCmd; +static NsfTypeConverter ConvertToNothing, ConvertViaCmd, ConvertToClass; /* @@ -230,6 +230,7 @@ static void GuardDel(NsfCmdList *filterCL); /* properties of objects and classes */ +static int IsBaseClass(NsfClass *cl); static int IsMetaClass(Tcl_Interp *interp, NsfClass *cl, int withMixins); static int IsSubType(NsfClass *subcl, NsfClass *cl); static NsfClass *DefaultSuperClass(Tcl_Interp *interp, NsfClass *cl, NsfClass *mcl, int isMeta); @@ -6018,6 +6019,13 @@ if (paramPtr->type) { if (paramPtr->converter == ConvertViaCmd) { result = paramPtr->type + 5; + } else if (paramPtr->converter == ConvertToClass && + (paramPtr->flags & (NSF_ARG_BASECLASS|NSF_ARG_METACLASS)) ) { + if (paramPtr->flags & NSF_ARG_BASECLASS) { + result = "baseclass"; + } else { + result = "metaclass"; + } } else if (strcmp(paramPtr->type, "stringtype") == 0) { if (paramPtr->converterArg) { result = ObjStr(paramPtr->converterArg); @@ -7337,6 +7345,15 @@ NsfClass *cl; Tcl_DString ds, *dsPtr = &ds; + if ((pPtr->flags & NSF_ARG_BASECLASS) && !IsBaseClass((NsfClass *)object)) { + what = "baseclass"; + goto type_error; + } + if ((pPtr->flags & NSF_ARG_METACLASS) && !IsMetaClass(interp, (NsfClass *)object, 1)) { + what = "metaclass"; + goto type_error; + } + if (pPtr->converterArg == NULL) return TCL_OK; @@ -7345,10 +7362,13 @@ return TCL_OK; } + type_error: DSTRING_INIT(dsPtr); Tcl_DStringAppend(dsPtr, what, -1); - Tcl_DStringAppend(dsPtr, " of type ", -1); - Tcl_DStringAppend(dsPtr, ObjStr(pPtr->converterArg), -1); + if (pPtr->converterArg) { + Tcl_DStringAppend(dsPtr, " of type ", -1); + Tcl_DStringAppend(dsPtr, ObjStr(pPtr->converterArg), -1); + } NsfObjErrType(interp, objPtr, Tcl_DStringValue(dsPtr), pPtr->name); DSTRING_FREE(dsPtr); @@ -7570,6 +7590,12 @@ result = ParamOptionSetConverter(interp, paramPtr, "object", ConvertToObject); } else if (strncmp(option, "class", 5) == 0) { result = ParamOptionSetConverter(interp, paramPtr, "class", ConvertToClass); + } else if (strncmp(option, "metaclass", 9) == 0) { + result = ParamOptionSetConverter(interp, paramPtr, "class", ConvertToClass); + paramPtr->flags |= NSF_ARG_METACLASS; + } else if (strncmp(option, "baseclass", 9) == 0) { + result = ParamOptionSetConverter(interp, paramPtr, "class", ConvertToClass); + paramPtr->flags |= NSF_ARG_BASECLASS; } else if (strncmp(option, "relation", 8) == 0) { result = ParamOptionSetConverter(interp, paramPtr, "relation", ConvertToRelation); paramPtr->flags |= NSF_ARG_RELATION; Index: generic/nsfInt.h =================================================================== diff -u -r404ad6bfcb313983a0cc54d3323751008bca991b -r0d35d1ccd86f2b72296ff01d0d83747ca1c0de65 --- generic/nsfInt.h (.../nsfInt.h) (revision 404ad6bfcb313983a0cc54d3323751008bca991b) +++ generic/nsfInt.h (.../nsfInt.h) (revision 0d35d1ccd86f2b72296ff01d0d83747ca1c0de65) @@ -365,6 +365,8 @@ #define NSF_ARG_METHOD 0x0080 #define NSF_ARG_RELATION 0x0100 #define NSF_ARG_SWITCH 0x0200 +#define NSF_ARG_BASECLASS 0x0400 +#define NSF_ARG_METACLASS 0x0800 #define NSF_ARG_HAS_DEFAULT 0x1000 #define NSF_ARG_IS_CONVERTER 0x2000 Index: library/nx/nx.tcl =================================================================== diff -u -r18d4d9c1a99310c3fb9b2f2bed03e9d59fb30d30 -r0d35d1ccd86f2b72296ff01d0d83747ca1c0de65 --- library/nx/nx.tcl (.../nx.tcl) (revision 18d4d9c1a99310c3fb9b2f2bed03e9d59fb30d30) +++ library/nx/nx.tcl (.../nx.tcl) (revision 0d35d1ccd86f2b72296ff01d0d83747ca1c0de65) @@ -1235,25 +1235,6 @@ proc createBootstrapAttributeSlots {} {} ################################################################## - # create user-level converter/checker based on ::nsf primitves - ################################################################## - - Slot method type=baseclass {name value} { - # note, that we cannot use "nsf::is baseclass ..." here, since nsf::is call this converter - if {![::nsf::isobject $value] || ![::nsf::dispatch $value ::nsf::methods::object::info::is baseclass]} { - error "expected baseclass but got \"$value\" for parameter $name" - } - return $value - } - - Slot method type=metaclass {name value} { - if {![::nsf::isobject $value] || ![::nsf::dispatch $value ::nsf::methods::object::info::is metaclass]} { - error "expected metaclass but got \"$value\" for parameter $name" - } - return $value - } - - ################################################################## # Create a mixin class to overload method "new" such it does not # allocate new objects in ::nx::*, but in the specified object # (without syntactic overhead).