rubinius-melbourne 3.7 → 3.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 *name; int id[2]; enum lex_state_e state;};
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 41
37
+ #define TOTAL_KEYWORDS 44
38
38
  #define MIN_WORD_LENGTH 2
39
39
  #define MAX_WORD_LENGTH 12
40
- #define MIN_HASH_VALUE 8
40
+ #define MIN_HASH_VALUE 7
41
41
  #define MAX_HASH_VALUE 50
42
- /* maximum key range = 43, duplicates = 0 */
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, 26, 51, 51, 14, 51, 16, 8,
55
- 11, 13, 51, 51, 51, 51, 10, 51, 13, 51,
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, 11, 51, 13, 1, 26,
58
- 4, 1, 8, 28, 51, 23, 51, 1, 1, 27,
59
- 5, 19, 21, 51, 8, 3, 3, 11, 51, 21,
60
- 24, 16, 51, 51, 51, 51, 51, 51, 51, 51,
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
- {"nil", {keyword_nil, keyword_nil}, EXPR_END},
96
+ {"elsif", {keyword_elsif, keyword_elsif}, EXPR_VALUE},
98
97
  {"ensure", {keyword_ensure, keyword_ensure}, EXPR_BEG},
99
- {"end", {keyword_end, keyword_end}, EXPR_END},
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
- {"return", {keyword_return, keyword_return}, EXPR_MID},
110
- {"def", {keyword_def, keyword_def}, EXPR_FNAME},
111
- {"and", {keyword_and, keyword_and}, EXPR_VALUE},
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
- {"in", {keyword_in, keyword_in}, EXPR_VALUE},
118
- {"when", {keyword_when, keyword_when}, EXPR_VALUE},
119
- {"retry", {keyword_retry, keyword_retry}, EXPR_END},
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
- {"case", {keyword_case, keyword_case}, EXPR_VALUE},
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
- {"while", {keyword_while, modifier_while}, EXPR_VALUE}
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
- if(key <= MAX_HASH_VALUE && key >= 0)
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
- if(*str == *s && !strcmp(str + 1, s + 1))
148
- return &wordlist[key];
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
- 527,
212
- 533,
213
- 539,
214
- 546,
215
- 553,
215
+ 526,
216
+ 530,
217
+ 535,
218
+ 541,
219
+ 548,
220
+ 554,
216
221
  560,
217
222
  567,
218
- 572,
219
- 577,
220
- 583,
221
- 589,
222
- 594,
223
+ 574,
224
+ 581,
225
+ 588,
226
+ 593,
223
227
  598,
224
- 603,
225
- 609,
226
- 617,
227
- 625,
228
- 633,
229
- 640,
230
- 648,
231
- 653,
232
- 659,
233
- 664,
234
- 676,
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
- 693,
237
- 700,
238
- 709,
242
+ 697,
243
+ 706,
239
244
  714,
240
- 719,
241
- 725,
242
- 732,
243
- 738,
244
- 747,
245
- 754,
246
- 763,
247
- 773
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 < 117) {
259
+ if(node < 121) {
252
260
  return node_types + node_types_offsets[node];
253
261
  } else {
254
262
  #define NODE_STRING_MESSAGE_LEN 20
@@ -83,6 +83,10 @@ namespace MELBOURNE {
83
83
  NODE_BLOCK_PASS,
84
84
  NODE_DEFN,
85
85
  NODE_DEFS,
86
+ NODE_DEFNM,
87
+ NODE_DEFSM,
88
+ NODE_FUN,
89
+ NODE_FUNM,
86
90
  NODE_ALIAS,
87
91
  NODE_VALIAS,
88
92
  NODE_UNDEF,
@@ -78,6 +78,10 @@ node_types = %w[
78
78
  block_pass
79
79
  defn
80
80
  defs
81
+ defnm
82
+ defsm
83
+ fun
84
+ funm
81
85
  alias
82
86
  valias
83
87
  undef
@@ -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");