id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc	lang	patch	platform
8	Various issues with get_class interface	pmichaud	whiteknight	"The get_class opcode doesn't deal well with finding classes
using an array, and there are other inconsistencies.  Here are some:

(1)  PDD15 is inconsistent about the mechanisms available to
identify a class PMC.  In various places it says:

 - class object, namespace object, key, or string name PMC (isa, line 349)
 - classname, namespace, or key PMC (get_attr_keyed, line 655)
 - class object or namespace key (setattribute, line 951)
 - PMC key or namespace object (get_class, line 1034)
 - string PMC, namespace key, class object (new, line 1067)

Notably, nowhere does it allow an array to be used to identify
a class, although the code does try to allow it (src/oo.c:188)
and we allow namespace lookups via arrays.

Ideally I think we ought to be able to identify a class by any of
    (a) class object,
    (b) NameSpace PMC,
    (c) Key PMC,
    (d) String PMC.

(2)  Looking up a nonexistent class with a String PMC
produces a null PMC (correct), but looking up a nonexistent
class with an array produces a ""get_string() not implemented in
class 'ResizableStringArray'"" exception:

{{{
    $ cat x.pir
    .sub main
        $P0 = box 'NoSuchClass'
        $P1 = get_class $P0
        $I1 = isnull $P1
        say $I1

        $P0 = split '::', 'NoSuchClass'
        $P1 = get_class $P0
        $I1 = isnull $P1
        say $I1

    .end

    $ ./parrot x.pir
    1
    get_string() not implemented in class 'ResizableStringArray'
    current instr.: 'main' pc 15 (x.pir:8)
    $
}}}

(2)  Even when using an array that does support get_string(),
we end up looking up the wrong class:

{{{
    $ cat y.pir
    .sub main
        $P99 = newclass '3'

        $P1 = new 'ResizablePMCArray'
        push $P1, 'A'
        push $P1, 'B'
        push $P1, 'C'
        $P0 = get_class $P1    # get class ['A';'B';'C']
        $I0 = isnull $P0
        say $I0

        # what class did we get?
        say $P0
    .end

    $ ./parrot y.pir
    0
    3
    $
}}}

Pm
"	todo	closed	major	0.9.1	core		medium	fixed	get_class				all
