ZVAL_PTR(&q->val, ARENA_REALLOC(Z_PTR(p->val)));
new_entry = (zend_op_array*)Z_PTR(q->val);
- new_entry->scope = ARENA_REALLOC(new_entry->scope);
+ if ((void*)new_entry->scope >= ZCG(current_persistent_script)->arena_mem &&
+ (void*)new_entry->scope < (void*)((char*)ZCG(current_persistent_script)->arena_mem + ZCG(current_persistent_script)->arena_size)) {
- /* update prototype */
- if (new_entry->prototype) {
- new_entry->prototype = ARENA_REALLOC(new_entry->prototype);
+ new_entry->scope = ARENA_REALLOC(new_entry->scope);
+
+ /* update prototype */
+ if (new_entry->prototype) {
+ new_entry->prototype = ARENA_REALLOC(new_entry->prototype);
+ }
}
}
}
static void zend_persist_op_array(zval *zv)
{
+ zend_op_array *op_array = Z_PTR_P(zv);
+ zend_op_array *old_op_array = zend_shared_alloc_get_xlat_entry(op_array);
+ if (old_op_array) {
+ Z_PTR_P(zv) = old_op_array;
+ if (op_array->refcount && --(*op_array->refcount) == 0) {
+ efree(op_array->refcount);
+ }
+ return;
+ }
memcpy(ZCG(arena_mem), Z_PTR_P(zv), sizeof(zend_op_array));
zend_shared_alloc_register_xlat_entry(Z_PTR_P(zv), ZCG(arena_mem));
Z_PTR_P(zv) = ZCG(arena_mem);
static void zend_persist_op_array_calc(zval *zv)
{
- ADD_ARENA_SIZE(sizeof(zend_op_array));
- zend_persist_op_array_calc_ex(Z_PTR_P(zv));
+ zend_op_array *op_array = Z_PTR_P(zv);
+
+ if (op_array->type == ZEND_USER_FUNCTION/* &&
+ (!op_array->refcount || *(op_array->refcount) > 1)*/) {
+ zend_op_array *old_op_array = zend_shared_alloc_get_xlat_entry(op_array);
+ if (old_op_array) {
+ Z_PTR_P(zv) = old_op_array;
+ } else {
+ ADD_ARENA_SIZE(sizeof(zend_op_array));
+ zend_persist_op_array_calc_ex(Z_PTR_P(zv));
+ zend_shared_alloc_register_xlat_entry(op_array, Z_PTR_P(zv));
+ }
+ } else {
+ ADD_ARENA_SIZE(sizeof(zend_op_array));
+ zend_persist_op_array_calc_ex(Z_PTR_P(zv));
+ }
}
static void zend_persist_property_info_calc(zval *zv)