summaryrefslogtreecommitdiff
path: root/ext/opcache/jit/zend_jit_helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/opcache/jit/zend_jit_helpers.c')
-rw-r--r--ext/opcache/jit/zend_jit_helpers.c174
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.