Tcl Source Code

View Ticket
Login
Ticket UUID: 3485060
Title: TclOO: variables not copied when mixins are copied
Type: Bug Version: obsolete: 8.6b2
Submitter: basilik99 Created on: 2012-02-06 19:28:27
Subsystem: 35. TclOO Package Assigned To: dkf
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2012-03-27 15:28:15
Resolution: Fixed Closed By: dkf
    Closed on: 2012-03-27 08:28:15
Description:
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
User Comments: dkf added on 2012-03-27 15:28:15:

allow_comments - 1

Fixed with commit of TIP #397 implementation,

dkf added on 2012-02-13 07:24:47:
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.

dkf added on 2012-02-13 07:18:16:

File Added - 435627: 3485060.patch

Attachments: