mirror of
https://github.com/php/php-src.git
synced 2026-04-20 22:41:20 +02:00
fixes
This commit is contained in:
@@ -25,7 +25,7 @@ static int zend_get_persistent_constant(zend_string *name, zval *result, int cop
|
||||
|
||||
if (retval) {
|
||||
if (c->flags & CONST_PERSISTENT) {
|
||||
*result = c->value;
|
||||
ZVAL_COPY_VALUE(result, &c->value);
|
||||
if (copy) {
|
||||
zval_copy_ctor(result);
|
||||
}
|
||||
@@ -907,7 +907,7 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
|
||||
* Float to string conversion may be affected by current
|
||||
* locale setting.
|
||||
*/
|
||||
int l;
|
||||
int l, old_len;
|
||||
|
||||
if (Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_STRING) {
|
||||
convert_to_string_safe(&ZEND_OP1_LITERAL(opline));
|
||||
@@ -915,24 +915,24 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
|
||||
if (Z_TYPE(ZEND_OP1_LITERAL(last_op)) != IS_STRING) {
|
||||
convert_to_string_safe(&ZEND_OP1_LITERAL(last_op));
|
||||
}
|
||||
l = Z_STRLEN(ZEND_OP1_LITERAL(opline)) + Z_STRLEN(ZEND_OP1_LITERAL(last_op));
|
||||
old_len = Z_STRLEN(ZEND_OP1_LITERAL(last_op));
|
||||
l = old_len + Z_STRLEN(ZEND_OP1_LITERAL(opline));
|
||||
if (IS_INTERNED(Z_STR(ZEND_OP1_LITERAL(last_op)))) {
|
||||
zend_string *tmp = STR_ALLOC(l, 0);
|
||||
memcpy(tmp->val, Z_STRVAL(ZEND_OP1_LITERAL(last_op)), l);
|
||||
memcpy(tmp->val, Z_STRVAL(ZEND_OP1_LITERAL(last_op)), old_len);
|
||||
Z_STR(ZEND_OP1_LITERAL(last_op)) = tmp;
|
||||
} else {
|
||||
Z_STR(ZEND_OP1_LITERAL(last_op)) = STR_REALLOC(Z_STR(ZEND_OP1_LITERAL(last_op)), l, 0);
|
||||
}
|
||||
memcpy(Z_STRVAL(ZEND_OP1_LITERAL(last_op))+Z_STRLEN(ZEND_OP1_LITERAL(last_op)), Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)));
|
||||
memcpy(Z_STRVAL(ZEND_OP1_LITERAL(last_op)) + old_len, Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)));
|
||||
Z_STRVAL(ZEND_OP1_LITERAL(last_op))[l] = '\0';
|
||||
zval_dtor(&ZEND_OP1_LITERAL(opline));
|
||||
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
|
||||
Z_STR(ZEND_OP1_LITERAL(opline)) = zend_new_interned_string(Z_STR(ZEND_OP1_LITERAL(last_op))TSRMLS_CC);
|
||||
Z_STR(ZEND_OP1_LITERAL(opline)) = zend_new_interned_string(Z_STR(ZEND_OP1_LITERAL(last_op)) TSRMLS_CC);
|
||||
Z_TYPE(ZEND_OP1_LITERAL(last_op)) = IS_NULL;
|
||||
#else
|
||||
Z_STRVAL(ZEND_OP1_LITERAL(opline)) = Z_STRVAL(ZEND_OP1_LITERAL(last_op));
|
||||
Z_STR(ZEND_OP1_LITERAL(opline)) = Z_STR(ZEND_OP1_LITERAL(last_op));
|
||||
#endif
|
||||
Z_STRLEN(ZEND_OP1_LITERAL(opline)) = l;
|
||||
MAKE_NOP(last_op);
|
||||
} else if (opline->opcode == ZEND_CONCAT &&
|
||||
ZEND_OP2_TYPE(opline) == IS_CONST &&
|
||||
@@ -944,7 +944,7 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
|
||||
ZEND_RESULT(VAR_SOURCE(opline->op1)).var == ZEND_OP1(opline).var) {
|
||||
/* compress consecutive CONCATs */
|
||||
zend_op *src = VAR_SOURCE(opline->op1);
|
||||
int l;
|
||||
int l, old_len;
|
||||
|
||||
if (Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) {
|
||||
convert_to_string_safe(&ZEND_OP2_LITERAL(opline));
|
||||
@@ -959,24 +959,24 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
|
||||
opline->opcode = ZEND_ADD_STRING;
|
||||
}
|
||||
COPY_NODE(opline->op1, src->op1);
|
||||
l = Z_STRLEN(ZEND_OP2_LITERAL(opline)) + Z_STRLEN(ZEND_OP2_LITERAL(src));
|
||||
old_len = Z_STRLEN(ZEND_OP2_LITERAL(src));
|
||||
l = old_len + Z_STRLEN(ZEND_OP2_LITERAL(opline));
|
||||
if (IS_INTERNED(Z_STR(ZEND_OP2_LITERAL(src)))) {
|
||||
zend_string *tmp = STR_ALLOC(l, 0);
|
||||
memcpy(tmp->val, Z_STRVAL(ZEND_OP2_LITERAL(last_op)), l);
|
||||
memcpy(tmp->val, Z_STRVAL(ZEND_OP2_LITERAL(src)), old_len);
|
||||
Z_STR(ZEND_OP2_LITERAL(last_op)) = tmp;
|
||||
} else {
|
||||
Z_STR(ZEND_OP2_LITERAL(src)) = STR_REALLOC(Z_STR(ZEND_OP2_LITERAL(src)), l, 0);
|
||||
}
|
||||
memcpy(Z_STRVAL(ZEND_OP2_LITERAL(src))+Z_STRLEN(ZEND_OP2_LITERAL(src)), Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)));
|
||||
memcpy(Z_STRVAL(ZEND_OP2_LITERAL(src)) + old_len, Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)));
|
||||
Z_STRVAL(ZEND_OP2_LITERAL(src))[l] = '\0';
|
||||
STR_RELEASE(Z_STR(ZEND_OP2_LITERAL(opline)));
|
||||
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
|
||||
Z_STR(ZEND_OP2_LITERAL(opline)) = zend_new_interned_string(Z_STR(ZEND_OP2_LITERAL(src)) TSRMLS_CC);
|
||||
Z_TYPE(ZEND_OP2_LITERAL(src)) = IS_NULL;
|
||||
#else
|
||||
Z_STRVAL(ZEND_OP2_LITERAL(opline)) = Z_STRVAL(ZEND_OP2_LITERAL(src));
|
||||
Z_STR(ZEND_OP2_LITERAL(opline)) = Z_STR(ZEND_OP2_LITERAL(src));
|
||||
#endif
|
||||
Z_STRLEN(ZEND_OP2_LITERAL(opline)) = l;
|
||||
MAKE_NOP(src);
|
||||
} else if ((opline->opcode == ZEND_ADD_STRING || opline->opcode == ZEND_ADD_VAR) && ZEND_OP1_TYPE(opline) == IS_CONST) {
|
||||
/* convert ADD_STRING(C1, C2) to CONCAT(C1, C2) */
|
||||
|
||||
@@ -2187,16 +2187,14 @@ static void accel_fast_hash_destroy(HashTable *ht)
|
||||
|
||||
for (idx = 0; idx < ht->nNumUsed; idx++) {
|
||||
p = ht->arData + idx;
|
||||
if (!p->xData) continue;
|
||||
ht->pDestructor(&p->xData);
|
||||
if (Z_TYPE(p->val) == IS_UNDEF) continue;
|
||||
ht->pDestructor(&p->val);
|
||||
}
|
||||
}
|
||||
|
||||
static void accel_fast_zval_ptr_dtor(zval **zval_ptr)
|
||||
static void accel_fast_zval_dtor(zval *zvalue)
|
||||
{
|
||||
zval *zvalue = *zval_ptr;
|
||||
|
||||
if (Z_DELREF_P(zvalue) == 0) {
|
||||
if (Z_REFCOUNTED_P(zvalue) && Z_DELREF_P(zvalue) == 0) {
|
||||
#if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
|
||||
switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
|
||||
#else
|
||||
@@ -2207,13 +2205,13 @@ static void accel_fast_zval_ptr_dtor(zval **zval_ptr)
|
||||
TSRMLS_FETCH();
|
||||
|
||||
#if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
|
||||
GC_REMOVE_ZVAL_FROM_BUFFER(zvalue);
|
||||
GC_REMOVE_FROM_BUFFER(Z_ARR_P(zvalue));
|
||||
#endif
|
||||
if (zvalue->value.ht && (zvalue->value.ht != &EG(symbol_table))) {
|
||||
if (Z_ARR_P(zvalue) != &EG(symbol_table)) {
|
||||
/* break possible cycles */
|
||||
Z_TYPE_P(zvalue) = IS_NULL;
|
||||
zvalue->value.ht->pDestructor = (dtor_func_t)accel_fast_zval_ptr_dtor;
|
||||
accel_fast_hash_destroy(zvalue->value.ht);
|
||||
Z_ARRVAL_P(zvalue)->pDestructor = accel_fast_zval_dtor;
|
||||
accel_fast_hash_destroy(Z_ARRVAL_P(zvalue));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2222,9 +2220,9 @@ static void accel_fast_zval_ptr_dtor(zval **zval_ptr)
|
||||
TSRMLS_FETCH();
|
||||
|
||||
#if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
|
||||
GC_REMOVE_ZVAL_FROM_BUFFER(zvalue);
|
||||
GC_REMOVE_FROM_BUFFER(Z_OBJ_P(zvalue));
|
||||
#endif
|
||||
Z_OBJ_HT_P(zvalue)->del_ref(zvalue TSRMLS_CC);
|
||||
zend_objects_store_del(Z_OBJ_P(zvalue) TSRMLS_CC);
|
||||
}
|
||||
break;
|
||||
case IS_RESOURCE:
|
||||
@@ -2232,7 +2230,7 @@ static void accel_fast_zval_ptr_dtor(zval **zval_ptr)
|
||||
TSRMLS_FETCH();
|
||||
|
||||
/* destroy resource */
|
||||
zend_list_delete(zvalue->value.lval);
|
||||
zend_list_delete(Z_RES_P(zvalue));
|
||||
}
|
||||
break;
|
||||
case IS_LONG:
|
||||
@@ -2248,13 +2246,15 @@ static void accel_fast_zval_ptr_dtor(zval **zval_ptr)
|
||||
}
|
||||
}
|
||||
|
||||
static int accel_clean_non_persistent_function(zend_function *function TSRMLS_DC)
|
||||
static int accel_clean_non_persistent_function(zval *zv TSRMLS_DC)
|
||||
{
|
||||
zend_function *function = Z_PTR_P(zv);
|
||||
|
||||
if (function->type == ZEND_INTERNAL_FUNCTION) {
|
||||
return ZEND_HASH_APPLY_STOP;
|
||||
} else {
|
||||
if (function->op_array.static_variables) {
|
||||
function->op_array.static_variables->pDestructor = (dtor_func_t)accel_fast_zval_ptr_dtor;
|
||||
function->op_array.static_variables->pDestructor = accel_fast_zval_dtor;
|
||||
accel_fast_hash_destroy(function->op_array.static_variables);
|
||||
function->op_array.static_variables = NULL;
|
||||
}
|
||||
@@ -2264,11 +2264,13 @@ static int accel_clean_non_persistent_function(zend_function *function TSRMLS_DC
|
||||
}
|
||||
}
|
||||
|
||||
static int accel_cleanup_function_data(zend_function *function TSRMLS_DC)
|
||||
static int accel_cleanup_function_data(zval *zv TSRMLS_DC)
|
||||
{
|
||||
zend_function *function = Z_PTR_P(zv);
|
||||
|
||||
if (function->type == ZEND_USER_FUNCTION) {
|
||||
if (function->op_array.static_variables) {
|
||||
function->op_array.static_variables->pDestructor = (dtor_func_t)accel_fast_zval_ptr_dtor;
|
||||
function->op_array.static_variables->pDestructor = accel_fast_zval_dtor;
|
||||
accel_fast_hash_destroy(function->op_array.static_variables);
|
||||
function->op_array.static_variables = NULL;
|
||||
}
|
||||
@@ -2276,9 +2278,9 @@ static int accel_cleanup_function_data(zend_function *function TSRMLS_DC)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int accel_clean_non_persistent_class(zend_class_entry **pce TSRMLS_DC)
|
||||
static int accel_clean_non_persistent_class(zval *zv TSRMLS_DC)
|
||||
{
|
||||
zend_class_entry *ce = *pce;
|
||||
zend_class_entry *ce = Z_PTR_P(zv);
|
||||
|
||||
if (ce->type == ZEND_INTERNAL_CLASS) {
|
||||
return ZEND_HASH_APPLY_STOP;
|
||||
@@ -2291,17 +2293,15 @@ static int accel_clean_non_persistent_class(zend_class_entry **pce TSRMLS_DC)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ce->default_static_members_count; i++) {
|
||||
if (ce->static_members_table[i]) {
|
||||
accel_fast_zval_ptr_dtor(&ce->static_members_table[i]);
|
||||
ce->static_members_table[i] = NULL;
|
||||
}
|
||||
accel_fast_zval_dtor(&ce->static_members_table[i]);
|
||||
ZVAL_UNDEF(&ce->static_members_table[i]);
|
||||
}
|
||||
ce->static_members_table = NULL;
|
||||
}
|
||||
#else
|
||||
zend_hash_apply(&ce->function_table, (apply_func_t) accel_cleanup_function_data TSRMLS_CC);
|
||||
if (ce->static_members) {
|
||||
ce->static_members->pDestructor = (dtor_func_t)accel_fast_zval_ptr_dtor;
|
||||
ce->static_members->pDestructor = accel_fast_zval_dtor;
|
||||
accel_fast_hash_destroy(ce->static_members);
|
||||
ce->static_members = NULL;
|
||||
}
|
||||
@@ -2310,12 +2310,14 @@ static int accel_clean_non_persistent_class(zend_class_entry **pce TSRMLS_DC)
|
||||
}
|
||||
}
|
||||
|
||||
static int accel_clean_non_persistent_constant(zend_constant *c TSRMLS_DC)
|
||||
static int accel_clean_non_persistent_constant(zval *zv TSRMLS_DC)
|
||||
{
|
||||
zend_constant *c = Z_PTR_P(zv);
|
||||
|
||||
if (c->flags & CONST_PERSISTENT) {
|
||||
return ZEND_HASH_APPLY_STOP;
|
||||
} else {
|
||||
interned_free(c->name);
|
||||
STR_RELEASE(c->name);
|
||||
return ZEND_HASH_APPLY_REMOVE;
|
||||
}
|
||||
}
|
||||
@@ -2323,21 +2325,21 @@ static int accel_clean_non_persistent_constant(zend_constant *c TSRMLS_DC)
|
||||
static void zend_accel_fast_shutdown(TSRMLS_D)
|
||||
{
|
||||
if (EG(full_tables_cleanup)) {
|
||||
EG(symbol_table).pDestructor = (dtor_func_t)accel_fast_zval_ptr_dtor;
|
||||
EG(symbol_table).ht.pDestructor = accel_fast_zval_dtor;
|
||||
} else {
|
||||
dtor_func_t old_destructor;
|
||||
|
||||
if (EG(objects_store).top > 1 || zend_hash_num_elements(&EG(regular_list)) > 0) {
|
||||
/* We don't have to destroy all zvals if they cannot call any destructors */
|
||||
|
||||
old_destructor = EG(symbol_table).pDestructor;
|
||||
EG(symbol_table).pDestructor = (dtor_func_t)accel_fast_zval_ptr_dtor;
|
||||
old_destructor = EG(symbol_table).ht.pDestructor;
|
||||
EG(symbol_table).ht.pDestructor = accel_fast_zval_dtor;
|
||||
zend_try {
|
||||
zend_hash_graceful_reverse_destroy(&EG(symbol_table));
|
||||
zend_hash_graceful_reverse_destroy(&EG(symbol_table).ht);
|
||||
} zend_end_try();
|
||||
EG(symbol_table).pDestructor = old_destructor;
|
||||
EG(symbol_table).ht.pDestructor = old_destructor;
|
||||
}
|
||||
zend_hash_init(&EG(symbol_table), 0, NULL, NULL, 0);
|
||||
zend_hash_init(&EG(symbol_table).ht, 0, NULL, NULL, 0);
|
||||
old_destructor = EG(function_table)->pDestructor;
|
||||
EG(function_table)->pDestructor = NULL;
|
||||
zend_hash_reverse_apply(EG(function_table), (apply_func_t) accel_clean_non_persistent_function TSRMLS_CC);
|
||||
|
||||
@@ -354,12 +354,12 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
|
||||
for (i = 0; i < op_array->num_args; i++) {
|
||||
if (op_array->arg_info[i].name) {
|
||||
//??? zend_accel_store_interned_string(op_array->arg_info[i].name, op_array->arg_info[i].name_len + 1);
|
||||
efree(op_array->arg_info[i].name);
|
||||
efree((char*)op_array->arg_info[i].name);
|
||||
op_array->arg_info[i].name = NULL;
|
||||
}
|
||||
if (op_array->arg_info[i].class_name) {
|
||||
//??? zend_accel_store_interned_string(op_array->arg_info[i].class_name, op_array->arg_info[i].class_name_len + 1);
|
||||
efree(op_array->arg_info[i].class_name);
|
||||
efree((char*)op_array->arg_info[i].class_name);
|
||||
op_array->arg_info[i].class_name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user