From: Leopold Toetsch <[EMAIL PROTECTED]>
   Date: Tue, 8 Aug 2006 19:43:31 +0200

   Am Sonntag, 6. August 2006 17:20 schrieb Bob Rogers:

   [ a much more detailed answer will follow ]

   > ? ?The problem is that inferior runloops cannot be re-entered via
   > continuation. ?

   C<get_string> is an excellent example for the POC. I've a first question 
   though: assuming that we might want to eliminate inferior runloops, what can 
   we do about usage of (e.g.) C<get_string> in:

   a)  print P0

   b)  foo(P0)    # function call with Preg
       ...
       .sub foo
          .param string s  # string param

   a) could be easy by making the get_string explicit in the opcodes:

      $S0 = P0    # imcc could handle this conversion 
      print $S0

Or print_p (which is not much more complicated than set_s_p) could be
reimplemented using a print_tail_result helper fn instead of
store_tail_result_into_register.  (Given the difficulty I've had with
set_retval, that would have made an easier POC, come to think of it.)

   but I see little chance to catch b) at compile time.  And b) is of
   course really nasty, as the C<get_string> is occuring during argument
   passing, which has also to be used for any replacement functionality.

   leo

Yes, this is a good example of the kind of pain I meant.  If we insisted
on trying to optimize this away, we'd be limited to supporting languages
no more dynamic than Java or C# -- and that's pretty limited.  ;-}  [1]

   It can still be done, IIUC.  Since an arbitrary number of
get_{string,number,integer} calls might be required, the arg processing
loop would have to be rewritten as a tail-recursion, and then broken
into thunks so that each could be called as a C_continuation if
necessary.  But it may depend on how many places need to call
parrot_pass_args and its kin, and how difficult *those* are to rewrite.

   This may not be quite so as bad as it seems -- the current algorithm
(as you well know!) already revolves around an explicit struct
call_state.  On the other hand, it's not a PMC, and we'd have to figure
out how to keep GC on during arg processing.

   Then there are :flat arrays.  What if some user passes a :flat arg
using an array class with an overloaded get_pmc_keyed_int method?
Methinks it would be good to draw a line here.

   Your detailed reply is eagerly awaited,

                                        -- Bob

[1]  Actually, I take that back:  For INS formals, IMCC could generate a
     prolog that is equivalent to this for each parameter <n>:

        C<n>:
                unless param_<n>_needs_conversion goto C<n+1>
                param_<n> = param_<n>_temp
        C<n+1>:
                . . .

     So if the value destined for param_<n> is a PMC, process_args
     stuffs it into param_<n>_temp (still a P register) and sets the
     param_<n>_needs_conversion flag.  The fact that coercion is
     out-of-order with respect to the assignment of other formals should
     not matter; it won't be visible to vtable methods [2].  The whole
     prolog would be unecessary if all were P formals, and could be
     skipped at runtime if no coercion was required.

     It rather seems like a band-aid to me.  But it would be easier in
     the short term.

[2]  Unless we should someday provide a mechanism for formals to be bound
     dynamically.

Reply via email to