On Thursday 10 July 2008 17:33:23 Patrick R. Michaud (via RT) wrote:
> There are a couple of issues with PMCProxy:
>
> 1. The PMCProxy returned from a get_class opcode isn't
> the same as one obtained from using typeof on an instance
> of the type.
>
> 2. Each invocation of typeof returns a new GC-able PMCProxy PMC..
>
> Here's the PIR:
>
> $ cat x.pir
> .sub main :main
> $P0 = get_class 'Integer'
> $P1 = new $P0
> $P2 = typeof $P1
>
> $I0 = issame $P0, $P2
> say $I0 # should be 1
>
> $P3 = typeof $P1
> $P4 = typeof $P1
>
> $I0 = issame $P3, $P4
> say $I0 # should be 1
> .end
>
> $ ./parrot x.pir
> 0
> 0
Here's a first approach. It breaks a couple of tests, but it's a start:
t/pmc/object-meths (Wstat: 1280 Tests: 37 Failed: 5)
Failed tests: 1-4, 16
t/oo/proxy (Wstat: 256 Tests: 5 Failed: 1)
Failed test: 3
I believe a solution is to make a Class PMC stick the appropriate PMCProxy in
its attached NameSpace's class slot when created, but I haven't tested that
(and won't have a chance for a few hours).
-- c
=== src/pmc/default.pmc
==================================================================
--- src/pmc/default.pmc (revision 29269)
+++ src/pmc/default.pmc (local)
@@ -994,11 +994,8 @@
*/
VTABLE PMC *get_class() {
- /* Create a proxy */
- INTVAL type = VTABLE_type(interp, SELF);
- PMC *type_num = pmc_new(interp, enum_class_Integer);
- VTABLE_set_integer_native(interp, type_num, type);
- return pmc_new_init(interp, enum_class_PMCProxy, type_num);
+ PMC *ns = VTABLE_get_namespace(interp, SELF);
+ return VTABLE_get_class(interp, ns);
}
VTABLE PMC *get_attr_str(STRING *name) {