From fdba58530a48223ecd0c9bcf629f08c3569d6c75 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 11 Dec 2019 11:42:45 -0800 Subject: OOP: implementing multiple inheritance. Multiple inheritance is too useful to ignore any longer. * lib.c (subtypep): Perform subtypep calculation between two struct types via the new struct_subtype_p function. It's too complicated now to do with ad hoc code outside of struct.c. * share/txr/stdlib/struct.tl (defstruct): This macro now needs to deal with the super argument being possibly a list of base types instead of a single one. * strut.c (struct struct_type): Member super and super_handle are removed. New member nsupers, supers, and sus. (struct_init): The super function re-registered; it has an optional argument. (call_stinitfun_chain): The compat code here must now access the supertype differently. We don't bother dealing with multiple inheritance in the compat case; programs requesting compatibility with TXR 151 shoudn't be trying to use multiple inheritance. (get_struct_handles, count_super_stslots, get_super_slots, find_super_for_slot): New static functions, to off-load some new complexity from make_struct_type. (make_struct_type): Handle the increased complexity due to multiple inheritance. (super): Takes an additional argument now, to request which supertype to retrieve. Defaults to zero: the first one. (struct_type_destroy): Free the sus array. (struct_type_mark): Mark the supers slot. (call_initfun_chain): Call init functions of all bases, in right-to-left order. (call_postinitfun_chain): Likewise for postinit functions. (call_super_method, call_super_fun, super_method): Use the first base as the supertype. This requirement feels bad; it needs to be revisited. (do_struct_subtype_p): New static function. (struct_subtype_p): New function. (ancestor_with_static_slot): New static function. (method_name): Revised for multiple inheritance; now relies on ancestor_with_static_slot to find the original ancestor that has brought in a method, so we can use that type in the method name. * struct.h (super): Declaration updated. (struct_subtype_p): Declared. * tests/012/oop-mi.expected: New file. * tests/012/oop-mi.tl: New test cases. * txr.1: Revised in order to document multiple inheritance. --- struct.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'struct.h') diff --git a/struct.h b/struct.h index 1850814e..78701270 100644 --- a/struct.h +++ b/struct.h @@ -47,7 +47,7 @@ val struct_get_initfun(val type); val struct_set_initfun(val type, val fun); val struct_get_postinitfun(val type); val struct_set_postinitfun(val type, val fun); -val super(val type); +val super(val type, val idx); val make_struct(val type, val plist, struct args *); val struct_from_plist(val type, struct args *plist); val struct_from_args(val type, struct args *boa); @@ -75,6 +75,7 @@ val slots(val stype); val structp(val obj); val struct_type(val strct); val struct_type_name(val stype); +val struct_subtype_p(val sub, val sup); val method(val strct, val slotsym); val method_args(val strct, val slotsym, struct args *); val super_method(val strct, val slotsym); -- cgit v1.2.3