diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/intl/tests/timezone_getCanonicalID_error.phpt | 6 | ||||
| -rw-r--r-- | ext/opcache/Optimizer/optimize_func_calls.c | 26 |
2 files changed, 24 insertions, 8 deletions
diff --git a/ext/intl/tests/timezone_getCanonicalID_error.phpt b/ext/intl/tests/timezone_getCanonicalID_error.phpt index e268e216a8..b29ca67701 100644 --- a/ext/intl/tests/timezone_getCanonicalID_error.phpt +++ b/ext/intl/tests/timezone_getCanonicalID_error.phpt @@ -11,7 +11,6 @@ ini_set("intl.error_level", E_WARNING); var_dump(IntlTimeZone::getCanonicalID()); var_dump(IntlTimeZone::getCanonicalID(array())); var_dump(IntlTimeZone::getCanonicalID("foo\x81")); -var_dump(IntlTimeZone::getCanonicalID('foobar', null)); --EXPECTF-- @@ -28,8 +27,3 @@ bool(false) Warning: IntlTimeZone::getCanonicalID(): intltz_get_canonical_id: could not convert time zone id to UTF-16 in %s on line %d bool(false) - -Fatal error: Uncaught Error: Cannot pass parameter 2 by reference in %s:%d -Stack trace: -#0 {main} - thrown in %s on line %d diff --git a/ext/opcache/Optimizer/optimize_func_calls.c b/ext/opcache/Optimizer/optimize_func_calls.c index a9fb259428..22829ad20d 100644 --- a/ext/opcache/Optimizer/optimize_func_calls.c +++ b/ext/opcache/Optimizer/optimize_func_calls.c @@ -29,6 +29,9 @@ #include "zend_execute.h" #include "zend_vm.h" +#define ZEND_OP1_IS_CONST_STRING(opline) \ + (ZEND_OP1_TYPE(opline) == IS_CONST && \ + Z_TYPE(op_array->literals[(opline)->op1.constant]) == IS_STRING) #define ZEND_OP2_IS_CONST_STRING(opline) \ (ZEND_OP2_TYPE(opline) == IS_CONST && \ Z_TYPE(op_array->literals[(opline)->op2.constant]) == IS_STRING) @@ -58,17 +61,34 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx) case ZEND_INIT_NS_FCALL_BY_NAME: if (ZEND_OP2_IS_CONST_STRING(opline)) { zend_function *func; - zval *function_name = &op_array->literals[opline->op2.constant + 1]; + zval *function_name = &ZEND_OP2_LITERAL(opline) + 1; if ((func = zend_hash_find_ptr(&ctx->script->function_table, Z_STR_P(function_name))) != NULL) { call_stack[call].func = func; } } + call_stack[call].opline = opline; + call++; + break; + case ZEND_INIT_STATIC_METHOD_CALL: + if (ZEND_OP2_IS_CONST_STRING(opline)) { + zend_class_entry *ce = NULL; + if (ZEND_OP1_IS_CONST_STRING(opline)) { + zend_string *class_name = Z_STR_P(&ZEND_OP1_LITERAL(opline) + 1); + ce = zend_hash_find_ptr(&ctx->script->class_table, class_name); + } else if (opline->op1_type == IS_UNUSED && op_array->scope + && (opline->op1.num & ZEND_FETCH_CLASS_SELF)) { + ce = op_array->scope; + } + if (ce) { + zend_string *func_name = Z_STR_P(&ZEND_OP2_LITERAL(opline) + 1); + call_stack[call].func = zend_hash_find_ptr(&ce->function_table, func_name); + } + } /* break missing intentionally */ case ZEND_NEW: case ZEND_INIT_DYNAMIC_CALL: case ZEND_INIT_METHOD_CALL: - case ZEND_INIT_STATIC_METHOD_CALL: case ZEND_INIT_FCALL: case ZEND_INIT_USER_CALL: call_stack[call].opline = opline; @@ -97,6 +117,8 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx) literal_dtor(&op_array->literals[fcall->op2.constant + 2]); fcall->op2.constant = fcall->op2.constant + 1; opline->opcode = zend_get_call_op(ZEND_INIT_FCALL, call_stack[call].func); + } else if (fcall->opcode == ZEND_INIT_STATIC_METHOD_CALL) { + /* We don't have specialized opcodes for this, do nothing */ } else { ZEND_ASSERT(0); } |
