rubinius-melbourne 3.7 → 3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/rubinius/code/melbourne/defs/keywords +56 -0
- data/ext/rubinius/code/melbourne/grammar.cpp +4285 -4053
- data/ext/rubinius/code/melbourne/grammar.y +103 -0
- data/ext/rubinius/code/melbourne/lex.c.blt +45 -45
- data/ext/rubinius/code/melbourne/node.hpp +4 -0
- data/ext/rubinius/code/melbourne/node_types.cpp +41 -33
- data/ext/rubinius/code/melbourne/node_types.hpp +4 -0
- data/ext/rubinius/code/melbourne/node_types.rb +4 -0
- data/ext/rubinius/code/melbourne/symbols.cpp +8 -0
- data/ext/rubinius/code/melbourne/symbols.hpp +4 -0
- data/ext/rubinius/code/melbourne/visitor.cpp +37 -0
- data/lib/rubinius/code/melbourne/version.rb +1 -1
- metadata +3 -2
@@ -451,6 +451,9 @@ static int scan_hex(const char *start, size_t len, size_t *retlen);
|
|
451
451
|
keyword_class
|
452
452
|
keyword_module
|
453
453
|
keyword_def
|
454
|
+
keyword_defm
|
455
|
+
keyword_fun
|
456
|
+
keyword_funm
|
454
457
|
keyword_undef
|
455
458
|
keyword_begin
|
456
459
|
keyword_rescue
|
@@ -1251,6 +1254,7 @@ reswords : keyword__LINE__ | keyword__FILE__ | keyword__ENCODING__
|
|
1251
1254
|
| keyword_BEGIN | keyword_END
|
1252
1255
|
| keyword_alias | keyword_and | keyword_begin
|
1253
1256
|
| keyword_break | keyword_case | keyword_class | keyword_def
|
1257
|
+
| keyword_defm | keyword_fun | keyword_funm
|
1254
1258
|
| keyword_defined | keyword_do | keyword_else | keyword_elsif
|
1255
1259
|
| keyword_end | keyword_ensure | keyword_false
|
1256
1260
|
| keyword_for | keyword_in | keyword_module | keyword_next
|
@@ -1887,6 +1891,60 @@ primary : literal
|
|
1887
1891
|
in_def--;
|
1888
1892
|
cur_mid = $<id>3;
|
1889
1893
|
}
|
1894
|
+
| k_defm fname
|
1895
|
+
{
|
1896
|
+
$<id>$ = cur_mid;
|
1897
|
+
cur_mid = $2;
|
1898
|
+
in_def++;
|
1899
|
+
local_push(0);
|
1900
|
+
}
|
1901
|
+
f_arglist
|
1902
|
+
bodystmt
|
1903
|
+
k_end
|
1904
|
+
{
|
1905
|
+
NODE* body = remove_begin($5);
|
1906
|
+
$$ = NEW_DEFNM($2, $4, body, NOEX_PRIVATE);
|
1907
|
+
nd_set_line($$, $<num>1);
|
1908
|
+
local_pop();
|
1909
|
+
in_def--;
|
1910
|
+
cur_mid = $<id>3;
|
1911
|
+
}
|
1912
|
+
| k_fun fname
|
1913
|
+
{
|
1914
|
+
$<id>$ = cur_mid;
|
1915
|
+
cur_mid = $2;
|
1916
|
+
in_def++;
|
1917
|
+
local_push(0);
|
1918
|
+
}
|
1919
|
+
f_arglist
|
1920
|
+
bodystmt
|
1921
|
+
k_end
|
1922
|
+
{
|
1923
|
+
NODE* body = remove_begin($5);
|
1924
|
+
$$ = NEW_FUN($2, $4, body, NOEX_PRIVATE);
|
1925
|
+
nd_set_line($$, $<num>1);
|
1926
|
+
local_pop();
|
1927
|
+
in_def--;
|
1928
|
+
cur_mid = $<id>3;
|
1929
|
+
}
|
1930
|
+
| k_funm fname
|
1931
|
+
{
|
1932
|
+
$<id>$ = cur_mid;
|
1933
|
+
cur_mid = $2;
|
1934
|
+
in_def++;
|
1935
|
+
local_push(0);
|
1936
|
+
}
|
1937
|
+
f_arglist
|
1938
|
+
bodystmt
|
1939
|
+
k_end
|
1940
|
+
{
|
1941
|
+
NODE* body = remove_begin($5);
|
1942
|
+
$$ = NEW_FUNM($2, $4, body, NOEX_PRIVATE);
|
1943
|
+
nd_set_line($$, $<num>1);
|
1944
|
+
local_pop();
|
1945
|
+
in_def--;
|
1946
|
+
cur_mid = $<id>3;
|
1947
|
+
}
|
1890
1948
|
| k_def singleton dot_or_colon {SET_LEX_STATE(EXPR_FNAME);} fname
|
1891
1949
|
{
|
1892
1950
|
$<num>4 = in_single;
|
@@ -1907,6 +1965,26 @@ primary : literal
|
|
1907
1965
|
in_single = $<num>4 & 1;
|
1908
1966
|
current_arg = $<id>6;
|
1909
1967
|
}
|
1968
|
+
| k_defm singleton dot_or_colon {SET_LEX_STATE(EXPR_FNAME);} fname
|
1969
|
+
{
|
1970
|
+
$<num>4 = in_single;
|
1971
|
+
in_single = 1;
|
1972
|
+
SET_LEX_STATE(EXPR_ENDFN | EXPR_LABEL); /* force for args */
|
1973
|
+
local_push(0);
|
1974
|
+
$<id>$ = current_arg;
|
1975
|
+
current_arg = 0;
|
1976
|
+
}
|
1977
|
+
f_arglist
|
1978
|
+
bodystmt
|
1979
|
+
k_end
|
1980
|
+
{
|
1981
|
+
NODE* body = remove_begin($8);
|
1982
|
+
$$ = NEW_DEFSM($2, $5, $7, body);
|
1983
|
+
nd_set_line($$, $<num>1);
|
1984
|
+
local_pop();
|
1985
|
+
in_single = $<num>4 & 1;
|
1986
|
+
current_arg = $<id>6;
|
1987
|
+
}
|
1910
1988
|
| keyword_break
|
1911
1989
|
{
|
1912
1990
|
$$ = NEW_BREAK(0);
|
@@ -1994,6 +2072,27 @@ k_def : keyword_def
|
|
1994
2072
|
}
|
1995
2073
|
;
|
1996
2074
|
|
2075
|
+
k_defm : keyword_defm
|
2076
|
+
{
|
2077
|
+
token_info_push("defm");
|
2078
|
+
$<num>$ = sourceline;
|
2079
|
+
}
|
2080
|
+
;
|
2081
|
+
|
2082
|
+
k_fun : keyword_fun
|
2083
|
+
{
|
2084
|
+
token_info_push("fun");
|
2085
|
+
$<num>$ = sourceline;
|
2086
|
+
}
|
2087
|
+
;
|
2088
|
+
|
2089
|
+
k_funm : keyword_funm
|
2090
|
+
{
|
2091
|
+
token_info_push("funm");
|
2092
|
+
$<num>$ = sourceline;
|
2093
|
+
}
|
2094
|
+
;
|
2095
|
+
|
1997
2096
|
k_end : keyword_end
|
1998
2097
|
{
|
1999
2098
|
token_info_pop("end");
|
@@ -6419,6 +6518,10 @@ retry:
|
|
6419
6518
|
if(c == '\n') {
|
6420
6519
|
space_seen = 1;
|
6421
6520
|
goto retry; /* skip \\n */
|
6521
|
+
} else if(c == '(' || c == '{') {
|
6522
|
+
pushback(c);
|
6523
|
+
SET_LEX_STATE(EXPR_ENDFN);
|
6524
|
+
return tLAMBDA;
|
6422
6525
|
}
|
6423
6526
|
pushback(c);
|
6424
6527
|
return '\\';
|
@@ -28,18 +28,18 @@
|
|
28
28
|
error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
29
29
|
#endif
|
30
30
|
|
31
|
-
struct kwtable {const char
|
31
|
+
struct kwtable {const char* name; int id[2]; enum lex_state_e state;};
|
32
32
|
const struct kwtable *rb_reserved_word(const char *, unsigned int);
|
33
33
|
static const struct kwtable *reserved_word(const char *, unsigned int);
|
34
34
|
#define rb_reserved_word(str, len) reserved_word(str, len)
|
35
35
|
struct kwtable;
|
36
36
|
|
37
|
-
#define TOTAL_KEYWORDS
|
37
|
+
#define TOTAL_KEYWORDS 44
|
38
38
|
#define MIN_WORD_LENGTH 2
|
39
39
|
#define MAX_WORD_LENGTH 12
|
40
|
-
#define MIN_HASH_VALUE
|
40
|
+
#define MIN_HASH_VALUE 7
|
41
41
|
#define MAX_HASH_VALUE 50
|
42
|
-
/* maximum key range =
|
42
|
+
/* maximum key range = 44, duplicates = 0 */
|
43
43
|
|
44
44
|
static inline unsigned int hash(register const char* str, register unsigned int len)
|
45
45
|
{
|
@@ -51,13 +51,13 @@ static inline unsigned int hash(register const char* str, register unsigned int
|
|
51
51
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
52
52
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
53
53
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
54
|
-
51, 51, 51,
|
55
|
-
|
54
|
+
51, 51, 51, 30, 51, 51, 15, 51, 18, 10,
|
55
|
+
12, 14, 51, 51, 51, 51, 11, 51, 14, 51,
|
56
56
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
57
|
-
51, 51, 51, 51, 51,
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
51, 51, 51, 51, 51, 12, 51, 6, 4, 35,
|
58
|
+
11, 1, 1, 29, 51, 27, 51, 3, 4, 20,
|
59
|
+
4, 10, 16, 51, 12, 1, 5, 8, 51, 12,
|
60
|
+
19, 18, 51, 51, 51, 51, 51, 51, 51, 51,
|
61
61
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
62
62
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
63
63
|
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
|
@@ -91,62 +91,62 @@ const struct kwtable* rb_reserved_word(register const char* str, register unsign
|
|
91
91
|
{
|
92
92
|
static const struct kwtable wordlist[] =
|
93
93
|
{
|
94
|
-
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
95
|
-
{"break", {keyword_break, keyword_break}, EXPR_MID},
|
94
|
+
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
96
95
|
{"else", {keyword_else, keyword_else}, EXPR_BEG},
|
97
|
-
{"
|
96
|
+
{"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE},
|
98
97
|
{"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG},
|
99
|
-
{"
|
98
|
+
{"self", {keyword_self, keyword_self}, EXPR_END},
|
99
|
+
{"false", {keyword_false, keyword_false}, EXPR_END},
|
100
|
+
{"fun", {keyword_fun, keyword_fun}, EXPR_FNAME},
|
101
|
+
{"break", {keyword_break, keyword_break}, EXPR_MID},
|
100
102
|
{"then", {keyword_then, keyword_then}, EXPR_BEG},
|
103
|
+
{"nil", {keyword_nil, keyword_nil}, EXPR_END},
|
104
|
+
{"def", {keyword_def, keyword_def}, EXPR_FNAME},
|
101
105
|
{"not", {keyword_not, keyword_not}, EXPR_ARG},
|
102
|
-
{"false", {keyword_false, keyword_false}, EXPR_END},
|
103
|
-
{"self", {keyword_self, keyword_self}, EXPR_END},
|
104
|
-
{"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE},
|
105
|
-
{"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID},
|
106
106
|
{"true", {keyword_true, keyword_true}, EXPR_END},
|
107
|
-
{"until", {keyword_until, modifier_until}, EXPR_VALUE},
|
108
107
|
{"unless", {keyword_unless, modifier_unless}, EXPR_VALUE},
|
109
|
-
{"
|
110
|
-
{"
|
111
|
-
{"
|
108
|
+
{"rescue", {keyword_rescue, modifier_rescue}, EXPR_MID},
|
109
|
+
{"when", {keyword_when, keyword_when}, EXPR_VALUE},
|
110
|
+
{"until", {keyword_until, modifier_until}, EXPR_VALUE},
|
112
111
|
{"do", {keyword_do, keyword_do}, EXPR_BEG},
|
113
|
-
{"yield", {keyword_yield, keyword_yield}, EXPR_ARG},
|
114
|
-
{"for", {keyword_for, keyword_for}, EXPR_VALUE},
|
115
|
-
{"undef", {keyword_undef, keyword_undef}, EXPR_FNAME},
|
116
112
|
{"or", {keyword_or, keyword_or}, EXPR_VALUE},
|
117
|
-
{"
|
118
|
-
{"
|
119
|
-
{"
|
113
|
+
{"undef", {keyword_undef, keyword_undef}, EXPR_FNAME},
|
114
|
+
{"end", {keyword_end, keyword_end}, EXPR_END},
|
115
|
+
{"return", {keyword_return, keyword_return}, EXPR_MID},
|
116
|
+
{"for", {keyword_for, keyword_for}, EXPR_VALUE},
|
117
|
+
{"funm", {keyword_funm, keyword_funm}, EXPR_FNAME},
|
120
118
|
{"if", {keyword_if, modifier_if}, EXPR_VALUE},
|
121
|
-
{"
|
122
|
-
{"redo", {keyword_redo, keyword_redo}, EXPR_END},
|
119
|
+
{"and", {keyword_and, keyword_and}, EXPR_VALUE},
|
123
120
|
{"next", {keyword_next, keyword_next}, EXPR_MID},
|
121
|
+
{"in", {keyword_in, keyword_in}, EXPR_VALUE},
|
124
122
|
{"super", {keyword_super, keyword_super}, EXPR_ARG},
|
123
|
+
{"yield", {keyword_yield, keyword_yield}, EXPR_ARG},
|
124
|
+
{"defm", {keyword_defm, keyword_defm}, EXPR_FNAME},
|
125
|
+
{"redo", {keyword_redo, keyword_redo}, EXPR_END},
|
125
126
|
{"module", {keyword_module, keyword_module}, EXPR_VALUE},
|
127
|
+
{"alias", {keyword_alias, keyword_alias}, EXPR_FNAME},
|
128
|
+
{"retry", {keyword_retry, keyword_retry}, EXPR_END},
|
129
|
+
{"case", {keyword_case, keyword_case}, EXPR_VALUE},
|
126
130
|
{"begin", {keyword_begin, keyword_begin}, EXPR_BEG},
|
127
131
|
{"__LINE__", {keyword__LINE__, keyword__LINE__}, EXPR_END},
|
128
132
|
{"__FILE__", {keyword__FILE__, keyword__FILE__}, EXPR_END},
|
133
|
+
{"while", {keyword_while, modifier_while}, EXPR_VALUE},
|
129
134
|
{"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},
|
130
|
-
{"END", {keyword_END, keyword_END}, EXPR_END},
|
131
|
-
{"alias", {keyword_alias, keyword_alias}, EXPR_FNAME},
|
132
|
-
{"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END},
|
133
|
-
{"defined?", {keyword_defined, keyword_defined}, EXPR_ARG},
|
134
135
|
{"class", {keyword_class, keyword_class}, EXPR_CLASS},
|
135
|
-
{""
|
136
|
-
{"
|
136
|
+
{"BEGIN", {keyword_BEGIN, keyword_BEGIN}, EXPR_END},
|
137
|
+
{"END", {keyword_END, keyword_END}, EXPR_END},
|
138
|
+
{"defined?", {keyword_defined, keyword_defined}, EXPR_ARG}
|
137
139
|
};
|
138
140
|
|
139
|
-
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
140
|
-
|
141
|
-
register int key = hash(str, len);
|
141
|
+
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) {
|
142
|
+
register int key = hash(str, len);
|
142
143
|
|
143
|
-
|
144
|
-
|
145
|
-
register const char *s = wordlist[key].name;
|
144
|
+
if(key <= MAX_HASH_VALUE && key >= 0) {
|
145
|
+
register const char *s = wordlist[key].name;
|
146
146
|
|
147
|
-
|
148
|
-
|
149
|
-
}
|
147
|
+
if(*str == *s && !strcmp (str + 1, s + 1))
|
148
|
+
return &wordlist[key];
|
150
149
|
}
|
150
|
+
}
|
151
151
|
return 0;
|
152
152
|
}
|
@@ -170,6 +170,10 @@ namespace MELBOURNE {
|
|
170
170
|
|
171
171
|
#define NEW_DEFN(i,a,d,p) NEW_NODE(NODE_DEFN,0,i,NEW_SCOPE(a,d))
|
172
172
|
#define NEW_DEFS(r,i,a,d) NEW_NODE(NODE_DEFS,r,i,NEW_SCOPE(a,d))
|
173
|
+
#define NEW_DEFNM(i,a,d,p) NEW_NODE(NODE_DEFNM,0,i,NEW_SCOPE(a,d))
|
174
|
+
#define NEW_DEFSM(r,i,a,d) NEW_NODE(NODE_DEFSM,r,i,NEW_SCOPE(a,d))
|
175
|
+
#define NEW_FUN(i,a,d,p) NEW_NODE(NODE_FUN,0,i,NEW_SCOPE(a,d))
|
176
|
+
#define NEW_FUNM(i,a,d,p) NEW_NODE(NODE_FUNM,0,i,NEW_SCOPE(a,d))
|
173
177
|
#define NEW_IFUNC(f,c) NEW_NODE(NODE_IFUNC,f,c,0)
|
174
178
|
#define NEW_SCOPE(a,b) NEW_NODE(NODE_SCOPE,local_tbl(),b,a)
|
175
179
|
#define NEW_BLOCK(a) NEW_NODE(NODE_BLOCK,a,0,0)
|
@@ -86,6 +86,10 @@ namespace MELBOURNE {
|
|
86
86
|
"block_pass\0"
|
87
87
|
"defn\0"
|
88
88
|
"defs\0"
|
89
|
+
"defnm\0"
|
90
|
+
"defsm\0"
|
91
|
+
"fun\0"
|
92
|
+
"funm\0"
|
89
93
|
"alias\0"
|
90
94
|
"valias\0"
|
91
95
|
"undef\0"
|
@@ -208,47 +212,51 @@ namespace MELBOURNE {
|
|
208
212
|
509,
|
209
213
|
514,
|
210
214
|
520,
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
215
|
+
526,
|
216
|
+
530,
|
217
|
+
535,
|
218
|
+
541,
|
219
|
+
548,
|
220
|
+
554,
|
216
221
|
560,
|
217
222
|
567,
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
594,
|
223
|
+
574,
|
224
|
+
581,
|
225
|
+
588,
|
226
|
+
593,
|
223
227
|
598,
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
228
|
+
604,
|
229
|
+
610,
|
230
|
+
615,
|
231
|
+
619,
|
232
|
+
624,
|
233
|
+
630,
|
234
|
+
638,
|
235
|
+
646,
|
236
|
+
654,
|
237
|
+
661,
|
238
|
+
669,
|
239
|
+
674,
|
240
|
+
680,
|
235
241
|
685,
|
236
|
-
|
237
|
-
|
238
|
-
709,
|
242
|
+
697,
|
243
|
+
706,
|
239
244
|
714,
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
245
|
+
721,
|
246
|
+
730,
|
247
|
+
735,
|
248
|
+
740,
|
249
|
+
746,
|
250
|
+
753,
|
251
|
+
759,
|
252
|
+
768,
|
253
|
+
775,
|
254
|
+
784,
|
255
|
+
794
|
248
256
|
};
|
249
257
|
|
250
258
|
const char *get_node_type_string(enum node_type node) {
|
251
|
-
if(node <
|
259
|
+
if(node < 121) {
|
252
260
|
return node_types + node_types_offsets[node];
|
253
261
|
} else {
|
254
262
|
#define NODE_STRING_MESSAGE_LEN 20
|
@@ -34,7 +34,9 @@ namespace MELBOURNE {
|
|
34
34
|
ID rb_sData;
|
35
35
|
ID rb_sDefined;
|
36
36
|
ID rb_sDefn;
|
37
|
+
ID rb_sDefnm;
|
37
38
|
ID rb_sDefs;
|
39
|
+
ID rb_sDefsm;
|
38
40
|
ID rb_sDot2;
|
39
41
|
ID rb_sDot3;
|
40
42
|
ID rb_sDRegx;
|
@@ -53,6 +55,8 @@ namespace MELBOURNE {
|
|
53
55
|
ID rb_sFlip3;
|
54
56
|
ID rb_sFloat;
|
55
57
|
ID rb_sFor;
|
58
|
+
ID rb_sFun;
|
59
|
+
ID rb_sFunm;
|
56
60
|
ID rb_sGAsgn;
|
57
61
|
ID rb_sGVar;
|
58
62
|
ID rb_sHash;
|
@@ -152,7 +156,9 @@ namespace MELBOURNE {
|
|
152
156
|
rb_sData = rb_intern("process_data");
|
153
157
|
rb_sDefined = rb_intern("process_defined");
|
154
158
|
rb_sDefn = rb_intern("process_defn");
|
159
|
+
rb_sDefnm = rb_intern("process_defnm");
|
155
160
|
rb_sDefs = rb_intern("process_defs");
|
161
|
+
rb_sDefsm = rb_intern("process_defsm");
|
156
162
|
rb_sDot2 = rb_intern("process_dot2");
|
157
163
|
rb_sDot3 = rb_intern("process_dot3");
|
158
164
|
rb_sDRegx = rb_intern("process_dregx");
|
@@ -171,6 +177,8 @@ namespace MELBOURNE {
|
|
171
177
|
rb_sFlip3 = rb_intern("process_flip3");
|
172
178
|
rb_sFloat = rb_intern("process_float");
|
173
179
|
rb_sFor = rb_intern("process_for");
|
180
|
+
rb_sFun = rb_intern("process_fun");
|
181
|
+
rb_sFunm = rb_intern("process_funm");
|
174
182
|
rb_sGAsgn = rb_intern("process_gasgn");
|
175
183
|
rb_sGVar = rb_intern("process_gvar");
|
176
184
|
rb_sHash = rb_intern("process_hash");
|