Index: doc/index.html =================================================================== diff -u -rbc2fe454630ac53d4ea617baa30e4ac93fa8fd30 -rf3d0bcae1ec627cfe5a7a6512d7e6b213359b72f --- doc/index.html (.../index.html) (revision bc2fe454630ac53d4ea617baa30e4ac93fa8fd30) +++ doc/index.html (.../index.html) (revision f3d0bcae1ec627cfe5a7a6512d7e6b213359b72f) @@ -23,7 +23,7 @@

Index: generic/predefined.h =================================================================== diff -u -r25b538dc2ef31223ad89edf12c3f6e60201049a8 -rf3d0bcae1ec627cfe5a7a6512d7e6b213359b72f --- generic/predefined.h (.../predefined.h) (revision 25b538dc2ef31223ad89edf12c3f6e60201049a8) +++ generic/predefined.h (.../predefined.h) (revision f3d0bcae1ec627cfe5a7a6512d7e6b213359b72f) @@ -7,8 +7,8 @@ "-alloc alloc -configure configure -create create\n" "-defaultmethod defaultmethod -destroy destroy -dealloc dealloc\n" "-init init -move move -objectparameter objectparameter\n" -"-recreate recreate -residualargs residualargs -unknown unknown\n" -"-__unknown __unknown}\n" +"-recreate recreate -requireobject __unknown -residualargs residualargs\n" +"-unknown unknown}\n" "foreach cmd [info command ::xotcl::cmd::Object::*] {\n" "set cmdName [namespace tail $cmd]\n" "if {$cmdName in [list \"instvar\"]} continue\n" Index: generic/predefined.xotcl =================================================================== diff -u -r25b538dc2ef31223ad89edf12c3f6e60201049a8 -rf3d0bcae1ec627cfe5a7a6512d7e6b213359b72f --- generic/predefined.xotcl (.../predefined.xotcl) (revision 25b538dc2ef31223ad89edf12c3f6e60201049a8) +++ generic/predefined.xotcl (.../predefined.xotcl) (revision f3d0bcae1ec627cfe5a7a6512d7e6b213359b72f) @@ -16,8 +16,8 @@ -alloc alloc -configure configure -create create -defaultmethod defaultmethod -destroy destroy -dealloc dealloc -init init -move move -objectparameter objectparameter - -recreate recreate -residualargs residualargs -unknown unknown - -__unknown __unknown + -recreate recreate -requireobject __unknown -residualargs residualargs + -unknown unknown } # provide the standard command set for ::xotcl2::Object Index: generic/xotcl.c =================================================================== diff -u -r64fac8df4cf61fb670c6d221ddfa990f7b4dd27c -rf3d0bcae1ec627cfe5a7a6512d7e6b213359b72f --- generic/xotcl.c (.../xotcl.c) (revision 64fac8df4cf61fb670c6d221ddfa990f7b4dd27c) +++ generic/xotcl.c (.../xotcl.c) (revision f3d0bcae1ec627cfe5a7a6512d7e6b213359b72f) @@ -683,10 +683,12 @@ return varTablePtr; } +#if 0 static int duringBootstrap(Tcl_Interp *interp) { Tcl_Obj *bootstrap = Tcl_GetVar2Ex(interp, "::xotcl::bootstrap", NULL, TCL_GLOBAL_ONLY); return (bootstrap != NULL); } +#endif /* * call an XOTcl method @@ -943,14 +945,14 @@ static int GetClassFromObj(Tcl_Interp *interp, register Tcl_Obj *objPtr, - XOTclClass **cl, XOTclClass *base) { + XOTclClass **cl, XOTclClass *baseClass) { XOTclObject *object; XOTclClass *cls = NULL; int result = TCL_OK; CONST char *objName = ObjStr(objPtr); Tcl_Command cmd; - /*fprintf(stderr, "GetClassFromObj %s base %p\n", objName, base);*/ + /*fprintf(stderr, "GetClassFromObj %s base %p\n", objName, baseClass);*/ cmd = Tcl_GetCommandFromObj(interp, objPtr); if (cmd) { @@ -974,18 +976,20 @@ } /*fprintf(stderr, "try unknown, result so far is %d\n", result);*/ - if (base) { - Tcl_Obj *nameObj = - isAbsolutePath(objName) ? objPtr : + if (baseClass) { + Tcl_Obj *methodObj, *nameObj = isAbsolutePath(objName) ? objPtr : NameInNamespaceObj(interp, objName, callingNameSpace(interp)); INCR_REF_COUNT(nameObj); - /*fprintf(stderr, "+++ calling __unknown for %s name=%s\n", objectName(base), ObjStr(nameObj));*/ - result = callMethod((ClientData) base, interp, - XOTclGlobalObjs[XOTE___UNKNOWN], - 3, &nameObj, XOTCL_CM_NO_PROTECT); - if (result == TCL_OK) { - result = GetClassFromObj(interp, objPtr, cl, 0); + + methodObj = XOTclMethodObj(interp, &baseClass->object, XO_requireobject_idx); + if (methodObj) { + /*fprintf(stderr, "+++ calling __unknown for %s name=%s\n", objectName(baseClass), ObjStr(nameObj));*/ + result = callMethod((ClientData) baseClass, interp, methodObj, + 3, &nameObj, XOTCL_CM_NO_PROTECT); + if (result == TCL_OK) { + result = GetClassFromObj(interp, objPtr, cl, 0); + } } DECR_REF_COUNT(nameObj); } @@ -1089,7 +1093,7 @@ static int -TopoSort(XOTclClass *cl, XOTclClass *base, XOTclClasses *(*next)(XOTclClass*)) { +TopoSort(XOTclClass *cl, XOTclClass *baseClass, XOTclClasses *(*next)(XOTclClass*)) { /*XOTclClasses *sl = (*next)(cl);*/ XOTclClasses *sl = next == Super ? cl->super : cl->sub; XOTclClasses *pl; @@ -1104,9 +1108,9 @@ for (; sl; sl = sl->nextPtr) { XOTclClass *sc = sl->cl; if (sc->color == GRAY) { cl->color = WHITE; return 0; } - if (sc->color == WHITE && !TopoSort(sc, base, next)) { + if (sc->color == WHITE && !TopoSort(sc, baseClass, next)) { cl->color = WHITE; - if (cl == base) { + if (cl == baseClass) { register XOTclClasses *pc; for (pc = cl->order; pc; pc = pc->nextPtr) { pc->cl->color = WHITE; } } @@ -1116,9 +1120,9 @@ cl->color = BLACK; pl = NEW(XOTclClasses); pl->cl = cl; - pl->nextPtr = base->order; - base->order = pl; - if (cl == base) { + pl->nextPtr = baseClass->order; + baseClass->order = pl; + if (cl == baseClass) { register XOTclClasses *pc; for (pc = cl->order; pc; pc = pc->nextPtr) { pc->cl->color = WHITE; } } @@ -1370,7 +1374,7 @@ ObjectSystemFree(Tcl_Interp *interp, XOTclObjectSystem *osPtr) { int i; - for (i=0; i<=XO___unknown_idx; i++) { + for (i=0; i<=XO_unknown_idx; i++) { Tcl_Obj *methodObj = osPtr->methods[i]; /*fprintf(stderr, "ObjectSystemFree [%d] %p ", i, methodObj);*/ if (methodObj) { @@ -1434,7 +1438,7 @@ int i; for (osPtr = RUNTIME_STATE(interp)->objectSystems; osPtr; osPtr = osPtr->nextPtr) { - for (i=0; i<=XO___unknown_idx; i++) { + for (i=0; i<=XO_unknown_idx; i++) { Tcl_Obj *methodObj = osPtr->methods[i]; if (methodObj && !strcmp(methodName, ObjStr(methodObj))) { int flag = 1<object.cl, 0)->object.cmdName; - ov[1] = XOTclGlobalObjs[XOTE___UNKNOWN]; - ov[2] = Tcl_NewStringObj(parentName, -1); - INCR_REF_COUNT(ov[2]); - /*fprintf(stderr, "+++ parent... calling __unknown for %s\n", ObjStr(ov[2]));*/ - result = Tcl_EvalObjv(interp, 3, ov, 0); - if (result == TCL_OK) { - XOTclObject *parentObj = (XOTclObject*) XOTclpGetObject(interp, parentName); - if (parentObj) { - requireObjNamespace(interp, parentObj); - } - rc = (Tcl_FindNamespace(interp, parentName, + XOTclClass *defaultSuperClass = DefaultSuperClass(interp, cl, cl->object.cl, 0); + Tcl_Obj *methodObj = XOTclMethodObj(interp, &defaultSuperClass->object, XO_requireobject_idx); + + if (methodObj) { + /* call requireObject and try again */ + Tcl_Obj *ov[3]; + int result; + + ov[0] = defaultSuperClass->object.cmdName; + ov[1] = methodObj; + ov[2] = Tcl_NewStringObj(parentName, -1); + INCR_REF_COUNT(ov[2]); + /*fprintf(stderr, "+++ parent... calling __unknown for %s\n", ObjStr(ov[2]));*/ + result = Tcl_EvalObjv(interp, 3, ov, 0); + if (result == TCL_OK) { + XOTclObject *parentObj = (XOTclObject*) XOTclpGetObject(interp, parentName); + if (parentObj) { + requireObjNamespace(interp, parentObj); + } + rc = (Tcl_FindNamespace(interp, parentName, (Tcl_Namespace *) NULL, TCL_GLOBAL_ONLY) != NULL); - } else { - rc = 0; + } else { + rc = 0; + } + DECR_REF_COUNT(ov[2]); } - DECR_REF_COUNT(ov[2]); } } else { XOTclObject *parentObj = (XOTclObject*) XOTclpGetObject(interp, parentName); @@ -3629,7 +3639,7 @@ * add a mixin class to 'mixinList' by appending it */ static int -MixinAdd(Tcl_Interp *interp, XOTclCmdList **mixinList, Tcl_Obj *nameObj, XOTclClass *base) { +MixinAdd(Tcl_Interp *interp, XOTclCmdList **mixinList, Tcl_Obj *nameObj, XOTclClass *baseClass) { XOTclClass *mixin; Tcl_Obj *guardObj = NULL; int ocName; Tcl_Obj **ovName; @@ -3644,7 +3654,7 @@ "' has too many elements.", (char *) NULL);*/ } - if (GetClassFromObj(interp, nameObj, &mixin, base) != TCL_OK) + if (GetClassFromObj(interp, nameObj, &mixin, baseClass) != TCL_OK) return XOTclErrBadVal(interp, "mixin", "a class as mixin", ObjStr(nameObj)); @@ -5148,7 +5158,7 @@ static int -SuperclassAdd(Tcl_Interp *interp, XOTclClass *cl, int oc, Tcl_Obj **ov, Tcl_Obj *arg, XOTclClass *base) { +SuperclassAdd(Tcl_Interp *interp, XOTclClass *cl, int oc, Tcl_Obj **ov, Tcl_Obj *arg, XOTclClass *baseClass) { XOTclClasses *filterCheck, *osl = NULL; XOTclClass **scl; int reversed = 0; @@ -5175,7 +5185,7 @@ scl = NEW_ARRAY(XOTclClass*, oc); for (i = 0; i < oc; i++) { - if (GetClassFromObj(interp, ov[i], &scl[i], base) != TCL_OK) { + if (GetClassFromObj(interp, ov[i], &scl[i], baseClass) != TCL_OK) { FREE(XOTclClass**, scl); return XOTclErrBadVal(interp, "superclass", "a list of classes", ObjStr(arg)); @@ -11234,7 +11244,7 @@ ObjStr(ov[i]), "'", (char *) NULL); } /*fprintf(stderr, "XOTclCreateObjectSystemCmd [%d] = %p %s (max %d, given %d)\n", - idx, ov[i+1], ObjStr(ov[i+1]), XO___unknown_idx, oc);*/ + idx, ov[i+1], ObjStr(ov[i+1]), XO_unknown_idx, oc);*/ osPtr->methods[idx] = ov[i+1]; INCR_REF_COUNT(osPtr->methods[idx]); } Index: generic/xotclInt.h =================================================================== diff -u -r64fac8df4cf61fb670c6d221ddfa990f7b4dd27c -rf3d0bcae1ec627cfe5a7a6512d7e6b213359b72f --- generic/xotclInt.h (.../xotclInt.h) (revision 64fac8df4cf61fb670c6d221ddfa990f7b4dd27c) +++ generic/xotclInt.h (.../xotclInt.h) (revision f3d0bcae1ec627cfe5a7a6512d7e6b213359b72f) @@ -508,23 +508,23 @@ XO_alloc_idx, XO_cleanup_idx, XO_configure_idx, XO_create_idx, XO_defaultmethod_idx, XO_destroy_idx, XO_dealloc_idx, XO_init_idx, XO_move_idx, XO_objectparameter_idx, - XO_recreate_idx, XO_residualargs_idx, - XO_unknown_idx, XO___unknown_idx + XO_recreate_idx, XO_requireobject_idx, XO_residualargs_idx, + XO_unknown_idx } SystemMethodsIdx; static CONST char *sytemMethodOpts[] = {"-alloc", "-cleanup", "-configure", "-create", "-defaultmethod", "-destroy", "-dealloc", "-init", "-move", "-objectparameter", - "-recreate", "-residualargs", - "-unknown", "-__unknown", + "-recreate", "-requireobject", + "-residualargs", "-unknown", NULL}; typedef struct XOTclObjectSystem { XOTclClass *rootClass; XOTclClass *rootMetaClass; int overloadedMethods; int definedMethods; - Tcl_Obj *methods[XO___unknown_idx+1]; + Tcl_Obj *methods[XO_unknown_idx+1]; struct XOTclObjectSystem *nextPtr; } XOTclObjectSystem; @@ -539,7 +539,6 @@ XOTE_EMPTY, XOTE_ONE, /* methods called internally */ XOTE_CONFIGURE, - XOTE___UNKNOWN, /* var names */ XOTE_AUTONAMES, XOTE_DEFAULTMETACLASS, XOTE_DEFAULTSUPERCLASS, XOTE_ALIAS_ARRAY, @@ -559,7 +558,6 @@ "", "1", /* methods called internally */ "configure", - "__unknown", /* var names */ "__autonames", "__default_metaclass", "__default_superclass", "::xotcl::alias", Index: library/lib/xotcl1.xotcl =================================================================== diff -u -r363468ca6ba6f70121e3b561303a116fa5942992 -rf3d0bcae1ec627cfe5a7a6512d7e6b213359b72f --- library/lib/xotcl1.xotcl (.../xotcl1.xotcl) (revision 363468ca6ba6f70121e3b561303a116fa5942992) +++ library/lib/xotcl1.xotcl (.../xotcl1.xotcl) (revision f3d0bcae1ec627cfe5a7a6512d7e6b213359b72f) @@ -13,8 +13,8 @@ -alloc alloc -cleanup cleanup -configure configure -create create -defaultmethod defaultmethod -destroy destroy -dealloc dealloc -init init -move move -objectparameter objectparameter - -recreate recreate -residualargs residualargs -unknown unknown - -__unknown __unknown + -recreate recreate -requireobject __unknown -residualargs residualargs + -unknown unknown } # provide the standard command set for ::xotcl::Object