Ticket #8 (closed todo: fixed)
Various issues with get_class interface
| Reported by: | pmichaud | Owned by: | whiteknight |
|---|---|---|---|
| Priority: | major | Milestone: | 0.9.1 |
| Component: | core | Version: | |
| Severity: | medium | Keywords: | get_class |
| Cc: | Language: | ||
| Patch status: | Platform: | all |
Description (last modified by pmichaud) (diff)
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
