Okay, so PDL_TRANS_START is intended to let you pick the size of your list-of-PDLs for a transformation structure, on a case-by-case basis in the code (and PP.pm does just that in all the generated code). The generic case is pdl_trans (sort of an ersatz superclass) in pdl.h.PL, and it looks like it's declared with np=1 (at line 272) simply because the PDL_TRANS_START macro affords no way to declare an undefined-length array.
On Oct 11, 2013, at 1:44 PM, Craig DeForest <[email protected]> wrote: > Wow, nice work finding this. It is right in the tangled mess that needs > overhaul for the next major version. The pdls link is a dynamically > allocated array -- I suspect that a better declaration is *pdls[] rather than > *pdls[1]. I don't know why it is declared as a unit-length array. > > > On Oct 11, 2013, at 1:34 PM, Dima Kogan <[email protected]> wrote: > >> Dima Kogan <[email protected]> writes: >> >>> Dima Kogan <[email protected]> writes: >>> >>>> valgrind is reporting some memory corruption, so I'll follow that when I >>>> have the time. >>> >>> Compiler bug! >> >> OK. Things look a little bit different in the morning. >> >> The gcc4.8 compiler is optimizing more heavily than the 4.7 one, and it >> looks like it's drawing some possibly incorrect conclusions when looking >> at broken pdl code. >> >> As I previously said, the issue is in this: >> >> pdl_trans *trans; >> for(j=0; j<trans->vtable->npdls; j++) { >> if(trans->pdls[j]->trans == trans) >> PDL_ENSURE_ALLOCATED(trans->pdls[j]); >> } >> >> >> pdl_trans is defined as >> >> struct pdl_trans { >> PDL_TRANS_START(1); >> } ; >> >> which expands to >> >> struct pdl_trans { >> int magicno; >> short flags; >> pdl_transvtable *vtable; >> void (*freeproc)(struct pdl_trans *); /* Call to free this >> (means whether malloced or not) */ >> pdl *pdls[1]; /* The pdls involved in the transformation */ >> int bvalflag; /* required for binary compatability even if >> WITH_BADVAL=0 */ >> int has_badvalue; >> double badvalue; >> int __datatype >> }; >> >> Note that pdl_trans has exactly one pdl* pdls[1] member. Gcc 4.8 sees >> this, and cuts off the loop to not iterate over more than one element. >> But clearly the PDL code intended for multiple iterations there, since >> trans->vtable->npdls is > 1. >> >> >> So what is PDL intending here? It's indexing that array past 1 in many >> places in the codebase. What are we doing? >> >> dima >> >> _______________________________________________ >> Perldl mailing list >> [email protected] >> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl >> > > _______________________________________________ Perldl mailing list [email protected] http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
