diff options
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index bbd64f2ea7..1bc67fb3ca 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -584,7 +584,7 @@ static inline void zend_assign_to_variable_reference(zval *variable_ptr, zval *v zval_dtor_func(garbage); return; } else { - GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr); + gc_check_possible_root(garbage); } } ZVAL_REF(variable_ptr, ref); @@ -1294,7 +1294,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zend_long offset; offset = zend_check_string_offset(dim, BP_VAR_W); - if (offset < (zend_long)(-Z_STRLEN_P(str))) { + if (offset < -(zend_long)Z_STRLEN_P(str)) { /* Error on negative offset */ zend_error(E_WARNING, "Illegal string offset: " ZEND_LONG_FMT, offset); if (result) { @@ -2063,12 +2063,12 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec zval *end = cv + EX(func)->op_array.last_var; while (EXPECTED(cv != end)) { if (Z_REFCOUNTED_P(cv)) { - if (!Z_DELREF_P(cv)) { - zend_refcounted *r = Z_COUNTED_P(cv); + zend_refcounted *r = Z_COUNTED_P(cv); + if (!--GC_REFCOUNT(r)) { ZVAL_NULL(cv); zval_dtor_func(r); } else { - GC_ZVAL_CHECK_POSSIBLE_ROOT(cv); + gc_check_possible_root(r); } } cv++; @@ -2659,6 +2659,9 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zval * ZEND_ASSERT(GC_TYPE((zend_object*)fbc->common.prototype) == IS_OBJECT); GC_REFCOUNT((zend_object*)fbc->common.prototype)++; call_info |= ZEND_CALL_CLOSURE; + if (fbc->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) { + call_info |= ZEND_CALL_FAKE_CLOSURE; + } } else if (object) { call_info |= ZEND_CALL_RELEASE_THIS; GC_REFCOUNT(object)++; /* For $this pointer */ |