Methods
PIR provides syntax to simplify writing methods and method calls. These calls follow the Parrot-calling conventions. The basic syntax is similar to the single-line subroutine call above, but instead of a subroutine label name it takes a variable for the invocant PMC and a string with the name of the method:
object."methodname"(arguments)
The invocant can be a variable or register, and the method name can
be a literal string, string variable, or method object register. This
tiny bit of code sets up all the registers for a method call and
makes the call, saving and restoring the top half of the register
frames around the call. Internally, the call is a
callmethodcc opcode, so it also generates a return
continuation.
This example defines two methods in the Foo class.
It calls one from the main body of the subroutine and the other from
within the first method:
.sub _main .local pmc class .local pmc obj newclass class, "Foo" # create a new Foo class find_type $I0, "Foo" # find its dynamic type number new obj, $I0 # instantiate a Foo object obj."_meth"( ) # call obj."_meth" which is actually print "done\n" # "_meth" in the "Foo" namespace end .end .namespace [ "Foo" ] # start namespace "Foo" .sub _meth method # define Foo::_meth global print "in meth\n" $S0 = "_other_meth" # method names can be in a register too self.$S0( ) # self is the invocant .end .sub _other_meth method # define another method print "in other_meth\n" # as above Parrot provides a return .end # statement
Each ...
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