mutant-melbourne 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/LICENSE +25 -0
  2. data/README.md +69 -0
  3. data/Rakefile +14 -0
  4. data/ext/melbourne/.gitignore +3 -0
  5. data/ext/melbourne/bstring-license.txt +29 -0
  6. data/ext/melbourne/bstrlib.c +2687 -0
  7. data/ext/melbourne/bstrlib.h +267 -0
  8. data/ext/melbourne/encoding_compat.cpp +188 -0
  9. data/ext/melbourne/encoding_compat.hpp +57 -0
  10. data/ext/melbourne/extconf.rb +87 -0
  11. data/ext/melbourne/grammar18.cpp +11280 -0
  12. data/ext/melbourne/grammar18.hpp +13 -0
  13. data/ext/melbourne/grammar18.y +6088 -0
  14. data/ext/melbourne/grammar19.cpp +12420 -0
  15. data/ext/melbourne/grammar19.hpp +11 -0
  16. data/ext/melbourne/grammar19.y +7113 -0
  17. data/ext/melbourne/lex.c.blt +152 -0
  18. data/ext/melbourne/lex.c.tab +136 -0
  19. data/ext/melbourne/local_state.hpp +43 -0
  20. data/ext/melbourne/melbourne.cpp +88 -0
  21. data/ext/melbourne/melbourne.hpp +19 -0
  22. data/ext/melbourne/node18.hpp +262 -0
  23. data/ext/melbourne/node19.hpp +271 -0
  24. data/ext/melbourne/node_types.rb +304 -0
  25. data/ext/melbourne/node_types18.cpp +255 -0
  26. data/ext/melbourne/node_types18.hpp +129 -0
  27. data/ext/melbourne/node_types19.cpp +249 -0
  28. data/ext/melbourne/node_types19.hpp +126 -0
  29. data/ext/melbourne/parser_state18.hpp +181 -0
  30. data/ext/melbourne/parser_state19.hpp +251 -0
  31. data/ext/melbourne/quark.cpp +42 -0
  32. data/ext/melbourne/quark.hpp +45 -0
  33. data/ext/melbourne/symbols.cpp +224 -0
  34. data/ext/melbourne/symbols.hpp +119 -0
  35. data/ext/melbourne/var_table18.cpp +83 -0
  36. data/ext/melbourne/var_table18.hpp +33 -0
  37. data/ext/melbourne/var_table19.cpp +65 -0
  38. data/ext/melbourne/var_table19.hpp +35 -0
  39. data/ext/melbourne/visitor18.cpp +963 -0
  40. data/ext/melbourne/visitor18.hpp +12 -0
  41. data/ext/melbourne/visitor19.cpp +960 -0
  42. data/ext/melbourne/visitor19.hpp +15 -0
  43. data/lib/compiler/ast/constants.rb +81 -0
  44. data/lib/compiler/ast/control_flow.rb +290 -0
  45. data/lib/compiler/ast/data.rb +14 -0
  46. data/lib/compiler/ast/definitions.rb +749 -0
  47. data/lib/compiler/ast/encoding.rb +18 -0
  48. data/lib/compiler/ast/exceptions.rb +138 -0
  49. data/lib/compiler/ast/file.rb +11 -0
  50. data/lib/compiler/ast/grapher.rb +89 -0
  51. data/lib/compiler/ast/literals.rb +207 -0
  52. data/lib/compiler/ast/node.rb +362 -0
  53. data/lib/compiler/ast/operators.rb +106 -0
  54. data/lib/compiler/ast/self.rb +15 -0
  55. data/lib/compiler/ast/sends.rb +615 -0
  56. data/lib/compiler/ast/transforms.rb +298 -0
  57. data/lib/compiler/ast/values.rb +88 -0
  58. data/lib/compiler/ast/variables.rb +351 -0
  59. data/lib/compiler/ast.rb +20 -0
  60. data/lib/compiler/locals.rb +109 -0
  61. data/lib/melbourne/processor.rb +651 -0
  62. data/lib/melbourne/version.rb +3 -0
  63. data/lib/melbourne.rb +143 -0
  64. metadata +112 -0
