Ticket UUID: | 3c32a3f8bd054837124c84f1725003e5a3eec028 | |||
Title: | TclOO - mixing an object | |||
Type: | Bug | Version: | trunk | |
Submitter: | pooryorick | Created on: | 2017-11-01 20:48:42 | |
Subsystem: | 35. TclOO Package | Assigned To: | nobody | |
Priority: | 5 Medium | Severity: | Minor | |
Status: | Closed | Last Modified: | 2017-11-18 00:14:37 | |
Resolution: | Fixed | Closed By: | pooryorick | |
Closed on: | 2017-11-18 00:14:37 | |||
Description: |
(text/x-fossil-wiki)
The following script causes a segmentation fault <code><verbatim> proc dying {_ args} { puts [list $_ is dying] } oo::define oo::class {export createWithNamespace} oo::class createWithNamespace obj1 obj1 ::oo::define obj1 {self mixin [self]} ::oo::copy obj1 obj2 ::oo::objdefine obj2 {mixin [self]} ::oo::copy obj2 obj3 trace add command obj3 delete [list obj3 dying] rename obj2 {} </verbatim></code> | |||
User Comments: |
pooryorick added on 2017-11-17 23:06:36:
(text/x-fossil-wiki)
Fixed in commit [5f178e7f03]. pooryorick added on 2017-11-01 20:57:39: (text/x-fossil-wiki) The problem lies in TclOO.c/ReleaseClassContents(), in a section that seems to be about removing a class that has been mixed into one of its instances (an unusual use case, to say the least): <code><verbatim> for(j=0 ; j<instancePtr->mixins.num ; j++) { Class *mixin = instancePtr->mixins.list[j]; if (mixin == clsPtr) { instancePtr->mixins.list[j] = NULL; } } </verbatim></code> Leaving a <code>NULL<code> in the list breaks expectations. Instead, that particular item should be unstitched from the list. |