mirror of
https://github.com/php/php-src.git
synced 2026-04-21 23:18:13 +02:00
Fixed bug #67725 (now we create immutable arrays only in SHM)
This commit is contained in:
@@ -498,7 +498,7 @@ PHP_FUNCTION( collator_sort_with_sort_keys )
|
||||
/* sort it */
|
||||
zend_qsort( sortKeyIndxBuf, sortKeyCount, sortKeyIndxSize, collator_cmp_sort_keys TSRMLS_CC );
|
||||
|
||||
zval_dtor( array );
|
||||
zval_ptr_dtor( array );
|
||||
/* for resulting hash we'll assign new hash keys rather then reordering */
|
||||
array_init(array);
|
||||
|
||||
|
||||
@@ -110,9 +110,6 @@ int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv TSRMLS_DC)
|
||||
int i = op_array->last_literal;
|
||||
op_array->last_literal++;
|
||||
op_array->literals = (zval*)erealloc(op_array->literals, op_array->last_literal * sizeof(zval));
|
||||
if (Z_TYPE_P(zv) == IS_ARRAY) {
|
||||
zend_make_immutable_array(zv TSRMLS_CC);
|
||||
}
|
||||
ZVAL_COPY_VALUE(&op_array->literals[i], zv);
|
||||
Z_CACHE_SLOT(op_array->literals[i]) = -1;
|
||||
//??? Z_SET_REFCOUNT(op_array->literals[i].constant, 2);
|
||||
|
||||
@@ -195,6 +195,7 @@ static void zend_persist_zval(zval *z TSRMLS_DC)
|
||||
new_ptr = zend_shared_alloc_get_xlat_entry(Z_ARR_P(z));
|
||||
if (new_ptr) {
|
||||
Z_ARR_P(z) = new_ptr;
|
||||
Z_TYPE_FLAGS_P(z) = IS_TYPE_IMMUTABLE;
|
||||
} else {
|
||||
if (Z_IMMUTABLE_P(z)) {
|
||||
Z_ARR_P(z) = zend_accel_memdup(Z_ARR_P(z), sizeof(zend_array));
|
||||
@@ -202,6 +203,10 @@ static void zend_persist_zval(zval *z TSRMLS_DC)
|
||||
} else {
|
||||
zend_accel_store(Z_ARR_P(z), sizeof(zend_array));
|
||||
zend_hash_persist(Z_ARRVAL_P(z), zend_persist_zval TSRMLS_CC);
|
||||
/* make immutable array */
|
||||
Z_TYPE_FLAGS_P(z) = IS_TYPE_IMMUTABLE;
|
||||
GC_REFCOUNT(Z_COUNTED_P(z)) = 2;
|
||||
Z_ARRVAL_P(z)->u.flags &= ~HASH_FLAG_APPLY_PROTECTION;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -252,6 +257,7 @@ static void zend_persist_zval_const(zval *z TSRMLS_DC)
|
||||
new_ptr = zend_shared_alloc_get_xlat_entry(Z_ARR_P(z));
|
||||
if (new_ptr) {
|
||||
Z_ARR_P(z) = new_ptr;
|
||||
Z_TYPE_FLAGS_P(z) = IS_TYPE_IMMUTABLE;
|
||||
} else {
|
||||
if (Z_IMMUTABLE_P(z)) {
|
||||
Z_ARR_P(z) = zend_accel_memdup(Z_ARR_P(z), sizeof(zend_array));
|
||||
@@ -259,6 +265,10 @@ static void zend_persist_zval_const(zval *z TSRMLS_DC)
|
||||
} else {
|
||||
zend_accel_store(Z_ARR_P(z), sizeof(zend_array));
|
||||
zend_hash_persist(Z_ARRVAL_P(z), zend_persist_zval TSRMLS_CC);
|
||||
/* make immutable array */
|
||||
Z_TYPE_FLAGS_P(z) = IS_TYPE_IMMUTABLE;
|
||||
GC_REFCOUNT(Z_COUNTED_P(z)) = 2;
|
||||
Z_ARRVAL_P(z)->u.flags &= ~HASH_FLAG_APPLY_PROTECTION;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user