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
