summaryrefslogtreecommitdiff
path: root/feature.h
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2021-07-27 14:55:14 +0100
committerPaul Evans <leonerd@leonerd.org.uk>2021-08-25 13:52:09 +0100
commitf79e2ff95fbb22eaf18e130c7cba8a9d40be3d75 (patch)
tree18bedb48e757671114f8f63c8691677a06b62a1b /feature.h
parent4b21956ed64a9303ab72a46be1cd68c22bff2560 (diff)
downloadperl-f79e2ff95fbb22eaf18e130c7cba8a9d40be3d75.tar.gz
Create `defer` syntax and `OP_PUSHDEFER` opcode
Adds syntax `defer { BLOCK }` to create a deferred block; code that is deferred until the scope exits. This syntax is guarded by use feature 'defer'; Adds a new opcode, `OP_PUSHDEFER`, which is a LOGOP whose `op_other` field gives the start of an optree to be deferred until scope exit. That op pointer will be stored on the save stack and invoked as part of scope unwind. Included is support for `B::Deparse` to deparse the optree back into syntax.
Diffstat (limited to 'feature.h')
-rw-r--r--feature.h43
1 files changed, 29 insertions, 14 deletions
diff --git a/feature.h b/feature.h
index 29522eedb5..23cc5f3d31 100644
--- a/feature.h
+++ b/feature.h
@@ -16,20 +16,21 @@
#define FEATURE_BITWISE_BIT 0x0002
#define FEATURE___SUB___BIT 0x0004
#define FEATURE_MYREF_BIT 0x0008
-#define FEATURE_EVALBYTES_BIT 0x0010
-#define FEATURE_FC_BIT 0x0020
-#define FEATURE_INDIRECT_BIT 0x0040
-#define FEATURE_ISA_BIT 0x0080
-#define FEATURE_MULTIDIMENSIONAL_BIT 0x0100
-#define FEATURE_POSTDEREF_QQ_BIT 0x0200
-#define FEATURE_REFALIASING_BIT 0x0400
-#define FEATURE_SAY_BIT 0x0800
-#define FEATURE_SIGNATURES_BIT 0x1000
-#define FEATURE_STATE_BIT 0x2000
-#define FEATURE_SWITCH_BIT 0x4000
-#define FEATURE_TRY_BIT 0x8000
-#define FEATURE_UNIEVAL_BIT 0x10000
-#define FEATURE_UNICODE_BIT 0x20000
+#define FEATURE_DEFER_BIT 0x0010
+#define FEATURE_EVALBYTES_BIT 0x0020
+#define FEATURE_FC_BIT 0x0040
+#define FEATURE_INDIRECT_BIT 0x0080
+#define FEATURE_ISA_BIT 0x0100
+#define FEATURE_MULTIDIMENSIONAL_BIT 0x0200
+#define FEATURE_POSTDEREF_QQ_BIT 0x0400
+#define FEATURE_REFALIASING_BIT 0x0800
+#define FEATURE_SAY_BIT 0x1000
+#define FEATURE_SIGNATURES_BIT 0x2000
+#define FEATURE_STATE_BIT 0x4000
+#define FEATURE_SWITCH_BIT 0x8000
+#define FEATURE_TRY_BIT 0x10000
+#define FEATURE_UNIEVAL_BIT 0x20000
+#define FEATURE_UNICODE_BIT 0x40000
#define FEATURE_BUNDLE_DEFAULT 0
#define FEATURE_BUNDLE_510 1
@@ -80,6 +81,12 @@
FEATURE_IS_ENABLED_MASK(FEATURE_TRY_BIT) \
)
+#define FEATURE_DEFER_IS_ENABLED \
+ ( \
+ CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+ FEATURE_IS_ENABLED_MASK(FEATURE_DEFER_BIT) \
+ )
+
#define FEATURE_STATE_IS_ENABLED \
( \
(CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
@@ -268,6 +275,14 @@ S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen,
}
return;
+ case 'd':
+ if (keylen == sizeof("feature_defer")-1
+ && memcmp(subf+1, "efer", keylen - sizeof("feature_")) == 0) {
+ mask = FEATURE_DEFER_BIT;
+ break;
+ }
+ return;
+
case 'e':
if (keylen == sizeof("feature_evalbytes")-1
&& memcmp(subf+1, "valbytes", keylen - sizeof("feature_")) == 0) {