Index: ChangeLog =================================================================== diff -u -raf52afc76c89bbf7ef89aca74745aea87f73b764 -rc7463312d92f53e9d3815408fe9537e9755cab8b --- ChangeLog (.../ChangeLog) (revision af52afc76c89bbf7ef89aca74745aea87f73b764) +++ ChangeLog (.../ChangeLog) (revision c7463312d92f53e9d3815408fe9537e9755cab8b) @@ -68,6 +68,8 @@ - changed " info hasNamespace" to " info hasnamespace" (all commands and info options are lowercase only, no underscore) - all " info" commands generated + - all check methods generated + - 3 class methods generated, handling args/allargs 2009-06-27 - changed method name "instdestroy" into "dealloc" Index: generic/gentclAPI.tcl =================================================================== diff -u -rd1b7134131d60a023d74c6d0b878afff993b4ddb -rc7463312d92f53e9d3815408fe9537e9755cab8b --- generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision d1b7134131d60a023d74c6d0b878afff993b4ddb) +++ generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision c7463312d92f53e9d3815408fe9537e9755cab8b) @@ -19,15 +19,17 @@ join $l ",\n " } -proc gencall {argDefinitions cDefsVar ifDefVar arglistVar preVar postVar} { - upvar $cDefsVar cDefs $ifDefVar ifDef $arglistVar arglist $preVar pre $postVar post +proc gencall {argDefinitions clientData cDefsVar ifDefVar arglistVar preVar postVar introVar} { + upvar $cDefsVar cDefs $ifDefVar ifDef $arglistVar arglist $preVar pre $postVar post \ + $introVar intro set c [list] set a [list] set i 0 set pre ""; set post "" foreach argDefinition $argDefinitions { array set "" $argDefinition set ifSet 0 + set cVar 1 if {[regexp {^-(.*)$} $(-argName) _ switchName]} { set varName with[string totitle $switchName] set calledArg $varName @@ -40,6 +42,20 @@ "class" {set type "XOTclClass *"} "object" {set type "XOTclObject *"} "tclobj" {set type "Tcl_Obj *"} + "args" { + set type "int " + set calledArg "objc-pc.args, objv+pc.args" + lappend if "int nobjc" "Tcl_Obj *CONST nobjv\[\]" + set ifSet 1 + set cVar 0 + } + "allargs" { + set type "int " + set calledArg "objc, objv" + lappend if "int objc" "Tcl_Obj *CONST objv\[\]" + set ifSet 1 + set cVar 0 + } "objpattern" { set type "Tcl_Obj *" lappend c "char *${varName}String = NULL;" "XOTclObject *${varName}Obj = NULL;" @@ -60,13 +76,25 @@ } } if {!$ifSet} {lappend if "$type$varName"} - lappend c [subst -nocommands {$type $varName = ($type)pc.clientData[$i];}] + if {$cVar} {lappend c [subst -nocommands {$type $varName = ($type)pc.clientData[$i];}]} lappend a $calledArg incr i } - set ifDef [join $if ", "] + set intro " parseContext pc;\n" + switch $clientData { + class { + array set cd {arglist "cl, " ifDefs "XOTclClass *cl, "} + append intro \ + " XOTclClass *cl = XOTclObjectToClass(clientData);" \n \ + { if (!cl) return XOTclObjErrType(interp, objv[0], "Class");} + } + "" { + array set cd {arglist "" ifDefs ""} + } + } + set ifDef $cd(ifDefs)[join $if ", "] set cDefs [join $c "\n "] - set arglist [join $a ", "] + set arglist $cd(arglist)[join $a ", "] } @@ -79,9 +107,9 @@ array set d $::definitions($key) append stubDecls "static int $d(stub)$::objCmdProc\n" lappend enums $d(idx) - lappend ifds "{\"$d(methodName)\", $d(stub), {\n [genifd $d(argDefintions)]}\n}" + lappend ifds "{\"$d(methodName)\", $d(stub), {\n [genifd $d(argDefinitions)]}\n}" - gencall $d(argDefintions) cDefs ifDef arglist pre post + gencall $d(argDefinitions) $d(clientData) cDefs ifDef arglist pre post intro append decls "static int $d(implementation)(Tcl_Interp *interp, $ifDef);\n" if {$post ne ""} { append cDefs "\n int returnCode;" @@ -94,8 +122,8 @@ append fns [subst -nocommands { static int $d(stub)(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - if (parse2(clientData, interp, objc, objv, $d(idx), &pc) != TCL_OK) { +$intro + if (parse2(interp, objc, objv, $d(idx), &pc) != TCL_OK) { return TCL_ERROR; } else { $cDefs @@ -114,8 +142,9 @@ interfaceDefinition ifd; } methodDefinition2; -static int parse2(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], +static int parse2(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int idx, parseContext *pc); + static int getMatchObject3(Tcl_Interp *interp, Tcl_Obj *patternObj, parseContext *pc, XOTclObject **matchObject, char **pattern); } @@ -132,15 +161,20 @@ set d(methodName) $methodName set d(implementation) $implementation set d(stub) ${implementation}Stub - set d(methodType) $methodType set d(idx) ${implementation}Idx + set d(methodType) $methodType + switch $methodType { + classMethod {set d(clientData) class} + objectMethod {set d(clientData) object} + default {set d(clientData) ""} + } set completed [list] foreach argDefinition $argDefinitions { array set "" {-required 0 -nrArgs 0 -type ""} array set "" $argDefinition lappend completed [array get ""] } - set d(argDefintions) $completed + set d(argDefinitions) $completed set ::definitions($d(methodType)-$d(implementation)-$d(methodName)) [array get d] } @@ -155,8 +189,27 @@ proc checkMethod {methodName implementation argDefinitions} { methodDefinition type=$methodName checkMethod $implementation $argDefinitions } +proc classMethod {methodName implementation argDefinitions} { + methodDefinition $methodName classMethod $implementation $argDefinitions +} + # +# class methods +# +classMethod alloc XOTclCAllocMethod { + {-argName "name" -required 1} +} +classMethod create XOTclCCreateMethod { + {-argName "name" -required 1} + {-argName "args" -required 1 -type allargs} +} +classMethod dealloc XOTclCDeallocMethod { + {-argName "object" -required 1 -type tclobj} +} + + +# # check methods # checkMethod required XOTclCheckRequiredArgs { @@ -403,9 +456,4 @@ } - - - - - genifds \ No newline at end of file Index: generic/tclAPI.h =================================================================== diff -u -rd1b7134131d60a023d74c6d0b878afff993b4ddb -rc7463312d92f53e9d3815408fe9537e9755cab8b --- generic/tclAPI.h (.../tclAPI.h) (revision d1b7134131d60a023d74c6d0b878afff993b4ddb) +++ generic/tclAPI.h (.../tclAPI.h) (revision c7463312d92f53e9d3815408fe9537e9755cab8b) @@ -5,13 +5,17 @@ interfaceDefinition ifd; } methodDefinition2; -static int parse2(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], +static int parse2(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int idx, parseContext *pc); + static int getMatchObject3(Tcl_Interp *interp, Tcl_Obj *patternObj, parseContext *pc, XOTclObject **matchObject, char **pattern); static int XOTclCheckBooleanArgsStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCheckRequiredArgsStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclCAllocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclCCreateMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclCDeallocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoHeritageMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstancesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclClassInfoInstargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -62,6 +66,9 @@ static int XOTclCheckBooleanArgs(Tcl_Interp *interp, char *name, Tcl_Obj *value); static int XOTclCheckRequiredArgs(Tcl_Interp *interp, char *name, Tcl_Obj *value); +static int XOTclCAllocMethod(Tcl_Interp *interp, XOTclClass *cl, char *name); +static int XOTclCCreateMethod(Tcl_Interp *interp, XOTclClass *cl, char *name, int objc, Tcl_Obj *CONST objv[]); +static int XOTclCDeallocMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *object); static int XOTclClassInfoHeritageMethod(Tcl_Interp *interp, XOTclClass *class, char *pattern); static int XOTclClassInfoInstancesMethod(Tcl_Interp *interp, XOTclClass *class, int withClosure, char *patternString, XOTclObject *patternObj); static int XOTclClassInfoInstargsMethod(Tcl_Interp *interp, XOTclClass *class, char *methodName); @@ -113,6 +120,9 @@ enum { XOTclCheckBooleanArgsIdx, XOTclCheckRequiredArgsIdx, + XOTclCAllocMethodIdx, + XOTclCCreateMethodIdx, + XOTclCDeallocMethodIdx, XOTclClassInfoHeritageMethodIdx, XOTclClassInfoInstancesMethodIdx, XOTclClassInfoInstargsMethodIdx, @@ -166,7 +176,8 @@ static int XOTclCheckBooleanArgsStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclCheckBooleanArgsIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclCheckBooleanArgsIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { char * name = (char *)pc.clientData[0]; @@ -180,7 +191,8 @@ static int XOTclCheckRequiredArgsStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclCheckRequiredArgsIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclCheckRequiredArgsIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { char * name = (char *)pc.clientData[0]; @@ -192,9 +204,55 @@ } static int +XOTclCAllocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + XOTclClass *cl = XOTclObjectToClass(clientData); + if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); + if (parse2(interp, objc, objv, XOTclCAllocMethodIdx, &pc) != TCL_OK) { + return TCL_ERROR; + } else { + char * name = (char *)pc.clientData[0]; + + return XOTclCAllocMethod(interp, cl, name); + + } +} + +static int +XOTclCCreateMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + XOTclClass *cl = XOTclObjectToClass(clientData); + if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); + if (parse2(interp, objc, objv, XOTclCCreateMethodIdx, &pc) != TCL_OK) { + return TCL_ERROR; + } else { + char * name = (char *)pc.clientData[0]; + + return XOTclCCreateMethod(interp, cl, name, objc, objv); + + } +} + +static int +XOTclCDeallocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + XOTclClass *cl = XOTclObjectToClass(clientData); + if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); + if (parse2(interp, objc, objv, XOTclCDeallocMethodIdx, &pc) != TCL_OK) { + return TCL_ERROR; + } else { + Tcl_Obj * object = (Tcl_Obj *)pc.clientData[0]; + + return XOTclCDeallocMethod(interp, cl, object); + + } +} + +static int XOTclClassInfoHeritageMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoHeritageMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoHeritageMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -208,7 +266,8 @@ static int XOTclClassInfoInstancesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstancesMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstancesMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -229,7 +288,8 @@ static int XOTclClassInfoInstargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstargsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstargsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -243,7 +303,8 @@ static int XOTclClassInfoInstbodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstbodyMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstbodyMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -257,7 +318,8 @@ static int XOTclClassInfoInstcommandsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstcommandsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstcommandsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -271,7 +333,8 @@ static int XOTclClassInfoInstdefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstdefaultMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstdefaultMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -287,7 +350,8 @@ static int XOTclClassInfoInstfilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstfilterMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstfilterMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -302,7 +366,8 @@ static int XOTclClassInfoInstfilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstfilterguardMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstfilterguardMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -316,7 +381,8 @@ static int XOTclClassInfoInstforwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstforwardMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstforwardMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -331,7 +397,8 @@ static int XOTclClassInfoInstinvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstinvarMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstinvarMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -344,7 +411,8 @@ static int XOTclClassInfoInstmixinMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstmixinMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstmixinMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -366,7 +434,8 @@ static int XOTclClassInfoInstmixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstmixinguardMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstmixinguardMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -380,7 +449,8 @@ static int XOTclClassInfoInstmixinofMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstmixinofMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstmixinofMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -401,7 +471,8 @@ static int XOTclClassInfoInstnonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstnonposargsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstnonposargsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -415,7 +486,8 @@ static int XOTclClassInfoInstparametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstparametercmdMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstparametercmdMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -429,7 +501,8 @@ static int XOTclClassInfoInstpostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstpostMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstpostMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -443,7 +516,8 @@ static int XOTclClassInfoInstpreMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstpreMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstpreMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -457,7 +531,8 @@ static int XOTclClassInfoInstprocsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstprocsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoInstprocsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -471,7 +546,8 @@ static int XOTclClassInfoMixinofMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoMixinofMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoMixinofMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -492,7 +568,8 @@ static int XOTclClassInfoParameterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoParameterMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoParameterMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -505,7 +582,8 @@ static int XOTclClassInfoSlotsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoSlotsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoSlotsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -518,7 +596,8 @@ static int XOTclClassInfoSubclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoSubclassMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoSubclassMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -539,7 +618,8 @@ static int XOTclClassInfoSuperclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoSuperclassMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclClassInfoSuperclassMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass * class = (XOTclClass *)pc.clientData[0]; @@ -554,7 +634,8 @@ static int XOTclObjInfoArgsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoArgsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoArgsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -568,7 +649,8 @@ static int XOTclObjInfoBodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoBodyMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoBodyMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -582,7 +664,8 @@ static int XOTclObjInfoCheckMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoCheckMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoCheckMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -595,7 +678,8 @@ static int XOTclObjInfoChildrenMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoChildrenMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoChildrenMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -609,7 +693,8 @@ static int XOTclObjInfoClassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoClassMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoClassMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -622,7 +707,8 @@ static int XOTclObjInfoCommandsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoCommandsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoCommandsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -636,7 +722,8 @@ static int XOTclObjInfoDefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoDefaultMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoDefaultMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -652,7 +739,8 @@ static int XOTclObjInfoFilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoFilterMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoFilterMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -668,7 +756,8 @@ static int XOTclObjInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoFilterguardMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoFilterguardMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -682,7 +771,8 @@ static int XOTclObjInfoForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoForwardMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoForwardMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -697,7 +787,8 @@ static int XOTclObjInfoHasnamespaceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoHasnamespaceMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoHasnamespaceMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -710,7 +801,8 @@ static int XOTclObjInfoInvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoInvarMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoInvarMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -723,7 +815,8 @@ static int XOTclObjInfoMethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoMethodsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoMethodsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -741,7 +834,8 @@ static int XOTclObjInfoMixinMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoMixinMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoMixinMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -763,7 +857,8 @@ static int XOTclObjInfoMixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoMixinguardMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoMixinguardMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -777,7 +872,8 @@ static int XOTclObjInfoNonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoNonposargsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoNonposargsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -791,7 +887,8 @@ static int XOTclObjInfoParametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoParametercmdMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoParametercmdMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -805,7 +902,8 @@ static int XOTclObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoParentMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoParentMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -818,7 +916,8 @@ static int XOTclObjInfoPostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoPostMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoPostMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -832,7 +931,8 @@ static int XOTclObjInfoPreMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoPreMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoPreMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -846,7 +946,8 @@ static int XOTclObjInfoPrecedenceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoPrecedenceMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoPrecedenceMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -861,7 +962,8 @@ static int XOTclObjInfoProcsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoProcsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoProcsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -875,7 +977,8 @@ static int XOTclObjInfoSlotObjectsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoSlotObjectsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoSlotObjectsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -889,7 +992,8 @@ static int XOTclObjInfoVarsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclObjInfoVarsMethodIdx, &pc) != TCL_OK) { + + if (parse2(interp, objc, objv, XOTclObjInfoVarsMethodIdx, &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject * object = (XOTclObject *)pc.clientData[0]; @@ -909,6 +1013,16 @@ {"name", 1, 0, NULL}, {"value", 0, 0, "tclobj"}} }, +{"alloc", XOTclCAllocMethodStub, { + {"name", 1, 0, NULL}} +}, +{"create", XOTclCCreateMethodStub, { + {"name", 1, 0, NULL}, + {"args", 1, 0, "allargs"}} +}, +{"dealloc", XOTclCDeallocMethodStub, { + {"object", 1, 0, "tclobj"}} +}, {"instances", XOTclClassInfoHeritageMethodStub, { {"class", 1, 0, "class"}, {"pattern", 0, 0, NULL}} Index: generic/xotcl.c =================================================================== diff -u -rd1b7134131d60a023d74c6d0b878afff993b4ddb -rc7463312d92f53e9d3815408fe9537e9755cab8b --- generic/xotcl.c (.../xotcl.c) (revision d1b7134131d60a023d74c6d0b878afff993b4ddb) +++ generic/xotcl.c (.../xotcl.c) (revision c7463312d92f53e9d3815408fe9537e9755cab8b) @@ -79,8 +79,7 @@ /* maybe move to stubs? */ int XOTclObjErrArgCntObj(Tcl_Interp *interp, Tcl_Obj *cmdName, Tcl_Obj *methodName, Tcl_Obj *msg); -static int createMethod(Tcl_Interp *interp, XOTclClass *cl, XOTclObject *obj, - int objc, Tcl_Obj *CONST objv[]); +static int createMethod(Tcl_Interp *interp, XOTclClass *cl, char *name, int objc, Tcl_Obj *CONST objv[]); static int SetXOTclObjectFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr); static void UpdateStringOfXOTclObject(Tcl_Obj *objPtr); static void FreeXOTclObjectInternalRep(Tcl_Obj *objPtr); @@ -6899,24 +6898,6 @@ return slotObjects; } -static int -ListSlotObjects(Tcl_Interp *interp, XOTclObject *obj, char *pattern) { - XOTclObjects *pl; - Tcl_Obj *list = Tcl_NewListObj(0, NULL); - - assert(obj); - - pl = computeSlotObjects(interp, obj, pattern /* not used */ ); - for (; pl; pl = pl->nextPtr) { - Tcl_ListObjAppendElement(interp, list, pl->obj->cmdName); - } - - XOTclObjectListFree(pl); - Tcl_SetObjResult(interp, list); - - return TCL_OK; -} - static XOTclClass* FindCalledClass(Tcl_Interp *interp, XOTclObject *obj) { XOTclCallStackContent *csc = CallStackGetTopFrame(interp); @@ -8939,7 +8920,7 @@ } extern int -XOTclCreate(Tcl_Interp *interp, XOTcl_Class *class, Tcl_Obj *name, ClientData data, +XOTclCreate(Tcl_Interp *interp, XOTcl_Class *class, Tcl_Obj *name, ClientData clientData, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = (XOTclClass *) class; int result; @@ -8952,7 +8933,7 @@ if (objc>0) { memcpy(ov+2, objv, sizeof(Tcl_Obj *)*objc); } - result = createMethod(interp, (XOTclClass *)cl, data, objc+2, ov); + result = createMethod(interp, cl, ObjStr(name), objc+2, ov); FREE_ON_STACK(ov); DECR_REF_COUNT(name); @@ -10875,42 +10856,8 @@ * class method implementations */ -static int -XOTclCDeallocMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - XOTclClass *cl = XOTclObjectToClass(clientData); - XOTclObject *delobj; - int rc; - if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (objc < 2) - return XOTclObjErrArgCnt(interp, cl->object.cmdName, objv[0], ""); - if (XOTclObjConvertObject(interp, objv[1], &delobj) != TCL_OK) - return XOTclVarErrMsg(interp, "Can't destroy object ", - ObjStr(objv[1]), " that does not exist.", - (char *) NULL); - - /* fprintf(stderr,"dealloc obj=%s, opt=%p\n", objectName(delobj), delobj->opt);*/ - rc = freeUnsetTraceVariable(interp, delobj); - if (rc != TCL_OK) { - return rc; - } - - /* - * latch, and call delete command if not already in progress - */ - delobj->flags |= XOTCL_DESTROY_CALLED; - RUNTIME_STATE(interp)->callIsDestroy = 1; - /*fprintf(stderr,"dealloc %s : setting callIsDestroy = 1\n", ObjStr(objv[1]));*/ - if (RUNTIME_STATE(interp)->exitHandlerDestroyRound != - XOTCL_EXITHANDLER_ON_SOFT_DESTROY) { - CallStackDestroyObject(interp, delobj); - } - - return TCL_OK; -} - - static Tcl_Namespace * callingNameSpace(Tcl_Interp *interp) { Tcl_Namespace *ns = NULL; @@ -10971,108 +10918,15 @@ static int -XOTclCAllocMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - XOTclClass *cl; - XOTclClass *newcl; - XOTclObject *newobj; - int result; - - cl = XOTclObjectToClass(clientData); - if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (objc < 2) - return XOTclObjErrArgCnt(interp, cl->object.cmdName, objv[0], " ?args?"); - -#if 0 - fprintf(stderr, "type(%s)=%p %s %d\n", - ObjStr(objv[1]), objv[1]->typePtr, objv[1]->typePtr? - objv[1]->typePtr->name:"NULL", - XOTclObjConvertObject(interp, objv[1], &newobj) - ); - /* - * if the lookup via GetObject for the object succeeds, - * the object exists already, - * and we do not overwrite it, but re-create it - */ - if (XOTclObjConvertObject(interp, objv[1], &newobj) == TCL_OK) { - fprintf(stderr, "lookup successful\n"); - result = doCleanup(interp, newobj, &cl->object, objc, objv); - } else -#endif - { - /* - * create a new object from scratch - */ - char *objName = ObjStr(objv[1]); - Tcl_Obj *tmpName = NULL; - /*fprintf(stderr, " **** 0 '%s' 1 '%s' %d\n",ObjStr(objv[0]),ObjStr(objv[1]),objc);*/ - - if (!NSCheckColons(objName, 0)) { - return XOTclVarErrMsg(interp, "Cannot allocate object -- illegal name '", - objName, "'", (char *) NULL); - } - - if (!isAbsolutePath(objName)) { - /*fprintf(stderr, "CallocMethod\n");*/ - tmpName = NameInNamespaceObj(interp, objName, callingNameSpace(interp)); - /*fprintf(stderr, " **** NoAbsoluteName for '%s' -> determined = '%s'\n", - objName, ObjStr(tmpName));*/ - objName = ObjStr(tmpName); - - INCR_REF_COUNT(tmpName); - } - - /*fprintf(stderr," **** name is '%s', isMetaClass => %d\n", - objName, IsMetaClass(interp, cl, 1));*/ - - if (IsMetaClass(interp, cl, 1)) { - /* - * if the base class is a meta-class, we create a class - */ - newcl = PrimitiveCCreate(interp, objName, cl); - if (newcl == 0) { - result = XOTclVarErrMsg(interp, "Class alloc failed for '", objName, - "' (possibly parent namespace does not exist)", - (char *) NULL); - } else { - Tcl_SetObjResult(interp, newcl->object.cmdName); - result = TCL_OK; - } - } else { - /* - * if the base class is an ordinary class, we create an object - */ - newobj = PrimitiveOCreate(interp, objName, cl); - if (newobj == 0) - result = XOTclVarErrMsg(interp, "Object alloc failed for '", objName, - "' (possibly parent namespace does not exist)", - (char *) NULL); - else { - result = TCL_OK; - Tcl_SetObjResult(interp, newobj->cmdName); - } - } - - if (tmpName) { - DECR_REF_COUNT(tmpName); - } - - } - - return result; -} - -static int -createMethod(Tcl_Interp *interp, XOTclClass *cl, XOTclObject *obj, - int objc, Tcl_Obj *CONST objv[]) { +createMethod(Tcl_Interp *interp, XOTclClass *cl, char *specifiedName, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *newobj = NULL; Tcl_Obj *nameObj, *tmpObj = NULL; int result; - char *objName, *specifiedName; + char *objName = specifiedName; ALLOC_ON_STACK(Tcl_Obj*, objc, tov); memcpy(tov, objv, sizeof(Tcl_Obj *)*(objc)); - specifiedName = objName = ObjStr(objv[1]); /* * complete the name if it is not absolute */ @@ -11111,7 +10965,7 @@ ObjStr(tov[1]), objc+1);*/ /* call recreate --> initialization */ - result = callMethod((ClientData) obj, interp, + result = callMethod((ClientData) cl, interp, XOTclGlobalObjects[XOTE_RECREATE], objc+1, tov+1, 0); if (result != TCL_OK) goto create_method_exit; @@ -11121,15 +10975,15 @@ objTrace("RECREATE", newobj); } else { + /* + * newobj might exist here, but will be automatically destroyed by + * alloc + */ - /* newobj might exist here, but will be automatically destroyed - by alloc */ - - result = XOTclVarErrMsg(interp, "Cannot create object -- illegal name '", - specifiedName, "'", (char *) NULL); /*fprintf(stderr, "alloc ... %s\n", ObjStr(tov[1]));*/ - result = callMethod((ClientData) obj, interp, - XOTclGlobalObjects[XOTE_ALLOC], objc+1, tov+1, 0); + + result = callMethod((ClientData) cl, interp, + XOTclGlobalObjects[XOTE_ALLOC], 3, tov+1, 0); if (result != TCL_OK) goto create_method_exit; @@ -11158,23 +11012,6 @@ static int -XOTclCCreateMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - XOTclClass *cl = XOTclObjectToClass(clientData); - - if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (objc < 2) - return XOTclObjErrArgCnt(interp, cl->object.cmdName, objv[0], " ?args?"); - - if (RUNTIME_STATE(interp)->exitHandlerDestroyRound != XOTCL_EXITHANDLER_OFF) { - fprintf(stderr,"### Can't create object %s during shutdown\n", ObjStr(objv[1])); - return TCL_ERROR; - return TCL_OK; /* don't fail, if this happens during destroy, it might be canceled */ - } - - return createMethod(interp, cl, &cl->object, objc, objv); -} - -static int XOTclCNewMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(clientData); XOTclObject *child = NULL; @@ -11298,14 +11135,7 @@ typedef struct { ClientData clientData[10]; Tcl_Obj *objv[10]; - int flags; - int resultIsSet; - XOTclObject *obj; - XOTclClass *cl; - int set; - char *pattern; - XOTclObject *matchObject; - Tcl_DString ds; + int args; } parseContext; typedef struct { @@ -11319,19 +11149,19 @@ typedef argDefinition interfaceDefinition[10]; static int -convertToType(Tcl_Interp *interp, Tcl_Obj *objPtr, char *type, ClientData *clientData) { +convertToType(Tcl_Interp *interp, Tcl_Obj *objPtr, char *type, ClientData *clientData, int *varArgs) { switch (*type) { + case 'a': + if (strcmp(type,"allargs") == 0 || strcmp(type,"args") == 0) { + *varArgs = 1; + break; + } case 'c': if (strcmp(type,"class") == 0) { if (GetXOTclClassFromObj(interp, objPtr, (XOTclClass **)clientData, 0) == TCL_OK) break; return XOTclObjErrType(interp, objPtr, type); } - case 't': - if (strcmp(type,"tclobj") == 0) { - *clientData = (ClientData)objPtr; - break; - } case 'o': { if (strcmp(type,"object") == 0) { @@ -11367,6 +11197,11 @@ } break; } + case 't': + if (strcmp(type,"tclobj") == 0) { + *clientData = (ClientData)objPtr; + break; + } default: return TCL_ERROR; } @@ -11376,9 +11211,8 @@ #include "tclAPI.h" static int -parse2(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], - int idx, parseContext *pc) { - int i, o, args, flagCount = 0, nrReq = 0, nrOpt = 0; +parse2(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int idx, parseContext *pc) { + int i, o, flagCount = 0, nrReq = 0, nrOpt = 0, varArgs = 0; argDefinition *aPtr, *bPtr; interfaceDefinition *ifdPtr = &methodDefinitons[idx].ifd; @@ -11423,10 +11257,10 @@ else nrOpt++; - /*fprintf(stderr,"... arg %s req %d type %s try to set on %d\n", - aPtr->name,aPtr->required,aPtr->type,i);*/ + /*fprintf(stderr,"... arg %s req %d type %s try to set on %d: '%s'\n", + aPtr->name,aPtr->required,aPtr->type,i, ObjStr(objv[o]));*/ if (aPtr->type) { - if (convertToType(interp, objv[o], aPtr->type, &pc->clientData[i]) != TCL_OK) { + if (convertToType(interp, objv[o], aPtr->type, &pc->clientData[i], &varArgs) != TCL_OK) { return TCL_ERROR; } } else { @@ -11439,9 +11273,11 @@ o++; i++; aPtr++; } } - args = objc - flagCount -1; - /*fprintf(stderr, "objc = %d, args = %d, nrReq %d, nrReq + nrOpt = %d\n", objc,args,nrReq,nrReq + nrOpt);*/ - if (args < nrReq || args > nrReq + nrOpt) { + pc->args = objc - flagCount - 1; + /* fprintf(stderr, "objc = %d, args = %d, nrReq %d, nrReq + nrOpt = %d, varArgs %d\n", + objc,pc->args,nrReq,nrReq + nrOpt, varArgs);*/ + + if (pc->args < nrReq || (!varArgs && pc->args > nrReq + nrOpt)) { Tcl_Obj *msg = Tcl_NewStringObj("", 0); for (aPtr=ifdPtr[0]; aPtr->name; aPtr++) { if (aPtr != ifdPtr[0]) { @@ -11458,8 +11294,8 @@ return XOTclObjErrArgCntObj(interp, objv[0], NULL, msg); } - /*fprintf(stderr,"after parse: o %d, i %d, objc %d, req %d opt %d ok? %d\n", - o,i,objc, nrReq, nrOpt, objc >= 1+nrReq && objc <= 1+nrReq+nrOpt);*/ + /* fprintf(stderr,"after parse: o %d, i %d, objc %d, req %d opt %d ok? %d\n", + o,i,objc, nrReq, nrOpt, objc >= 1+nrReq && objc <= 1+nrReq+nrOpt); */ return TCL_OK; } @@ -11481,68 +11317,114 @@ return 0; } -#if 0 -static int -XOTclClassInfoHeritageMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { - parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoHeritageMethodIdx, &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclClass *cl = (XOTclClass *)pc.clientData[0]; - char *pattern = (char *)pc.clientData[1]; +/*************************** + * Begin Class Methods + ***************************/ - return ListHeritage(interp, cl, pattern); +static int XOTclCAllocMethod(Tcl_Interp *interp, XOTclClass *cl, char *name) { + Tcl_Obj *tmpName = NULL; + int result; + + /* + * create a new object from scratch + */ + + /*fprintf(stderr, " **** 0 class '%s' wants to alloc '%s'\n",className(cl),name);*/ + if (!NSCheckColons(name, 0)) { + return XOTclVarErrMsg(interp, "Cannot allocate object -- illegal name '", + name, "'", (char *) NULL); } -} -static int -XOTclClassInfoInstancesMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstancesMethodIdx, &pc) != TCL_OK) { - return TCL_ERROR; + /* + * If the path is not absolute, we add the appropriate namespace + */ + if (!isAbsolutePath(name)) { + tmpName = NameInNamespaceObj(interp, name, callingNameSpace(interp)); + /*fprintf(stderr, " **** NoAbsoluteName for '%s' -> determined = '%s'\n", + name, ObjStr(tmpName));*/ + name = ObjStr(tmpName); + INCR_REF_COUNT(tmpName); + } + + if (IsMetaClass(interp, cl, 1)) { + /* + * if the base class is a meta-class, we create a class + */ + XOTclClass *newcl = PrimitiveCCreate(interp, name, cl); + if (newcl == 0) { + result = XOTclVarErrMsg(interp, "Class alloc failed for '", name, + "' (possibly parent namespace does not exist)", + (char *) NULL); + } else { + Tcl_SetObjResult(interp, newcl->object.cmdName); + result = TCL_OK; + } } else { - XOTclClass *cl = (XOTclClass *)pc.clientData[0]; - int withClosure = (int) pc.clientData[1]; - Tcl_Obj *patternObj = (Tcl_Obj *) pc.clientData[2]; - XOTclObject *matchObject = NULL; - char *pattern = NULL; - int rc; - - if (getMatchObject3(interp, patternObj, &pc, &matchObject, &pattern) == -1) { - return TCL_OK; + /* + * if the base class is an ordinary class, we create an object + */ + XOTclObject *newobj = PrimitiveOCreate(interp, name, cl); + if (newobj == 0) + result = XOTclVarErrMsg(interp, "Object alloc failed for '", name, + "' (possibly parent namespace does not exist)", + (char *) NULL); + else { + result = TCL_OK; + Tcl_SetObjResult(interp, newobj->cmdName); } - rc = listInstances(interp, cl, pattern, withClosure, matchObject); - - if (matchObject) { - Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); - } - DSTRING_FREE(&pc.ds); } - return TCL_OK; + + if (tmpName) { + DECR_REF_COUNT(tmpName); + } + + return result; } -static int -XOTclClassInfoInstargsMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - parseContext pc; - if (parse2(clientData, interp, objc, objv, XOTclClassInfoInstargsMethodIdx, &pc) != TCL_OK) { - return TCL_ERROR; - } else { - XOTclClass *cl = (XOTclClass *)pc.clientData[0]; - char *methodName = (char *)pc.clientData[1]; - Tcl_Namespace *nsp = cl->nsPtr; +static int XOTclCCreateMethod(Tcl_Interp *interp, XOTclClass *cl, char *name, + int objc, Tcl_Obj *CONST objv[]) { + if (RUNTIME_STATE(interp)->exitHandlerDestroyRound != XOTCL_EXITHANDLER_OFF) { + fprintf(stderr,"### Can't create object %s during shutdown\n", ObjStr(objv[1])); + return TCL_OK; /* don't fail, if this happens during destroy, it might be canceled */ + } + + return createMethod(interp, cl, name, objc, objv); +} - if (cl->nonposArgsTable) { - XOTclNonposArgs *nonposArgs = NonposArgsGet(cl->nonposArgsTable, methodName); - if (nonposArgs && nonposArgs->ordinaryArgs) { - return ListArgsFromOrdinaryArgs(interp, nonposArgs); - } - } - return ListProcArgs(interp, Tcl_Namespace_cmdTable(nsp), methodName); +static int XOTclCDeallocMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *object) { + XOTclObject *delobj; + int rc; + + if (XOTclObjConvertObject(interp, object, &delobj) != TCL_OK) + return XOTclVarErrMsg(interp, "Can't destroy object ", + ObjStr(object), " that does not exist.", + (char *) NULL); + + /* fprintf(stderr,"dealloc obj=%s, opt=%p\n", objectName(delobj), delobj->opt);*/ + rc = freeUnsetTraceVariable(interp, delobj); + if (rc != TCL_OK) { + return rc; } + + /* + * latch, and call delete command if not already in progress + */ + delobj->flags |= XOTCL_DESTROY_CALLED; + RUNTIME_STATE(interp)->callIsDestroy = 1; + /*fprintf(stderr,"dealloc %s : setting callIsDestroy = 1\n", ObjStr(object);*/ + if (RUNTIME_STATE(interp)->exitHandlerDestroyRound != + XOTCL_EXITHANDLER_ON_SOFT_DESTROY) { + CallStackDestroyObject(interp, delobj); + } + + return TCL_OK; } -#endif +/*************************** + * End Class Methods + ***************************/ + /*************************** * Begin check Methods ***************************/ @@ -12082,8 +11964,6 @@ - - static int XOTclCInstParameterCmdMethod(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { @@ -13886,9 +13766,9 @@ }; methodDefinition definitions2[] = { - {"alloc", XOTclCAllocMethod}, - {"create", XOTclCCreateMethod}, - {"dealloc", XOTclCDeallocMethod}, + {"alloc", XOTclCAllocMethodStub}, + {"create", XOTclCCreateMethodStub}, + {"dealloc", XOTclCDeallocMethodStub}, {"new", XOTclCNewMethod}, {"instfilterguard", XOTclCInstFilterGuardMethod}, {"instinvar", XOTclCInvariantsMethod},