1 /* -*- mode: C; buffer-read-only: t -*-
2 !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
3 This file is built by regen/feature.pl.
4 Any changes made here will be lost!
5 */
6
7
8 #ifndef PERL_FEATURE_H_
9 #define PERL_FEATURE_H_
10
11 #if defined(PERL_CORE) || defined (PERL_EXT)
12
13 #define HINT_FEATURE_SHIFT 26
14
15 #define FEATURE_BAREWORD_FILEHANDLES_BIT 0x0001
16 #define FEATURE_BITWISE_BIT 0x0002
17 #define FEATURE_CLASS_BIT 0x0004
18 #define FEATURE___SUB___BIT 0x0008
19 #define FEATURE_MYREF_BIT 0x0010
20 #define FEATURE_DEFER_BIT 0x0020
21 #define FEATURE_EVALBYTES_BIT 0x0040
22 #define FEATURE_MORE_DELIMS_BIT 0x0080
23 #define FEATURE_FC_BIT 0x0100
24 #define FEATURE_INDIRECT_BIT 0x0200
25 #define FEATURE_ISA_BIT 0x0400
26 #define FEATURE_MODULE_TRUE_BIT 0x0800
27 #define FEATURE_MULTIDIMENSIONAL_BIT 0x1000
28 #define FEATURE_POSTDEREF_QQ_BIT 0x2000
29 #define FEATURE_REFALIASING_BIT 0x4000
30 #define FEATURE_SAY_BIT 0x8000
31 #define FEATURE_SIGNATURES_BIT 0x10000
32 #define FEATURE_STATE_BIT 0x20000
33 #define FEATURE_SWITCH_BIT 0x40000
34 #define FEATURE_TRY_BIT 0x80000
35 #define FEATURE_UNIEVAL_BIT 0x100000
36 #define FEATURE_UNICODE_BIT 0x200000
37
38 #define FEATURE_BUNDLE_DEFAULT 0
39 #define FEATURE_BUNDLE_510 1
40 #define FEATURE_BUNDLE_511 2
41 #define FEATURE_BUNDLE_515 3
42 #define FEATURE_BUNDLE_523 4
43 #define FEATURE_BUNDLE_527 5
44 #define FEATURE_BUNDLE_535 6
45 #define FEATURE_BUNDLE_537 7
46 #define FEATURE_BUNDLE_539 8
47 #define FEATURE_BUNDLE_CUSTOM (HINT_FEATURE_MASK >> HINT_FEATURE_SHIFT)
48
49 /* this is preserved for testing and asserts */
50 #define OLD_CURRENT_HINTS \
51 (PL_curcop == &PL_compiling ? PL_hints : PL_curcop->cop_hints)
52 /* this is the same thing, but simpler (no if) as PL_hints expands
53 to PL_compiling.cop_hints */
54 #define CURRENT_HINTS \
55 PL_curcop->cop_hints
56 #define CURRENT_FEATURE_BUNDLE \
57 ((CURRENT_HINTS & HINT_FEATURE_MASK) >> HINT_FEATURE_SHIFT)
58
59 #define FEATURE_IS_ENABLED_MASK(mask) \
60 ((CURRENT_HINTS & HINT_LOCALIZE_HH) \
61 ? (PL_curcop->cop_features & (mask)) : FALSE)
62
63 /* The longest string we pass in. */
64 #define MAX_FEATURE_LEN (sizeof("bareword_filehandles")-1)
65
66 #define FEATURE_FC_IS_ENABLED \
67 ( \
68 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
69 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
70 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
71 FEATURE_IS_ENABLED_MASK(FEATURE_FC_BIT)) \
72 )
73
74 #define FEATURE_ISA_IS_ENABLED \
75 ( \
76 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_535 && \
77 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
78 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
79 FEATURE_IS_ENABLED_MASK(FEATURE_ISA_BIT)) \
80 )
81
82 #define FEATURE_SAY_IS_ENABLED \
83 ( \
84 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
85 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
86 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
87 FEATURE_IS_ENABLED_MASK(FEATURE_SAY_BIT)) \
88 )
89
90 #define FEATURE_TRY_IS_ENABLED \
91 ( \
92 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_539 \
93 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
94 FEATURE_IS_ENABLED_MASK(FEATURE_TRY_BIT)) \
95 )
96
97 #define FEATURE_CLASS_IS_ENABLED \
98 ( \
99 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
100 FEATURE_IS_ENABLED_MASK(FEATURE_CLASS_BIT) \
101 )
102
103 #define FEATURE_DEFER_IS_ENABLED \
104 ( \
105 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
106 FEATURE_IS_ENABLED_MASK(FEATURE_DEFER_BIT) \
107 )
108
109 #define FEATURE_STATE_IS_ENABLED \
110 ( \
111 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
112 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
113 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
114 FEATURE_IS_ENABLED_MASK(FEATURE_STATE_BIT)) \
115 )
116
117 #define FEATURE_SWITCH_IS_ENABLED \
118 ( \
119 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
120 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \
121 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
122 FEATURE_IS_ENABLED_MASK(FEATURE_SWITCH_BIT)) \
123 )
124
125 #define FEATURE_BITWISE_IS_ENABLED \
126 ( \
127 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_527 && \
128 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
129 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
130 FEATURE_IS_ENABLED_MASK(FEATURE_BITWISE_BIT)) \
131 )
132
133 #define FEATURE_INDIRECT_IS_ENABLED \
134 ( \
135 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527 \
136 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
137 FEATURE_IS_ENABLED_MASK(FEATURE_INDIRECT_BIT)) \
138 )
139
140 #define FEATURE_EVALBYTES_IS_ENABLED \
141 ( \
142 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
143 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
144 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
145 FEATURE_IS_ENABLED_MASK(FEATURE_EVALBYTES_BIT)) \
146 )
147
148 #define FEATURE_SIGNATURES_IS_ENABLED \
149 ( \
150 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_535 && \
151 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
152 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
153 FEATURE_IS_ENABLED_MASK(FEATURE_SIGNATURES_BIT)) \
154 )
155
156 #define FEATURE___SUB___IS_ENABLED \
157 ( \
158 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
159 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
160 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
161 FEATURE_IS_ENABLED_MASK(FEATURE___SUB___BIT)) \
162 )
163
164 #define FEATURE_MODULE_TRUE_IS_ENABLED \
165 ( \
166 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_537 && \
167 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
168 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
169 FEATURE_IS_ENABLED_MASK(FEATURE_MODULE_TRUE_BIT)) \
170 )
171
172 #define FEATURE_REFALIASING_IS_ENABLED \
173 ( \
174 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
175 FEATURE_IS_ENABLED_MASK(FEATURE_REFALIASING_BIT) \
176 )
177
178 #define FEATURE_POSTDEREF_QQ_IS_ENABLED \
179 ( \
180 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_523 && \
181 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
182 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
183 FEATURE_IS_ENABLED_MASK(FEATURE_POSTDEREF_QQ_BIT)) \
184 )
185
186 #define FEATURE_UNIEVAL_IS_ENABLED \
187 ( \
188 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \
189 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
190 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
191 FEATURE_IS_ENABLED_MASK(FEATURE_UNIEVAL_BIT)) \
192 )
193
194 #define FEATURE_MYREF_IS_ENABLED \
195 ( \
196 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
197 FEATURE_IS_ENABLED_MASK(FEATURE_MYREF_BIT) \
198 )
199
200 #define FEATURE_UNICODE_IS_ENABLED \
201 ( \
202 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_511 && \
203 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_539) \
204 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
205 FEATURE_IS_ENABLED_MASK(FEATURE_UNICODE_BIT)) \
206 )
207
208 #define FEATURE_MULTIDIMENSIONAL_IS_ENABLED \
209 ( \
210 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527 \
211 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
212 FEATURE_IS_ENABLED_MASK(FEATURE_MULTIDIMENSIONAL_BIT)) \
213 )
214
215 #define FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED \
216 ( \
217 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535 \
218 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
219 FEATURE_IS_ENABLED_MASK(FEATURE_BAREWORD_FILEHANDLES_BIT)) \
220 )
221
222 #define FEATURE_MORE_DELIMS_IS_ENABLED \
223 ( \
224 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
225 FEATURE_IS_ENABLED_MASK(FEATURE_MORE_DELIMS_BIT) \
226 )
227
228
229 #define SAVEFEATUREBITS() SAVEI32(PL_compiling.cop_features)
230
231 #define CLEARFEATUREBITS() (PL_compiling.cop_features = 0)
232
233 #define FETCHFEATUREBITSHH(hh) S_fetch_feature_bits_hh(aTHX_ (hh))
234
235 #endif /* PERL_CORE or PERL_EXT */
236
237 #ifdef PERL_IN_OP_C
238 PERL_STATIC_INLINE void
S_enable_feature_bundle(pTHX_ SV * ver)239 S_enable_feature_bundle(pTHX_ SV *ver)
240 {
241 SV *comp_ver = sv_newmortal();
242 PL_hints = (PL_hints &~ HINT_FEATURE_MASK)
243 | (
244 (sv_setnv(comp_ver, 5.039),
245 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
246 ? FEATURE_BUNDLE_539 :
247 (sv_setnv(comp_ver, 5.037),
248 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
249 ? FEATURE_BUNDLE_537 :
250 (sv_setnv(comp_ver, 5.035),
251 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
252 ? FEATURE_BUNDLE_535 :
253 (sv_setnv(comp_ver, 5.027),
254 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
255 ? FEATURE_BUNDLE_527 :
256 (sv_setnv(comp_ver, 5.023),
257 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
258 ? FEATURE_BUNDLE_523 :
259 (sv_setnv(comp_ver, 5.015),
260 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
261 ? FEATURE_BUNDLE_515 :
262 (sv_setnv(comp_ver, 5.011),
263 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
264 ? FEATURE_BUNDLE_511 :
265 (sv_setnv(comp_ver, 5.009005),
266 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0)
267 ? FEATURE_BUNDLE_510 :
268 FEATURE_BUNDLE_DEFAULT
269 ) << HINT_FEATURE_SHIFT;
270 /* special case */
271 assert(PL_curcop == &PL_compiling);
272 if (FEATURE_UNICODE_IS_ENABLED) PL_hints |= HINT_UNI_8_BIT;
273 else PL_hints &= ~HINT_UNI_8_BIT;
274 }
275 #endif /* PERL_IN_OP_C */
276
277 #if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_CTL_C)
278
279 #define magic_sethint_feature(keysv, keypv, keylen, valsv, valbool) \
280 S_magic_sethint_feature(aTHX_ (keysv), (keypv), (keylen), (valsv), (valbool))
281 PERL_STATIC_INLINE void
S_magic_sethint_feature(pTHX_ SV * keysv,const char * keypv,STRLEN keylen,SV * valsv,bool valbool)282 S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen,
283 SV *valsv, bool valbool) {
284 if (keysv)
285 keypv = SvPV_const(keysv, keylen);
286
287 if (memBEGINs(keypv, keylen, "feature_")) {
288 const char *subf = keypv + (sizeof("feature_")-1);
289 U32 mask = 0;
290 switch (*subf) {
291 case '_':
292 if (keylen == sizeof("feature___SUB__")-1
293 && memcmp(subf+1, "_SUB__", keylen - sizeof("feature_")) == 0) {
294 mask = FEATURE___SUB___BIT;
295 break;
296 }
297 return;
298
299 case 'b':
300 if (keylen == sizeof("feature_bareword_filehandles")-1
301 && memcmp(subf+1, "areword_filehandles", keylen - sizeof("feature_")) == 0) {
302 mask = FEATURE_BAREWORD_FILEHANDLES_BIT;
303 break;
304 }
305 else if (keylen == sizeof("feature_bitwise")-1
306 && memcmp(subf+1, "itwise", keylen - sizeof("feature_")) == 0) {
307 mask = FEATURE_BITWISE_BIT;
308 break;
309 }
310 return;
311
312 case 'c':
313 if (keylen == sizeof("feature_class")-1
314 && memcmp(subf+1, "lass", keylen - sizeof("feature_")) == 0) {
315 mask = FEATURE_CLASS_BIT;
316 break;
317 }
318 return;
319
320 case 'd':
321 if (keylen == sizeof("feature_defer")-1
322 && memcmp(subf+1, "efer", keylen - sizeof("feature_")) == 0) {
323 mask = FEATURE_DEFER_BIT;
324 break;
325 }
326 return;
327
328 case 'e':
329 if (keylen == sizeof("feature_evalbytes")-1
330 && memcmp(subf+1, "valbytes", keylen - sizeof("feature_")) == 0) {
331 mask = FEATURE_EVALBYTES_BIT;
332 break;
333 }
334 return;
335
336 case 'f':
337 if (keylen == sizeof("feature_fc")-1
338 && memcmp(subf+1, "c", keylen - sizeof("feature_")) == 0) {
339 mask = FEATURE_FC_BIT;
340 break;
341 }
342 return;
343
344 case 'i':
345 if (keylen == sizeof("feature_indirect")-1
346 && memcmp(subf+1, "ndirect", keylen - sizeof("feature_")) == 0) {
347 mask = FEATURE_INDIRECT_BIT;
348 break;
349 }
350 else if (keylen == sizeof("feature_isa")-1
351 && memcmp(subf+1, "sa", keylen - sizeof("feature_")) == 0) {
352 mask = FEATURE_ISA_BIT;
353 break;
354 }
355 return;
356
357 case 'm':
358 if (keylen == sizeof("feature_module_true")-1
359 && memcmp(subf+1, "odule_true", keylen - sizeof("feature_")) == 0) {
360 mask = FEATURE_MODULE_TRUE_BIT;
361 break;
362 }
363 else if (keylen == sizeof("feature_more_delims")-1
364 && memcmp(subf+1, "ore_delims", keylen - sizeof("feature_")) == 0) {
365 mask = FEATURE_MORE_DELIMS_BIT;
366 break;
367 }
368 else if (keylen == sizeof("feature_multidimensional")-1
369 && memcmp(subf+1, "ultidimensional", keylen - sizeof("feature_")) == 0) {
370 mask = FEATURE_MULTIDIMENSIONAL_BIT;
371 break;
372 }
373 else if (keylen == sizeof("feature_myref")-1
374 && memcmp(subf+1, "yref", keylen - sizeof("feature_")) == 0) {
375 mask = FEATURE_MYREF_BIT;
376 break;
377 }
378 return;
379
380 case 'p':
381 if (keylen == sizeof("feature_postderef_qq")-1
382 && memcmp(subf+1, "ostderef_qq", keylen - sizeof("feature_")) == 0) {
383 mask = FEATURE_POSTDEREF_QQ_BIT;
384 break;
385 }
386 return;
387
388 case 'r':
389 if (keylen == sizeof("feature_refaliasing")-1
390 && memcmp(subf+1, "efaliasing", keylen - sizeof("feature_")) == 0) {
391 mask = FEATURE_REFALIASING_BIT;
392 break;
393 }
394 return;
395
396 case 's':
397 if (keylen == sizeof("feature_say")-1
398 && memcmp(subf+1, "ay", keylen - sizeof("feature_")) == 0) {
399 mask = FEATURE_SAY_BIT;
400 break;
401 }
402 else if (keylen == sizeof("feature_signatures")-1
403 && memcmp(subf+1, "ignatures", keylen - sizeof("feature_")) == 0) {
404 mask = FEATURE_SIGNATURES_BIT;
405 break;
406 }
407 else if (keylen == sizeof("feature_state")-1
408 && memcmp(subf+1, "tate", keylen - sizeof("feature_")) == 0) {
409 mask = FEATURE_STATE_BIT;
410 break;
411 }
412 else if (keylen == sizeof("feature_switch")-1
413 && memcmp(subf+1, "witch", keylen - sizeof("feature_")) == 0) {
414 mask = FEATURE_SWITCH_BIT;
415 break;
416 }
417 return;
418
419 case 't':
420 if (keylen == sizeof("feature_try")-1
421 && memcmp(subf+1, "ry", keylen - sizeof("feature_")) == 0) {
422 mask = FEATURE_TRY_BIT;
423 break;
424 }
425 return;
426
427 case 'u':
428 if (keylen == sizeof("feature_unicode")-1
429 && memcmp(subf+1, "nicode", keylen - sizeof("feature_")) == 0) {
430 mask = FEATURE_UNICODE_BIT;
431 break;
432 }
433 else if (keylen == sizeof("feature_unieval")-1
434 && memcmp(subf+1, "nieval", keylen - sizeof("feature_")) == 0) {
435 mask = FEATURE_UNIEVAL_BIT;
436 break;
437 }
438 return;
439
440 default:
441 return;
442 }
443 if (valsv ? SvTRUE(valsv) : valbool)
444 PL_compiling.cop_features |= mask;
445 else
446 PL_compiling.cop_features &= ~mask;
447 }
448 }
449 #endif /* PERL_IN_MG_C */
450
451 /* subject to change */
452 struct perl_feature_bit {
453 const char *name;
454 STRLEN namelen;
455 U32 mask;
456 };
457
458 #ifdef PERL_IN_PP_CTL_C
459
460 static const struct perl_feature_bit
461 PL_feature_bits[] = {
462 {
463 /* feature bareword_filehandles */
464 "feature_bareword_filehandles",
465 STRLENs("feature_bareword_filehandles"),
466 FEATURE_BAREWORD_FILEHANDLES_BIT
467 },
468 {
469 /* feature bitwise */
470 "feature_bitwise",
471 STRLENs("feature_bitwise"),
472 FEATURE_BITWISE_BIT
473 },
474 {
475 /* feature class */
476 "feature_class",
477 STRLENs("feature_class"),
478 FEATURE_CLASS_BIT
479 },
480 {
481 /* feature current_sub */
482 "feature___SUB__",
483 STRLENs("feature___SUB__"),
484 FEATURE___SUB___BIT
485 },
486 {
487 /* feature declared_refs */
488 "feature_myref",
489 STRLENs("feature_myref"),
490 FEATURE_MYREF_BIT
491 },
492 {
493 /* feature defer */
494 "feature_defer",
495 STRLENs("feature_defer"),
496 FEATURE_DEFER_BIT
497 },
498 {
499 /* feature evalbytes */
500 "feature_evalbytes",
501 STRLENs("feature_evalbytes"),
502 FEATURE_EVALBYTES_BIT
503 },
504 {
505 /* feature extra_paired_delimiters */
506 "feature_more_delims",
507 STRLENs("feature_more_delims"),
508 FEATURE_MORE_DELIMS_BIT
509 },
510 {
511 /* feature fc */
512 "feature_fc",
513 STRLENs("feature_fc"),
514 FEATURE_FC_BIT
515 },
516 {
517 /* feature indirect */
518 "feature_indirect",
519 STRLENs("feature_indirect"),
520 FEATURE_INDIRECT_BIT
521 },
522 {
523 /* feature isa */
524 "feature_isa",
525 STRLENs("feature_isa"),
526 FEATURE_ISA_BIT
527 },
528 {
529 /* feature module_true */
530 "feature_module_true",
531 STRLENs("feature_module_true"),
532 FEATURE_MODULE_TRUE_BIT
533 },
534 {
535 /* feature multidimensional */
536 "feature_multidimensional",
537 STRLENs("feature_multidimensional"),
538 FEATURE_MULTIDIMENSIONAL_BIT
539 },
540 {
541 /* feature postderef_qq */
542 "feature_postderef_qq",
543 STRLENs("feature_postderef_qq"),
544 FEATURE_POSTDEREF_QQ_BIT
545 },
546 {
547 /* feature refaliasing */
548 "feature_refaliasing",
549 STRLENs("feature_refaliasing"),
550 FEATURE_REFALIASING_BIT
551 },
552 {
553 /* feature say */
554 "feature_say",
555 STRLENs("feature_say"),
556 FEATURE_SAY_BIT
557 },
558 {
559 /* feature signatures */
560 "feature_signatures",
561 STRLENs("feature_signatures"),
562 FEATURE_SIGNATURES_BIT
563 },
564 {
565 /* feature state */
566 "feature_state",
567 STRLENs("feature_state"),
568 FEATURE_STATE_BIT
569 },
570 {
571 /* feature switch */
572 "feature_switch",
573 STRLENs("feature_switch"),
574 FEATURE_SWITCH_BIT
575 },
576 {
577 /* feature try */
578 "feature_try",
579 STRLENs("feature_try"),
580 FEATURE_TRY_BIT
581 },
582 {
583 /* feature unicode_eval */
584 "feature_unieval",
585 STRLENs("feature_unieval"),
586 FEATURE_UNIEVAL_BIT
587 },
588 {
589 /* feature unicode_strings */
590 "feature_unicode",
591 STRLENs("feature_unicode"),
592 FEATURE_UNICODE_BIT
593 },
594 { NULL, 0, 0U }
595 };
596
597 PERL_STATIC_INLINE void
S_fetch_feature_bits_hh(pTHX_ HV * hh)598 S_fetch_feature_bits_hh(pTHX_ HV *hh) {
599 PL_compiling.cop_features = 0;
600
601 const struct perl_feature_bit *fb = PL_feature_bits;
602 while (fb->name) {
603 SV **svp = hv_fetch(hh, fb->name, (I32)fb->namelen, 0);
604 if (svp && SvTRUE(*svp))
605 PL_compiling.cop_features |= fb->mask;
606 ++fb;
607 }
608 }
609
610 #endif
611
612 #endif /* PERL_FEATURE_H_ */
613
614 /* ex: set ro ft=c: */
615