summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-04-12 02:35:42 +0300
committerDmitry Stogov <dmitry@zend.com>2019-04-12 02:35:42 +0300
commit55cc280429c453a89e33de7357fa80589470dfc3 (patch)
tree4185afc2c6405d42751fc354a20676be9408d904 /Zend/zend_compile.h
parent88a2268d6b9ff152399a8761dc826ce414c0b985 (diff)
downloadphp-git-55cc280429c453a89e33de7357fa80589470dfc3.tar.gz
Backported call frame initialization improvement
Diffstat (limited to 'Zend/zend_compile.h')
-rw-r--r--Zend/zend_compile.h53
1 files changed, 24 insertions, 29 deletions
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 523d04e794..588022c770 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -482,13 +482,6 @@ union _zend_function {
zend_internal_function internal_function;
};
-typedef enum _zend_call_kind {
- ZEND_CALL_NESTED_FUNCTION, /* stackless VM call to function */
- ZEND_CALL_NESTED_CODE, /* stackless VM call to include/require/eval */
- ZEND_CALL_TOP_FUNCTION, /* direct VM call to function from external C code */
- ZEND_CALL_TOP_CODE /* direct VM call to "main" code from external C code */
-} zend_call_kind;
-
struct _zend_execute_data {
const zend_op *opline; /* executed opline */
zend_execute_data *call; /* current call */
@@ -502,24 +495,30 @@ struct _zend_execute_data {
#endif
};
-#define ZEND_CALL_FUNCTION (0 << 0)
-#define ZEND_CALL_CODE (1 << 0)
-#define ZEND_CALL_NESTED (0 << 1)
-#define ZEND_CALL_TOP (1 << 1)
-#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 2)
-#define ZEND_CALL_HAS_SYMBOL_TABLE (1 << 4)
-#define ZEND_CALL_CLOSURE (1 << 5)
-#define ZEND_CALL_RELEASE_THIS (1 << 6)
-#define ZEND_CALL_ALLOCATED (1 << 7)
-#define ZEND_CALL_GENERATOR (1 << 8)
-#define ZEND_CALL_DYNAMIC (1 << 9)
-#define ZEND_CALL_FAKE_CLOSURE (1 << 10)
-#define ZEND_CALL_SEND_ARG_BY_REF (1 << 11)
-
-#define ZEND_CALL_INFO_SHIFT 16
+#define ZEND_CALL_HAS_THIS IS_OBJECT_EX
+
+/* Top 16 bits of Z_TYPE_INFO(EX(This)) are used as call_info flags */
+#define ZEND_CALL_FUNCTION (0 << 16)
+#define ZEND_CALL_CODE (1 << 16)
+#define ZEND_CALL_NESTED (0 << 17)
+#define ZEND_CALL_TOP (1 << 17)
+#define ZEND_CALL_ALLOCATED (1 << 18)
+#define ZEND_CALL_FREE_EXTRA_ARGS (1 << 19)
+#define ZEND_CALL_HAS_SYMBOL_TABLE (1 << 20)
+#define ZEND_CALL_RELEASE_THIS (1 << 21)
+#define ZEND_CALL_CLOSURE (1 << 22)
+#define ZEND_CALL_FAKE_CLOSURE (1 << 23)
+#define ZEND_CALL_GENERATOR (1 << 24)
+#define ZEND_CALL_DYNAMIC (1 << 25)
+#define ZEND_CALL_SEND_ARG_BY_REF (1 << 31)
+
+#define ZEND_CALL_NESTED_FUNCTION (ZEND_CALL_FUNCTION | ZEND_CALL_NESTED)
+#define ZEND_CALL_NESTED_CODE (ZEND_CALL_CODE | ZEND_CALL_NESTED)
+#define ZEND_CALL_TOP_FUNCTION (ZEND_CALL_TOP | ZEND_CALL_FUNCTION)
+#define ZEND_CALL_TOP_CODE (ZEND_CALL_CODE | ZEND_CALL_TOP)
#define ZEND_CALL_INFO(call) \
- (Z_TYPE_INFO((call)->This) >> ZEND_CALL_INFO_SHIFT)
+ Z_TYPE_INFO((call)->This)
#define ZEND_CALL_KIND_EX(call_info) \
(call_info & (ZEND_CALL_CODE | ZEND_CALL_TOP))
@@ -527,16 +526,12 @@ struct _zend_execute_data {
#define ZEND_CALL_KIND(call) \
ZEND_CALL_KIND_EX(ZEND_CALL_INFO(call))
-#define ZEND_SET_CALL_INFO(call, object, info) do { \
- Z_TYPE_INFO((call)->This) = ((object) ? IS_OBJECT_EX : IS_UNDEF) | ((info) << ZEND_CALL_INFO_SHIFT); \
- } while (0)
-
#define ZEND_ADD_CALL_FLAG_EX(call_info, flag) do { \
- call_info |= ((flag) << ZEND_CALL_INFO_SHIFT); \
+ call_info |= (flag); \
} while (0)
#define ZEND_DEL_CALL_FLAG_EX(call_info, flag) do { \
- call_info &= ~((flag) << ZEND_CALL_INFO_SHIFT); \
+ call_info &= ~(flag); \
} while (0)
#define ZEND_ADD_CALL_FLAG(call, flag) do { \