Index: library/serialize/serializer.tcl =================================================================== diff -u -r2321487af7f5d63ba7abb11d14e657a24b2e7788 -r542f9eada7981ba0f968374ff45ea9d2d44dd9a0 --- library/serialize/serializer.tcl (.../serializer.tcl) (revision 2321487af7f5d63ba7abb11d14e657a24b2e7788) +++ library/serialize/serializer.tcl (.../serializer.tcl) (revision 542f9eada7981ba0f968374ff45ea9d2d44dd9a0) @@ -1052,7 +1052,6 @@ set :rootClass ::xotcl::Object set :rootMetaClass ::xotcl::Class - #array set :ignorePattern [list "::xotcl::*" 1] array set :ignorePattern [list "::nsf::*" 1 "::nx::*" 1 "::xotcl::*" 1] :public object method serialize-all-start {s} { @@ -1210,6 +1209,21 @@ [:frameWorkCmd ::nsf::relation::get $o class-mixin] \ [:frameWorkCmd ::nsf::method::assertion $o class-invar] + # + # Check for overloaded accessors generated by the slots and make sure, these are + # available in the serialized code. + # + set slotObjects [nsf::directdispatch $o ::nsf::methods::class::info::slotobjects -type ::nx::Slot] + foreach so $slotObjects { + set methodName [namespace tail $so] + if {[$o info instprocs $methodName] ne ""} { + # + # The method was overloaded. + # + $s addPostCmd [:method-serialize $o $methodName inst $s] + } + } + $s addPostCmd [:frameWorkCmd ::nsf::relation::get $o class-filter] return $cmd } Index: library/xotcl/tests/slottest.xotcl =================================================================== diff -u -rc4f449cb353be812ba6502ef8e9587e87881f59b -r542f9eada7981ba0f968374ff45ea9d2d44dd9a0 --- library/xotcl/tests/slottest.xotcl (.../slottest.xotcl) (revision c4f449cb353be812ba6502ef8e9587e87881f59b) +++ library/xotcl/tests/slottest.xotcl (.../slottest.xotcl) (revision 542f9eada7981ba0f968374ff45ea9d2d44dd9a0) @@ -731,6 +731,52 @@ ? {c default_form_loader ""} {expected integer but got "" as return value} } + +nx::test case nx-serialize-param-overload { + + # + # Create slot via "parameter" + # + ::xotcl::Class create C -parameter p + # + # Create a method overloading slot accessor for "p". + # + C instproc p args {return 1} + C create c1 + + ? {c1 p} 1 + + set ::stringC [C serialize] + ? {expr {[string length $::stringC] > 100}} 1 + + c1 destroy + C destroy + ? {catch {eval $::stringC}} 0 + + C create c1 + ? {c1 p} 1 + + # + # Create slot directly via ::xotcl::Attribute and not via + # "parameter" and overload its accessor with an instproc. + # + ::xotcl::Class create Person -slots { + ::xotcl::Attribute salary -default 0 + } + Person instproc salary args {return 100} + Person create p1 + + ? {p1 salary} 100 + + set ::stringP [Person serialize] + p1 destroy + Person destroy + + ? {catch {eval $::stringP}} 0 + Person create p1 + + ? {p1 salary} 100 +} # # Local variables: # mode: tcl