@@ -0,0 +1,249 @@
1
+ /* This file is generated by node_types.rb. Do not edit. */
2
+
3
+ #include "node_types19.hpp"
4
+
5
+ #include <stdio.h>
6
+
7
+ namespace melbourne {
8
+ namespace grammar19 {
9
+ static const char node_types[] = {
10
+ "scope\0"
11
+ "block\0"
12
+ "if\0"
13
+ "case\0"
14
+ "when\0"
15
+ "opt_n\0"
16
+ "while\0"
17
+ "until\0"
18
+ "iter\0"
19
+ "for\0"
20
+ "break\0"
21
+ "next\0"
22
+ "redo\0"
23
+ "retry\0"
24
+ "begin\0"
25
+ "rescue\0"
26
+ "resbody\0"
27
+ "ensure\0"
28
+ "and\0"
29
+ "or\0"
30
+ "masgn\0"
31
+ "lasgn\0"
32
+ "dasgn\0"
33
+ "dasgn_curr\0"
34
+ "gasgn\0"
35
+ "iasgn\0"
36
+ "iasgn2\0"
37
+ "cdecl\0"
38
+ "cvasgn\0"
39
+ "cvdecl\0"
40
+ "op_asgn1\0"
41
+ "op_asgn2\0"
42
+ "op_asgn_and\0"
43
+ "op_asgn_or\0"
44
+ "call\0"
45
+ "fcall\0"
46
+ "vcall\0"
47
+ "super\0"
48
+ "zsuper\0"
49
+ "array\0"
50
+ "zarray\0"
51
+ "values\0"
52
+ "hash\0"
53
+ "return\0"
54
+ "yield\0"
55
+ "lvar\0"
56
+ "dvar\0"
57
+ "gvar\0"
58
+ "ivar\0"
59
+ "const\0"
60
+ "cvar\0"
61
+ "nth_ref\0"
62
+ "back_ref\0"
63
+ "match\0"
64
+ "match2\0"
65
+ "match3\0"
66
+ "lit\0"
67
+ "str\0"
68
+ "dstr\0"
69
+ "xstr\0"
70
+ "dxstr\0"
71
+ "evstr\0"
72
+ "dregx\0"
73
+ "dregx_once\0"
74
+ "args\0"
75
+ "args_aux\0"
76
+ "opt_arg\0"
77
+ "postarg\0"
78
+ "argscat\0"
79
+ "argspush\0"
80
+ "splat\0"
81
+ "to_ary\0"
82
+ "block_arg\0"
83
+ "block_pass\0"
84
+ "defn\0"
85
+ "defs\0"
86
+ "alias\0"
87
+ "valias\0"
88
+ "undef\0"
89
+ "class\0"
90
+ "module\0"
91
+ "sclass\0"
92
+ "colon2\0"
93
+ "colon3\0"
94
+ "dot2\0"
95
+ "dot3\0"
96
+ "flip2\0"
97
+ "flip3\0"
98
+ "self\0"
99
+ "nil\0"
100
+ "true\0"
101
+ "false\0"
102
+ "errinfo\0"
103
+ "defined\0"
104
+ "postexe\0"
105
+ "alloca\0"
106
+ "bmethod\0"
107
+ "memo\0"
108
+ "ifunc\0"
109
+ "dsym\0"
110
+ "attrasgn\0"
111
+ "prelude\0"
112
+ "lambda\0"
113
+ "optblock\0"
114
+ "last\0"
115
+ "file\0"
116
+ "regex\0"
117
+ "number\0"
118
+ "float\0"
119
+ "encoding\0"
120
+ "preexe\0"
121
+ };
122
+
123
+ static const unsigned short node_types_offsets[] = {
124
+ 0,
125
+ 6,
126
+ 12,
127
+ 15,
128
+ 20,
129
+ 25,
130
+ 31,
131
+ 37,
132
+ 43,
133
+ 48,
134
+ 52,
135
+ 58,
136
+ 63,
137
+ 68,
138
+ 74,
139
+ 80,
140
+ 87,
141
+ 95,
142
+ 102,
143
+ 106,
144
+ 109,
145
+ 115,
146
+ 121,
147
+ 127,
148
+ 138,
149
+ 144,
150
+ 150,
151
+ 157,
152
+ 163,
153
+ 170,
154
+ 177,
155
+ 186,
156
+ 195,
157
+ 207,
158
+ 218,
159
+ 223,
160
+ 229,
161
+ 235,
162
+ 241,
163
+ 248,
164
+ 254,
165
+ 261,
166
+ 268,
167
+ 273,
168
+ 280,
169
+ 286,
170
+ 291,
171
+ 296,
172
+ 301,
173
+ 306,
174
+ 312,
175
+ 317,
176
+ 325,
177
+ 334,
178
+ 340,
179
+ 347,
180
+ 354,
181
+ 358,
182
+ 362,
183
+ 367,
184
+ 372,
185
+ 378,
186
+ 384,
187
+ 390,
188
+ 401,
189
+ 406,
190
+ 415,
191
+ 423,
192
+ 431,
193
+ 439,
194
+ 448,
195
+ 454,
196
+ 461,
197
+ 471,
198
+ 482,
199
+ 487,
200
+ 492,
201
+ 498,
202
+ 505,
203
+ 511,
204
+ 517,
205
+ 524,
206
+ 531,
207
+ 538,
208
+ 545,
209
+ 550,
210
+ 555,
211
+ 561,
212
+ 567,
213
+ 572,
214
+ 576,
215
+ 581,
216
+ 587,
217
+ 595,
218
+ 603,
219
+ 611,
220
+ 618,
221
+ 626,
222
+ 631,
223
+ 637,
224
+ 642,
225
+ 651,
226
+ 659,
227
+ 666,
228
+ 675,
229
+ 680,
230
+ 685,
231
+ 691,
232
+ 698,
233
+ 704,
234
+ 713,
235
+ 720
236
+ };
237
+
238
+ const char *get_node_type_string(enum node_type node) {
239
+ if(node < 111) {
240
+ return node_types + node_types_offsets[node];
241
+ } else {
242
+ #define NODE_STRING_MESSAGE_LEN 20
243
+ static char msg[NODE_STRING_MESSAGE_LEN];
244
+ snprintf(msg, NODE_STRING_MESSAGE_LEN, "unknown node type: %d", node);
245
+ return msg;
246
+ }
247
+ }
248
+ }; // namespace grammar19
249
+ }; // namespace melbourne
@@ -0,0 +1,126 @@
1
+ #ifndef MEL_NODE_TYPES19_HPP
2
+ #define MEL_NODE_TYPES19_HPP
3
+ /* This file is generated by node_types.rb. Do not edit. */
4
+
5
+ namespace melbourne {
6
+ namespace grammar19 {
7
+ enum node_type {
8
+ NODE_SCOPE,
9
+ NODE_BLOCK,
10
+ NODE_IF,
11
+ NODE_CASE,
12
+ NODE_WHEN,
13
+ NODE_OPT_N,
14
+ NODE_WHILE,
15
+ NODE_UNTIL,
16
+ NODE_ITER,
17
+ NODE_FOR,
18
+ NODE_BREAK,
19
+ NODE_NEXT,
20
+ NODE_REDO,
21
+ NODE_RETRY,
22
+ NODE_BEGIN,
23
+ NODE_RESCUE,
24
+ NODE_RESBODY,
25
+ NODE_ENSURE,
26
+ NODE_AND,
27
+ NODE_OR,
28
+ NODE_MASGN,
29
+ NODE_LASGN,
30
+ NODE_DASGN,
31
+ NODE_DASGN_CURR,
32
+ NODE_GASGN,
33
+ NODE_IASGN,
34
+ NODE_IASGN2,
35
+ NODE_CDECL,
36
+ NODE_CVASGN,
37
+ NODE_CVDECL,
38
+ NODE_OP_ASGN1,
39
+ NODE_OP_ASGN2,
40
+ NODE_OP_ASGN_AND,
41
+ NODE_OP_ASGN_OR,
42
+ NODE_CALL,
43
+ NODE_FCALL,
44
+ NODE_VCALL,
45
+ NODE_SUPER,
46
+ NODE_ZSUPER,
47
+ NODE_ARRAY,
48
+ NODE_ZARRAY,
49
+ NODE_VALUES,
50
+ NODE_HASH,
51
+ NODE_RETURN,
52
+ NODE_YIELD,
53
+ NODE_LVAR,
54
+ NODE_DVAR,
55
+ NODE_GVAR,
56
+ NODE_IVAR,
57
+ NODE_CONST,
58
+ NODE_CVAR,
59
+ NODE_NTH_REF,
60
+ NODE_BACK_REF,
61
+ NODE_MATCH,
62
+ NODE_MATCH2,
63
+ NODE_MATCH3,
64
+ NODE_LIT,
65
+ NODE_STR,
66
+ NODE_DSTR,
67
+ NODE_XSTR,
68
+ NODE_DXSTR,
69
+ NODE_EVSTR,
70
+ NODE_DREGX,
71
+ NODE_DREGX_ONCE,
72
+ NODE_ARGS,
73
+ NODE_ARGS_AUX,
74
+ NODE_OPT_ARG,
75
+ NODE_POSTARG,
76
+ NODE_ARGSCAT,
77
+ NODE_ARGSPUSH,
78
+ NODE_SPLAT,
79
+ NODE_TO_ARY,
80
+ NODE_BLOCK_ARG,
81
+ NODE_BLOCK_PASS,
82
+ NODE_DEFN,
83
+ NODE_DEFS,
84
+ NODE_ALIAS,
85
+ NODE_VALIAS,
86
+ NODE_UNDEF,
87
+ NODE_CLASS,
88
+ NODE_MODULE,
89
+ NODE_SCLASS,
90
+ NODE_COLON2,
91
+ NODE_COLON3,
92
+ NODE_DOT2,
93
+ NODE_DOT3,
94
+ NODE_FLIP2,
95
+ NODE_FLIP3,
96
+ NODE_SELF,
97
+ NODE_NIL,
98
+ NODE_TRUE,
99
+ NODE_FALSE,
100
+ NODE_ERRINFO,
101
+ NODE_DEFINED,
102
+ NODE_POSTEXE,
103
+ NODE_ALLOCA,
104
+ NODE_BMETHOD,
105
+ NODE_MEMO,
106
+ NODE_IFUNC,
107
+ NODE_DSYM,
108
+ NODE_ATTRASGN,
109
+ NODE_PRELUDE,
110
+ NODE_LAMBDA,
111
+ NODE_OPTBLOCK,
112
+ NODE_LAST,
113
+ NODE_FILE,
114
+ NODE_REGEX,
115
+ NODE_NUMBER,
116
+ NODE_FLOAT,
117
+ NODE_ENCODING,
118
+ NODE_PREEXE
119
+ };
120
+
121
+ const char *get_node_type_string(enum node_type nt);
122
+
123
+ }; // namespace grammar19
124
+ }; // namespace melbourne
125
+
126
+ #endif
@@ -0,0 +1,181 @@
1
+ #ifndef MEL_PARSER_STATE18_HPP
2
+ #define MEL_PARSER_STATE18_HPP
3
+
4
+ #include "node18.hpp"
5
+ #include "node_types18.hpp"
6
+ #include "local_state.hpp"
7
+
8
+ #include <vector>
9
+ #include <list>
10
+
11
+ namespace melbourne {
12
+ namespace grammar18 {
13
+
14
+ enum lex_state_e {
15
+ EXPR_BEG, /* ignore newline, +/- is a sign. */
16
+ EXPR_END, /* newline significant, +/- is a operator. */
17
+ EXPR_ARG, /* newline significant, +/- is a operator. */
18
+ EXPR_CMDARG, /* newline significant, +/- is a operator. */
19
+ EXPR_ENDARG, /* newline significant, +/- is a operator. */
20
+ EXPR_MID, /* newline significant, +/- is a operator. */
21
+ EXPR_FNAME, /* ignore newline, no reserved words. */
22
+ EXPR_DOT, /* right after `.' or `::', no reserved words. */
23
+ EXPR_CLASS, /* immediate after `class', no here document. */
24
+ };
25
+
26
+ typedef VALUE stack_type;
27
+
28
+ struct StartPosition {
29
+ int line;
30
+ const char* kind;
31
+
32
+ StartPosition(int l, const char* k)
33
+ : line(l)
34
+ , kind(k)
35
+ {}
36
+ };
37
+
38
+ typedef struct rb_parser_state {
39
+ int end_seen;
40
+ int debug_lines;
41
+ int heredoc_end;
42
+ int command_start;
43
+ NODE *lex_strterm;
44
+ int paren_nest;
45
+ int lpar_beg;
46
+ int class_nest;
47
+ int in_single;
48
+ int in_def;
49
+ int compile_for_eval;
50
+ ID cur_mid;
51
+ char *token_buffer;
52
+ int tokidx;
53
+ int toksiz;
54
+ int emit_warnings;
55
+ /* Mirror'ing the 1.8 parser, There are 2 input methods,
56
+ from IO and directly from a string. */
57
+
58
+ /* this function reads a line from lex_io and stores it in
59
+ * line_buffer.
60
+ */
61
+ bool (*lex_gets)(rb_parser_state*);
62
+ bstring line_buffer;
63
+
64
+ /* If this is set, we use the io method. */
65
+ FILE *lex_io;
66
+ /* Otherwise, we use this. */
67
+ bstring lex_string;
68
+ bstring lex_lastline;
69
+ bstring lex_nextline;
70
+
71
+ char *lex_pbeg;
72
+ char *lex_p;
73
+ char *lex_pend;
74
+ int lex_str_used;
75
+
76
+ enum lex_state_e lex_state;
77
+ int in_defined;
78
+ stack_type cond_stack;
79
+ stack_type cmdarg_stack;
80
+
81
+ void *lval; /* the parser's yylval */
82
+ bool eofp;
83
+
84
+ std::vector<bstring>* magic_comments;
85
+ int column;
86
+ NODE *top_node;
87
+
88
+ LocalState* variables;
89
+
90
+ int ternary_colon;
91
+
92
+ void **memory_pools;
93
+ int pool_size, current_pool;
94
+ char *memory_cur;
95
+ char *memory_last_addr;
96
+ int memory_size;
97
+
98
+ bool verbose;
99
+
100
+ bool parse_error;
101
+ VALUE processor;
102
+
103
+ char *ruby_sourcefile;
104
+ int ruby_sourceline;
105
+
106
+ // Keeps track of lines that 'end' starters are on, to enable
107
+ // better error reporting.
108
+ std::list<StartPosition>* start_lines;
109
+
110
+ // Tracks quarks
111
+ quark_map* quark_indexes;
112
+ quark_vector* quarks;
113
+ } rb_parser_state;
114
+
115
+
116
+ #define PARSER_STATE ((rb_parser_state*)parser_state)
117
+ #define PARSER_VAR(var) (PARSER_STATE->var)
118
+
119
+ #define end_seen PARSER_VAR(end_seen)
120
+ #define ruby__end__seen PARSER_VAR(ruby__end__seen)
121
+ #define ruby_debug_lines PARSER_VAR(debug_lines)
122
+ #define heredoc_end PARSER_VAR(heredoc_end)
123
+ #define command_start PARSER_VAR(command_start)
124
+ #define lex_strterm PARSER_VAR(lex_strterm)
125
+ #define paren_nest PARSER_VAR(paren_nest)
126
+ #define lpar_beg PARSER_VAR(lpar_beg)
127
+ #define class_nest PARSER_VAR(class_nest)
128
+ #define in_single PARSER_VAR(in_single)
129
+ #define in_def PARSER_VAR(in_def)
130
+ #define compile_for_eval PARSER_VAR(compile_for_eval)
131
+ #define cur_mid PARSER_VAR(cur_mid)
132
+ #define tokenbuf PARSER_VAR(token_buffer)
133
+ #define tokidx PARSER_VAR(tokidx)
134
+ #define toksiz PARSER_VAR(toksiz)
135
+ #define emit_warnings PARSER_VAR(emit_warnings)
136
+ #define lex_gets PARSER_VAR(lex_gets)
137
+ #define line_buffer PARSER_VAR(line_buffer)
138
+ #define line_count PARSER_VAR(line_count)
139
+ #define lex_io PARSER_VAR(lex_io)
140
+ #define lex_string PARSER_VAR(lex_string)
141
+ #define lex_gets_ptr PARSER_VAR(lex_gets_ptr)
142
+ #define lex_input PARSER_VAR(lex_input)
143
+ #define lex_lastline PARSER_VAR(lex_lastline)
144
+ #define lex_nextline PARSER_VAR(lex_nextline)
145
+ #define lex_pbeg PARSER_VAR(lex_pbeg)
146
+ #define lex_p PARSER_VAR(lex_p)
147
+ #define lex_pend PARSER_VAR(lex_pend)
148
+ #define lex_str_used PARSER_VAR(lex_str_used)
149
+ #define lex_state PARSER_VAR(lex_state)
150
+ #define in_defined PARSER_VAR(in_defined)
151
+ #define cond_stack PARSER_VAR(cond_stack)
152
+ #define cmdarg_stack PARSER_VAR(cmdarg_stack)
153
+ #define lval PARSER_VAR(lval)
154
+ #define eofp PARSER_VAR(eofp)
155
+ #define magic_comments PARSER_VAR(magic_comments)
156
+ #define column PARSER_VAR(column)
157
+ #define top_node PARSER_VAR(top_node)
158
+ #define variables PARSER_VAR(variables)
159
+ #define ternary_colon PARSER_VAR(ternary_colon)
160
+ #define memory_pools PARSER_VAR(memory_pools)
161
+ #define pool_size PARSER_VAR(pool_size)
162
+ #define current_pool PARSER_VAR(current_pool)
163
+ #define memory_cur PARSER_VAR(memory_cur)
164
+ #define memory_last_addr PARSER_VAR(memory_last_addr)
165
+ #define memory_size PARSER_VAR(memory_size)
166
+ #define verbose PARSER_VAR(verbose)
167
+ #define parse_error PARSER_VAR(parse_error)
168
+ #define processor PARSER_VAR(processor)
169
+ #define start_lines PARSER_VAR(start_lines)
170
+ #define ruby_sourcefile PARSER_VAR(ruby_sourcefile)
171
+ #define ruby_sourceline PARSER_VAR(ruby_sourceline)
172
+ #define quark_indexes PARSER_VAR(quark_indexes)
173
+ #define quarks PARSER_VAR(quarks)
174
+
175
+ #define node_newnode(t, a, b, c) parser_node_newnode((rb_parser_state*)parser_state, t, a, b, c)
176
+
177
+ quark id_to_quark(rb_parser_state* parser_state, QUID id);
178
+ }; // namespace grammar18
179
+ }; // namespace melbourne
180
+
181
+ #endif