Index: generic/gentclAPI.decls =================================================================== diff -u -ree516ca61badbed0c2949e21c51755a7020648a7 -r07939dc97b98b4a40c047be6923c36380c7c6b5d --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision ee516ca61badbed0c2949e21c51755a7020648a7) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision 07939dc97b98b4a40c047be6923c36380c7c6b5d) @@ -34,6 +34,9 @@ } xotclCmd finalize XOTclFinalizeObjCmd { } +xotclCmd instvar XOTclInstvarCmd { + {-argName "args" -type allargs} +} xotclCmd methodproperty XOTclMethodPropertyCmd { {-argName "object" -required 1 -type object} {-argName "methodName" -required 1} Index: generic/gentclAPI.tcl =================================================================== diff -u -r39433ecd7b8822d98a577a6904bde94d0dd1d900 -r07939dc97b98b4a40c047be6923c36380c7c6b5d --- generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 39433ecd7b8822d98a577a6904bde94d0dd1d900) +++ generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 07939dc97b98b4a40c047be6923c36380c7c6b5d) @@ -188,6 +188,7 @@ } } }]} + proc genSimpleStub {stub intro idx cDefs pre call post} { return [subst -nocommands { static int @@ -229,7 +230,12 @@ } else { set call "return [implArgList $d(implementation) {} $arglist];" } - if {$nrArgs == 1 && $arglist eq "obj, objc, objv"} { + #if {$nrArgs == 1} { puts stderr "$d(stub) => '$arglist'" } + if {$nrArgs == 1 && $arglist eq "objc, objv"} { + # TODO we would not need to generate a stub at all.... + append fns [genSimpleStub $d(stub) $intro $d(idx) $cDefs $pre $call $post] + } elseif {$nrArgs == 1 && $arglist eq "obj, objc, objv"} { + # no need to call objv parser #puts stderr "$d(stub) => '$arglist'" append fns [genSimpleStub $d(stub) $intro $d(idx) $cDefs $pre $call $post] } else { Index: generic/tclAPI.h =================================================================== diff -u -r39433ecd7b8822d98a577a6904bde94d0dd1d900 -r07939dc97b98b4a40c047be6923c36380c7c6b5d --- generic/tclAPI.h (.../tclAPI.h) (revision 39433ecd7b8822d98a577a6904bde94d0dd1d900) +++ generic/tclAPI.h (.../tclAPI.h) (revision 07939dc97b98b4a40c047be6923c36380c7c6b5d) @@ -137,6 +137,7 @@ static int XOTclConfigureCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCreateObjectSystemCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclFinalizeObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclInstvarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclMethodPropertyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclMyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclRelationCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -237,6 +238,7 @@ static int XOTclConfigureCmd(Tcl_Interp *interp, int configureoption, Tcl_Obj *value); static int XOTclCreateObjectSystemCmd(Tcl_Interp *interp, char *rootClass, char *rootMetaClass); static int XOTclFinalizeObjCmd(Tcl_Interp *interp); +static int XOTclInstvarCmd(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); static int XOTclMethodPropertyCmd(Tcl_Interp *interp, XOTclObject *object, char *methodName, int withPer_object, int methodproperty, Tcl_Obj *value); static int XOTclMyCmd(Tcl_Interp *interp, int withLocal, Tcl_Obj *method, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclRelationCmd(Tcl_Interp *interp, XOTclObject *object, int relationtype, Tcl_Obj *value); @@ -338,6 +340,7 @@ XOTclConfigureCmdIdx, XOTclCreateObjectSystemCmdIdx, XOTclFinalizeObjCmdIdx, + XOTclInstvarCmdIdx, XOTclMethodPropertyCmdIdx, XOTclMyCmdIdx, XOTclRelationCmdIdx, @@ -2232,6 +2235,15 @@ } static int +XOTclInstvarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + + + + return XOTclInstvarCmd(interp, objc, objv); + +} + +static int XOTclMethodPropertyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -2708,6 +2720,9 @@ {"::xotcl::finalize", XOTclFinalizeObjCmdStub, 0, { } }, +{"::xotcl::instvar", XOTclInstvarCmdStub, 1, { + {"args", 0, 0, convertToNothing}} +}, {"::xotcl::methodproperty", XOTclMethodPropertyCmdStub, 5, { {"object", 1, 0, convertToObject}, {"methodName", 1, 0, convertToString}, Index: generic/xotcl.c =================================================================== diff -u -ree516ca61badbed0c2949e21c51755a7020648a7 -r07939dc97b98b4a40c047be6923c36380c7c6b5d --- generic/xotcl.c (.../xotcl.c) (revision ee516ca61badbed0c2949e21c51755a7020648a7) +++ generic/xotcl.c (.../xotcl.c) (revision 07939dc97b98b4a40c047be6923c36380c7c6b5d) @@ -1082,6 +1082,30 @@ * references upon object kills and then will get dangling * internalRep references to killed XOTclObjects */ + /*fprintf(stderr, "cmdtype of %s is xotclObjectType %d cmdType %d\n", + ObjStr(objPtr), cmdType == &XOTclObjectType,cmdType == GetCmdNameType(cmdType));*/ + +#ifdef KEEP_TCL_CMD_TYPE + if (cmdType == GetCmdNameType(cmdType)) { + Tcl_Command cmd = Tcl_GetCommandFromObj(interp, objPtr); + /*fprintf(stderr,"obj %s is of type tclCmd, cmd=%p\n", ObjStr(objPtr), cmd);*/ + if (cmd) { + XOTclObject *o = XOTclGetObjectFromCmdPtr(cmd); + + /*fprintf(stderr,"Got Object from '%s' %p\n", objPtr->bytes, o); + fprintf(stderr,"cmd->objProc %p == %p, proc=%p\n", + Tcl_Command_objProc(cmd), XOTclObjDispatch, + Tcl_Command_proc(cmd) );*/ + + if (o) { + if (obj) *obj = o; + result = TCL_OK; + } else { + goto convert_to_xotcl_object; + } + } else goto convert_to_xotcl_object; + } else +#endif if (cmdType == &XOTclObjectType) { /* fprintf(stderr,"obj is of type XOTclObjectType\n");*/ if (obj) { @@ -1113,26 +1137,6 @@ } else { result = TCL_OK; } -#ifdef KEEP_TCL_CMD_TYPE - } else if (cmdType == GetCmdNameType(cmdType)) { - Tcl_Command cmd = Tcl_GetCommandFromObj(interp, objPtr); - /*fprintf(stderr,"obj %s is of type tclCmd, cmd=%p\n", ObjStr(objPtr), cmd);*/ - if (cmd) { - XOTclObject *o = XOTclGetObjectFromCmdPtr(cmd); - - /*fprintf(stderr,"Got Object from '%s' %p\n", objPtr->bytes, o); - fprintf(stderr,"cmd->objProc %p == %p, proc=%p\n", - Tcl_Command_objProc(cmd), XOTclObjDispatch, - Tcl_Command_proc(cmd) );*/ - - if (o) { - if (obj) *obj = o; - result = TCL_OK; - } else { - goto convert_to_xotcl_object; - } - } else goto convert_to_xotcl_object; -#endif } else { #ifdef KEEP_TCL_CMD_TYPE convert_to_xotcl_object: @@ -1899,6 +1903,10 @@ Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; Tcl_Command cmd; + +#ifdef OBJDELETION_TRACE + fprintf(stderr, "NSCleanupNamespace %p\n", ns); +#endif /* * Delete all variables and initialize var table again * (DeleteVars frees the vartable) @@ -7107,8 +7115,8 @@ static int GetInstvarsIntoCurrentScope(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]); -int -XOTclInstvarCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { +static int +XOTclInstvarCmd(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = GetSelfObj(interp); if (!obj) return XOTclVarErrMsg(interp, "instvar: no current object", (char *) NULL); @@ -7477,11 +7485,11 @@ (ClientData)obj, PrimitiveODestroy); PrimitiveOInit(obj, interp, name, cl); -#if 0 +#if defined(KEEP_TCL_CMD_TYPE) /*defined(KEEP_TCL_CMD_TYPE)*/ - /*TclNewObj(obj->cmdName);*/ obj->cmdName = Tcl_NewStringObj(name, length); - TclSetCmdNameObj(interp, obj->cmdName, (Command*)obj->id); + Tcl_GetCommandFromObj(interp,obj->cmdName); + /*TclSetCmdNameObj(interp, obj->cmdName, (Command*)obj->id);*/ /*fprintf(stderr, "new command has name '%s'\n", objectName(obj));*/ #else obj->cmdName = NewXOTclObjectObjName(obj, name, length); @@ -12960,7 +12968,6 @@ #endif Tcl_CreateObjCommand(interp, "::xotcl::self", XOTclGetSelfObjCmd, 0, 0); /*Tcl_CreateObjCommand(interp, "::xotcl::K", XOTclKObjCmd, 0, 0);*/ - Tcl_CreateObjCommand(interp, "::xotcl::instvar", XOTclInstvarCmd, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::dispatch", XOTclDispatchCmd, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::deprecated", XOTcl_DeprecatedCmd, 0, 0); Index: generic/xotclShadow.c =================================================================== diff -u -r2111020b49da8ce57758e51accf0b6073037f0d2 -r07939dc97b98b4a40c047be6923c36380c7c6b5d --- generic/xotclShadow.c (.../xotclShadow.c) (revision 2111020b49da8ce57758e51accf0b6073037f0d2) +++ generic/xotclShadow.c (.../xotclShadow.c) (revision 07939dc97b98b4a40c047be6923c36380c7c6b5d) @@ -45,7 +45,7 @@ XOTclGlobalStrings[name], Tcl_Command_objProc(cmd), proc); */ ti->proc = Tcl_Command_objProc(cmd); - ti->clientData = Tcl_Command_objClientData(cmd); + ti->clientData = Tcl_Command_objClientData(cmd); Tcl_Command_objProc(cmd) = proc; } }