Permalink
Switch branches/tags
Find file
Fetching contributors…
Cannot retrieve contributors at this time
115 lines (85 sloc) 4.25 KB

NAME

docs/dev/pcc_state.pod - Readme file for the Parrot Calling Conventions State Table.

DESCRIPTION

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.

PARROT CALLING CONVENTIONS STATE TABLE

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  |
           |      |      |      |      |      |      |      |      |      |
   ------------------------------------------------------------------------

Glossary

Flag Values
nrml  no flags   (src: val & 0x03a0 = 0; dest: val & 0x0260 = 0)
slrp  SLURPY     (val & 0x0020 = 1)
flat  FLAT       (val & 0x0020 = 1)
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)
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
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
Done
D1  done
Notes
*1  pmc only
*2  error unless pmc is aggregate or reference to aggregate
*3  pmc or string constant only

Examples

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