diff options
Diffstat (limited to 'ext/opcache/jit/zend_jit_helpers.c')
-rw-r--r-- | ext/opcache/jit/zend_jit_helpers.c | 174 |
1 files changed, 36 insertions, 138 deletions
diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 9fd4bddf15..53e0107bdc 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -259,31 +259,10 @@ static zval* ZEND_FASTCALL zend_jit_hash_index_lookup_rw(HashTable *ht, zend_lon return retval; } -static zval* ZEND_FASTCALL zend_jit_hash_index_lookup_w(HashTable *ht, zend_long idx) -{ - zval *retval = _zend_hash_index_find(ht, idx); - - if (!retval) { - retval = zend_hash_index_add_new(ht, idx, &EG(uninitialized_zval)); - } - return retval; -} - static zval* ZEND_FASTCALL zend_jit_hash_lookup_rw(HashTable *ht, zend_string *str) { zval *retval = zend_hash_find_ex(ht, str, 1); - - if (retval) { - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) { - return NULL; - } - ZVAL_NULL(retval); - } - } - } else { + if (!retval) { /* Key may be released while throwing the undefined index warning. */ zend_string_addref(str); if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) { @@ -296,23 +275,6 @@ static zval* ZEND_FASTCALL zend_jit_hash_lookup_rw(HashTable *ht, zend_string *s return retval; } -static zval* ZEND_FASTCALL zend_jit_hash_lookup_w(HashTable *ht, zend_string *str) -{ - zval *retval = zend_hash_find_ex(ht, str, 1); - - if (retval) { - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - ZVAL_NULL(retval); - } - } - } else { - retval = zend_hash_add_new(ht, str, &EG(uninitialized_zval)); - } - return retval; -} - static zval* ZEND_FASTCALL zend_jit_symtable_lookup_rw(HashTable *ht, zend_string *str) { zend_ulong idx; @@ -344,17 +306,7 @@ static zval* ZEND_FASTCALL zend_jit_symtable_lookup_rw(HashTable *ht, zend_strin } while (0); retval = zend_hash_find(ht, str); - if (retval) { - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) { - return NULL; - } - ZVAL_NULL(retval); - } - } - } else { + if (!retval) { /* Key may be released while throwing the undefined index warning. */ zend_string_addref(str); if (UNEXPECTED(zend_undefined_index_write(ht, str) == FAILURE)) { @@ -371,7 +323,6 @@ static zval* ZEND_FASTCALL zend_jit_symtable_lookup_w(HashTable *ht, zend_string { zend_ulong idx; register const char *tmp = str->val; - zval *retval; do { if (*tmp > '9') { @@ -386,26 +337,11 @@ static zval* ZEND_FASTCALL zend_jit_symtable_lookup_w(HashTable *ht, zend_string } } if (_zend_handle_numeric_str_ex(str->val, str->len, &idx)) { - retval = zend_hash_index_find(ht, idx); - if (!retval) { - retval = zend_hash_index_add_new(ht, idx, &EG(uninitialized_zval)); - } - return retval; + return zend_hash_index_lookup(ht, idx); } } while (0); - retval = zend_hash_find(ht, str); - if (retval) { - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - ZVAL_NULL(retval); - } - } - } else { - retval = zend_hash_add_new(ht, str, &EG(uninitialized_zval)); - } - return retval; + return zend_hash_lookup(ht, str); } static int ZEND_FASTCALL zend_jit_undefined_op_helper(uint32_t var) @@ -482,17 +418,7 @@ str_index: goto num_index; } retval = zend_hash_find(ht, offset_key); - if (retval) { - /* support for $GLOBALS[...] */ - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key)); - ZVAL_NULL(result); - return; - } - } - } else { + if (!retval) { zend_error(E_WARNING, "Undefined array key \"%s\"", ZSTR_VAL(offset_key)); ZVAL_NULL(result); return; @@ -557,16 +483,7 @@ str_index: goto num_index; } retval = zend_hash_find(ht, offset_key); - if (retval) { - /* support for $GLOBALS[...] */ - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - ZVAL_NULL(result); - return; - } - } - } else { + if (!retval) { ZVAL_NULL(result); return; } @@ -628,18 +545,13 @@ str_index: goto num_index; } retval = zend_hash_find(ht, offset_key); - if (retval) { - /* support for $GLOBALS[...] */ - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - } - if (UNEXPECTED(Z_TYPE_P(retval) == IS_REFERENCE)) { - retval = Z_REFVAL_P(retval); - } - return (Z_TYPE_P(retval) > IS_NULL); - } else { + if (!retval) { return 0; } + if (UNEXPECTED(Z_TYPE_P(retval) == IS_REFERENCE)) { + retval = Z_REFVAL_P(retval); + } + return Z_TYPE_P(retval) > IS_NULL; num_index: ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef); @@ -701,18 +613,7 @@ str_index: goto num_index; } retval = zend_hash_find(ht, offset_key); - if (retval) { - /* support for $GLOBALS[...] */ - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) { - return NULL; - } - ZVAL_NULL(retval); - } - } - } else { + if (!retval) { /* Key may be released while throwing the undefined index warning. */ zend_string_addref(offset_key); if (UNEXPECTED(zend_undefined_index_write(ht, offset_key) == FAILURE)) { @@ -784,26 +685,10 @@ str_index: if (ZEND_HANDLE_NUMERIC(offset_key, hval)) { goto num_index; } - retval = zend_hash_find(ht, offset_key); - if (retval) { - /* support for $GLOBALS[...] */ - if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { - retval = Z_INDIRECT_P(retval); - if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) { - ZVAL_NULL(retval); - } - } - } else { - retval = zend_hash_add_new(ht, offset_key, &EG(uninitialized_zval)); - } - return retval; + return zend_hash_lookup(ht, offset_key); num_index: - ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef); - return retval; - -num_undef: - retval = zend_hash_index_add_new(ht, hval, &EG(uninitialized_zval)); + ZEND_HASH_INDEX_LOOKUP(ht, hval, retval); return retval; } @@ -1452,7 +1337,7 @@ check_indirect: return ref; } -static zend_always_inline zend_bool zend_jit_verify_type_common(zval *arg, zend_arg_info *arg_info, void **cache_slot) +static zend_always_inline bool zend_jit_verify_type_common(zval *arg, zend_arg_info *arg_info, void **cache_slot) { uint32_t type_mask; @@ -1463,14 +1348,20 @@ static zend_always_inline zend_bool zend_jit_verify_type_common(zval *arg, zend_ ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(arg_info->type), list_type) { if (*cache_slot) { ce = *cache_slot; + } else if (ZEND_TYPE_HAS_CE_CACHE(*list_type) && ZEND_TYPE_CE_CACHE(*list_type)) { + ce = ZEND_TYPE_CE_CACHE(*list_type); + *cache_slot = ce; } else { ce = zend_fetch_class(ZEND_TYPE_NAME(*list_type), - (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD)); + ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT); if (!ce) { cache_slot++; continue; } *cache_slot = ce; + if (ZEND_TYPE_HAS_CE_CACHE(*list_type)) { + ZEND_TYPE_SET_CE_CACHE(*list_type, ce); + } } if (instanceof_function(Z_OBJCE_P(arg), ce)) { return 1; @@ -1480,12 +1371,19 @@ static zend_always_inline zend_bool zend_jit_verify_type_common(zval *arg, zend_ } else { if (EXPECTED(*cache_slot)) { ce = (zend_class_entry *) *cache_slot; + } else if (ZEND_TYPE_HAS_CE_CACHE(arg_info->type) && ZEND_TYPE_CE_CACHE(arg_info->type)) { + ce = ZEND_TYPE_CE_CACHE(arg_info->type); + *cache_slot = ce; } else { - ce = zend_fetch_class(ZEND_TYPE_NAME(arg_info->type), (ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD)); + ce = zend_fetch_class(ZEND_TYPE_NAME(arg_info->type), + ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD | ZEND_FETCH_CLASS_SILENT); if (UNEXPECTED(!ce)) { goto builtin_types; } *cache_slot = (void *) ce; + if (ZEND_TYPE_HAS_CE_CACHE(arg_info->type)) { + ZEND_TYPE_SET_CE_CACHE(arg_info->type, ce); + } } if (instanceof_function(Z_OBJCE_P(arg), ce)) { return 1; @@ -1510,12 +1408,12 @@ builtin_types: return 0; } -static zend_bool ZEND_FASTCALL zend_jit_verify_arg_slow(zval *arg, zend_arg_info *arg_info) +static bool ZEND_FASTCALL zend_jit_verify_arg_slow(zval *arg, zend_arg_info *arg_info) { zend_execute_data *execute_data = EG(current_execute_data); const zend_op *opline = EX(opline); void **cache_slot = CACHE_ADDR(opline->extended_value); - zend_bool ret; + bool ret; ret = zend_jit_verify_type_common(arg, arg_info, cache_slot); if (UNEXPECTED(!ret)) { @@ -1648,12 +1546,12 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_is_dynamic(zend_object *zobj, intpt zend_jit_fetch_obj_is_slow(zobj); } -static zend_always_inline zend_bool promotes_to_array(zval *val) { +static zend_always_inline bool promotes_to_array(zval *val) { return Z_TYPE_P(val) <= IS_FALSE || (Z_ISREF_P(val) && Z_TYPE_P(Z_REFVAL_P(val)) <= IS_FALSE); } -static zend_always_inline zend_bool check_type_array_assignable(zend_type type) { +static zend_always_inline bool check_type_array_assignable(zend_type type) { if (!ZEND_TYPE_IS_SET(type)) { return 1; } @@ -1695,7 +1593,7 @@ static zend_never_inline ZEND_COLD void zend_throw_access_uninit_prop_by_ref_err zend_get_unmangled_property_name(prop->name)); } -static zend_never_inline zend_bool zend_handle_fetch_obj_flags( +static zend_never_inline bool zend_handle_fetch_obj_flags( zval *result, zval *ptr, zend_object *obj, zend_property_info *prop_info, uint32_t flags) { switch (flags) { @@ -1878,7 +1776,7 @@ static zend_property_info *zend_jit_get_prop_not_accepting_double(zend_reference return NULL; } -static ZEND_COLD void zend_jit_throw_incdec_ref_error(zend_reference *ref, zend_bool inc) +static ZEND_COLD void zend_jit_throw_incdec_ref_error(zend_reference *ref, bool inc) { zend_property_info *error_prop = zend_jit_get_prop_not_accepting_double(ref); /* Currently there should be no way for a typed reference to accept both int and double. |