develooper Front page | perl.perl5.porters | Postings from December 2011


Thread Next
Father Chrysostomos
December 25, 2011 14:16
Message ID:
# New Ticket Created by  Father Chrysostomos 
# Please include the string:  [perl #106998]
# in the subject line of all future correspondence about this issue. 
# <URL: >


#   a
#  / \
# b   c
#  \ /
#   d

@d::ISA = qw 'b c';
@b::ISA = @c::ISA = 'a';

package d { use mro 'c3'  }

package subclass { @ISA = 'd'; }

print for @{mro'get_linear_isa 'd'};
print "----";
print for @{mro'get_linear_isa 'subclass'};


The output shows that a c3 class fails the empty subclass test, because the subclass, which uses dfs by default, imposes that on its superclasses.

I think this is a flawed model.  It means that no existing module hierarchies can switch over to c3 without breaking subclasses.

I think dfs mro linearisation needs to use the mro linearisations of its parents, instead of traversing all the superclasses itself.

Likewise I think c3 needs to be modified.  It may not follow the c3 algorithm any more, but right now it’s impossible to use the c3 mro in the example above if class ‘a’ happens to have dfs diamond inheritance from its superclasses.  (Maybe the c3 algorithm should treat any class that does not use c3 as a ‘black box’: it just takes the mro linearisation from that class and considers it a list of immediate superclasses.)

Likewise, next::method should respect each class’s mro.

Otherwise, the current mro system is more a curiosity than anything else.

It’s not possible to use mro plugins to store the list of superclasses somewhere other than @ISA.

Right now, to subclass a random class, one has to ‘use mro(); use mro mro::get_mro $super’.  Easy things should be simple and vice versa.
Site configuration information for perl 5.15.5:

Configured by sprout at Sun Dec 18 11:26:14 PST 2011.

Summary of my perl5 (revision 5 version 15 subversion 5) configuration:
  Snapshot of: 5dca8ed9d28127c9f7a2e7ce5f8ba970da3608cd
    osname=darwin, osvers=10.5.0, archname=darwin-2level
    uname='darwin pint.local 10.5.0 darwin kernel version 10.5.0: fri nov 5 23:20:39 pdt 2010; root:xnu-1504.9.17~1release_i386 i386 '
    config_args='-de -Dusedevel -DDEBUGGING=-g'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
    cc='cc', ccflags ='-fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include',
    optimize='-O3 -g',
    cppflags='-fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.2.1 (Apple Inc. build 5664)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='env MACOSX_DEPLOYMENT_TARGET=10.3 cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib
    libs=-ldbm -ldl -lm -lutil -lc
    perllibs=-ldl -lm -lutil -lc
    libc=, so=dylib, useshrplib=false, libperl=libperl.a
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=bundle, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags=' -bundle -undefined dynamic_lookup -L/usr/local/lib -fstack-protector'

Locally applied patches:

@INC for perl 5.15.5:

Environment for perl 5.15.5:
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PERL_BADLANG (unset)

Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About