Jerome Vouillon:
# I propose the following alternate guidelines.
# 
# First, the code would look something like this:
# 
#   STRING * concat (STRING* a, STRING* b, STRING* c) {
#     PARROT_start();
#     PARROT_str_params_3(a, b, c);
#     PARROT_str_local_2(d, e);
# 
#     d = string_concat(a, b);
#     e = string_concat(d, c);
# 
#     PARROT_return(e);
#   }
# 
# Then, the rules would be:
#   (1)  start your functions with PARROT_start
#   (2)  register all parameters of type STRING * with PARROT_str_params
#   (2') register all parameters of type PMC * with PARROT_pmc_params
#   (3)  declare the local variables of type STRING * with 
# PARROT_str_local
#   (3') declare the local variables of type PMC * with PARROT_pmc_local

I assume the lack of mentions of Buffers are an oversight.

#   (4)  use PARROT_return to exit the function
#   (5)  do not nest function calls
#        (for instance, "e = string_concat (string_concat(a, b), c);"
#         would be forbidden)

I don't understand the reasoning behind (5).  Would you care to
elaborate?

# The idea is to explicitly manage a stack of parrot objects, 
# which can be traversed by the GC.
# 
# This rules let a lot of freedom to the garbage collector:
# - it can garbage collect anything which is not rooted;
# - it can move objects (strings and PMCs) around;
# - objects do not need any additional field/flag;
# - exception can be implemented using longjmp; if an exception is
#   raised, temporary allocated objects will be properly freed 
# by the GC.

Anything that lets us use longjmp is fine by me.  ;^)

# Do you think that these rules would be too error-prone, or 
# too cumbersome?

May I suggest an alternate version?

    STRING * concat (STRING* a, STRING* b, STRING* c) {
      Enter_sub();  /* The macros don't really need a Parrot_ prefix, do
they? */
      Str_params_3(a, b, c);
      Decl_str(d);  /* These aren't needed anymore, actually... */
      Decl_str(e);
  
      Return(
        string_concat(
          string_concat(a, b),
            c
        )
      );
    }

--Brent Dax <[EMAIL PROTECTED]>
@roles=map {"Parrot $_"} qw(embedding regexen Configure)

blink:  Text blinks (alternates between visible and invisible).
Conforming user agents are not required to support this value.
    --The W3C CSS-2 Specification

Reply via email to