10.7 Methods

     

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) 



Perl 6 and Parrot Essentials
Perl 6 and Parrot Essentials, Second Edition
ISBN: 059600737X
EAN: 2147483647
Year: 2003
Pages: 116

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net