xref: /openbsd/gnu/usr.bin/perl/feature.h (revision 3d61058a)
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