NAME

Parrot::Pmc2c::Emitter

SYNOPSIS

use Parrot::Pmc2c::Emitter ();

DESCRIPTION

This package provides various methods for composing parts of files created by parsing PMCs. Its methods are called by several other packages under lib/Parrot/Pmc2c/, all of which are ultimately run during the many instances of tools/build/pmc2c.pl invoked during the make build process.

PUBLIC METHODS

new()

  • Purpose

    Parrot::Pmc2c::Emitter constructor.

  • Arguments

    Parrot::Pmc2c::Emitter->new( 'path/to/file' );

    String holding relative path to file to be written.

  • Return Value

    Parrot::Pmc2c::Emitter object.

  • Comment

    The method's argument is, in practice, the return value of a method call. Examples:

    # lib/Parrot/Pmc2c/PMC.pm
    my $c_emitter = Parrot::Pmc2c::Emitter->new( $self->filename(".c") );
    my $h_emitter = Parrot::Pmc2c::Emitter->new( $self->filename(".h", $self->is_dynamic) );
    
    # lib/Parrot/Pmc2c/PCCMETHOD.pm
    my $e = Parrot::Pmc2c::Emitter->new( $pmc->filename );

text()

  • Purpose

    This, in effect, is a different type of constructor from new(). It takes up to three arguments and returns an object with a more complex structure.

  • Arguments

    List of one to three strings:

    1 body
    2 filename
    3 bline

    Examples:

    # lib/Parrot/Pmc2c/PMC.pm
    body => Parrot::Pmc2c::Emitter->text($body),
    
    # lib/Parrot/Pmc2c/Parser.pm
    $pmc->preamble( Parrot::Pmc2c::Emitter->text( $preamble, $filename, 1 ) );
    
    $pmc->postamble( Parrot::Pmc2c::Emitter->text( $post, $filename, $lineno ) );
    
    body => Parrot::Pmc2c::Emitter->text( $methodblock, $filename, $lineno ),
  • Return Value

    Parrot::Pmc2c::Emitter object, apparently suitable for using as value for a body key in a Parrot::Pmc2c::Method object. MUST VERIFY.

  • Comment

    Also currently (June 2012) used in lib/Parrot/Pmc2c/PMC/Null.pm, lib/Parrot/Pmc2c/PMC/Object.pm, lib/Parrot/Pmc2c/PMC/RO.pm and lib/Parrot/Pmc2c/PMC/default.pm.

find()

  • Purpose

    Recursively returns strings captured from pattern matches.

  • Arguments

    Single argument: compiled regular expression.

  • Return Value

    If a pattern is matched within a list of items, return the matching string. Return the object itself it the match is against the data element. Return a false value otherwise.

  • Comment

    Used in Parrot::Pmc2c::PCCMETHOD. Example:

    $matched = $body->find($signature_re);

subst()

  • Purpose

    Recursively perform substitutions.

  • Arguments

    List of two arguments:

    • Compiled regular expression.

    • Reference to a subroutine which performs a substitution on the string matched by the first argument's pattern.

  • Return Value

    True value.

  • Comment

    Used in Parrot::Pmc2c::Method. Some of these substitutions can be quite simple:

    $body->subst( qr{\bSELF\b},   sub { '_self' } );

    Others are more complex:

    # Rewrite STATICSELF.other_method(args...)
    $body->subst(
        qr{
      \bSTATICSELF\b    # Macro STATICSELF
      \.(\w+)           # other_method
      \(\s*(.*?)\)      # capture argument list
      }x,
        sub {
            "Parrot_${pmcname}"
                . ( $pmc->is_vtable_method($1) ? "" : "_nci" ) . "_$1("
                . full_arguments($2) . ")";
        }
    );

replace()

  • Purpose

  • Arguments

    List of two arguments:

    • Compiled regular expression.

    • Another Parrot::Pmc2c::Emitter object.

  • Return Value

    True value upon success.

  • Comment

    Used in Parrot::Pmc2c::PCCMETHOD::rewrite_RETURNs(). Example:

    $matched->replace( $match, $e );