Skip to content

Commit 0fc90b1

Browse files
committed
Merge branch 'PHP-5.5' of git.php.net:php-src into PHP-5.5
2 parents 9a6b72a + de65817 commit 0fc90b1

File tree

12 files changed

+250
-173
lines changed

12 files changed

+250
-173
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ PHP NEWS
1212
string). (Laruence)
1313

1414
- OPCache
15+
. Fixed bug #66176 (Invalid constant substitution). (Dmitry)
1516
. Fixed bug #65915 (Inconsistent results with require return value). (Dmitry)
17+
. Fixed bug #65559 (Opcache: cache not cleared if changes occur while
18+
running). (Dmitry)
1619

1720
- readline
1821
. Fixed Bug #65714 (PHP cli forces the tty to cooked mode). (Remi)

ext/opcache/Optimizer/block_pass.c

Lines changed: 11 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -643,8 +643,11 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
643643
opline->opcode != ZEND_FREE
644644
) {
645645
zend_op *src = VAR_SOURCE(opline->op1);
646+
zval c = ZEND_OP1_LITERAL(src);
646647
VAR_UNSET(opline->op1);
647-
COPY_NODE(opline->op1, src->op1);
648+
zval_copy_ctor(&c);
649+
update_op1_const(op_array, opline, &c TSRMLS_CC);
650+
literal_dtor(&ZEND_OP1_LITERAL(src));
648651
MAKE_NOP(src);
649652
}
650653

@@ -654,51 +657,12 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
654657
VAR_SOURCE(opline->op2)->opcode == ZEND_QM_ASSIGN &&
655658
ZEND_OP1_TYPE(VAR_SOURCE(opline->op2)) == IS_CONST) {
656659
zend_op *src = VAR_SOURCE(opline->op2);
660+
zval c = ZEND_OP1_LITERAL(src);
657661
VAR_UNSET(opline->op2);
658-
COPY_NODE(opline->op2, src->op1);
662+
zval_copy_ctor(&c);
663+
update_op2_const(op_array, opline, &c TSRMLS_CC);
664+
literal_dtor(&ZEND_OP1_LITERAL(src));
659665
MAKE_NOP(src);
660-
661-
#if ZEND_EXTENSION_API_NO >= PHP_5_4_X_API_NO
662-
/* numeric string constants used as array indeces have to be
663-
converted to long at compile time */
664-
if (opline->opcode == ZEND_ADD_ARRAY_ELEMENT ||
665-
opline->opcode == ZEND_INIT_ARRAY ||
666-
opline->opcode == ZEND_UNSET_DIM ||
667-
opline->opcode == ZEND_ISSET_ISEMPTY_DIM_OBJ ||
668-
opline->opcode == ZEND_FETCH_DIM_R ||
669-
opline->opcode == ZEND_FETCH_DIM_W ||
670-
opline->opcode == ZEND_FETCH_DIM_RW ||
671-
opline->opcode == ZEND_FETCH_DIM_IS ||
672-
opline->opcode == ZEND_FETCH_DIM_FUNC_ARG ||
673-
opline->opcode == ZEND_FETCH_DIM_UNSET ||
674-
opline->opcode == ZEND_FETCH_DIM_TMP_VAR ||
675-
(opline->opcode == ZEND_OP_DATA &&
676-
((opline-1)->opcode == ZEND_ASSIGN_DIM ||
677-
((opline-1)->extended_value == ZEND_ASSIGN_DIM &&
678-
((opline-1)->opcode == ZEND_ASSIGN_ADD ||
679-
(opline-1)->opcode == ZEND_ASSIGN_SUB ||
680-
(opline-1)->opcode == ZEND_ASSIGN_MUL ||
681-
(opline-1)->opcode == ZEND_ASSIGN_DIV ||
682-
(opline-1)->opcode == ZEND_ASSIGN_MOD ||
683-
(opline-1)->opcode == ZEND_ASSIGN_SL ||
684-
(opline-1)->opcode == ZEND_ASSIGN_SR ||
685-
(opline-1)->opcode == ZEND_ASSIGN_CONCAT ||
686-
(opline-1)->opcode == ZEND_ASSIGN_BW_OR ||
687-
(opline-1)->opcode == ZEND_ASSIGN_BW_AND ||
688-
(opline-1)->opcode == ZEND_ASSIGN_BW_XOR))))) {
689-
690-
if (Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING) {
691-
ulong index;
692-
int numeric = 0;
693-
694-
ZEND_HANDLE_NUMERIC_EX(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline))+1, index, numeric = 1);
695-
if (numeric) {
696-
zval_dtor(&ZEND_OP2_LITERAL(opline));
697-
ZVAL_LONG(&ZEND_OP2_LITERAL(opline), index);
698-
}
699-
}
700-
}
701-
#endif
702666
}
703667

