=head1 parrot calling conventions state table

this document expresses the calling conventions as outlined in PDD03 in table
format. this is a work in progress, which, when finished, should assist in
creating an exhaustive test suite for calling conventions.

              1      2      3      4      5      6      7      8      9

           |                          DEST                         |      |
           |          unnamed          |           named         *3|      |
           |   required  |   optional  |   required  |   optional  |      |
           |      |    *1|      |    *1|      |    *1|      |    *1|      |
           | nrml | slrp | nrml | slrp | nrml | slrp | nrml | slrp | END  |
   ------------------------------------------------------------------------
           |      |      |      |      |      |      |      |      |      |
 A    nrml |  P1  |  P2  |  P1  |  P2  |  E6  |  E6  |  E6  |  E6  |  E1  |
    u      |      |      |      |      |      |      |      |      |      |
    n----------------------------------------------------------------------
    n  *1,2|      |      |      |      |      |      |      |      |      |
 B  a flat |  P3  |  P3  |  P3  |  P3  |  P4  |  P5  | P4   |  P5  |  E2  |
    m      |      |      |      |      |      |      |      |      |      |
    e----------------------------------------------------------------------
    d    *1|      |      |      |      |      |      |      |      |      |
 C    mayb |  P1  |  X1  |  P1  |  X1  |      |      |      |      |  E2  |
   S       |      |      |      |      |      |      |      |      |      |
   R-----------------------------------------------------------------------
   C       |      |      |      |      |      |      |      |      |      |
 D    nrml |  E5  |  E5  |  E5  |  E5  |      |      |      |      |  E1  |
           |      |      |      |      |      |      |      |      |      |
    n----------------------------------------------------------------------
    a    *3|      |      |      |      |      |      |      |      |      |
 E  m flat |  E5  |  E5  |  E5  |  E5  |      |      |      |      |  E2  |
    e      |      |      |      |      |      |      |      |      |      |
    d----------------------------------------------------------------------
           |      |      |      |      |      |      |      |      |      |
 F    mayb |  E4  |  E4  |  E4  |  E4  |  E4  |  E4  |  E4  |  E4  |  E2  |
           |      |      |      |      |      |      |      |      |      |
   ------------------------------------------------------------------------
           |      |      |      |      |      |      |      |      |      |
 G     END |  E3  |  E3  |  D1  |  D1  |  E3  |  E3  |  D1  |  D1  |  D1  |
           |      |      |      |      |      |      |      |      |      |
   ------------------------------------------------------------------------


=head2 Glossary

=over 4

=item  Flag Values

  nrml  no flags   (src: val & 0x03a0 = 0; dest: val & 0x0260 = 0)
  slrp  SLURPY     (val & 0x0020 = 1)
  flat  FLAT       (val & 0x0020 = 1)

=item  Passing

  P1  pass as-is, next state
  P2  pass as-is, next src
  P3  pass contents as array items, next
  P4  pass current array item as-is, next src array item
  P5  pass current array items as pairs (a[0],a[0]) or as (a[0],a[1]) (a.size % 2 = 0)
  P4  pass current array item as-is, next src array item
  P5  pass current array items as pairs (a[0],a[0]) or as (a[0],a[1]) (a.size % 2 = 0)

=item  Expressions

  X1  if(src pmc is aggregate or reference to aggregate)
        if dest is array, pass as flat
        if dest is hash, pass as pairs

=item  Errors

  E1  overflow
  E2  overflow if aggregate is not empty
  E3  underflow
  E4  [removed]
  E5  named parameter passed, unnamed expected
  E6  unnamed parameter passed, named expected

=item  Done

  D1  done

=item Notes

  *1  pmc only
  *2  error unless pmc is aggregate or reference to aggregate
  *3  pmc or string constant only

=back

=head2 Examples

=over 4

=item A:5
  'caller'(1, 2) # caller
  .param pmc two :named('two') ; .param pmc one :named('one')
  two = 1 ; one = 2


=cut
