Christoph Otto via RT wrote:
I'm running into a snag trying to implement this.  It turns out that
many lines which use the PMC_x_val macros use them on different types of
PMCs, especially parents and children (e.g. FixedPMCArray and
ResizablePMCArray).  There are also some instances where the PMCs with a
related purpose but no inheritance (e.g. RetContinuation and
ExceptionHandler) have the unionval used in the same way on a line of code.

What's the right way to fix these cases to use the GETATTR/SETATTR macros?

I have a file that lists these, which I'll be sticking on the wiki later
tonight.

Here's the more detailed version:

Thanks to Infinoid++, I was able to follow particle's recommendation earlier in the thread and modify the PMC_x_val macros to record some information at runtime. This will make the cage task *much* more approachable and parallelizable, but it also exposes places where code makes promiscuous assumptions about PMC internals.

The referenced files were generated by modifying include/parrot/pobj.h [1], then building and testing Parrot and any currently maintained HLLs that use custom PMCs. The results are on trac, sorted by file [2] and by PMC [3]. I did this to help clarify how the UnionVal macros would need to be converted to GETATTR/SETATTR macros, since the latter are PMC-specific. The files are generated from r34501 and can be regenerated as needed.

The problem with using ATTRs in their current state is that, depending on control flow, a given instance of a PMC_x_val may be called with several different PMC types (see src/hash.c:1045 in [2] for an extreme case). This is fairly common and makes ATTRs unusable for any PMCs whose UnionVals are twiddled by common code.

One solution to this would be to make ATTRs follow the inheritance chain so the following code works:

PMC *foo = new_pmc(INTERP, enum_class_Foo); /*Foo has no ATTRs, extends Bar*/
INTVAL baz;                                 /*Bar has a "baz" ATTR*/
GETATTR_Bar_baz(INTERP, foo, baz);


I'm not attached to any particular solution, but it's clear that the migration away from the PMC UnionVal can't happen without some kind of significant change.


[1] http://xrl.us/becsw4 (diff)
[2] http://xrl.us/becswu (csv, sorted by source code file)
[3] http://xrl.us/becsww (csv, sorted by PMC type)

Reply via email to