Stacks and Register Frames
Parrot provides 32 registers of each type: integer, floating-point number, string, and PMC. This is a generous number of registers, but it’s still too restrictive for the average use. You can hardly limit your code to 32 integers at a time. This is especially true when you start working with subroutines and need a way to store the caller’s values and the subroutine’s values. So, Parrot also provides stacks for storing values outside the 32 registers. Parrot has seven basic stacks, each used for a different purpose: the user stack, the control stack, the integer stack, and the four register backing stacks.[40]
User Stack
The
user stack, also known as the
general-purpose stack, stores individual
values. The two main opcodes for working with the user stack are
save
, to push a value onto the stack, and
restore
, to pop one off the stack:
save 42 # push onto user stack restore I1 # pop off user stack
The one argument to save can be either a constant
or a register. The user stack is a typed stack, so
restore will only pop a value into a register of
the same type as the original value:
save 1 set I0, 4 restore I0 print I0 # prints 1 end
If that restore were restore
N0
instead of an integer register, you’d get an
exception, “Wrong type on top of
stack!”
A handful of other instructions are useful for manipulating the user
stack. rotate_up
rotates a given number of elements on
the user stack to put a different element on the top of the stack.
The depth
opcode returns ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access