On 21/08/2013, at 12:36 PM, travisbrady wrote:

Please note you have to run

        make bootstrap

after building Felix with Python. That rebuilds Felix using Felix.
That build is complete. The Python build is not.

Also my current usage is that I do not install Felix. I just use it where
it got built eg

        build/release/host/bin/flx --test=build/release .......



> build/release/cache/text/Users/travisbrady/code/hub/felix/src/tools/flx.cpp:2388:13:
>  fatal error: incomplete type 'void' is not assignable last = last; // 
> original lists tail ~~~~~ ^ 1 error generated.

Commit [master 475c990] Fix bug #45.

Should fix this bug. Sorry about that!

The problem is a bit nasty. In the library we had floating body insertion which
used to read:

    { // in place reversal returns tail as well
      struct node_t { ?1 elt; void *tail; };
      void *nutail = (void*)0;                 // new temp tail
      void *cur = *$1;                         // list to reverse
      void *last = cur;                        // save head
      while(cur)
      {
        void *oldtail = ((node_t*)FLX_VNP(cur))->tail;            // set old 
tail to current's tail
        ((node_t*)FLX_VNP(cur))->tail = nutail;                   // set 
current's tail to nutail
        nutail = cur;                                            // set nutail 
to current
        cur = oldtail;                                           // set current 
to old tail
      }
      *$1 = nutail;                                              // reversed 
list
      *$2 = last;                                                // original 
lists tail
    }

The problem is that if argument $2 is set to expression "last" it is confused
with the local variable "last". To fix this I have changed the library to read:

  proc rev_last[T,PLT=&list[T]] : &list[T] * &list[T] = 
"_rev_last($1,$2,(?1*)0);" requires _rev_last_[T,PLT];

  body _rev_last_[T,PLT]=
    """
    static void _rev_last(?2 p1, ?2 p2, ?1*)
    { // in place reversal returns tail as well
      struct node_t { ?1 elt; void *tail; };
      void *nutail = (void*)0;                 // new temp tail
      void *cur = *p1;                         // list to reverse
      void *last = cur;                        // save head
      while(cur)
      {
        void *oldtail = ((node_t*)FLX_VNP(cur))->tail;            // set old 
tail to current's tail
        ((node_t*)FLX_VNP(cur))->tail = nutail;                   // set 
current's tail to nutail
        nutail = cur;                                            // set nutail 
to current
        cur = oldtail;                                           // set current 
to old tail
      }
      *p1 = nutail;                                              // reversed 
list
      *p2 = last;                                                // original 
lists tail
    }
    """
  ;

Now the arguments are p1 and p2 instead of $1 and $2 and the binding
is done in the proc rev_last call:

        _rev_last($1,$2,(?1*)0)

Note the dummy argument, to ensure the overload takes account
of the first type argument ?1.

In fact even this may fail if Felix uses two distinct names for the
same type (which it does sometimes ..)

[I am still testing this patch, if I got the rewrite of rev_last wrong
all hell will break loose on list operations]

--
john skaller
skal...@users.sourceforge.net
http://felix-lang.org




------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and 
AppDynamics. Performance Central is your source for news, insights, 
analysis and resources for efficient Application Performance Management. 
Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to