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