1
0
mirror of https://github.com/php/php-src.git synced 2026-03-27 17:52:16 +01:00
This commit is contained in:
Dmitry Stogov
2014-04-16 01:45:40 +04:00
parent a4bda5b187
commit e99e6958bc
6 changed files with 452 additions and 894 deletions

View File

@@ -1994,9 +1994,6 @@ static void debug_backtrace_get_args(zval *curpos, zval *arg_array TSRMLS_DC)
while (--arg_count >= 0) {
arg = p++;
if (arg) {
//??? if (Z_TYPE_P(arg) != IS_OBJECT) {
//??? SEPARATE_ZVAL_TO_MAKE_IS_REF(arg);
//??? }
if (Z_REFCOUNTED_P(arg)) Z_ADDREF_P(arg);
add_next_index_zval(arg_array, arg);
} else {

View File

@@ -522,7 +522,7 @@ ZEND_API int zval_update_constant_ex(zval *p, void *arg, zend_class_entry *scope
actual_len -= (actual - Z_STRVAL_P(p));
if (inline_change) {
zend_string *s = STR_INIT(actual, actual_len, 0);
//??? STR_RELEASE(Z_STR_P(p));
STR_RELEASE(Z_STR_P(p));
Z_STR_P(p) = s;
Z_TYPE_FLAGS_P(p) = IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE;
}

View File

@@ -374,9 +374,6 @@ static void gc_mark_roots(TSRMLS_D)
while (current != &GC_G(roots)) {
if (GC_GET_COLOR(GC_INFO(current->ref)) == GC_PURPLE) {
gc_mark_grey(current->ref TSRMLS_CC);
//??? } else {
//??? GC_SET_ADDRESS(GC_INFO(current->ref), 0);
//??? GC_REMOVE_FROM_ROOTS(current);
}
current = current->next;
}
@@ -487,9 +484,6 @@ tail_call:
zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref;
/* PURPLE instead of BLACK to prevent buffering in nested gc calls */
//??? GC_SET_PURPLE(GC_INFO(obj));
if (EXPECTED(IS_OBJ_VALID(EG(objects_store).object_buckets[obj->handle]) &&
(get_gc = obj->handlers->get_gc) != NULL)) {
int i, n;

View File

@@ -163,10 +163,6 @@ static void zend_std_call_getter(zval *object, zval *member, zval *retval TSRMLS
zend_call_method_with_1_params(object, ce, &ce->__get, ZEND_GET_FUNC_NAME, retval, member);
zval_ptr_dtor(member);
//??? if (Z_REFCOUNTED_P(retval)) {
//??? Z_DELREF_P(retval);
//??? }
}
/* }}} */
@@ -481,25 +477,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, const zend_li
retval = rv;
if (!Z_ISREF_P(rv) &&
(type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET)) {
if (Z_REFCOUNTED_P(rv) && Z_REFCOUNT_P(rv) > 1) {
SEPARATE_ZVAL(rv);
//??? if (Z_TYPE_P(rv) == IS_OBJECT ||
//??? Z_TYPE_P(rv) == IS_RESOURCE) {
//??? Z_ADDREF_P(rv);
//??? } else {
//??? zval_copy_ctor(rv);
//??? Z_SET_REFCOUNT_P(rv, 1);
//??? }
//??? zval *tmp = rv;
//???
//??? ALLOC_ZVAL(rv);
//??? ZVAL_DUP(rv, tmp);
//??? Z_UNSET_ISREF_P(rv);
//??? Z_SET_REFCOUNT_P(rv, 0);
}
SEPARATE_ZVAL(rv);
if (UNEXPECTED(Z_TYPE_P(rv) != IS_OBJECT)) {
zend_error(E_NOTICE, "Indirect modification of overloaded property %s::$%s has no effect", zobj->ce->name->val, Z_STRVAL_P(member));
}
@@ -688,10 +666,6 @@ zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv TSR
}
return NULL;
}
/* Undo PZVAL_LOCK() */
//??? if (Z_REFCOUNTED_P(rv)) Z_DELREF_P(rv);
return rv;
} else {
zend_error_noreturn(E_ERROR, "Cannot use object of type %s as array", ce->name->val);
@@ -1552,18 +1526,13 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
return FAILURE;
}
if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
//??? INIT_PZVAL(writeobj);
if (readobj == writeobj) {
zval_ptr_dtor(readobj);
}
ZVAL_COPY_VALUE(writeobj, &retval);
if (Z_TYPE_P(writeobj) != type) {
convert_to_explicit_type(writeobj, type);
}
return SUCCESS;
} else {
zval_ptr_dtor(&retval);
//??? INIT_PZVAL(writeobj);
if (readobj == writeobj) {
zval_ptr_dtor(readobj);
}

View File

@@ -1145,8 +1145,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
EMPTY_SWITCH_DEFAULT_CASE()
}
/* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
} else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
} else if (Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
switch (type) {
@@ -1919,7 +1918,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
zval *ret = EX_VAR(opline->result.var);
ZVAL_NULL(ret);
//??? ret->var.ptr_ptr = &ret->var.ptr;
Z_VAR_FLAGS_P(ret) = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0 ? IS_VAR_RET_REF : 0;
if (!zend_execute_internal) {
@@ -1932,8 +1930,8 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
if (!RETURN_VALUE_USED(opline)) {
zval_ptr_dtor(ret);
}
} else if (RETURN_VALUE_USED(opline)) {
//??? EX_T(opline->result.var).var.ptr = NULL;
} else if (RETURN_VALUE_USED(opline)) {
ZVAL_UNDEF(EX_VAR(opline->result.var));
}
} else if (fbc->type == ZEND_USER_FUNCTION) {
zval *return_value = NULL;
@@ -1944,7 +1942,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
return_value = EX_VAR(opline->result.var);
ZVAL_NULL(return_value);
//??? ret->var.ptr_ptr = &ret->var.ptr;
Z_VAR_FLAGS_P(return_value) = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0 ? IS_VAR_RET_REF : 0;
}
@@ -1988,7 +1985,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
//??? Z_UNSET_ISREF_P(EX_T(opline->result.var).var.ptr);
//??? Z_SET_REFCOUNT_P(EX_T(opline->result.var).var.ptr, 1);
Z_VAR_FLAGS_P(EX_VAR(opline->result.var)) = 0;
//??? EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
}
}
@@ -2809,11 +2805,9 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY)
if (OP1_TYPE == IS_VAR && !Z_ISREF_P(retval_ptr)) {
if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
(Z_VAR_FLAGS_P(retval_ptr) & IS_VAR_RET_REF)) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
} else {
zend_error(E_NOTICE, "Only variable references should be returned by reference");
if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
zval tmp;
ZVAL_DUP(&tmp, retval_ptr);
ZVAL_NEW_REF(EX(return_value), &tmp);
@@ -2965,13 +2959,8 @@ ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
top = zend_vm_stack_top_inc(TSRMLS_C);
if (Z_ISREF_P(varptr)) {
//??? if (OP1_TYPE == IS_CV ||
//??? (OP1_TYPE == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
ZVAL_DUP(top, Z_REFVAL_P(varptr));
FREE_OP1();
//??? } else {
//??? varptr = Z_REFVAL_P(varptr);
//??? }
ZVAL_DUP(top, Z_REFVAL_P(varptr));
FREE_OP1();
} else {
if (OP1_TYPE == IS_CV) {
if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
@@ -3232,7 +3221,6 @@ ZEND_VM_C_LABEL(send_again):
}
ZEND_VM_C_LABEL(unpack_iter_dtor):
//??? iter->funcs->dtor(iter TSRMLS_CC);
zend_iterator_dtor(iter TSRMLS_CC);
break;
}
@@ -3533,7 +3521,6 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMP|VAR|UNUSED|CV, ANY)
if (EXPECTED(EG(exception) == NULL)) {
ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));
//??? Z_SET_ISREF_P(retval);
if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(EX_VAR(opline->result.var));
}
@@ -4062,19 +4049,11 @@ ZEND_VM_C_LABEL(num_index_dim):
if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use object as array");
}
//??? if (IS_OP2_TMP_FREE()) {
//???? if (OP2_TYPE == IS_CONST) {
//???? ZVAL_DUP(offset, offset);
//???? } else if (OP2_TYPE == IS_TMP_VAR) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? if (OP2_TYPE == IS_CONST) {
//??? zval_copy_ctor(offset);
//??? }
Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
//??? if (IS_OP2_TMP_FREE()) {
//???? if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_TMP_VAR) {
//??? zval_ptr_dtor(offset);
//??? } else {
FREE_OP2();
//??? }
FREE_OP2();
break;
case IS_STRING:
case IS_STR_OFFSET:
@@ -5301,9 +5280,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
* not return by reference we throw a notice. */
if (OP1_TYPE == IS_VAR && !Z_ISREF_P(value_ptr)
&& !(opline->extended_value == ZEND_RETURNS_FUNCTION
&& (Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF))
//??? && EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
) {
&& (Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF))) {
zend_error(E_NOTICE, "Only variable references should be yielded by reference");
} else {
SEPARATE_ZVAL_TO_MAKE_IS_REF(value_ptr);
@@ -5316,18 +5293,12 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
/* Consts, temporary variables and references need copying */
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR
|| Z_ISREF_P(value)
) {
//??? INIT_PZVAL_COPY(copy, value);
if (OP1_TYPE == IS_CONST) {
ZVAL_DUP(&generator->value, value);
} else if (OP1_TYPE == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!IS_OP1_TMP_FREE()) {
zval_copy_ctor(&generator->value);
}
} else if (Z_ISREF_P(value)) {
ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
FREE_OP1_IF_VAR();
} else {
if (OP1_TYPE == IS_CV) {
@@ -5347,19 +5318,18 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
zval *key = GET_OP2_ZVAL_PTR(BP_VAR_R);
/* Consts, temporary variables and references need copying */
if (OP2_TYPE == IS_CONST || OP2_TYPE == IS_TMP_VAR
|| (Z_ISREF_P(key) && Z_REFCOUNT_P(key) > 0)
) {
//??? INIT_PZVAL_COPY(copy, key);
if (OP2_TYPE == IS_CONST) {
ZVAL_DUP(&generator->key, key);
} else if (OP2_TYPE == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
if (Z_OPT_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!IS_OP2_TMP_FREE()) {
zval_copy_ctor(&generator->key);
}
} else if (Z_ISREF_P(key)) {
ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
FREE_OP2_IF_VAR();
} else {
ZVAL_COPY(&generator->key, key);
if (OP1_TYPE == IS_CV) {
if (Z_REFCOUNTED_P(key)) Z_ADDREF_P(key);
}
ZVAL_COPY_VALUE(&generator->key, key);
}
if (Z_TYPE(generator->key) == IS_LONG
@@ -5367,8 +5337,6 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
) {
generator->largest_used_integer_key = Z_LVAL(generator->key);
}
FREE_OP2_IF_VAR();
} else {
/* If no key was specified we use auto-increment keys */
generator->largest_used_integer_key++;

File diff suppressed because it is too large Load Diff