Format of the Parrot bytecode
0 1 2 3
+----------+----------+----------+----------+
| Wordsize | Byteorder| Major | Minor |
+----------+----------+----------+----------+
Wordsize must be at least 4 (32-bit). Loader is responsible for transforming the file into the VM native wordsize on the fly. For performance, a utility should be provided to convert PBCs on disk if they cannot be recompiled.
Byteorder currently supports two values: (0-Little Endian, 1-Big Endian)
4 5
+----------+----------+----------+----------+
| Flags | FloatType| Pad - For future use|
+----------+----------+----------+----------+
| Pad - For future use |
+----------+----------+----------+----------+
| Pad - For future use |
+----------+----------+----------+----------+
16
+----------+----------+----------+----------+
| Parrot Magic = 0x 13155a1 |
+----------+----------+----------+----------+
Magic is stored in native byteorder. The loader uses the byteorder header to convert the Magic to verify. More specifically, ALL words (non-bytes) in the bytecode file are stored in native order, unless otherwise specified.
20
+----------+----------+----------+----------+
| Opcode Type (Perl = 0x5045524c) |
+----------+----------+----------+----------+
For each segment:
4, 4 + (4 + S0), 4 + (4 + S0) + (4 + S1)
+----------+----------+----------+----------+
| Segment length in bytes (S) |
+----------+----------+----------+----------+
| |
: S bytes of segment content :
| |
+----------+----------+----------+----------+
Currently there are three segment types defined, and they must occur in precisely the order: FIXUP, CONSTANT TABLE, BYTE CODE. Every segment must be present, even if empty.
FIXUP SEGMENT
<< The format for the FIXUP segment is not yet defined. >>
CONSTANT TABLE SEGMENT
0 (relative)
+----------+----------+----------+----------+
| Constant Count (N) |
+----------+----------+----------+----------+
For each constant:
+----------+----------+----------+----------+
| Constant Type (T) |
+----------+----------+----------+----------+
| Constant Size (S) |
+----------+----------+----------+----------+
| |
| S bytes of constant content |
: appropriate for representing :
| a value of type T |
| |
+----------+----------+----------+----------+
CONSTANTS
For integer constants:
<< integer constants are represented as manifest constants in
the byte code stream currently, limiting them to 32 bit values. >>
For number constants (S is constant, and is equal to sizeof(FLOATVAL)
):
+----------+----------+----------+----------+
| |
| S' bytes of Data |
| |
+----------+----------+----------+----------+
where
S' = S + (S % 4) ? (4 - (S % 4)) : 0
If S' > S, then the extra bytes are filled with zeros.
For string constants (S varies, and is the size of the particular string):
4, 4 + (16 + S'0), 4 + (16 + S'0) + (16 + S'1)
+----------+----------+----------+----------+
| Flags |
+----------+----------+----------+----------+
| Encoding |
+----------+----------+----------+----------+
| Type |
+----------+----------+----------+----------+
| Size (S) |
+----------+----------+----------+----------+
| |
: S' bytes of Data :
| |
+----------+----------+----------+----------+
where
S' = S + (S % 4) ? (4 - (S % 4)) : 0
If S' > S, then the extra bytes are filled with zeros.
BYTE CODE SEGMENT
The pieces that can be found in the byte code segment are as follows:
+----------+----------+----------+----------+
| Operation Code |
+----------+----------+----------+----------+
+----------+----------+----------+----------+
| Register Argument |
+----------+----------+----------+----------+
+----------+----------+----------+----------+
| Integer Argument (Manifest Constant) |
+----------+----------+----------+----------+
+----------+----------+----------+----------+
| String Argument (Constant Table Index) |
+----------+----------+----------+----------+
+----------+----------+----------+----------+
| Number Argument (Constant Table Index) |
+----------+----------+----------+----------+
The number and types for each argument can be determined by consulting Parrot::Opcode.
SOURCE CODE SEGMENT
Currently there are no utilities that use this segment, even though it is mentioned in some of the early Parrot documents.
Eventually there will be a more complete and useful PackFile specification, but this simple format works well enough for now (c. Parrot 0.0.5).
AUTHOR
Gregor N. Purdy <gregor@focusresearch.com>