On Tue, May 28, 2002 at 08:30:52AM -0400, Mike Lambert wrote:
> Can you provide an implementation of the macros you described above? I
> have a few concerns which I'm not sure if they are addressed. For example:

    #define PARROT_start() \
       frame * saved_top = stack_top;

> PARROT_str_local(d)
> I'm assuming it puts a reference to d onto the rooted stack. It would also
> need to initialize d to NULL to avoid pointing at garbage buffers.

    #define PARROT_str_local(d)        \
       STRING * d = NULL;              \
       frame frame_##d;                \
       int dummy_##d = (               \
         (frame_##d.ptr = &d),         \
         (frame_##d.next = stack_top), \
         (stack_top = &frame_##d),     \
         0);

> PARROT_str_params_3(a, b, c);
> What's the point of this? With rule 5 that prevents function call nesting,
> you're guaranteed of all your arguments being rooted. I think you can lose
> either the nesting requirement or the str_params requirement.

Yes, you are right: we don't need this macro if all the arguments are
already rooted.

> PARROT_return(e);
> I'm assuming this backs the stack up to the place pointed to by
> PARROT_start(), right?

Right:

    #define PARROT_return(e)   \
      do {                     \
        stack_top = saved_top; \
        return e;              \
      } while (0);             \

> This means during a longjmp, the stack won't be
> backed up properly until another PARROT_return() is called, somewhere
> farther up the chain, right?

Right, the stack has to be backed up explicitely.  But the exception
handler can do it immediately.

> Finally, in response to my original post, you asked:
> 
> > Suppose your C code builds a nested datastructure.  For instance,
> > it creates some strings and add them to a hash-table.  The hash-table is
> > then returned.  Should it clear the neonate flag of the strings?
> 
> I think I'd have to say...don't do that. Ops and functions shouldn't be
> building large data structures, imo. Stuff like buliding large hashes
> and/or arrays of data should be done in opcode, in perl code, or whatever
> language is operating on parrot.

Still, it seems reasonable for a function to return a small
datastructure, such as a pair of strings.

> If you *really* need to operate on a nested datastructure, and you're
> going to hold it against my proposal, then there are two options.
> 
> a) write code like:
> base = newbasepmc #nenoate pmc
> other = newchildpmc #also neonate
> base->add(other) #even if collecting/dod'ing, can't collect above two
> done_with_pmc(other) #un-neonates it, since it's attached to a root (neonate0 set
> ....repeat...
> 
> It works, and then you just need to worry about what to do with your
> 'base' at the end of the function (to un-neonate it or not).

This sounds reasonable.

-- Jerome

Reply via email to