* from data in regen/op_private */
-#define OPpTRANS_ALL (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE)
-
+#define OPpTRANS_ALL (OPpTRANS_USE_SVOP|OPpTRANS_CAN_FORCE_UTF8|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE)
+#define OPpTRANS_FROM_UTF OPpTRANS_USE_SVOP
+#define OPpTRANS_TO_UTF OPpTRANS_CAN_FORCE_UTF8
/* Mask for OP_ENTERSUB flags, the absence of which must be propagated
/* things that can be elements of op_aux */
-typedef union {
+typedef union {
PADOFFSET pad_offset;
SV *sv;
IV iv;
/* Set by the parser if it discovers an error, so the regex shouldn't be
* compiled */
-#define PMf_HAS_ERROR (1U<<(PMf_BASE_SHIFT+4))
+#define PMf_HAS_ERROR (1U<<(PMf_BASE_SHIFT+3))
/* 'use re "taint"' in scope: taint $1 etc. if target tainted */
-#define PMf_RETAINT (1U<<(PMf_BASE_SHIFT+5))
+#define PMf_RETAINT (1U<<(PMf_BASE_SHIFT+4))
/* match successfully only once per reset, with related flag RXf_USED in
* re->extflags holding state. This is used only for ?? matches, and only on
* OP_MATCH and OP_QR */
-#define PMf_ONCE (1U<<(PMf_BASE_SHIFT+6))
+#define PMf_ONCE (1U<<(PMf_BASE_SHIFT+5))
/* PMf_ONCE, i.e. ?pat?, has matched successfully. Not used under threading. */
-#define PMf_USED (1U<<(PMf_BASE_SHIFT+7))
+#define PMf_USED (1U<<(PMf_BASE_SHIFT+6))
/* subst replacement is constant */
-#define PMf_CONST (1U<<(PMf_BASE_SHIFT+8))
+#define PMf_CONST (1U<<(PMf_BASE_SHIFT+7))
/* keep 1st runtime pattern forever */
-#define PMf_KEEP (1U<<(PMf_BASE_SHIFT+9))
+#define PMf_KEEP (1U<<(PMf_BASE_SHIFT+8))
-#define PMf_GLOBAL (1U<<(PMf_BASE_SHIFT+10)) /* pattern had a g modifier */
+#define PMf_GLOBAL (1U<<(PMf_BASE_SHIFT+9)) /* pattern had a g modifier */
/* don't reset pos() if //g fails */
-#define PMf_CONTINUE (1U<<(PMf_BASE_SHIFT+11))
+#define PMf_CONTINUE (1U<<(PMf_BASE_SHIFT+10))
/* evaluating replacement as expr */
-#define PMf_EVAL (1U<<(PMf_BASE_SHIFT+12))
+#define PMf_EVAL (1U<<(PMf_BASE_SHIFT+11))
/* Return substituted string instead of modifying it. */
-#define PMf_NONDESTRUCT (1U<<(PMf_BASE_SHIFT+13))
+#define PMf_NONDESTRUCT (1U<<(PMf_BASE_SHIFT+12))
/* the pattern has a CV attached (currently only under qr/...(?{}).../) */
-#define PMf_HAS_CV (1U<<(PMf_BASE_SHIFT+14))
+#define PMf_HAS_CV (1U<<(PMf_BASE_SHIFT+13))
/* op_code_list is private; don't free it etc. It may well point to
* code within another sub, with different pad etc */
-#define PMf_CODELIST_PRIVATE (1U<<(PMf_BASE_SHIFT+15))
+#define PMf_CODELIST_PRIVATE (1U<<(PMf_BASE_SHIFT+14))
/* the PMOP is a QR (we should be able to detect that from the op type,
* but the regex compilation API passes just the pm flags, not the op
* itself */
-#define PMf_IS_QR (1U<<(PMf_BASE_SHIFT+16))
-#define PMf_USE_RE_EVAL (1U<<(PMf_BASE_SHIFT+17)) /* use re'eval' in scope */
+#define PMf_IS_QR (1U<<(PMf_BASE_SHIFT+15))
+#define PMf_USE_RE_EVAL (1U<<(PMf_BASE_SHIFT+16)) /* use re'eval' in scope */
+
+/* Means that this is a subpattern being compiled while processing a \p{}
+ * wildcard. This isn't called from op.c, but it is passed as a pm flag. */
+#define PMf_WILDCARD (1U<<(PMf_BASE_SHIFT+17))
/* See comments at the beginning of these defines about adding bits. The
* highest bit position should be used, so that if PMf_BASE_SHIFT gets
struct opslab {
OPSLAB * opslab_next; /* next slab */
OPSLAB * opslab_head; /* first slab in chain */
- OP * opslab_freed; /* chain of freed ops (head only)*/
+ OP ** opslab_freed; /* array of sized chains of freed ops (head only)*/
size_t opslab_refcnt; /* number of ops (head slab only) */
+ U16 opslab_freed_size; /* allocated size of opslab_freed */
U16 opslab_size; /* size of slab in pointers,
including header */
U16 opslab_free_space; /* space available in this slab
"Use of strings with code points over 0xFF as arguments to " \
"%s operator is not allowed"
#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_PERL_C)
+# define TR_UNMAPPED (UV)-1
+# define TR_DELETE (UV)-2
+# define TR_R_EMPTY (UV)-3 /* rhs (replacement) is empty */
+# define TR_OOB (UV)-4 /* Something that isn't one of the others */
+# define TR_SPECIAL_HANDLING TR_DELETE /* Can occupy same value */
+# define TR_UNLISTED TR_UNMAPPED /* A synonym whose name is clearer
+ at times */
+#endif
#if defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C)
#define RANGE_INDICATOR ILLEGAL_UTF8_BYTE
#endif
/* stuff for OP_ARGCHECK */
-struct op_argcheck_aux {
+struct op_argcheck_aux {
UV params; /* number of positional parameters */
UV opt_params; /* number of optional positional parameters */
char slurpy; /* presence of slurpy: may be '\0', '@' or '%' */