704668
/* T = PRINT(X), F(T) => ECHO(X), F(1) */
@@ -1070,10 +1034,9 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
10701034

10711035
literal_dtor(&ZEND_OP1_LITERAL(opline));
10721036
literal_dtor(&ZEND_OP2_LITERAL(opline));
1073-
ZEND_OP1_LITERAL(opline) = result;
1074-
SET_UNUSED(opline->op2);
1075-
10761037
opline->opcode = ZEND_QM_ASSIGN;
1038+
SET_UNUSED(opline->op2);
1039+
update_op1_const(op_array, opline, &result TSRMLS_CC);
10771040
}
10781041
EG(error_reporting) = er;
10791042
} else if ((opline->opcode == ZEND_BOOL ||
@@ -1097,8 +1060,8 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
10971060
}
10981061
PZ_SET_REFCOUNT_P(&result, 1);
10991062
PZ_UNSET_ISREF_P(&result);
1100-
ZEND_OP1_LITERAL(opline) = result;
11011063
opline->opcode = ZEND_QM_ASSIGN;
1064+
update_op1_const(op_array, opline, &result TSRMLS_CC);
11021065
} else if ((opline->opcode == ZEND_RETURN || opline->opcode == ZEND_EXIT) &&
11031066
ZEND_OP1_TYPE(opline) == IS_TMP_VAR &&
11041067
VAR_SOURCE(opline->op1) &&

ext/opcache/Optimizer/pass1_5.c

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,11 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
219219
EG(in_execution) = 1;
220220
EG(active_op_array) = op_array;
221221
if (zend_get_constant("__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1, &offset TSRMLS_CC)) {
222+
zend_uint tv = ZEND_RESULT(opline).var;
223+
222224
literal_dtor(&ZEND_OP2_LITERAL(opline));
223-
ZEND_OP1_TYPE(opline) = IS_CONST;
224-
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
225-
opline->op1.constant = zend_optimizer_add_literal(op_array, &offset TSRMLS_CC);
226-
#else
227-
ZEND_OP1_LITERAL(opline) = offset;
228-
#endif
229-
SET_UNUSED(opline->op2);
230-
opline->opcode = ZEND_QM_ASSIGN;
225+
MAKE_NOP(opline);
226+
replace_tmp_by_const(op_array, opline, tv, &offset TSRMLS_CC);
231227
}
232228
EG(active_op_array) = orig_op_array;
233229
EG(in_execution) = orig_in_execution;
@@ -238,20 +234,15 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
238234
ZEND_OP2_TYPE(opline) == IS_CONST &&
239235
ZEND_OP2_LITERAL(opline).type == IS_STRING) {
240236
/* substitute persistent constants */
237+
zend_uint tv = ZEND_RESULT(opline).var;
241238
zval c;
242239

243240
if (!zend_get_persistent_constant(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)), &c, 1 TSRMLS_CC)) {
244241
break;
245242
}
246243
literal_dtor(&ZEND_OP2_LITERAL(opline));
247-
ZEND_OP1_TYPE(opline) = IS_CONST;
248-
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
249-
opline->op1.constant = zend_optimizer_add_literal(op_array, &c TSRMLS_CC);
250-
#else
251-
ZEND_OP1_LITERAL(opline) = c;
252-
#endif
253-
SET_UNUSED(opline->op2);
254-
opline->opcode = ZEND_QM_ASSIGN;
244+
MAKE_NOP(opline);
245+
replace_tmp_by_const(op_array, opline, tv, &c TSRMLS_CC);
255246
}
256247
break;
257248

0 commit comments

Comments
 (0)