1#! nqp 2# Copyright (C) 2009-2010, Parrot Foundation. 3 4INIT { 5 pir::load_bytecode("dumper.pbc"); 6}; 7 8class Ops::OpLib is Hash; 9 10=begin NAME 11 12C<Ops::OpLib> - library of Parrot Operations. 13 14=end NAME 15 16=begin DESCRIPTION 17 18Responsible for loading F<src/ops/ops.skip> files, parse F<.ops> files, sort 19them, etc. 20 21Heavily inspired by Perl5 Parrot::Ops2pm. 22 23=end DESCRIPTION 24 25=begin SYNOPSIS 26 27 my $oplib := Ops::OpLib.new( 28 :skip_file('../../src/ops/ops.skip'), 29 )); 30 31=end SYNOPSIS 32 33=begin ATTRIBUTES 34 35=over 4 36 37=item * C<%.op_skip_table> 38 39Reference to a 'seen-hash' of skipped opcodes. 40 41 'op_skip_table' => { 42 'bor_i_ic_ic' => 1, 43 'xor_i_ic_ic' => 1, 44 'tanh_n_nc' => 1, 45 # ... 46 }, 47 48As F<src/ops/ops.skip> states, these are "... opcodes that should not ever to be 49generated or implemented because they are useless and/or silly." 50 51=back 52 53=end ATTRIBUTES 54 55=begin METHODS 56 57=over 4 58 59=item C<new> 60 61Build OpLib. 62 63(It's NQP. In Perl 6 it should be submethod and invoked automatically) 64 65=end METHODS 66 67method new(:$skip_file, :$quiet? = 0) { 68 self<skip_file> := $skip_file // './src/ops/ops.skip'; 69 self<quiet> := $quiet; 70 71 # Initialize self. 72 self<op_skip_table> := hash(); 73 self<ops_past> := list(); 74 self<regen_ops_num> := 0; 75 76 self.load_op_map_files(); 77 78 self; 79} 80 81=begin METHODS 82 83=item C<load_op_map_files> 84 85Load ops.skip. 86 87=end METHODS 88 89method load_op_map_files() { 90 self._load_skip_file; 91} 92 93method _load_skip_file() { 94 my $buf := slurp(self<skip_file>); 95 grammar SKIP { 96 rule TOP { <op>+ } 97 98 rule op { $<name>=(\w+) } 99 token ws { 100 [ 101 | \s+ 102 | '#' \N* 103 ]* 104 } 105 } 106 107 my $lines := SKIP.parse($buf); 108 109 for $lines<op> { 110 self<op_skip_table>{$_<name>} := 1; 111 } 112} 113 114 115=begin ACCESSORS 116 117Various methods for accessing internals. 118 119=over 4 120 121=item * C<op_skip_table> 122 123=end ACCESSORS 124 125method op_skip_table() { self<op_skip_table>; } 126 127# Local Variables: 128# mode: perl6 129# fill-column: 100 130# End: 131# vim: expandtab shiftwidth=4 ft=perl6: 132