diff options
author | Dmitry Stogov <dmitry@zend.com> | 2019-04-12 02:35:42 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2019-04-12 02:35:42 +0300 |
commit | 55cc280429c453a89e33de7357fa80589470dfc3 (patch) | |
tree | 4185afc2c6405d42751fc354a20676be9408d904 /Zend/zend_compile.h | |
parent | 88a2268d6b9ff152399a8761dc826ce414c0b985 (diff) | |
download | php-git-55cc280429c453a89e33de7357fa80589470dfc3.tar.gz |
Backported call frame initialization improvement
Diffstat (limited to 'Zend/zend_compile.h')
-rw-r--r-- | Zend/zend_compile.h | 53 |
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 { \ |