| B-JVM-Jasmin documentation | Contained in the B-JVM-Jasmin distribution. |
B::JVM::Jasmin::CompileState - Internal package used by B::JVM::Jasmin to keep state of compilation
use B::JVM::Jasmin::CompileState; my $state = new B::JVM::Jasmin::CompileState([HASHREF]);
This class is used to store the internal state of the compiler as it runs. Certain global information must be accounted for, and instead of making a bunch of global variables, I thought it would be better to keep track of this via a sub-package.
Bradley M. Kuhn, bkuhn@ebb.org, http://www.ebb.org/bkuhn
Copyright (C) 1999, Bradley M. Kuhn, All Rights Reserved.
You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the LICENSE file that was shipped with this distribution.
perl(1), jasmin(1), B::JVM::Jasmin(3).
Version number of B::JVM::Jasmin::CompileState. It should always match the version of B::JVM::Jasmin
Canonical @ISA array, derives from nothing
Used for error reporting
Used to do some operations on files
used for creating lexically scoped file handles
Needed for creating emitter objects for output
usage: B::JVM::Jasmin::CompileState::new(HASHREF)
Creates a new object of the class. First, it checks for the validity of the keys of the given initialization package (valid keys are kept in @validUserParameters), and if everything checks out, it sets up a few defaults if none were given and returns the blessed object.
Accepted User Parameters:
The name to be used for the Java class that will correspond to the "main::" package. Defaults to "Main" if none is given.
This is the current package being compiled. Should be updated by the user using the setCurrentPackage method. There is really no need to initialize it until compilation starts. Consequently, the value defaults to undef.
A directory to use for creation of output files. Defaults to the current working directory.
If true, intermediate files that are generated during the compilation process are kept for user inspection.
usage: $obj->createNewFile($packageName, [$className])
Creates a new file entry in the compiler state object and opens a new file handle for use when writing out jasmin files. If the file has already been created, nothing is done. This is typically called whenever a new package is discovered, so that a seperate class file can be generated for that package (class) in True Java Style (TM) :)
usage: $obj->emit([PACAKGE_NAME])
returns the emitter object associated with the given package, PACAKGE_NAME. If PACKAGE_NAME is missing, then the emitter object of the currentPackage is returned
usage: $obj->setCurrentMethod($methodName)
Set the current method to be $methodName
usage: $obj->setCurrentPackage($packageName)
Set the current package to be $packageName
usage: $obj->clearCurrentMethod()
Clear the current method name stored
usage: $obj->getCurrentMethod()
Return the current method
usage: $obj->DESTROY()
Default destructor for the object
| B-JVM-Jasmin documentation | Contained in the B-JVM-Jasmin distribution. |
# CompileState.pm -*- Perl -*- # # Copyright (C) 1999, Bradley M. Kuhn, All Rights Reserved. # # You may distribute under the terms of either the GNU General Public License # or the Artistic License, as specified in the LICENSE file that was shipped # with this distribution. package B::JVM::Jasmin::CompileState; use 5.000562; use strict; use warnings;
use vars qw(@ISA $VERSION); $VERSION = "0.02"; @ISA = qw(); ###############################################################################
use Carp; use File::Spec::Functions; use IO::File; use B::JVM::Jasmin::Emit; ###############################################################################
#-----------------------------------------------------------------------------
sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = shift; croak("CompileState not initialized correctly") unless (ref($self) eq "HASH");
my(@validUserParameters) = qw(mainClassName currentPackage outputDirectory keepIntermediateFiles); my(%validUserParameters); @validUserParameters{@validUserParameters} = 1 .. @validUserParameters; # Set up defaults we require $self->{mainClassName} = "Main" unless defined $self->{mainClassName}; $self->{outputDirectory} = curdir() unless defined $self->{outputDirectory}; $self->{outputDirectory} = canonpath($self->{outputDirectory}, 1); # First, check to make sure parameters given were correct foreach my $parameter (keys %{$self}) { croak("invalid parameter: $parameter") unless defined $validUserParameters{$parameter}; } bless $self, $class; $self->createNewFile("main", $self->{mainClassName}); return $self; } #-----------------------------------------------------------------------------
sub createNewFile { my($self, $packageName, $className) = @_; # Make sure we haven't already set this package up return if defined $self->{Package}->{$packageName}; unless (defined $className) { $className = $packageName; $className =~ s/::/_/g; } my $fileName = catfile($self->{outputDirectory}, "${className}.jasmin"); my $fh = new IO::File; open($fh, ">$fileName") || croak "unable to open $fileName: $!"; $self->{Package}->{$packageName}->{FH} = $fh; $self->{Package}->{$packageName}->{fileName} = $fileName; $self->{Package}->{$packageName}->{emitter} = new B::JVM::Jasmin::Emit($fh, $fileName); $self->{Package}->{$packageName}->{emitter}->source("${className}.jasmin"); $self->{Package}->{$packageName}->{emitter}->class("public", $className); $self->{Package}->{$packageName}->{emitter}->super("java/lang/Object"); # This isn't right! I think perljvm program will need to clear these out # push(@{$self->{CleanupFiles}}, $fileName) # unless $self->{keepIntermediateFiles}; return $self; } #-----------------------------------------------------------------------------
sub emit { my($self, $packageName) = @_; unless (defined $packageName) { $packageName = $self->{currentPackage}; croak "cannot emit; there appears to be no currentPackage set" unless (defined $packageName); } return $self->{Package}->{$packageName}->{emitter}; } #-----------------------------------------------------------------------------
sub setCurrentMethod { my($self, $methodName) = @_; $self->{currentMethod} = $methodName; } #-----------------------------------------------------------------------------
sub setCurrentPackage { my($self, $packageName) = @_; $self->{currentPackage} = $packageName; } #-----------------------------------------------------------------------------
sub clearCurrentMethod { my($self) = @_; $self->{currentMethod} = undef; } #-----------------------------------------------------------------------------
sub getCurrentMethod { my($self) = @_; return $self->{currentMethod}; } #-----------------------------------------------------------------------------
sub DESTROY { my $self = shift; unlink(@{$self->{CleanupFiles}}) if (defined $self->{CleanupFiles}); } ############################################################################### 1; __END__