On Thursday 22 February 2007 08:41, Patrick R.Michaud wrote:
> While running 'make fulltest' for the 0.4.9 release, I'm getting
> two failing tests under the -C (CGP) runcore (r17148):
>
> Failed Test Stat Wstat Total Fail List of Failed
> ---------------------------------------------------------------------------
>---- t/pmc/ref.t 2 512 16 2 13-14
Here's a fix for that. I'm not sure it's completely correct with regard to
the Ref PMC, but it does fix the delegation problem nicely.
-- c
=== src/ops/pic.ops
==================================================================
--- src/ops/pic.ops (revision 2241)
+++ src/ops/pic.ops (local)
@@ -50,7 +50,7 @@
left = $2;
right = $3;
lru = &mic->lru;
- lr_types = (left->vtable->base_type << 16) | right->vtable->base_type;
+ lr_types = (VTABLE_type(interp, left) << 16) | VTABLE_type(interp, right);
if (lru->u.type == lr_types) {
runit_v_pp:
((mmd_f_v_pp)lru->f.real_function)(interp, left, right);
@@ -88,10 +88,10 @@
left = $2;
mic = (Parrot_MIC *) cur_opcode[1];
- lt = left->vtable->base_type;
+ lt = VTABLE_type(interp, left);
right = $3;
lru = &mic->lru;
- rt = right->vtable->base_type;
+ rt = VTABLE_type(interp, right);
lr_types = (lt << 16) | rt;
if (lru->u.type == lr_types) {
INTVAL a = lt == enum_class_Integer ? PMC_int_val(left) :
=== src/pic.c
==================================================================
--- src/pic.c (revision 2241)
+++ src/pic.c (local)
@@ -660,8 +660,8 @@
/*
* get real dispatch function
*/
- left_type = left->vtable->base_type;
- right_type = right->vtable->base_type;
+ left_type = VTABLE_type(interp, left);
+ right_type = VTABLE_type(interp, right);
func = get_mmd_dispatch_type(interp,
mic->m.func_nr, left_type, right_type, &is_pmc);
if (is_pmc) {
=== src/pmc/ref.pmc
==================================================================
--- src/pmc/ref.pmc (revision 2241)
+++ src/pmc/ref.pmc (local)
@@ -96,6 +96,20 @@
/*
+=item C<INTVAL type()>
+
+Returns the PMC's type.
+
+=cut
+
+*/
+
+ INTVAL type() {
+ return VTABLE_type(interp, PMC_pmc_val(SELF));
+ }
+
+/*
+
=item C<void mark()>
Marks the referenced PMC as live.