Hello,
I found out that ABCL, when redefining a class, modifies the old class metaobject in-place, slot by slot. This has the implication that the redefinition of an instance of a custom metaclass does not update custom slots. Now, I didn't check on the AMOP, but I'm pretty sure the proper class redefinition protocol is more articulate than the one implemented in ABCL; still, applying the patch that you find attached fixes the problem of custom slots not being updated by calling reinitialize-instance where the old code manually updated the class metaobject, so it is, I think, a valid temporary solution until we have a full MOP. However, before committing the patch, I'd like to hear your opinion about it.
The patch also includes some tabs converted to spaces, sorry for the noise.
Bye, Alessio
On Sat, Apr 23, 2011 at 12:53 AM, Alessio Stalla alessiostalla@gmail.com wrote:
Hello,
I found out that ABCL, when redefining a class, modifies the old class metaobject in-place, slot by slot. This has the implication that the redefinition of an instance of a custom metaclass does not update custom slots. Now, I didn't check on the AMOP, but I'm pretty sure the proper class redefinition protocol is more articulate than the one implemented in ABCL; still, applying the patch that you find attached fixes the problem of custom slots not being updated by calling reinitialize-instance where the old code manually updated the class metaobject, so it is, I think, a valid temporary solution until we have a full MOP. However, before committing the patch, I'd like to hear your opinion about it.
The patch also includes some tabs converted to spaces, sorry for the noise.
Additionally, I also rectified the hierarchy for slot-definition and subclasses, introducing the classes standard-slot-definition, standard-direct-slot-definition and standard-effective-slot-definition, as specified by the AMOP (except for the METAOBJECT class, which is missing and should be on the CPL of all metaobject classes). I ran the ANSI tests and got 33 failures, one less than before (but that could be a randomized test passing, I didn't check). While I find it unlikely that someone has code defining custom slot definitions that relies on the previous class hierarchy, this is a potentially breaking change, so comments are welcome. If no one speaks up in a few days, I will commit the patch on trunk and notify the mailing list.
Cheers, Alessio
On Wed, Apr 27, 2011 at 12:36 AM, Alessio Stalla alessiostalla@gmail.com wrote:
On Sat, Apr 23, 2011 at 12:53 AM, Alessio Stalla alessiostalla@gmail.com wrote:
Hello,
I found out that ABCL, when redefining a class, modifies the old class metaobject in-place, slot by slot. This has the implication that the redefinition of an instance of a custom metaclass does not update custom slots. Now, I didn't check on the AMOP, but I'm pretty sure the proper class redefinition protocol is more articulate than the one implemented in ABCL; still, applying the patch that you find attached fixes the problem of custom slots not being updated by calling reinitialize-instance where the old code manually updated the class metaobject, so it is, I think, a valid temporary solution until we have a full MOP. However, before committing the patch, I'd like to hear your opinion about it.
The patch also includes some tabs converted to spaces, sorry for the noise.
Additionally, I also rectified the hierarchy for slot-definition and subclasses, introducing the classes standard-slot-definition, standard-direct-slot-definition and standard-effective-slot-definition, as specified by the AMOP (except for the METAOBJECT class, which is missing and should be on the CPL of all metaobject classes). I ran the ANSI tests and got 33 failures, one less than before (but that could be a randomized test passing, I didn't check). While I find it unlikely that someone has code defining custom slot definitions that relies on the previous class hierarchy, this is a potentially breaking change, so comments are welcome. If no one speaks up in a few days, I will commit the patch on trunk and notify the mailing list.
Committed as r13273 [1], with additional fixes. In the commit message I forgot to mention the original issue about class redefinition (it's late), but it's there. Also, while not explicitly mentioned, user-defined classes extending slot-definition can be redefined, while it wasn't the case before. Let me know if you encounter any problems.
Cheers, Alessio
armedbear-devel@common-lisp.net