On 04/11/2011, at 11:17 PM, john skaller wrote:
> Another day another bug .. :)
>
> generated code giving error:
> //-----------------------------------------
> //EMIT USER BODY CODE
>
> void _rev(_poly_5493t_29757* plt)
> void _rev(_poly_5493t_29764* plt)
> { // in place reversal
> struct node_t { _a4974t_29738* elt; void *tail; };
> void *nutail = 0;
> void *cur = *plt;
> while(cur)
> {
> void *oldtail = ((node_t*)FLX_VP(cur))->tail; // save old tail in
> temp
> ((node_t*)FLX_VP(cur))->tail = nutail; // overwrite current
> node tail
> nutail = cur; // set new tail to
> current
> cur = oldtail; // set current to
> saved old tail
> }
> *plt = nutail; // overwrite
> }
Solution 1, a temporary hack: change the list definition from
union list[T] = | Empty | Cons of T * list[T];
to
union list[T] = | Empty | Cons of list[T] * T;
This puts the pointer first in the node_t struct. Since we now know the offset,
the list reversal code becomes non-polymorphic.
Solution 2: maybe (not sure) we can make the body code in question
non-polymorphic
to Felix but C++ polymorphic: use a template. C++ will figure out that the two
typedefs
map to the same type and only generate one instance.
Solution 3: The real solution perhaps: get rid of emitted typedefs. That's
easy, but
everywhere they're used in the code they have to be replaced by what they're
defined to.
Solution 4: Just admit polymorphic body insertions don't work. Actually that's
already specified (in my head anyhow).
Solution 5: make 'em distinct types, eg: struct name { void *data; }.
Since I'm chasing a run time bug at the moment, solution (1) has some appeal :)
--
john skaller
[email protected]
------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language