On Thursday 14 February 2008 18:16:03 Jerry Gay wrote: > 'cotto' on #parrot came to me with a problem today. he is unable to > call VTABLE_is_equal(...) inside a .pmc file. i'll use > src/pmc/exporter.pmc as an example pmc file, because i know its > internals. here's a patch: > > Index: src/pmc/exporter.pmc > =================================================================== > --- src/pmc/exporter.pmc (revision 25720) > +++ src/pmc/exporter.pmc (working copy) > @@ -100,6 +100,17 @@ > > */ > > +static void test(PARROT_INTERP) { > + PMC *p1 = pmc_new(interp, enum_class_String); > + PMC *p2 = pmc_new(interp, enum_class_String); > + INTVAL cmp; > + VTABLE_set_string_native(interp, p1, const_string(interp, "test")); > + VTABLE_set_string_native(interp, p2, const_string(interp, "test")); > + > + cmp = VTABLE_is_equal(interp, p1, p2); > + printf("<<<%d>>>\n", cmp); > +} > + > pmclass Exporter > need_ext { > > @@ -117,6 +128,7 @@ > void init() { > Parrot_Exporter *exp = NULL; > > + test(INTERP); > /* Set up the object. */ > exp = mem_allocate_zeroed_typed(Parrot_Exporter); > exp->ns_src = PMCNULL; > > > compiling with this patch produces an error like: > exporter.obj : error LNK2019: unresolved external symbol > _VTABLE_is_equal referenced in function _test > > err, wha? it's in docs/pdds/pdd17_pmc.pod. it should be there. why on > earth isn't it callable? > > i went digging in include/parrot/vtable.h, tools/build/vtable_h.pl, > src/vtable.tbl, lib/Parrot/Vtable.pm. i can't figure out what's going > on. i can see that there's no VTABLE_ macro for is_equal (or cmp, for > that matter). i just can't put my finger on *why*. i wondered if it > was just the missing VTABLE_ accessor macros, so i unrolled the macro. > + cmp = (p1)->vtable->is_equal(interp, p1, p2); > > didn't work: > .\src\pmc\exporter.pmc(110) : error C2039: 'is_equal' : is not a > member of '_vtable' > > > i was able to work around the problem, looking at how 'eq' is > implemented in src/ops/cmp.ops gave me an idea. if i replace the line > + cmp = VTABLE_is_equal(interp, p1, p2); > with > + cmp = mmd_dispatch_i_pp(interp, p1, p2, MMD_EQ); > then it works. so, mmd dispatch is working. the functions are there. > > > what am i missing? i'm guessing it's something in the perl that > generates the c, but i have to step away for a while. i'd be happy if > somebody else put their eyes on it, too. chromatic? anyone?
They're marked as MMD in vtable.tbl, so my guess is that they're not directly callable by vtable pointer from C. F<docs/mmd.pod> (though admittedly out of date) suggests that mmd_dispatch_* is the right approach. -- c