Menu

#4999 TclOO: variables not copied when mixins are copied

obsolete: 8.6b2
closed-fixed
5
2012-03-27
2012-02-06
No

Hi,

I use ActiveState Tcl 8.6.0.0.295132 Beta 6. The following code:

package require TclOO
oo::class create Mix1 \ {
variable Mix1_var

constructor {} \ {
set Mix1_var 10
puts "Mix1 constructor: Mix1_var = $Mix1_var."
next
}
}

oo::class create C1 \ {
mixin [oo::copy Mix1 Mix1_copy]

variable C1_var

constructor {} \ {
set C1_var 40
my variable Mix1_var ;# needed otherwise variable not found (normal behavior)
puts "C1 constructor: C1_var = $C1_var and Mix1_var = $Mix1_var."
}
}
C1 create objc1

gives the output:

Mix1 constructor: Mix1_var = 10.
can't read "Mix1_var": no such variable
% puts $errorInfo
can't read "Mix1_var": no such variable
while executing
"puts "C1 constructor: C1_var = $C1_var and Mix1_var = $Mix1_var.""
(class "::C1" constructor line 4)
invoked from within
"next"
(class "::oo::define::Mix1_copy" constructor line 4)
invoked from within
"C1 create objc1"

However, if:
mixin [oo::copy Mix1 Mix1_copy]
is replaced by:
mixin Mix1

then it works without an error. So I suspect variables in a mixin not being copied when the mixin class is copied. Please confirm if it is a bug.

Thanks,
Etienne

Discussion

  • Donal K. Fellows

    Unidiff

     
  • Donal K. Fellows

    Try the attached patch (or look on the development-rfe3485060 of the tcloo project: http://core.tcl.tk/tcloo/\) which should now copy variables and procedures. I'd appreciate review; there may be things that should be copied by default which I've forgotten. (Note that non-procedure commands and sub-namespaces will definitely _not_ be copied by default, the former because that's super-hard and the latter because there's now a mechanism for adding it when necessary. I also don't copy traces of any kind.)

    It's *possible* that the patch won't apply cleanly to the main Tcl 8.6 trunk right now (well, excluding the ChangeLog entry of course). The codebases are close, but not identical.

     
  • Donal K. Fellows

    • milestone: --> obsolete: 8.6b2
    • status: open --> closed-fixed
     
  • Donal K. Fellows

    Fixed with commit of TIP #397 implementation,