diff options
Diffstat (limited to 'Zend/zend_API.h')
-rw-r--r-- | Zend/zend_API.h | 202 |
1 files changed, 170 insertions, 32 deletions
diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 00a39f6624..2ae1990ced 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -675,9 +675,9 @@ ZEND_API int zend_try_assign_typed_ref_res(zend_reference *ref, zend_resource *r ZEND_API int zend_try_assign_typed_ref_zval(zend_reference *ref, zval *zv); ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, zend_bool strict); -#define ZEND_TRY_ASSIGN_NULL(zv) do { \ +#define _ZEND_TRY_ASSIGN_NULL(zv, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_null(ref); \ @@ -689,9 +689,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_NULL(_zv); \ } while (0) -#define ZEND_TRY_ASSIGN_FALSE(zv) do { \ +#define ZEND_TRY_ASSIGN_NULL(zv) \ + _ZEND_TRY_ASSIGN_NULL(zv, 0) + +#define ZEND_TRY_ASSIGN_REF_NULL(zv) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_NULL(zv, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_FALSE(zv, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_bool(ref, 0); \ @@ -703,9 +711,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_FALSE(_zv); \ } while (0) -#define ZEND_TRY_ASSIGN_TRUE(zv) do { \ +#define ZEND_TRY_ASSIGN_FASLE(zv) \ + _ZEND_TRY_ASSIGN_FALSE(zv, 0) + +#define ZEND_TRY_ASSIGN_REF_FALSE(zv) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_FALSE(zv, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_TRUE(zv, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_bool(ref, 1); \ @@ -717,9 +733,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_TRUE(_zv); \ } while (0) -#define ZEND_TRY_ASSIGN_BOOL(zv, bval) do { \ +#define ZEND_TRY_ASSIGN_TRUE(zv) \ + _ZEND_TRY_ASSIGN_TRUE(zv, 0) + +#define ZEND_TRY_ASSIGN_REF_TRUE(zv) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_TRUE(zv, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_BOOL(zv, bval, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_bool(ref, 1); \ @@ -731,9 +755,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_BOOL(_zv, bval); \ } while (0) -#define ZEND_TRY_ASSIGN_LONG(zv, lval) do { \ +#define ZEND_TRY_ASSIGN_BOOL(zv, bval) \ + _ZEND_TRY_ASSIGN_BOOL(zv, bval, 0) + +#define ZEND_TRY_ASSIGN_REF_BOOL(zv, bval) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_BOOL(zv, bval, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_LONG(zv, lval, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_long(ref, lval); \ @@ -745,9 +777,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_LONG(_zv, lval); \ } while (0) -#define ZEND_TRY_ASSIGN_DOUBLE(zv, dval) do { \ +#define ZEND_TRY_ASSIGN_LONG(zv, lval) \ + _ZEND_TRY_ASSIGN_LONG(zv, lval, 0) + +#define ZEND_TRY_ASSIGN_REF_LONG(zv, lval) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_LONG(zv, lval, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_double(ref, dval); \ @@ -759,9 +799,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_DOUBLE(_zv, dval); \ } while (0) -#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) do { \ +#define ZEND_TRY_ASSIGN_DOUBLE(zv, dval) \ + _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, 0) + +#define ZEND_TRY_ASSIGN_REF_DOUBLE(zv, dval) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_DOUBLE(zv, dval, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_empty_string(ref); \ @@ -773,9 +821,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_EMPTY_STRING(_zv); \ } while (0) -#define ZEND_TRY_ASSIGN_STR(zv, str) do { \ +#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) \ + _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, 0) + +#define ZEND_TRY_ASSIGN_REF_EMPTY_STRING(zv) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_EMPTY_STRING(zv, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_STR(zv, str, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_str(ref, str); \ @@ -787,9 +843,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_STR(_zv, str); \ } while (0) -#define ZEND_TRY_ASSIGN_NEW_STR(zv, str) do { \ +#define ZEND_TRY_ASSIGN_STR(zv, str) \ + _ZEND_TRY_ASSIGN_STR(zv, str, 0) + +#define ZEND_TRY_ASSIGN_REF_STR(zv, str) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_STR(zv, str, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_NEW_STR(zv, str, is_str) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_str || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_str(ref, str); \ @@ -801,9 +865,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_NEW_STR(_zv, str); \ } while (0) -#define ZEND_TRY_ASSIGN_STRING(zv, string) do { \ +#define ZEND_TRY_ASSIGN_NEW_STR(zv, str) \ + _ZEND_TRY_ASSIGN_NEW_STR(zv, str, 0) + +#define ZEND_TRY_ASSIGN_REF_NEW_STR(zv, str) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_NEW_STR(zv, str, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_STRING(zv, string, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_string(ref, string); \ @@ -815,9 +887,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_STRING(_zv, string); \ } while (0) -#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) do { \ +#define ZEND_TRY_ASSIGN_STRING(zv, string) \ + _ZEND_TRY_ASSIGN_STRING(zv, string, 0) + +#define ZEND_TRY_ASSIGN_REF_STRING(zv, string) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_STRING(zv, string, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_stringl(ref, string, len); \ @@ -829,9 +909,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_STRINGL(_zv, string, len); \ } while (0) -#define ZEND_TRY_ASSIGN_ARR(zv, arr) do { \ +#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) \ + _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, 0) + +#define ZEND_TRY_ASSIGN_REF_STRINGL(zv, string, len) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_STRINGL(zv, string, len, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_ARR(zv, arr, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_arr(ref, arr); \ @@ -843,9 +931,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_ARR(_zv, arr); \ } while (0) -#define ZEND_TRY_ASSIGN_RES(zv, res) do { \ +#define ZEND_TRY_ASSIGN_ARR(zv, arr) \ + _ZEND_TRY_ASSIGN_ARR(zv, arr, 0) + +#define ZEND_TRY_ASSIGN_REF_ARR(zv, arr) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_ARR(zv, arr, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_RES(zv, res, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_res(ref, res); \ @@ -857,9 +953,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_RES(_zv, res); \ } while (0) -#define ZEND_TRY_ASSIGN_TMP(zv, other_zv) do { \ +#define ZEND_TRY_ASSIGN_RES(zv, res) \ + _ZEND_TRY_ASSIGN_RES(zv, res, 0) + +#define ZEND_TRY_ASSIGN_REF_RES(zv, res) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_RES(zv, res, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_TMP(zv, other_zv, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref(ref, other_zv); \ @@ -871,9 +975,17 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_COPY_VALUE(_zv, other_zv); \ } while (0) -#define ZEND_TRY_ASSIGN_VALUE(zv, other_zv) do { \ +#define ZEND_TRY_ASSIGN_TMP(zv, other_zv) \ + _ZEND_TRY_ASSIGN_TMP(zv, other_zv, 0) + +#define ZEND_TRY_ASSIGN_REF_TMP(zv, other_zv) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_TMP(zv, other_zv, 1); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_zval(ref, other_zv); \ @@ -885,14 +997,27 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_COPY_VALUE(_zv, other_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_VALUE(zv, other_zv) \ + _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, 0) + +#define ZEND_TRY_ASSIGN_REF_VALUE(zv, other_zv) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_VALUE(zv, other_zv, 1); \ +} while (0) + #define ZEND_TRY_ASSIGN_COPY(zv, other_zv) do { \ Z_TRY_ADDREF_P(other_zv); \ ZEND_TRY_ASSIGN_VALUE(zv, other_zv); \ } while (0) -#define ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict) do { \ +#define ZEND_TRY_ASSIGN_REF_COPY(zv, other_zv) do { \ + Z_TRY_ADDREF_P(other_zv); \ + ZEND_TRY_ASSIGN_REF_VALUE(zv, other_zv); \ +} while (0) + +#define _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, is_ref) do { \ zval *_zv = zv; \ - if (EXPECTED(Z_ISREF_P(_zv))) { \ + if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \ zend_reference *ref = Z_REF_P(_zv); \ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { \ zend_try_assign_typed_ref_zval_ex(ref, other_zv, strict); \ @@ -904,11 +1029,24 @@ ZEND_API int zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval *zv, ze ZVAL_COPY_VALUE(_zv, other_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict) \ + _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, 0) + +#define ZEND_TRY_ASSIGN_REF_VALUE_EX(zv, other_zv, strict) do { \ + ZEND_ASSERT(Z_ISREF_P(zv)); \ + _ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict, 1); \ +} while (0) + #define ZEND_TRY_ASSIGN_COPY_EX(zv, other_zv, strict) do { \ Z_TRY_ADDREF_P(other_zv); \ ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict); \ } while (0) +#define ZEND_TRY_ASSIGN_REF_COPY_EX(zv, other_zv, strict) do { \ + Z_TRY_ADDREF_P(other_zv); \ + ZEND_TRY_ASSIGN_REF_VALUE_EX(zv, other_zv, strict); \ +} while (0) + /* Initializes a reference to an empty array and returns dereferenced zval, * or NULL if the initialization failed. */ static zend_always_inline zval *zend_try_array_init_size(zval *zv, uint32_t size) |