Author: chip
Date: Fri Nov 10 11:12:20 2006
New Revision: 15330
Modified:
trunk/docs/pdds/pdd03_calling_conventions.pod
Changes in other areas also in this revision:
Modified:
trunk/ (props changed)
trunk/compilers/imcc/imcc.l
trunk/compilers/imcc/imcc.y
trunk/compilers/imcc/pcc.c
trunk/compilers/imcc/symreg.h
trunk/docs/pcc_state.pod
trunk/include/parrot/enums.h
trunk/include/parrot/op.h
trunk/src/bignum.c
trunk/src/inter_call.c
Log:
Remove the :maybe_flat "feature", which was intended to help Perl 6, but
they never used it.
Substantially improve editorial quality of pdd03 (++particle).
Modified: trunk/docs/pdds/pdd03_calling_conventions.pod
==============================================================================
--- trunk/docs/pdds/pdd03_calling_conventions.pod (original)
+++ trunk/docs/pdds/pdd03_calling_conventions.pod Fri Nov 10 11:12:20 2006
@@ -59,10 +59,11 @@
<get_opcode> "(..., 0x200, flags0, ...)", ..., "name", REG0, ...
The flags string is a literal quoted string denoting a list of zero or more
-comma-separated integers. The list as a whole may be surrounded by
-parentheses. Integers may be specified either in decimal, or if prefixed with
-"0b"/"0x", in binary/hexadecimal. There must be exactly one integer for each
-value or register given.
+comma-separated integers. Integers may be specified either in decimal, or if
+prefixed with "0b"/"0x", in binary/hexadecimal. There must be exactly one
+integer for each value or register given.
+
+(DEPRECATED: The list as a whole may be surrounded by parentheses.)
For documentation purposes we'll number the bits 0 (low) through 30 (high).
Bit 31 (and higher, where available) will not be used.
@@ -109,63 +110,29 @@
The value is a literal constant, not a register. (Don't set this bit
yourself; the assembler will do it.)
-=item 5 C<FLAT>
-
-If this bit is set on a PMC value, then the PMC must be an aggregate or a
-scalar containing a reference to an aggregate. The contents of the aggregate,
-rather than the aggregate itself, will be passed.
-
- If the NAMED bit is also set, the aggregate will be used as a
- hash; its contents, as key/value pairs, will be passed as
- named parameters. The PMC must implement the full hash
- interface. {{ TODO: Limit the required interface. }}
-
- array; its contents will be used as positional parameters.
-
-The meaning of this bit is undefined when applied to integer, number, and
-string values.
-
-=item 6 C<MAYBE_FLAT>
-
-If this bit is set on a PMC value, and:
+=item 5 C<FLAT> (P only)
-=over 4
-
-=item a
+If this bit is set on a PMC value, then the PMC must be an aggregate. The
+contents of the aggregate, rather than the aggregate itself, will be passed.
-the PMC is either an aggregate or a scalar containing a reference to
-an aggregate, and
+If the C<NAMED> bit is also set, the aggregate will be used as a hash; its
+contents, as key/value pairs, will be passed as named parameters. The PMC
+must implement the full hash interface. {{ TODO: Limit the required
+interface. }}
-=item b
-
-the target register has the SLURPY bit set,
-
-=back
-
-then pass the PMC value as a list of values, in these ways:
-
-=over 4
-
-=item a
-
-if the value is an array, pass its elements in the normal way (FLAT
-style);
-
-=item b
-
-if the value is a hash, pass its elements as a list of key/value
-pairs contained in HLL-specific 'pair' PMCs.
-
-=back
+If the C<NAMED> bit is not set, the aggregate will be used as an array; its
+contents will be passed as positional parameters.
The meaning of this bit is undefined when applied to integer, number, and
-string values. It may not be combined with the NAMED bit.
+string values.
+
+=item 6 (unused)
-=item 7 C<(unused)>
+=item 7 (unused)
-=item 8 C<(unused)>
+=item 8 (unused)
-=item 9 C<NAMED (FLAT or string constant only)>
+=item 9 C<NAMED> (C<FLAT> or string constant only)
When the FLAT bit is also set, behavior is as described above in the "FLAT"
section. Otherwise, this bit may only be set on a unique string constant
@@ -195,9 +162,9 @@
=over 4
-=item 4 C<(unused)>
+=item 4 (unused)
-=item 5 C<SLURPY (P only)>
+=item 5 C<SLURPY> (P only)
If this bit is set on a P register, then it will be populated with an
aggregate that will contain all of the remaining values that have not already
@@ -206,15 +173,13 @@
All such values will be converted to PMCs according to the detailed rules
below, and those PMCs will be stored into the new aggregate.
- If the NAMED bit is also set, the aggregate will be an
- HLL-specific hash type and the contents will be all
- unassigned _named_ parameters.
-
- If the NAMED bit is not set, the aggregate will be an
- HLL-specific array type and the contents will be all
- unassigned positional parameters.
+If the C<NAMED> bit is also set, the aggregate will be the HLL-specific hash
+type and the contents will be all unassigned _named_ parameters.
+
+If the C<NAMED> bit is not set, the aggregate will be the HLL-specific array
+type and the contents will be all unassigned positional parameters.
-=item 6 C<(unused)>
+=item 6 (unused)
=item 7 C<OPTIONAL>
@@ -222,26 +187,32 @@
exception will be raised; rather, the register will be set to a default value:
a Null PMC for P, an empty string for S, or zero for N or I.
-=item 8 C<OPT_FLAG (I only)>
+=item 8 C<OPT_FLAG> (I only)
An I register with this bit set is set to one if the immediately preceding
-B<OPTIONAL> register received a value; otherwise, it is set to zero.
+B<OPTIONAL> register received a value; otherwise, it is set to zero. If the
+preceding register was not marked B<OPTIONAL>, the behavior is undefined; but
+we promise you won't like it.
-=item 8 C<READONLY (P only)>
+=item 8 C<READONLY> (P only)
-C<XXX - PROPOSED ONLY - XXX>
+I<XXX - PROPOSED ONLY - XXX>
If this bit is set on a P register that receives a value, Parrot will ensure
that the final value in the P register is read-only (i.e. will not permit
modification). If the received value was a mutable PMC, then Parrot will
-create and set the register to a read-only PMC wrapper around the original
-PMC.
+create and set the register to a {not yet invented} read-only PMC wrapper
+around the original PMC.
-Parrot's algorithm for deciding what is writable may be pretty simplistic. In
-initial implementations, it may assume that any PMC not of a known
-read-only-wrapper type is mutable.
+Future Notes: Parrot's algorithm for deciding what is writable may be
+simplistic. In initial implementations, it may assume that any PMC not of a
+known read-only-wrapper type is mutable. Later it may allow the HLL to
+provide the test. But we must beware overdesigning this; any HLL with a truly
+complex notion of read-only probably needs to do this kind of wrapping itself.
-=item 9 C<NAMED (SLURPY or string constant only)>
+=item 8 (unused for S and N)
+
+=item 9 C<NAMED> (C<SLURPY> or string constant only)
When the SLURPY bit is also set, behavior is as described above in the
"SLURPY" section. Otherwise, this bit may only be set on a unique string
@@ -263,17 +234,18 @@
If too few values are provided so that some target registers are left unset,
this too results in an exception.
-=head3 Ordering of named values
+=head3 Ordering of named values (outgoing)
-Named values (arguments, or values to return) must I<appear> after all the
-unnamed values. Within the unnamed and named zones, FLAT and non-FLAT values
-may be mixed in any order.
+Named values (arguments, or values to return) must be listed textually after
+all the positional values. C<FLAT> and non-C<FLAT> values may be mixed in any
+order.
-=head3 Ordering of named targets
+=head3 Ordering of named targets (incoming)
Named targets (parameters, or returned values) must appear I<after> all the
-unnamed targets. Within the unnamed and named zones, SLURPY targets must
-appear last (if they appear at all).
+positional targets. A C<SLURPY> positional target, if present, must be the
+last positional target; a C<SLURPY> named target, if present, must be the last
+named target.
So the acceptable ordering of targets is:
@@ -281,29 +253,29 @@
=item *
-unnamed non-SLURPY (any number)
+positional non-SLURPY (any number)
=item *
-unnamed SLURPY array (optional)
+positional SLURPY array (optional)
=item *
-NAMED non-SLURPY (any number)
+NAMED non-SLURPY (any number)
=item *
-NAMED SLURPY hash (optional)
+NAMED SLURPY hash (optional)
=back
-=head3 Mixing named and unnamed values
+=head3 Mixing named and positional values
-Unnamed targets can only be filled with unnamed values.
+Positional targets can only be filled with positional values.
-Named targets can be filled with either unnamed or named values. However, if
-a named target was already filled by an unnamed (positional) value, and then a
-named value is also given, this is an overflow error.
+Named targets can be filled with either positional or named values. However,
+if a named target was already filled by an positional (positional) value, and
+then a named value is also given, this is an overflow error.
=head3 Type Conversions
@@ -339,7 +311,9 @@
=back
-[1] according the current HLL type mappings.
+[1] or some other type specified by the current HLL type map, which may
+substitute an alternative type for each default low-level Parrot type (array,
+hash, string, number, etc.).
=head1 BUGS
@@ -363,6 +337,9 @@
foo(p, value :named('key')) # the same
foo(kw :named :flat) # a flattening hash
+ # all together now: three positional (one flat) with two named (one flat)
+ foo(a, b, c :flat, 'x' => 3, 'y' => 4, z :flat :named('z'))
+
=head2 Parameters
.param int i # positional parameter
@@ -387,7 +364,7 @@
=head1 REFERENCES
-None.
+L<pdd23_exceptions.pod>
=cut