1 | #!/usr/bin/env python2
|
2 | """optview_gen.py."""
|
3 | from __future__ import print_function
|
4 |
|
5 | import sys
|
6 |
|
7 | from frontend import option_def
|
8 | #from core import optview
|
9 |
|
10 |
|
11 | def GenMethods(opt_names, f):
|
12 | for n in opt_names:
|
13 | f.write(' bool %s() { return _Get(option_i::%s); }\n' % (n, n))
|
14 |
|
15 |
|
16 | def main(argv):
|
17 | f = sys.stdout
|
18 |
|
19 | f.write("""\
|
20 | #ifndef OPTVIEW_H
|
21 | #define OPTVIEW_H
|
22 |
|
23 | #include "_gen/frontend/option.asdl.h"
|
24 | #include "mycpp/runtime.h"
|
25 |
|
26 | namespace optview {
|
27 |
|
28 | using option_asdl::option_i;
|
29 |
|
30 | class _View {
|
31 | public:
|
32 | _View(List<bool>* opt0_array, List<List<bool>*>* opt_stacks)
|
33 | : opt0_array(opt0_array), opt_stacks(opt_stacks) {
|
34 | }
|
35 |
|
36 | bool _Get(int opt_num) {
|
37 | List<bool>* overlay = opt_stacks->at(opt_num);
|
38 | if ((overlay == nullptr) or len(overlay) == 0) {
|
39 | return opt0_array->at(opt_num);
|
40 | } else {
|
41 | return overlay->at(-1);
|
42 | }
|
43 | }
|
44 |
|
45 | static constexpr ObjHeader obj_header() {
|
46 | return ObjHeader::ClassFixed(field_mask(), sizeof(_View));
|
47 | }
|
48 |
|
49 | List<bool>* opt0_array;
|
50 | List<List<bool>*>* opt_stacks;
|
51 |
|
52 | static constexpr uint32_t field_mask() {
|
53 | return
|
54 | maskbit(offsetof(_View, opt0_array))
|
55 | | maskbit(offsetof(_View, opt_stacks));
|
56 | }
|
57 | };
|
58 |
|
59 | class Parse : public _View {
|
60 | public:
|
61 | Parse(List<bool>* opt0_array, List<List<bool>*>* opt_stacks)
|
62 | : _View(opt0_array, opt_stacks) {
|
63 | }
|
64 | """)
|
65 |
|
66 | GenMethods(option_def.ParseOptNames(), f)
|
67 |
|
68 | f.write("""\
|
69 | };
|
70 |
|
71 | class Exec : public _View {
|
72 | public:
|
73 | Exec(List<bool>* opt0_array, List<List<bool>*>* opt_stacks)
|
74 | : _View(opt0_array, opt_stacks) {
|
75 | }
|
76 | """)
|
77 |
|
78 | GenMethods(option_def.ExecOptNames(), f)
|
79 |
|
80 | f.write("""\
|
81 | };
|
82 |
|
83 | } // namespace optview
|
84 |
|
85 | #endif // OPTVIEW_H
|
86 | """)
|
87 |
|
88 |
|
89 | if __name__ == '__main__':
|
90 | try:
|
91 | main(sys.argv)
|
92 | except RuntimeError as e:
|
93 | print('FATAL: %s' % e, file=sys.stderr)
|
94 | sys.exit(1)
|