10.7 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 method call looks up the method name in the symbol table of the object's class. Like .pcc_sub in PASM, .sub makes a symbol table entry for the subroutine in the current namespace. When a .sub is declared as a method , it automatically creates a local variable named self and assigns it the object passed in P2 . You can pass multiple arguments to a method and retrieve multiple return values just like a single-line subroutine call: (res1, res2) = obj."method"(arg1, arg2) |