21static ZEND_COLD void undef_result_after_exception(
void) {
22 const zend_op *opline =
EG(opline_before_exception);
32 void **run_time_cache;
43 void **run_time_cache;
64 fbc = _zend_jit_init_func_run_time_cache(&
fbc->op_array);
74 *cache_slot = (
void *)(uintptr_t)
result;
91 fbc = _zend_jit_init_func_run_time_cache(&
fbc->op_array);
110 object = &
EG(uninitialized_zval);
121 zend_jit_invalid_method_call(
object);
154 zend_undefined_method(called_scope,
Z_STR_P(function_name));
178 fbc = zend_jit_find_method_helper(obj, function_name, obj_ptr);
183 }
else if (obj != *obj_ptr) {
231 register const char *tmp = str->
val;
236 }
else if (*tmp <
'0') {
241 if (*tmp >
'9' || *tmp <
'0') {
289 register const char *tmp = str->
val;
295 }
else if (*tmp <
'0') {
300 if (*tmp >
'9' || *tmp <
'0') {
324 register const char *tmp = str->
val;
329 }
else if (*tmp <
'0') {
334 if (*tmp >
'9' || *tmp <
'0') {
346static int ZEND_FASTCALL zend_jit_undefined_op_helper(uint32_t var)
402 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
426 if (!zend_is_long_compatible(
Z_DVAL_P(
dim), hval)) {
490 undef_result_after_exception();
544 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
568 if (!zend_is_long_compatible(
Z_DVAL_P(
dim), hval)) {
634 undef_result_after_exception();
682 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
696 if (!zend_is_long_compatible(
Z_DVAL_P(
dim), hval)) {
786 opline =
EG(opline_before_exception);
788 if (opline && !zend_jit_undefined_op_helper_write(
ht, opline->
op2.
var)) {
804 if (!zend_is_long_compatible(
Z_DVAL_P(
dim), hval)) {
872 undef_result_after_exception();
917 if (!zend_jit_undefined_op_helper_write(
ht, opline->
op2.
var)) {
927 zval_ptr_dtor_nogc(
EX_VAR((opline+1)->
op1.var));
937 if (!zend_is_long_compatible(
Z_DVAL_P(
dim), hval)) {
1005 undef_result_after_exception();
1006 if (
EG(opline_before_exception)
1011 zval_ptr_dtor_nogc(
EX_VAR((
EG(opline_before_exception)+1)->
op1.var));
1038 bool trailing_data =
false;
1041 true,
NULL, &trailing_data)) {
1052 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
1091 return zend_jit_fetch_dim_str_offset(str,
offset);
1105 zend_string_efree(str);
1114 return zend_jit_fetch_dim_str_offset(str,
offset);
1132 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
1140 goto try_string_offset;
1159 if (real_offset >= 0) {
1177 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
1178 dim = &
EG(uninitialized_zval);
1187 zend_unwrap_reference(
retval);
1204 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
1205 dim = &
EG(uninitialized_zval);
1214 zend_unwrap_reference(
result);
1249 zend_string_efree(
s);
1281 const zend_op *op_data =
EG(current_execute_data)->opline + 1;
1283 zend_jit_undefined_op_helper(op_data->
op1.
var);
1284 value = &
EG(uninitialized_zval);
1291 zend_string_efree(
s);
1309 zend_string_release(tmp);
1316 if (string_len != 1) {
1317 if (string_len == 0) {
1331 zend_string_efree(
s);
1357 zend_string_forget_hash_val(
Z_STR_P(str));
1377 const zend_op *opline =
EG(current_execute_data)->opline;
1378 zend_jit_undefined_op_helper(opline->
op2.
var);
1379 dim = &
EG(uninitialized_zval);
1436 var = zend_jit_fetch_dim_w_helper(arr,
dim);
1439 var = zend_jit_fetch_dim_rw_helper(arr,
dim);
1482 const zend_op *opline =
EG(current_execute_data)->opline;
1483 zend_jit_undefined_op_helper(opline->
op2.
var);
1484 dim = &
EG(uninitialized_zval);
1488 const zend_op *op_data =
EG(current_execute_data)->opline + 1;
1490 zend_jit_undefined_op_helper(op_data->
op1.
var);
1491 value = &
EG(uninitialized_zval);
1514 const zend_op *op_data =
EG(current_execute_data)->opline + 1;
1516 zend_jit_undefined_op_helper(op_data->
op1.
var);
1517 value = &
EG(uninitialized_zval);
1540 ? zend_jit_fetch_dim_w_helper(arr,
dim)
1555 const zend_op *opline =
EG(current_execute_data)->opline;
1556 zend_jit_undefined_op_helper(opline->
op2.
var);
1557 dim = &
EG(uninitialized_zval);
1575 const zend_op *opline =
EG(current_execute_data)->opline;
1576 zend_jit_undefined_op_helper(opline->
op2.
var);
1577 dim = &
EG(uninitialized_zval);
1622 ? zend_jit_fetch_dim_rw_helper(arr,
dim)
1625 binary_op(var, var,
value);
1636 size_t result_len = op1_len + op2_len;
1650 zend_string_forget_hash_val(result_str);
1658 result_str = zend_string_alloc(result_len, 0);
1665 ZSTR_VAL(result_str)[result_len] =
'\0';
1672 size_t result_len = op1_len + op2_len;
1681 result_str = zend_string_alloc(result_len, 0);
1688 ZSTR_VAL(result_str)[result_len] =
'\0';
1694 size_t op1_len =
ZSTR_LEN(op1_str);
1696 size_t result_len = op1_len + op2_len;
1711 zend_string_forget_hash_val(result_str);
1716 result_str = zend_string_alloc(result_len, 0);
1724 ZSTR_VAL(result_str)[result_len] =
'\0';
1730 zend_jit_undefined_op_helper(
EG(current_execute_data)->opline->
op2.
var);
1753 lval = zval_get_long_ex(
offset,
true);
1754 goto isset_str_offset;
1763 zend_vm_stack_free_call_frame(
call);
1780 EXPECTED(zend_string_equal_content(
p->key, varname)))) {
1783 goto check_indirect;
1790 idx = (
char*)
value - (
char*)
EG(symbol_table).arData;
1794 idx = (
char*)
value - (
char*)
EG(symbol_table).arData;
1859 zend_unwrap_reference(
retval);
1876 if (
EXPECTED(idx < zobj->properties->nNumUsed *
sizeof(
Bucket))) {
1893 intptr_t idx = (
char*)
retval - (
char*)
zobj->properties->arData;
1899 zend_jit_fetch_obj_r_slow(
zobj);
1915 zend_unwrap_reference(
retval);
1932 if (
EXPECTED(idx < zobj->properties->nNumUsed *
sizeof(
Bucket))) {
1949 intptr_t idx = (
char*)
retval - (
char*)
zobj->properties->arData;
1955 zend_jit_fetch_obj_is_slow(
zobj);
1969 zend_unwrap_reference(
retval);
1986 if (
EXPECTED(idx < zobj->properties->nNumUsed *
sizeof(
Bucket))) {
2002 intptr_t idx = (
char*)
retval - (
char*)
zobj->properties->arData;
2007 return zend_jit_fetch_obj_r_slow_ex(
zobj);
2021 zend_unwrap_reference(
retval);
2038 if (
EXPECTED(idx < zobj->properties->nNumUsed *
sizeof(
Bucket))) {
2054 intptr_t idx = (
char*)
retval - (
char*)
zobj->properties->arData;
2059 return zend_jit_fetch_obj_is_slow_ex(
zobj);
2077 "Cannot auto-initialize an %s inside property %s::$%s of type %s",
2082 zend_string_release(type_str);
2088 "Cannot access uninitialized non-nullable property %s::$%s by reference",
2090 zend_get_unmangled_property_name(prop->
name));
2098 if (promotes_to_array(
ptr)) {
2102 if (!check_type_array_assignable(
prop_info->type)) {
2103 zend_throw_auto_init_in_prop_error(
prop_info,
"array");
2116 zend_throw_access_uninit_prop_by_ref_error(
prop_info);
2196 "Cannot auto-initialize an array inside property %s::$%s of type %s",
2200 zend_string_release(type_str);
2230 zend_vm_stack_free_args(
call);
2243 return zend_jit_assign_to_typed_ref_helper(ref,
value,
IS_CONST);
2253 return zend_jit_assign_to_typed_ref_helper(ref,
value,
IS_VAR);
2259 const zend_op *opline =
EG(current_execute_data)->opline;
2265 var = (opline + 1)->
op1.var;
2267 zend_jit_undefined_op_helper(var);
2268 value = &
EG(uninitialized_zval);
2270 return zend_jit_assign_to_typed_ref_helper(ref,
value,
IS_CV);
2305 const zend_op *opline =
EG(current_execute_data)->opline;
2311 var = (opline + 1)->
op1.var;
2313 zend_jit_undefined_op_helper(var);
2314 value = &
EG(uninitialized_zval);
2335 "Cannot increment a reference held by property %s::$%s of type %s past its maximal value",
2337 zend_get_unmangled_property_name(error_prop->
name),
2339 zend_string_release(type_str);
2347 "Cannot decrement a reference held by property %s::$%s of type %s past its minimal value",
2349 zend_get_unmangled_property_name(error_prop->
name),
2351 zend_string_release(type_str);
2366 zend_jit_throw_inc_ref_error(ref, error_prop);
2392 zend_jit_throw_dec_ref_error(ref, error_prop);
2416 zend_jit_throw_inc_ref_error(ref, error_prop);
2435 zend_jit_throw_dec_ref_error(ref, error_prop);
2455 binary_op(&z_copy, &ref->
val,
val);
2468 binary_op(&z_copy, &ref->
val,
val);
2475 zval_ptr_dtor_nogc(
val);
2497 "Attempt to modify property \"%s\" on %s",
2515 "Attempt to increment/decrement property \"%s\" on %s",
2525 "Attempt to assign property \"%s\" on %s",
2534 zend_jit_undefined_op_helper(
EX(opline)->
op1.var);
2536 zend_jit_invalid_property_assign(
container, property_name);
2571#define HT_POISONED_PTR ((HashTable *) (intptr_t) -1)
2578 while (iter !=
end) {
2579 if (iter->
ht ==
ht) {
2590 _zend_hash_iterators_remove(
ht);
2620 const zend_op *op_data =
EG(current_execute_data)->opline + 1;
2622 zend_jit_undefined_op_helper(op_data->
op1.
var);
2623 value = &
EG(uninitialized_zval);
2641 const char *operation = indirect ?
"indirectly modify" :
"modify";
2658 zend_jit_undefined_op_helper(op_data->
op1.
var);
2659 value = &
EG(uninitialized_zval);
2662 if (
UNEXPECTED(!verify_readonly_and_avis(property_val, info,
false))) {
2697 z =
object->handlers->read_property(
object,
name,
BP_VAR_R, cache_slot, &
rv);
2706 object->handlers->write_property(
object,
name, &
res, cache_slot);
2735 binary_op(&z_copy, zptr,
value);
2764 zend_jit_assign_op_to_typed_ref(ref,
value, binary_op);
2776 zend_jit_assign_op_to_typed_prop(zptr,
prop_info,
value, binary_op);
2778 binary_op(zptr, zptr,
value);
2787 _zend_jit_assign_op_overloaded_property(
zobj,
name, cache_slot,
value, binary_op);
2794 zend_type_error(
"Cannot increment property %s::$%s of type %s past its maximal value",
2796 zend_get_unmangled_property_name(prop->
name),
2798 zend_string_release(type_str);
2805 zend_type_error(
"Cannot decrement property %s::$%s of type %s past its minimal value",
2807 zend_get_unmangled_property_name(prop->
name),
2809 zend_string_release(type_str);
2972 fast_long_increment_function(prop);
2984 zend_jit_pre_inc_typed_ref(ref,
result);
2990 zend_jit_inc_typed_prop(prop,
prop_info);
3020 zobj->handlers->write_property(
zobj,
name, &z_copy, cache_slot);
3042 fast_long_decrement_function(prop);
3054 zend_jit_pre_dec_typed_ref(ref,
result);
3060 zend_jit_dec_typed_prop(prop,
prop_info);
3090 zobj->handlers->write_property(
zobj,
name, &z_copy, cache_slot);
3111 fast_long_increment_function(prop);
3122 zend_jit_post_inc_typed_ref(ref,
result);
3151 zobj->handlers->write_property(
zobj,
name, &z_copy, cache_slot);
3172 fast_long_decrement_function(prop);
3183 zend_jit_post_dec_typed_ref(ref,
result);
3212 zobj->handlers->write_property(
zobj,
name, &z_copy, cache_slot);
3228static void ZEND_FASTCALL zend_jit_exception_in_interrupt_handler_helper(
void)
3232 const zend_op *throw_op =
EG(opline_before_exception);
3252 for (i = 0; i <=
count; i++) {
3256 ret = zend_string_alloc(
len, 0);
3260 for (i = 0; i <=
count; i++) {
count(Countable|array $value, int $mode=COUNT_NORMAL)
memset(ptr, 0, type->size)
unsigned const char * end
zend_object_get_method_t get_method
zend_object_read_dimension_t read_dimension
zend_object_write_dimension_t write_dimension
const zend_object_handlers * handlers
ZEND_API ZEND_COLD void zend_error_unchecked(int type, const char *format,...)
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API ZEND_COLD void zend_type_error(const char *format,...)
ZEND_API ZEND_COLD void zend_error(int type, const char *format,...)
ZEND_API ZEND_COLD void zend_illegal_container_offset(const zend_string *container, const zval *offset, int type)
ZEND_API const char * zend_zval_value_name(const zval *arg)
#define efree_size(ptr, size)
#define perealloc(ptr, size, persistent)
#define ZEND_MM_ALIGNED_SIZE(size)
#define FREE_HASHTABLE(ht)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API zend_string * zend_type_to_string(zend_type type)
zend_result(ZEND_FASTCALL * binary_op_type)(zval *, zval *, zval *)
#define ZEND_CALL_ALLOCATED
#define ZEND_ACC_READONLY
#define RUN_TIME_CACHE(op_array)
#define ZEND_ACC_PPP_SET_MASK
#define ZEND_CALL_NESTED_FUNCTION
#define ZEND_USER_FUNCTION
#define ZEND_CALL_VAR(call, n)
#define ZEND_ACC_CALL_VIA_TRAMPOLINE
struct _zend_op_array zend_op_array
#define EX_USES_STRICT_TYPES()
struct _zend_property_info zend_property_info
#define ZEND_FETCH_DIM_WRITE
#define ZEND_CALL_USES_STRICT_TYPES(call)
#define RT_CONSTANT(opline, node)
#define ZEND_CALL_INFO(call)
struct _zend_arg_info zend_arg_info
#define ZEND_FETCH_OBJ_FLAGS
#define ZEND_ACC_NEVER_CACHE
ZEND_API bool zend_verify_ref_array_assignable(zend_reference *ref)
ZEND_API bool zend_check_user_type_slow(zend_type *type, zval *arg, zend_reference *ref, void **cache_slot, bool is_return_type)
ZEND_API void ZEND_FASTCALL zend_init_func_run_time_cache(zend_op_array *op_array)
ZEND_API ZEND_COLD zval *ZEND_FASTCALL zend_undefined_offset_write(HashTable *ht, zend_long lval)
ZEND_API ZEND_COLD void zend_verify_arg_error(const zend_function *zf, const zend_arg_info *arg_info, uint32_t arg_num, zval *value)
ZEND_API bool zend_never_inline zend_verify_property_type(const zend_property_info *info, zval *property, bool strict)
ZEND_API bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, bool strict)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_use_resource_as_offset(const zval *dim)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation)
ZEND_API ZEND_COLD zval *ZEND_FASTCALL zend_undefined_index_write(HashTable *ht, zend_string *offset)
ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void)
ZEND_API void * zend_vm_stack_extend(size_t size)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error(const zend_property_info *info)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_false_to_array_deprecated(void)
ZEND_API ZEND_COLD void zend_verify_return_error(const zend_function *zf, zval *value)
#define CACHED_PTR_EX(slot)
#define ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop)
#define ZEND_REF_HAS_TYPE_SOURCES(ref)
#define CACHE_PTR_EX(slot, ptr)
#define ZEND_REF_FOREACH_TYPE_SOURCES_END()
#define ZEND_REF_ADD_TYPE_SOURCE(ref, source)
ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info)
#define CACHE_POLYMORPHIC_PTR(num, ce, ptr)
union _zend_function zend_function
#define GC_REMOVE_FROM_BUFFER(p)
ZEND_API zval *ZEND_FASTCALL zend_hash_next_index_insert_new(HashTable *ht, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h)
ZEND_API zval *ZEND_FASTCALL zend_hash_lookup(HashTable *ht, zend_string *key)
ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite)
ZEND_API zval *ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key)
ZEND_API bool ZEND_FASTCALL _zend_handle_numeric_str_ex(const char *key, size_t length, zend_ulong *idx)
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
ZEND_API HashTable *ZEND_FASTCALL zend_array_dup(HashTable *source)
ZEND_API zval *ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key)
ZEND_API zval *ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulong h)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
#define ZEND_HASH_INDEX_LOOKUP(_ht, _h, _ret)
#define HT_HAS_ITERATORS(ht)
#define zend_new_array(size)
#define ZEND_HASH_INDEX_FIND(_ht, _h, _ret, _not_found)
#define ZEND_HANDLE_NUMERIC(key, idx)
#define HASH_FLAG_UNINITIALIZED
struct _zend_string zend_string
#define ZEND_MAP_PTR_SET(ptr, val)
#define ZEND_DECODE_DYN_PROP_OFFSET(offset)
#define ZEND_ENCODE_DYN_PROP_OFFSET(offset)
#define IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(offset)
#define IS_HOOKED_PROPERTY_OFFSET(offset)
#define ZEND_DYNAMIC_PROPERTY_OFFSET
#define zend_free_trampoline(func)
ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object)
ZEND_API zend_result ZEND_FASTCALL decrement_function(zval *op1)
ZEND_API void ZEND_COLD zend_incompatible_double_to_long_error(double d)
ZEND_API zend_string *ZEND_FASTCALL zval_try_get_string_func(zval *op)
ZEND_API zend_result ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2)
ZEND_API zend_long ZEND_FASTCALL zval_get_long_func(const zval *op, bool is_strict)
ZEND_API zend_result ZEND_FASTCALL increment_function(zval *op1)
#define zend_never_inline
#define EXPECTED(condition)
#define zend_always_inline
#define EMPTY_SWITCH_DEFAULT_CASE()
#define UNEXPECTED(condition)
struct _zend_array zend_array
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
#define _ZSTR_STRUCT_SIZE(len)
#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(s1, s2)
#define ZSTR_IS_INTERNED(s)
#define ZSTR_COPYABLE_CONCAT_PROPERTIES
#define ZSTR_EMPTY_ALLOC()
#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s)
#define Z_ISREF_P(zval_p)
#define Z_TRY_ADDREF_P(pz)
#define Z_REFVAL_P(zval_p)
#define Z_STRVAL_P(zval_p)
#define Z_ISUNDEF_P(zval_p)
#define Z_ARRVAL_P(zval_p)
#define Z_REFCOUNTED_P(zval_p)
#define ZVAL_INDIRECT(z, v)
struct _zend_array HashTable
#define IS_PROP_REINITABLE
#define Z_OBJ_HT_P(zval_p)
#define ZVAL_COPY_DEREF(z, v)
#define ZVAL_NEW_REF(z, r)
#define ZEND_TYPE_FULL_MASK(t)
#define Z_STRLEN_P(zval_p)
#define ZEND_TYPE_IS_SET(t)
#define Z_RES_HANDLE_P(zval_p)
#define ZVAL_NEW_STR(z, s)
#define HT_GET_DATA_ADDR(ht)
struct _zend_refcounted zend_refcounted
#define Z_INDIRECT_P(zval_p)
#define ZVAL_MAKE_REF_EX(z, refcount)
#define IS_ARRAY_IMMUTABLE
#define Z_ISERROR_P(zval_p)
struct _HashTableIterator HashTableIterator
#define ZEND_TYPE_ALLOW_NULL(t)
#define SEPARATE_ARRAY(zv)
#define ZEND_TYPE_CONTAINS_CODE(t, code)
struct _zend_execute_data zend_execute_data
#define ZVAL_COPY_VALUE(z, v)
struct _zend_reference zend_reference
#define GC_ADD_FLAGS(p, flags)
#define Z_TRY_DELREF_P(pz)
ZEND_API void ZEND_FASTCALL rc_dtor_func(zend_refcounted *p)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
ZEND_API void zval_add_ref(zval *p)
zend_property_info * prop_info
zend_refcounted * garbage
#define ZEND_HANDLE_EXCEPTION
#define ZEND_ADD_ARRAY_ELEMENT
#define ZEND_ISSET_ISEMPTY_DIM_OBJ
#define ZEND_ADD_ARRAY_UNPACK
#define ZEND_FETCH_DIM_UNSET