Index: generic/predefined.h =================================================================== diff -u -rc11ab22190bdfe6231b454e9969b6ffafb547f9c -rafa1cb8064311ef406ae50c499c026c8576393f8 --- generic/predefined.h (.../predefined.h) (revision c11ab22190bdfe6231b454e9969b6ffafb547f9c) +++ generic/predefined.h (.../predefined.h) (revision afa1cb8064311ef406ae50c499c026c8576393f8) @@ -223,7 +223,9 @@ "return $parameterdefinitions}\n" "::xotcl2::Object method objectparameter {} {\n" "set parameterdefinitions [::xotcl::parametersFromSlots [self]]\n" -"lappend parameterdefinitions args\n" +"if {[::xotcl::is [self] class]} {\n" +"lappend parameterdefinitions -parameter:method,optional}\n" +"lappend parameterdefinitions -noinit:method,optional,noarg -volatile:method,optional,noarg arg:initcmd,optional\n" "return $parameterdefinitions}\n" "proc createBootstrapAttributeSlots {class definitions} {\n" "if {![::xotcl::is ${class}::slot object]} {\n" @@ -339,6 +341,7 @@ "::xotcl::InterceptorSlot create ${os}::Class::slot::instfilter \\\n" "-elementtype \"\" \\\n" "-type relation}\n" +"::xotcl::MetaSlot invalidateobjectparameter\n" "::xotcl::MetaSlot create ::xotcl::Attribute -superclass ::xotcl::Slot\n" "::xotcl::relation ::xotcl::Attribute superclass ::xotcl::Slot\n" "createBootstrapAttributeSlots ::xotcl::Attribute {\n" @@ -391,20 +394,21 @@ "\\[list [::xotcl::self] __value_changed_cmd \\[::xotcl::self\\] [list [set .valuechangedcmd]]\\]\"}\n" "if {$__initcmd ne \"\"} {\n" "set .initcmd $__initcmd}}\n" -"::xotcl2::Class create ::xotcl::Slot::Nocheck \\\n" -"-method check_single_value args {;} -method check_multiple_values args {;} \\\n" -"-method mk_type_checker args {return \"\"}\n" -"::xotcl2::Class create ::xotcl::Slot::Optimizer \\\n" -"-method proc args {::xotcl::next; .optimize} \\\n" -"-method forward args {::xotcl::next; .optimize} \\\n" -"-method init args {::xotcl::next; .optimize} \\\n" -"-method optimize {} {\n" +"::xotcl2::Class create ::xotcl::Slot::Nocheck {\n" +".method check_single_value args {;}\n" +".method check_multiple_values args {;}\n" +".method mk_type_checker args {return \"\"}}\n" +"::xotcl2::Class create ::xotcl::Slot::Optimizer {\n" +".method proc args {::xotcl::next; .optimize}\n" +".method forward args {::xotcl::next; .optimize}\n" +".method init args {::xotcl::next; .optimize}\n" +".method optimize {} {\n" "if {[set .multivalued]} return\n" "if {[set .defaultmethods] ne {get assign}} return\n" "if {[.procsearch assign] ne \"::xotcl::Slot instcmd assign\"} return\n" "if {[.procsearch get] ne \"::xotcl::Slot instcmd get\"} return\n" "set forwarder [expr {[set .per-object] ? \"parametercmd\":\"instparametercmd\"}]\n" -"${.domain} $forwarder ${.name}}\n" +"${.domain} $forwarder ${.name}}}\n" "::xotcl::Attribute instmixin add ::xotcl::Slot::Optimizer\n" "::xotcl2::Class create ::xotcl::ScopedNew -superclass ::xotcl2::Class\n" "createBootstrapAttributeSlots ::xotcl::ScopedNew {\n" Index: generic/predefined.xotcl =================================================================== diff -u -rc11ab22190bdfe6231b454e9969b6ffafb547f9c -rafa1cb8064311ef406ae50c499c026c8576393f8 --- generic/predefined.xotcl (.../predefined.xotcl) (revision c11ab22190bdfe6231b454e9969b6ffafb547f9c) +++ generic/predefined.xotcl (.../predefined.xotcl) (revision afa1cb8064311ef406ae50c499c026c8576393f8) @@ -371,8 +371,6 @@ # Slot definitions ################## # -# TODO: define base slots on xotcl2::Object + Class instead of ::xotcl::Object -# # still bootstrap code; we cannot use slots/-parameter yet ::xotcl2::Class create ::xotcl::MetaSlot ::xotcl::relation ::xotcl::MetaSlot superclass ::xotcl2::Class @@ -441,12 +439,12 @@ } ::xotcl2::Object method objectparameter {} { set parameterdefinitions [::xotcl::parametersFromSlots [self]] - #if {[::xotcl::is [self] class]} { - # lappend parameterdefinitions -parameter:method,optional - #} - #lappend parameterdefinitions arg:initcmd,optional + if {[::xotcl::is [self] class]} { + lappend parameterdefinitions -parameter:method,optional + } + lappend parameterdefinitions -noinit:method,optional,noarg -volatile:method,optional,noarg arg:initcmd,optional # for the time being, use: - lappend parameterdefinitions args + #lappend parameterdefinitions args #puts stderr "*** parameter definition for [self]: $parameterdefinitions" return $parameterdefinitions } @@ -567,7 +565,6 @@ } ::xotcl::Slot method init {args} { - #puts stderr init-got-'$args' set forwarder [expr {${.per-object} ? "forward" : "instforward"}] if {${.domain} eq ""} { set .domain [::xotcl::self callingobject] @@ -669,6 +666,9 @@ # # TODO: why does -superclass not work here? # before, the subsequent ::xotcl::relation was not needed. + +::xotcl::MetaSlot invalidateobjectparameter + ::xotcl::MetaSlot create ::xotcl::Attribute -superclass ::xotcl::Slot ::xotcl::relation ::xotcl::Attribute superclass ::xotcl::Slot @@ -761,25 +761,28 @@ } # mixin class for decativating all checks -::xotcl2::Class create ::xotcl::Slot::Nocheck \ - -method check_single_value args {;} -method check_multiple_values args {;} \ - -method mk_type_checker args {return ""} +::xotcl2::Class create ::xotcl::Slot::Nocheck { + .method check_single_value args {;} + .method check_multiple_values args {;} + .method mk_type_checker args {return ""} +} # mixin class for optimizing slots -::xotcl2::Class create ::xotcl::Slot::Optimizer \ - -method proc args {::xotcl::next; .optimize} \ - -method forward args {::xotcl::next; .optimize} \ - -method init args {::xotcl::next; .optimize} \ - -method optimize {} { - #puts stderr "slot optimizer for ${.domain} calls invalidateobjectparameter" - #${.domain} invalidateobjectparameter - if {[set .multivalued]} return - if {[set .defaultmethods] ne {get assign}} return - if {[.procsearch assign] ne "::xotcl::Slot instcmd assign"} return - if {[.procsearch get] ne "::xotcl::Slot instcmd get"} return - set forwarder [expr {[set .per-object] ? "parametercmd":"instparametercmd"}] - #puts stderr "**** optimizing ${.domain} $forwarder ${.name}" - ${.domain} $forwarder ${.name} - } +::xotcl2::Class create ::xotcl::Slot::Optimizer { + .method proc args {::xotcl::next; .optimize} + .method forward args {::xotcl::next; .optimize} + .method init args {::xotcl::next; .optimize} + .method optimize {} { + #puts stderr "slot optimizer for ${.domain} calls invalidateobjectparameter" + #${.domain} invalidateobjectparameter + if {[set .multivalued]} return + if {[set .defaultmethods] ne {get assign}} return + if {[.procsearch assign] ne "::xotcl::Slot instcmd assign"} return + if {[.procsearch get] ne "::xotcl::Slot instcmd get"} return + set forwarder [expr {[set .per-object] ? "parametercmd":"instparametercmd"}] + #puts stderr "**** optimizing ${.domain} $forwarder ${.name}" + ${.domain} $forwarder ${.name} + } +} # register the optimizer per default ::xotcl::Attribute instmixin add ::xotcl::Slot::Optimizer Index: generic/xotcl.c =================================================================== diff -u -r555e7f84db642cb7f4d77c8a5189922e1287b3d4 -rafa1cb8064311ef406ae50c499c026c8576393f8 --- generic/xotcl.c (.../xotcl.c) (revision 555e7f84db642cb7f4d77c8a5189922e1287b3d4) +++ generic/xotcl.c (.../xotcl.c) (revision afa1cb8064311ef406ae50c499c026c8576393f8) @@ -5116,6 +5116,8 @@ ParamDefsFormatOption(interp, nameStringObj, "initcmd", &colonWritten, &first); } else if ((pPtr->flags & XOTCL_ARG_METHOD)) { ParamDefsFormatOption(interp, nameStringObj, "method", &colonWritten, &first); + } else if ((pPtr->flags & XOTCL_ARG_NOARG)) { + ParamDefsFormatOption(interp, nameStringObj, "noarg", &colonWritten, &first); } innerlist = Tcl_NewListObj(0, NULL); @@ -6018,6 +6020,9 @@ paramPtr->flags |= XOTCL_ARG_INITCMD; } else if (strncmp(option, "method", length) == 0) { paramPtr->flags |= XOTCL_ARG_METHOD; + } else if (strncmp(option, "noarg", length) == 0) { + paramPtr->flags |= XOTCL_ARG_NOARG; + paramPtr->nrArgs = 0; } else if (strncmp(option, "switch", length) == 0) { paramPtr->nrArgs = 0; paramPtr->converter = convertToSwitch; @@ -11020,7 +11025,7 @@ result = Tcl_EvalObjEx(interp, newValue, TCL_EVAL_DIRECT); } else { result = callMethod((ClientData) obj, interp, - paramPtr->nameObj, 3, &newValue, 0); + paramPtr->nameObj, 2+(paramPtr->nrArgs), &newValue, 0); } fprintf(stderr, "XOTclOConfigureMethod_ attribute %s evaluated %s => (%d)\n", ObjStr(paramPtr->nameObj), ObjStr(newValue), result); @@ -11046,7 +11051,8 @@ XOTcl_PopFrame(interp, obj); remainingArgsc = pc.objc - paramDefs->nrParams; - if (remainingArgsc > 0) { + /* call residualargs only, when we have varargs and left over arguments */ + if (pc.varArgs && remainingArgsc > 0) { result = callMethod((ClientData) obj, interp, XOTclGlobalObjects[XOTE_RESIDUALARGS], remainingArgsc+2, pc.full_objv + i-1, 0); if (result != TCL_OK) { Index: generic/xotclInt.h =================================================================== diff -u -rdc104a4fef2ca770198e73bffce9ad28f32c5c31 -rafa1cb8064311ef406ae50c499c026c8576393f8 --- generic/xotclInt.h (.../xotclInt.h) (revision dc104a4fef2ca770198e73bffce9ad28f32c5c31) +++ generic/xotclInt.h (.../xotclInt.h) (revision afa1cb8064311ef406ae50c499c026c8576393f8) @@ -422,6 +422,7 @@ #define XOTCL_ARG_SUBST_DEFAULT 0x0002 #define XOTCL_ARG_INITCMD 0x0004 #define XOTCL_ARG_METHOD 0x0008 +#define XOTCL_ARG_NOARG 0x0010 #define XOTCL_ARG_RELATION 0x0100 /* disallowed options */