(opline->opcode != ZEND_FE_RESET_R || opline->opcode != ZEND_FE_RESET_RW) &&
opline->opcode != ZEND_FREE
) {
- zend_op *src = VAR_SOURCE(opline->op1);
+ znode_op op1 = opline->op1;
+ zend_op *src = VAR_SOURCE(op1);
zval c = ZEND_OP1_LITERAL(src);
- VAR_UNSET(opline->op1);
zval_copy_ctor(&c);
- zend_optimizer_update_op1_const(op_array, opline, &c);
- literal_dtor(&ZEND_OP1_LITERAL(src));
- MAKE_NOP(src);
+ if (zend_optimizer_update_op1_const(op_array, opline, &c)) {
+ VAR_SOURCE(op1) = NULL;
+ literal_dtor(&ZEND_OP1_LITERAL(src));
+ MAKE_NOP(src);
+ }
}
/* T = QM_ASSIGN(C), F(T) => NOP, F(C) */
VAR_SOURCE(opline->op2) &&
VAR_SOURCE(opline->op2)->opcode == ZEND_QM_ASSIGN &&
ZEND_OP1_TYPE(VAR_SOURCE(opline->op2)) == IS_CONST) {
- zend_op *src = VAR_SOURCE(opline->op2);
+ znode_op op2 = opline->op2;
+ zend_op *src = VAR_SOURCE(op2);
zval c = ZEND_OP1_LITERAL(src);
- VAR_UNSET(opline->op2);
zval_copy_ctor(&c);
- zend_optimizer_update_op2_const(op_array, opline, &c);
- literal_dtor(&ZEND_OP1_LITERAL(src));
- MAKE_NOP(src);
+ if (zend_optimizer_update_op2_const(op_array, opline, &c)) {
+ VAR_SOURCE(op2) = NULL;
+ literal_dtor(&ZEND_OP1_LITERAL(src));
+ MAKE_NOP(src);
+ }
}
/* T = CAST(X, String), ECHO(T) => NOP, ECHO(X) */
}
}
-void zend_optimizer_update_op1_const(zend_op_array *op_array,
- zend_op *opline,
- zval *val)
+int zend_optimizer_update_op1_const(zend_op_array *op_array,
+ zend_op *opline,
+ zval *val)
{
- if (opline->opcode == ZEND_FREE) {
- MAKE_NOP(opline);
- zval_dtor(val);
- } else {
- ZEND_OP1_TYPE(opline) = IS_CONST;
- if (Z_TYPE_P(val) == IS_STRING) {
- switch (opline->opcode) {
- case ZEND_INIT_STATIC_METHOD_CALL:
- case ZEND_CATCH:
- case ZEND_FETCH_CONSTANT:
- case ZEND_DEFINED:
- case ZEND_NEW:
- drop_leading_backslash(val);
- opline->op1.constant = zend_optimizer_add_literal(op_array, val);
- zend_string_hash_val(Z_STR(ZEND_OP1_LITERAL(opline)));
- Z_CACHE_SLOT(op_array->literals[opline->op1.constant]) = op_array->cache_size;
- op_array->cache_size += sizeof(void*);
- zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val)));
- break;
- default:
- opline->op1.constant = zend_optimizer_add_literal(op_array, val);
- zend_string_hash_val(Z_STR(ZEND_OP1_LITERAL(opline)));
- break;
- }
- } else {
- if (opline->opcode == ZEND_CONCAT ||
- opline->opcode == ZEND_FAST_CONCAT) {
- convert_to_string(val);
+ switch (opline->opcode) {
+ case ZEND_FREE:
+ MAKE_NOP(opline);
+ zval_dtor(val);
+ break;
+ case ZEND_INIT_STATIC_METHOD_CALL:
+ case ZEND_CATCH:
+ case ZEND_FETCH_CONSTANT:
+ case ZEND_DEFINED:
+ case ZEND_NEW:
+ if (Z_TYPE_P(val) != IS_STRING) {
+ zval_dtor(val);
+ return 0;
}
+ ZEND_OP1_TYPE(opline) = IS_CONST;
+ drop_leading_backslash(val);
opline->op1.constant = zend_optimizer_add_literal(op_array, val);
- }
+ zend_string_hash_val(Z_STR(ZEND_OP1_LITERAL(opline)));
+ Z_CACHE_SLOT(op_array->literals[opline->op1.constant]) = op_array->cache_size;
+ op_array->cache_size += sizeof(void*);
+ zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val)));
+ break;
+ case ZEND_CONCAT:
+ case ZEND_FAST_CONCAT:
+ convert_to_string(val);
+ /* break missing intentionally */
+ default:
+ ZEND_OP1_TYPE(opline) = IS_CONST;
+ opline->op1.constant = zend_optimizer_add_literal(op_array, val);
+ if (Z_TYPE_P(val) == IS_STRING) {
+ zend_string_hash_val(Z_STR(ZEND_OP1_LITERAL(opline)));
+ }
+ break;
}
+
+ return 1;
}
-void zend_optimizer_update_op2_const(zend_op_array *op_array,
- zend_op *opline,
- zval *val)
+int zend_optimizer_update_op2_const(zend_op_array *op_array,
+ zend_op *opline,
+ zval *val)
{
- ZEND_OP2_TYPE(opline) = IS_CONST;
if (opline->opcode == ZEND_INIT_FCALL) {
+ ZEND_OP2_TYPE(opline) = IS_CONST;
zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));
opline->op2.constant = zend_optimizer_add_literal(op_array, val);
zend_string_hash_val(Z_STR(ZEND_OP2_LITERAL(opline)));
Z_CACHE_SLOT(op_array->literals[opline->op2.constant]) = op_array->cache_size;
op_array->cache_size += sizeof(void*);
- return;
+ return 1;
}
switch (opline->opcode) {
case ZEND_ADD_INTERFACE:
case ZEND_ADD_TRAIT:
case ZEND_INSTANCEOF:
+ if (Z_TYPE_P(val) != IS_STRING) {
+ zval_dtor(val);
+ return 0;
+ }
+ /* break missing intentionally */
case ZEND_INIT_DYNAMIC_CALL:
drop_leading_backslash(val);
break;
}
+ ZEND_OP2_TYPE(opline) = IS_CONST;
opline->op2.constant = zend_optimizer_add_literal(op_array, val);
if (Z_TYPE_P(val) == IS_STRING) {
zend_string_hash_val(Z_STR(ZEND_OP2_LITERAL(opline)));
break;
}
}
+
+ return 1;
}
int zend_optimizer_replace_by_const(zend_op_array *op_array,
default:
break;
}
- zend_optimizer_update_op1_const(op_array, opline, val);
- break;
+ return zend_optimizer_update_op1_const(op_array, opline, val);
}
if (ZEND_OP2_TYPE(opline) == type &&
default:
break;
}
- zend_optimizer_update_op2_const(op_array, opline, val);
- break;
+ return zend_optimizer_update_op2_const(op_array, opline, val);
}
opline++;
}