1 /* -*- 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_BITWISE_BIT 0x0001 16 #define FEATURE___SUB___BIT 0x0002 17 #define FEATURE_MYREF_BIT 0x0004 18 #define FEATURE_EVALBYTES_BIT 0x0008 19 #define FEATURE_FC_BIT 0x0010 20 #define FEATURE_INDIRECT_BIT 0x0020 21 #define FEATURE_ISA_BIT 0x0040 22 #define FEATURE_POSTDEREF_QQ_BIT 0x0080 23 #define FEATURE_REFALIASING_BIT 0x0100 24 #define FEATURE_SAY_BIT 0x0200 25 #define FEATURE_SIGNATURES_BIT 0x0400 26 #define FEATURE_STATE_BIT 0x0800 27 #define FEATURE_SWITCH_BIT 0x1000 28 #define FEATURE_UNIEVAL_BIT 0x2000 29 #define FEATURE_UNICODE_BIT 0x4000 30 31 #define FEATURE_BUNDLE_DEFAULT 0 32 #define FEATURE_BUNDLE_510 1 33 #define FEATURE_BUNDLE_511 2 34 #define FEATURE_BUNDLE_515 3 35 #define FEATURE_BUNDLE_523 4 36 #define FEATURE_BUNDLE_527 5 37 #define FEATURE_BUNDLE_CUSTOM (HINT_FEATURE_MASK >> HINT_FEATURE_SHIFT) 38 39 #define CURRENT_HINTS \ 40 (PL_curcop == &PL_compiling ? PL_hints : PL_curcop->cop_hints) 41 #define CURRENT_FEATURE_BUNDLE \ 42 ((CURRENT_HINTS & HINT_FEATURE_MASK) >> HINT_FEATURE_SHIFT) 43 44 #define FEATURE_IS_ENABLED_MASK(mask) \ 45 ((CURRENT_HINTS & HINT_LOCALIZE_HH) \ 46 ? (PL_curcop->cop_features & (mask)) : FALSE) 47 48 /* The longest string we pass in. */ 49 #define MAX_FEATURE_LEN (sizeof("postderef_qq")-1) 50 51 #define FEATURE_FC_IS_ENABLED \ 52 ( \ 53 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ 54 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 55 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 56 FEATURE_IS_ENABLED_MASK(FEATURE_FC_BIT)) \ 57 ) 58 59 #define FEATURE_ISA_IS_ENABLED \ 60 ( \ 61 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 62 FEATURE_IS_ENABLED_MASK(FEATURE_ISA_BIT) \ 63 ) 64 65 #define FEATURE_SAY_IS_ENABLED \ 66 ( \ 67 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \ 68 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 69 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 70 FEATURE_IS_ENABLED_MASK(FEATURE_SAY_BIT)) \ 71 ) 72 73 #define FEATURE_STATE_IS_ENABLED \ 74 ( \ 75 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \ 76 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 77 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 78 FEATURE_IS_ENABLED_MASK(FEATURE_STATE_BIT)) \ 79 ) 80 81 #define FEATURE_SWITCH_IS_ENABLED \ 82 ( \ 83 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \ 84 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 85 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 86 FEATURE_IS_ENABLED_MASK(FEATURE_SWITCH_BIT)) \ 87 ) 88 89 #define FEATURE_BITWISE_IS_ENABLED \ 90 ( \ 91 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_527 \ 92 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 93 FEATURE_IS_ENABLED_MASK(FEATURE_BITWISE_BIT)) \ 94 ) 95 96 #define FEATURE_INDIRECT_IS_ENABLED \ 97 ( \ 98 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527 \ 99 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 100 FEATURE_IS_ENABLED_MASK(FEATURE_INDIRECT_BIT)) \ 101 ) 102 103 #define FEATURE_EVALBYTES_IS_ENABLED \ 104 ( \ 105 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ 106 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 107 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 108 FEATURE_IS_ENABLED_MASK(FEATURE_EVALBYTES_BIT)) \ 109 ) 110 111 #define FEATURE_SIGNATURES_IS_ENABLED \ 112 ( \ 113 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 114 FEATURE_IS_ENABLED_MASK(FEATURE_SIGNATURES_BIT) \ 115 ) 116 117 #define FEATURE___SUB___IS_ENABLED \ 118 ( \ 119 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ 120 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 121 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 122 FEATURE_IS_ENABLED_MASK(FEATURE___SUB___BIT)) \ 123 ) 124 125 #define FEATURE_REFALIASING_IS_ENABLED \ 126 ( \ 127 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 128 FEATURE_IS_ENABLED_MASK(FEATURE_REFALIASING_BIT) \ 129 ) 130 131 #define FEATURE_POSTDEREF_QQ_IS_ENABLED \ 132 ( \ 133 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_523 && \ 134 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 135 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 136 FEATURE_IS_ENABLED_MASK(FEATURE_POSTDEREF_QQ_BIT)) \ 137 ) 138 139 #define FEATURE_UNIEVAL_IS_ENABLED \ 140 ( \ 141 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ 142 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 143 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 144 FEATURE_IS_ENABLED_MASK(FEATURE_UNIEVAL_BIT)) \ 145 ) 146 147 #define FEATURE_MYREF_IS_ENABLED \ 148 ( \ 149 CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 150 FEATURE_IS_ENABLED_MASK(FEATURE_MYREF_BIT) \ 151 ) 152 153 #define FEATURE_UNICODE_IS_ENABLED \ 154 ( \ 155 (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_511 && \ 156 CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527) \ 157 || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ 158 FEATURE_IS_ENABLED_MASK(FEATURE_UNICODE_BIT)) \ 159 ) 160 161 162 #define SAVEFEATUREBITS() SAVEI32(PL_compiling.cop_features) 163 164 #define CLEARFEATUREBITS() (PL_compiling.cop_features = 0) 165 166 #define STOREFEATUREBITSHH(hh) \ 167 (hv_stores((hh), "feature/bits", newSVuv(PL_compiling.cop_features))) 168 169 #define FETCHFEATUREBITSHH(hh) \ 170 STMT_START { \ 171 SV **fbsv = hv_fetchs((hh), "feature/bits", FALSE); \ 172 PL_compiling.cop_features = fbsv ? SvUV(*fbsv) : 0; \ 173 } STMT_END 174 175 #endif /* PERL_CORE or PERL_EXT */ 176 177 #ifdef PERL_IN_OP_C 178 PERL_STATIC_INLINE void 179 S_enable_feature_bundle(pTHX_ SV *ver) 180 { 181 SV *comp_ver = sv_newmortal(); 182 PL_hints = (PL_hints &~ HINT_FEATURE_MASK) 183 | ( 184 (sv_setnv(comp_ver, 5.027), 185 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0) 186 ? FEATURE_BUNDLE_527 : 187 (sv_setnv(comp_ver, 5.023), 188 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0) 189 ? FEATURE_BUNDLE_523 : 190 (sv_setnv(comp_ver, 5.015), 191 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0) 192 ? FEATURE_BUNDLE_515 : 193 (sv_setnv(comp_ver, 5.011), 194 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0) 195 ? FEATURE_BUNDLE_511 : 196 (sv_setnv(comp_ver, 5.009005), 197 vcmp(ver, upg_version(comp_ver, FALSE)) >= 0) 198 ? FEATURE_BUNDLE_510 : 199 FEATURE_BUNDLE_DEFAULT 200 ) << HINT_FEATURE_SHIFT; 201 /* special case */ 202 assert(PL_curcop == &PL_compiling); 203 if (FEATURE_UNICODE_IS_ENABLED) PL_hints |= HINT_UNI_8_BIT; 204 else PL_hints &= ~HINT_UNI_8_BIT; 205 } 206 #endif /* PERL_IN_OP_C */ 207 208 #ifdef PERL_IN_MG_C 209 210 #define magic_sethint_feature(keysv, keypv, keylen, valsv, valbool) \ 211 S_magic_sethint_feature(aTHX_ (keysv), (keypv), (keylen), (valsv), (valbool)) 212 PERL_STATIC_INLINE void 213 S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen, 214 SV *valsv, bool valbool) { 215 if (keysv) 216 keypv = SvPV_const(keysv, keylen); 217 218 if (memBEGINs(keypv, keylen, "feature_")) { 219 const char *subf = keypv + (sizeof("feature_")-1); 220 U32 mask = 0; 221 switch (*subf) { 222 case '_': 223 if (keylen == sizeof("feature___SUB__")-1 224 && memcmp(subf+1, "_SUB__", keylen - sizeof("feature_")) == 0) { 225 mask = FEATURE___SUB___BIT; 226 break; 227 } 228 return; 229 230 case 'b': 231 if (keylen == sizeof("feature_bitwise")-1 232 && memcmp(subf+1, "itwise", keylen - sizeof("feature_")) == 0) { 233 mask = FEATURE_BITWISE_BIT; 234 break; 235 } 236 return; 237 238 case 'e': 239 if (keylen == sizeof("feature_evalbytes")-1 240 && memcmp(subf+1, "valbytes", keylen - sizeof("feature_")) == 0) { 241 mask = FEATURE_EVALBYTES_BIT; 242 break; 243 } 244 return; 245 246 case 'f': 247 if (keylen == sizeof("feature_fc")-1 248 && memcmp(subf+1, "c", keylen - sizeof("feature_")) == 0) { 249 mask = FEATURE_FC_BIT; 250 break; 251 } 252 return; 253 254 case 'i': 255 if (keylen == sizeof("feature_indirect")-1 256 && memcmp(subf+1, "ndirect", keylen - sizeof("feature_")) == 0) { 257 mask = FEATURE_INDIRECT_BIT; 258 break; 259 } 260 else if (keylen == sizeof("feature_isa")-1 261 && memcmp(subf+1, "sa", keylen - sizeof("feature_")) == 0) { 262 mask = FEATURE_ISA_BIT; 263 break; 264 } 265 return; 266 267 case 'm': 268 if (keylen == sizeof("feature_myref")-1 269 && memcmp(subf+1, "yref", keylen - sizeof("feature_")) == 0) { 270 mask = FEATURE_MYREF_BIT; 271 break; 272 } 273 return; 274 275 case 'p': 276 if (keylen == sizeof("feature_postderef_qq")-1 277 && memcmp(subf+1, "ostderef_qq", keylen - sizeof("feature_")) == 0) { 278 mask = FEATURE_POSTDEREF_QQ_BIT; 279 break; 280 } 281 return; 282 283 case 'r': 284 if (keylen == sizeof("feature_refaliasing")-1 285 && memcmp(subf+1, "efaliasing", keylen - sizeof("feature_")) == 0) { 286 mask = FEATURE_REFALIASING_BIT; 287 break; 288 } 289 return; 290 291 case 's': 292 if (keylen == sizeof("feature_say")-1 293 && memcmp(subf+1, "ay", keylen - sizeof("feature_")) == 0) { 294 mask = FEATURE_SAY_BIT; 295 break; 296 } 297 else if (keylen == sizeof("feature_signatures")-1 298 && memcmp(subf+1, "ignatures", keylen - sizeof("feature_")) == 0) { 299 mask = FEATURE_SIGNATURES_BIT; 300 break; 301 } 302 else if (keylen == sizeof("feature_state")-1 303 && memcmp(subf+1, "tate", keylen - sizeof("feature_")) == 0) { 304 mask = FEATURE_STATE_BIT; 305 break; 306 } 307 else if (keylen == sizeof("feature_switch")-1 308 && memcmp(subf+1, "witch", keylen - sizeof("feature_")) == 0) { 309 mask = FEATURE_SWITCH_BIT; 310 break; 311 } 312 return; 313 314 case 'u': 315 if (keylen == sizeof("feature_unicode")-1 316 && memcmp(subf+1, "nicode", keylen - sizeof("feature_")) == 0) { 317 mask = FEATURE_UNICODE_BIT; 318 break; 319 } 320 else if (keylen == sizeof("feature_unieval")-1 321 && memcmp(subf+1, "nieval", keylen - sizeof("feature_")) == 0) { 322 mask = FEATURE_UNIEVAL_BIT; 323 break; 324 } 325 return; 326 327 default: 328 return; 329 } 330 if (valsv ? SvTRUE(valsv) : valbool) 331 PL_compiling.cop_features |= mask; 332 else 333 PL_compiling.cop_features &= ~mask; 334 } 335 } 336 #endif /* PERL_IN_MG_C */ 337 338 #endif /* PERL_FEATURE_H_ */ 339 340 /* ex: set ro: */ 341