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 pad stack, and the four register-backing stacks.
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 the number ...
Get Perl 6 and Parrot Essentials, Second Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.