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 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 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 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