+----------------------------------------------------------------------+\r
*/\r
\r
+#include "php.h"\r
#include "Optimizer/zend_optimizer.h"\r
#include "Optimizer/zend_optimizer_internal.h"\r
#include "zend_API.h"\r
\r
#endif\r
\r
+static void update_op1_const(zend_op_array *op_array,\r
+ zend_op *opline,\r
+ zval *val TSRMLS_DC)\r
+{\r
+ if (opline->opcode == ZEND_FREE) {\r
+ MAKE_NOP(opline);\r
+ zval_dtor(val);\r
+ } else {\r
+ ZEND_OP1_TYPE(opline) = IS_CONST;\r
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO\r
+ if (Z_TYPE_P(val) == IS_STRING) {\r
+ switch (opline->opcode) {\r
+ case ZEND_INIT_STATIC_METHOD_CALL:\r
+ case ZEND_CATCH:\r
+ case ZEND_FETCH_CONSTANT:\r
+ opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1);\r
+ op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++;\r
+ zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
+ zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ op_array->literals[opline->op1.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op1.constant+1].constant), Z_STRLEN(op_array->literals[opline->op1.constant+1].constant) + 1);\r
+ break;\r
+ case ZEND_DO_FCALL:\r
+ zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
+ opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1);\r
+ op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++;\r
+ break;\r
+ default:\r
+ opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1);\r
+ break;\r
+ }\r
+ } else {\r
+ opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ }\r
+#else\r
+ ZEND_OP1_LITERAL(opline) = *val;\r
+#endif\r
+ }\r
+}\r
+\r
+static void update_op2_const(zend_op_array *op_array,\r
+ zend_op *opline,\r
+ zval *val TSRMLS_DC)\r
+{\r
+ ZEND_OP2_TYPE(opline) = IS_CONST;\r
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO\r
+ opline->op2.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ if (Z_TYPE_P(val) == IS_STRING) {\r
+ Z_HASH_P(&ZEND_OP2_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)) + 1);\r
+ switch (opline->opcode) {\r
+ case ZEND_FETCH_R:\r
+ case ZEND_FETCH_W:\r
+ case ZEND_FETCH_RW:\r
+ case ZEND_FETCH_IS:\r
+ case ZEND_FETCH_UNSET:\r
+ case ZEND_FETCH_FUNC_ARG:\r
+ case ZEND_FETCH_CLASS:\r
+ case ZEND_INIT_FCALL_BY_NAME:\r
+ /*case ZEND_INIT_NS_FCALL_BY_NAME:*/\r
+ case ZEND_UNSET_VAR:\r
+ case ZEND_ISSET_ISEMPTY_VAR:\r
+ case ZEND_ADD_INTERFACE:\r
+ case ZEND_ADD_TRAIT:\r
+ op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot++;\r
+ zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
+ zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1);\r
+ break;\r
+ case ZEND_INIT_METHOD_CALL:\r
+ case ZEND_INIT_STATIC_METHOD_CALL:\r
+ zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
+ zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
+ op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1);\r
+ /* break missing intentionally */ \r
+ /*case ZEND_FETCH_CONSTANT:*/\r
+ case ZEND_ASSIGN_OBJ:\r
+ case ZEND_FETCH_OBJ_R:\r
+ case ZEND_FETCH_OBJ_W:\r
+ case ZEND_FETCH_OBJ_RW:\r
+ case ZEND_FETCH_OBJ_IS:\r
+ case ZEND_FETCH_OBJ_UNSET:\r
+ case ZEND_FETCH_OBJ_FUNC_ARG:\r
+ case ZEND_UNSET_OBJ:\r
+ case ZEND_PRE_INC_OBJ:\r
+ case ZEND_PRE_DEC_OBJ:\r
+ case ZEND_POST_INC_OBJ:\r
+ case ZEND_POST_DEC_OBJ:\r
+ case ZEND_ISSET_ISEMPTY_PROP_OBJ:\r
+ op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot;\r
+ op_array->last_cache_slot += 2;\r
+ break;\r
+ case ZEND_ASSIGN_ADD:\r
+ case ZEND_ASSIGN_SUB:\r
+ case ZEND_ASSIGN_MUL:\r
+ case ZEND_ASSIGN_DIV:\r
+ case ZEND_ASSIGN_MOD:\r
+ case ZEND_ASSIGN_SL:\r
+ case ZEND_ASSIGN_SR:\r
+ case ZEND_ASSIGN_CONCAT:\r
+ case ZEND_ASSIGN_BW_OR:\r
+ case ZEND_ASSIGN_BW_AND:\r
+ case ZEND_ASSIGN_BW_XOR:\r
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {\r
+ op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot;\r
+ op_array->last_cache_slot += 2;\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+#else\r
+ ZEND_OP2_LITERAL(opline) = *val;\r
+#endif\r
+}\r
+\r
static void replace_tmp_by_const(zend_op_array *op_array,\r
zend_op *opline,\r
zend_uint var,\r
if (ZEND_OP1_TYPE(opline) == IS_TMP_VAR &&\r
ZEND_OP1(opline).var == var) {\r
\r
- if (opline->opcode == ZEND_FREE) {\r
- MAKE_NOP(opline);\r
- zval_dtor(val);\r
- } else {\r
- ZEND_OP1_TYPE(opline) = IS_CONST;\r
-#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO\r
- if (Z_TYPE_P(val) == IS_STRING) {\r
- switch (opline->opcode) {\r
- case ZEND_INIT_STATIC_METHOD_CALL:\r
- case ZEND_CATCH:\r
- case ZEND_FETCH_CONSTANT:\r
- opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1);\r
- op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++;\r
- zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
- zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- op_array->literals[opline->op1.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op1.constant+1].constant), Z_STRLEN(op_array->literals[opline->op1.constant+1].constant) + 1);\r
- break;\r
- case ZEND_DO_FCALL:\r
- zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
- opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1);\r
- op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++;\r
- break;\r
- default:\r
- opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1);\r
- break;\r
- }\r
- } else {\r
- opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- }\r
-#else\r
- ZEND_OP1_LITERAL(opline) = *val;\r
-#endif\r
- }\r
+ update_op1_const(op_array, opline, val TSRMLS_CC);\r
/* TMP_VAR my be used only once */\r
break;\r
}\r
if (ZEND_OP2_TYPE(opline) == IS_TMP_VAR &&\r
ZEND_OP2(opline).var == var) {\r
\r
- ZEND_OP2_TYPE(opline) = IS_CONST;\r
-#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO\r
- opline->op2.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- if (Z_TYPE_P(val) == IS_STRING) {\r
- Z_HASH_P(&ZEND_OP2_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)) + 1);\r
- switch (opline->opcode) {\r
- case ZEND_FETCH_R:\r
- case ZEND_FETCH_W:\r
- case ZEND_FETCH_RW:\r
- case ZEND_FETCH_IS:\r
- case ZEND_FETCH_UNSET:\r
- case ZEND_FETCH_FUNC_ARG:\r
- case ZEND_FETCH_CLASS:\r
- case ZEND_INIT_FCALL_BY_NAME:\r
- /*case ZEND_INIT_NS_FCALL_BY_NAME:*/\r
- case ZEND_UNSET_VAR:\r
- case ZEND_ISSET_ISEMPTY_VAR:\r
- case ZEND_ADD_INTERFACE:\r
- case ZEND_ADD_TRAIT:\r
- op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot++;\r
- zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
- zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1);\r
- break;\r
- case ZEND_INIT_METHOD_CALL:\r
- case ZEND_INIT_STATIC_METHOD_CALL:\r
- zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val));\r
- zend_optimizer_add_literal(op_array, val TSRMLS_CC);\r
- op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1);\r
- /* break missing intentionally */ \r
- /*case ZEND_FETCH_CONSTANT:*/\r
- case ZEND_ASSIGN_OBJ:\r
- case ZEND_FETCH_OBJ_R:\r
- case ZEND_FETCH_OBJ_W:\r
- case ZEND_FETCH_OBJ_RW:\r
- case ZEND_FETCH_OBJ_IS:\r
- case ZEND_FETCH_OBJ_UNSET:\r
- case ZEND_FETCH_OBJ_FUNC_ARG:\r
- case ZEND_UNSET_OBJ:\r
- case ZEND_PRE_INC_OBJ:\r
- case ZEND_PRE_DEC_OBJ:\r
- case ZEND_POST_INC_OBJ:\r
- case ZEND_POST_DEC_OBJ:\r
- case ZEND_ISSET_ISEMPTY_PROP_OBJ:\r
- op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot;\r
- op_array->last_cache_slot += 2;\r
- break;\r
- case ZEND_ASSIGN_ADD:\r
- case ZEND_ASSIGN_SUB:\r
- case ZEND_ASSIGN_MUL:\r
- case ZEND_ASSIGN_DIV:\r
- case ZEND_ASSIGN_MOD:\r
- case ZEND_ASSIGN_SL:\r
- case ZEND_ASSIGN_SR:\r
- case ZEND_ASSIGN_CONCAT:\r
- case ZEND_ASSIGN_BW_OR:\r
- case ZEND_ASSIGN_BW_AND:\r
- case ZEND_ASSIGN_BW_XOR:\r
- if (opline->extended_value == ZEND_ASSIGN_OBJ) {\r
- op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot;\r
- op_array->last_cache_slot += 2;\r
- }\r
- break;\r
- default:\r
- break;\r
- }\r
- }\r
-#else\r
- ZEND_OP2_LITERAL(opline) = *val;\r
-#endif\r
+ update_op2_const(op_array, opline, val TSRMLS_CC);\r
+ /* TMP_VAR my be used only once */\r
break;\r
}\r
opline++;\r