[svn:parrot] r44770 - branches/ops_pct/compilers/opsc/ops

bacek at svn.parrot.org bacek at svn.parrot.org
Mon Mar 8 19:57:24 UTC 2010


Author: bacek
Date: Mon Mar  8 19:57:24 2010
New Revision: 44770
URL: https://trac.parrot.org/parrot/changeset/44770

Log:
Remove old oplib.

Deleted:
   branches/ops_pct/compilers/opsc/ops/oplib.pm

Deleted: branches/ops_pct/compilers/opsc/ops/oplib.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/ops/oplib.pm	Mon Mar  8 19:57:24 2010	(r44769)
+++ /dev/null	00:00:00 1970	(deleted)
@@ -1,426 +0,0 @@
-# Copyright (C) 2009, Parrot Foundation.
-# $Id$
-
-INIT {
-    pir::load_bytecode("dumper.pbc");
-    pir::load_bytecode("nqp-settings.pbc");
-};
-
-class Ops::OpLib is Hash;
-
-=begin NAME
-
-C<Ops::OpLib> - library of Parrot Operations.
-
-=end NAME
-
-=begin DESCRIPTION
-
-Responsible for loading F<src/ops/ops.num> and F<src/ops/ops.skip> files,
-parse F<.ops> files, sort them, etc.
-
-Heavily inspired by Perl5 Parrot::Ops2pm.
-
-=end DESCRIPTION
-
-=begin SYNOPSIS
-
-    my $oplib := Ops::OpLib.new.BUILD(
-        :files(@files),
-        :num_file('../../src/ops/ops.num'),
-        :skip_file('../../src/ops/ops.skip'),
-    ));
-
-=end SYNOPSIS
-
-=begin ATTRIBUTES
-
-=over 4
-
-=item * C<@.files>
-
-Op files. Mandatory argument of C<BUILD> method.
-
-=item * C<@.ops_past>
-
-List of parsed ops. Currently as C<PAST::Block>, but we probably will use
-more specific class inherited from C<PAST::Block> to provide some helper
-methods.
-
-=item * C<$.max_op_num>
-
-Scalar holding number of highest non-experimental op.  Example:
-
-    'max_op_num' => 1246,
-
-=item * C<%.optable>
-
-Hash holding mapping of opcode names ops to their numbers.
-Example:
-
-  'optable' => {
-    'pow_p_p_i' => 650,
-    'say_s' => 463,
-    'lsr_p_p_i' => 207,
-    'lt_s_sc_ic' => 289,
-    # ...
-    'debug_init' => 429,
-    'iseq_i_nc_n' => 397,
-    'eq_addr_sc_s_ic' => 254
-  },
-
-Per F<src/ops/ops.num>, this mapping exists so that we can nail down
-the op numbers for the core opcodes in a particular version of the
-bytecode and provide backward-compatibility for bytecode.
-
-=item * C<%.skiptable>
-
-Reference to a 'seen-hash' of skipped opcodes.
-
-  'skiptable' => {
-    'bor_i_ic_ic' => 1,
-    'xor_i_ic_ic' => 1,
-    'tanh_n_nc' => 1,
-    # ...
-  },
-
-As F<src/ops/ops.skip> states, these are "... opcodes that could be listed in
-F<[src/ops/]ops.num> but aren't ever to be generated or implemented because
-they are useless and/or silly."
-
-=back
-
-=end ATTRIBUTES
-
-=begin METHODS
-
-=over 4
-
-=item C<BUILD>
-
-Build OpLib.
-
-(It's NQP. In Perl 6 it should be submethod and invoked automatically)
-
-=end METHODS
-
-method BUILD(:@files, :$num_file, :$skip_file) {
-    # Process arguments
-    if + at files == 0 {
-        die("We need some files!")
-    }
-    self<files>      := @files;
-    self<num_file>   := $num_file  || './src/ops/ops.num';
-    self<skip_file>  := $skip_file || './src/ops/ops.skip';
-
-    # Initialize self.
-    self<max_op_num> := 0;
-    self<optable>    := hash();
-    self<skiptable>  := hash();
-    self<ops_past>   := list();
-
-    self.load_op_map_files();
-
-    self;
-}
-
-=begin METHODS
-
-=item C<parse_ops>
-
-Parse all ops files passed to BUILD method. Create self.ops list for parsed
-ops.  This function is used primarily for testing.  When invoked directly, the
-HLLCompiler sets the past directly.
-
-=end METHODS
-
-method parse_ops() {
-    for self.files() {
-        for @(self.parse_ops_file($_)) {
-            self<ops_past>.push($_);
-        }
-    }
-}
-
-=begin METHODS
-
-=item C<parse_ops_file>
-
-Parse single ops file. Returns list of parsed ops.
-
-=end METHODS
-
-method parse_ops_file($file) {
-    my $parser := self._get_compiler();
-    my $buffer := slurp($file);
-    my $past   := $parser.compile($buffer, :target('past'));
-    #_dumper($past);
-    #say($file ~ ' ' ~ +@($past<ops>));
-    $past<ops>;
-}
-
-=begin METHODS
-
-=item C<set_ops_past>
-
-Assign an already-constructed past tree to self.
-
-=end METHODS
-
-method set_ops_past($past) {
-    self<ops_past> := $past;
-}
-
-=begin METHODS
-
-=item C<load_op_map_files>
-
-Load ops.num and ops.skip files.
-
-=end METHODS
-
-method load_op_map_files() {
-    self._load_num_file;
-    self._load_skip_file;
-}
-
-=begin METHODS
-
-=item C<build_ops>
-
-Take C<ops_past> and do any runcore-agnostic processing on it.  This means such
-things as expanding opcodes with C<in> params into multiple functions,
-determining jump flags, etc.
-
-=end METHODS
-
-method build_ops() {
-    
-    #ops.num is guaranteed not to have any holes, but the ordering also comes
-    #from all the .ops files catted together.  It should be sufficient to go
-    #through the past, expanding ops to opfuncs as necessary and simply
-    #verifying that they end up with the right number.  A special case is
-    #experimental.ops, which don't appear in ops.num.
-
-    my $op_num := 0;
-
-    for self<ops_past><ops>.iterator {
-        my $cur_op := $_;
-        say("found an op: "~ ~$_<name>);
-        #my $jump_flags := self.get_jump_flags($cur_op);
-        #figure out all the constant data: flags, name, etc
-        #build an array of args
-        #$args := [ [] ];
-        #for eq:
-        #     [ [ {'dir'=>'in', 'type'=>'ic', 'label'=>0}, {'dir'=>'in', 'type'=>'i', 'label'=>0} ] , ...
-
-
-
-        #check for any skiplisted long opnames before adding them to ops
-
-    }
-
-    #'JUMP' => '0',
-    #'NAME' => 'end',
-    #'FLAGS' => {
-    #    '' => undef,
-    #    'flow' => undef,
-    #    'check_event' => undef,
-    #    'base_core' => undef
-    #},
-    #'ARGDIRS' => [],
-    #'TYPE' => 'inline',
-    #'CODE' => 0,
-    #'ARGS' => [],
-    #'BODY' => '#line 53 "src/ops/core.ops"
-    #{{=0}};
-    #',
-    #'LABELS' => []
-
-
-}
-
-=begin METHODS
-
-=item C<get_jump_flags>
-
-Process the body of this op to figure out which jump flags need to be set.
-
-=end METHODS
-
-method get_jump_flags($op) {
-    my %jumps;
-    my @jumps;
-
-    #figure out which control flow flags need to be set for this op
-    if (match( " 'goto' \s+ 'ADDRESS' ", ~$op)) {
-        %jumps{'PARROT_JUMP_ADDRESS'} := 1;
-    }
-
-    if (match( " 'goto' \s+ 'OFFSET' ", ~$op) ||
-        $op.name eq 'runinterp' ) {
-        %jumps{'PARROT_JUMP_RELATIVE'} := 1;
-    }
-
-    if (match( " 'goto' \s+ 'POP' ", ~$op)) {
-        %jumps{'PARROT_JUMP_POP'} := 1;
-    }
-
-    if (match( " 'expr' \s+ 'NEXT' ", ~$op) ||
-        $op.name eq 'runinterp' ) {
-        %jumps{'PARROT_JUMP_ENEXT'} := 1;
-    }
-
-    if (match( " 'restart' \s+ 'OFFSET' ", ~$op)) {
-        %jumps{'PARROT_JUMP_RELATIVE'} := 1;
-        %jumps{'PARROT_JUMP_RESTART'}  := 1;
-    }
-    elsif (match( " 'restart' \s+ 'OFFSET' ", ~$op)) {
-        %jumps{'PARROT_JUMP_RESTART'} := 1;
-        %jumps{'PARROT_JUMP_ENEXT'}   := 1;
-    }
-    elsif ($op.name eq 'branch_cs' || $op.name eq 'returncc' ) {
-        %jumps{'PARROT_JUMP_RESTART'} := 1;
-    }
-    elsif (match( " 'restart' \s+ 'ADDRESS' ", ~~$op)) {
-        %jumps{'PARROT_JUMP_RESTART'} := 1;
-        %jumps{'PARROT_JUMP_ENEXT'}   := 0;
-    }
-
-    #XXX: need to handle PARROT_JUMP_GNEXT
-
-    for %jumps {
-        if %jumps{$_} {
-            @jumps.push($_);
-        }
-    }
-
-    if + at jumps == 0 {
-        $op<jump_flags> := '0';
-    }
-    else {
-        $op<jump_flags> := join('|', @jumps);
-    }
-    say(~$op<jump_flags>);
-}
-
-
-
-my method _load_num_file() {
-    # slurp isn't very efficient. But extending NQP beyond bare minimum is not in scope.
-    my $buf := slurp(self<num_file>);
-    grammar NUM {
-        rule TOP { <op>+ }
-
-        rule op { $<name>=(\w+) $<number>=(\d+) }
-        token ws {
-            [
-            | \s+
-            | '#' \N*
-            ]*
-        }
-    }
-
-    #say("Parsing NUM");
-    my $ops := NUM.parse($buf);
-    #_dumper($ops);
-
-    my $prev := -1;
-    for $ops<op> {
-        my $name    := ~$_<name>;
-        my $number  := +$_<number>;
-        #say(@parts[0] ~ ' => ' ~@parts[1]);
-        if (+$number) eq $number {
-            if ($prev + 1 != $number) {
-                die("hole in ops.num before #$number");
-            }
-            if self<optable>.exists($name) {
-                die("duplicate opcode $name and $number");
-            }
-
-            $prev := $number;
-            self<optable>{$name} := $number;
-            if ( $number > self<max_op_num> ) {
-                self<max_op_num> := $number;
-            }
-        }
-    }
-
-    #_dumper(self<optable>);
-}
-
-method _load_skip_file() {
-    my $buf     := slurp(self<skip_file>);
-    grammar SKIP {
-        rule TOP { <op>+ }
-
-        rule op { $<name>=(\w+) }
-        token ws {
-            [
-            | \s+
-            | '#' \N*
-            ]*
-        }
-    }
-
-    my $lines := SKIP.parse($buf);
-
-    for $lines<op> {
-        if self<optable>.exists($_<name>) {
-            die("skipped opcode '$_' is also in num_file");
-        }
-        self<skiptable>{$_<name>} := 1;
-    }
-}
-
-
-method _get_compiler() {
-    Q:PIR { 
-        %r = compreg 'Ops'
-    };
-}
-
-=begin ACCESSORS
-
-Various methods for accessing internals.
-
-=over 4
-
-=item * C<ops_past>
-
-=item * C<files>
-
-=item * C<max_op_num>
-
-=item * C<optable>
-
-=item * C<skiptable>
-
-=end ACCESSORS
-
-method ops_past() {
-    self<ops_past>;
-}
-
-method files() {
-    self<files>;
-}
-
-method max_op_num() {
-    self<max_op_num>;
-}
-
-method optable() {
-    self<optable>;
-}
-
-method skiptable() {
-    self<skiptable>;
-}
-
-
-# Local Variables:
-#   mode: perl6
-#   fill-column: 100
-# End:
-# vim: expandtab shiftwidth=4 ft=perl6:


More information about the parrot-commits mailing list