@@ -61,6 +61,24 @@ if (polyglot_as_boolean(polyglot_invoke(RUBY_CEXT, "warning?"))) { \
61
61
} \
62
62
})
63
63
64
+ #define rb_tr_scan_args_kw (kw_flag , argc , argv , format , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 ) \
65
+ (RBIMPL_CONSTANT_P(format) ? \
66
+ __extension__ ({ \
67
+ static bool evaled; \
68
+ static int pre; \
69
+ static int optional; \
70
+ static bool rest; \
71
+ static int post; \
72
+ static bool kwargs; \
73
+ static bool block; \
74
+ if (!evaled) { \
75
+ rb_tr_scan_args_kw_parse(format, &pre, &optional, &rest, &post, &kwargs, &block); \
76
+ evaled = true; \
77
+ } \
78
+ rb_tr_scan_args_kw_int(kw_flag, argc, argv, pre, optional, rest, post, kwargs, block, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); \
79
+ }) : \
80
+ rb_tr_scan_args_kw_non_const(kw_flag, argc, argv, format, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10))
81
+
64
82
#define rb_tr_scan_args_kw_1 (KW_FLAG , ARGC , ARGV , FORMAT , V1 ) rb_tr_scan_args_kw(KW_FLAG, ARGC, ARGV, FORMAT, V1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
65
83
#define rb_tr_scan_args_kw_2 (KW_FLAG , ARGC , ARGV , FORMAT , V1 , V2 ) rb_tr_scan_args_kw(KW_FLAG, ARGC, ARGV, FORMAT, V1, V2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
66
84
#define rb_tr_scan_args_kw_3 (KW_FLAG , ARGC , ARGV , FORMAT , V1 , V2 , V3 ) rb_tr_scan_args_kw(KW_FLAG, ARGC, ARGV, FORMAT, V1, V2, V3, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
@@ -196,20 +214,10 @@ static inline char *rb_tr_string_value_cstr(VALUE *value_pointer) {
196
214
return RSTRING_PTR (string );
197
215
}
198
216
199
- ALWAYS_INLINE (static int rb_tr_scan_args_kw (int kw_flag , int argc , VALUE * argv , const char * format , VALUE * v1 , VALUE * v2 , VALUE * v3 , VALUE * v4 , VALUE * v5 , VALUE * v6 , VALUE * v7 , VALUE * v8 , VALUE * v9 , VALUE * v10 ));
200
- static inline int rb_tr_scan_args_kw (int kw_flag , int argc , VALUE * argv , const char * format , VALUE * v1 , VALUE * v2 , VALUE * v3 , VALUE * v4 , VALUE * v5 , VALUE * v6 , VALUE * v7 , VALUE * v8 , VALUE * v9 , VALUE * v10 ) {
201
-
202
- // TODO CS 7-Feb-17 maybe we could inline cache this part?
203
-
204
- const char * formatp = format ;
205
- int pre = 0 ;
206
- int optional = 0 ;
207
- bool rest ;
208
- int post = 0 ;
209
- bool kwargs ;
210
- bool block ;
217
+ void rb_tr_scan_args_kw_parse (const char * format , int * pre , int * optional , bool * rest , int * post , bool * kwargs , bool * block );
211
218
212
- // Interpret kw_flag
219
+ ALWAYS_INLINE (static int rb_tr_scan_args_kw_int (int kw_flag , int argc , VALUE * argv , int pre , int optional , bool rest , int post , bool kwargs , bool block , VALUE * v1 , VALUE * v2 , VALUE * v3 , VALUE * v4 , VALUE * v5 , VALUE * v6 , VALUE * v7 , VALUE * v8 , VALUE * v9 , VALUE * v10 ));
220
+ static inline int rb_tr_scan_args_kw_int (int kw_flag , int argc , VALUE * argv , int pre , int optional , bool rest , int post , bool kwargs , bool block , VALUE * v1 , VALUE * v2 , VALUE * v3 , VALUE * v4 , VALUE * v5 , VALUE * v6 , VALUE * v7 , VALUE * v8 , VALUE * v9 , VALUE * v10 ) {
213
221
214
222
int keyword_given = 0 ;
215
223
int last_hash_keyword = 0 ;
@@ -220,48 +228,6 @@ static inline int rb_tr_scan_args_kw(int kw_flag, int argc, VALUE *argv, const c
220
228
case RB_SCAN_ARGS_LAST_HASH_KEYWORDS : last_hash_keyword = 1 ; break ;
221
229
}
222
230
223
- // TODO CS 27-Feb-17 can LLVM constant-fold through isdigit?
224
-
225
- if (isdigit (* formatp )) {
226
- pre = * formatp - '0' ;
227
- formatp ++ ;
228
-
229
- if (isdigit (* formatp )) {
230
- optional = * formatp - '0' ;
231
- formatp ++ ;
232
- }
233
- }
234
-
235
- if (* formatp == '*' ) {
236
- rest = true;
237
- formatp ++ ;
238
- } else {
239
- rest = false;
240
- }
241
-
242
- if (isdigit (* formatp )) {
243
- post = * formatp - '0' ;
244
- formatp ++ ;
245
- }
246
-
247
- if (* formatp == ':' ) {
248
- kwargs = true;
249
- formatp ++ ;
250
- } else {
251
- kwargs = false;
252
- }
253
-
254
- if (* formatp == '&' ) {
255
- block = true;
256
- formatp ++ ;
257
- } else {
258
- block = false;
259
- }
260
-
261
- if (* formatp != '\0' ) {
262
- rb_raise (rb_eArgError , "bad rb_scan_args format" );
263
- }
264
-
265
231
// Check we have enough arguments
266
232
267
233
if (pre + post > argc ) {
@@ -425,6 +391,22 @@ static inline int rb_tr_scan_args_kw(int kw_flag, int argc, VALUE *argv, const c
425
391
return argc ;
426
392
}
427
393
394
+ ALWAYS_INLINE (static int rb_tr_scan_args_kw_non_const (int kw_flag , int argc , VALUE * argv , const char * format , VALUE * v1 , VALUE * v2 , VALUE * v3 , VALUE * v4 , VALUE * v5 , VALUE * v6 , VALUE * v7 , VALUE * v8 , VALUE * v9 , VALUE * v10 ));
395
+ static inline int rb_tr_scan_args_kw_non_const (int kw_flag , int argc , VALUE * argv , const char * format , VALUE * v1 , VALUE * v2 , VALUE * v3 , VALUE * v4 , VALUE * v5 , VALUE * v6 , VALUE * v7 , VALUE * v8 , VALUE * v9 , VALUE * v10 ) {
396
+
397
+ const char * formatp = format ;
398
+ int pre = 0 ;
399
+ int optional = 0 ;
400
+ bool rest ;
401
+ int post = 0 ;
402
+ bool kwargs ;
403
+ bool block ;
404
+
405
+ rb_tr_scan_args_kw_parse (format , & pre , & optional , & rest , & post , & kwargs , & block );
406
+
407
+ return rb_tr_scan_args_kw_int (kw_flag , argc , argv , pre , optional , rest , post , kwargs , block , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 );
408
+ }
409
+
428
410
#define rb_iv_get (obj , name ) \
429
411
(__builtin_constant_p(name) ? \
430
412
rb_ivar_get(obj, rb_intern(name)) : \
0 commit comments