|
39 | 39 | typedef struct _optimizer_call_info {
|
40 | 40 | zend_function *func;
|
41 | 41 | zend_op *opline;
|
| 42 | + zend_bool try_inline; |
42 | 43 | } optimizer_call_info;
|
43 | 44 |
|
44 | 45 | static void zend_delete_call_instructions(zend_op *opline)
|
@@ -159,6 +160,7 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
159 | 160 | case ZEND_INIT_FCALL:
|
160 | 161 | call_stack[call].func = zend_optimizer_get_called_func(
|
161 | 162 | ctx->script, op_array, opline, 0);
|
| 163 | + call_stack[call].try_inline = 1; |
162 | 164 | /* break missing intentionally */
|
163 | 165 | case ZEND_NEW:
|
164 | 166 | case ZEND_INIT_DYNAMIC_CALL:
|
@@ -198,12 +200,14 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
198 | 200 | ZEND_ASSERT(0);
|
199 | 201 | }
|
200 | 202 |
|
201 |
| - if (ZEND_OPTIMIZER_PASS_16 & ctx->optimization_level) { |
| 203 | + if ((ZEND_OPTIMIZER_PASS_16 & ctx->optimization_level) |
| 204 | + && call_stack[call].try_inline) { |
202 | 205 | zend_try_inline_call(op_array, fcall, opline, call_stack[call].func);
|
203 | 206 | }
|
204 | 207 | }
|
205 | 208 | call_stack[call].func = NULL;
|
206 | 209 | call_stack[call].opline = NULL;
|
| 210 | + call_stack[call].try_inline = 0; |
207 | 211 | break;
|
208 | 212 | case ZEND_FETCH_FUNC_ARG:
|
209 | 213 | case ZEND_FETCH_STATIC_PROP_FUNC_ARG:
|
@@ -257,17 +261,10 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
257 | 261 | }
|
258 | 262 | }
|
259 | 263 | break;
|
260 |
| -#if 0 |
261 |
| - case ZEND_SEND_REF: |
262 |
| - if (call_stack[call - 1].func) { |
263 |
| - /* We won't handle run-time pass by reference */ |
264 |
| - call_stack[call - 1].opline = NULL; |
265 |
| - } |
266 |
| - break; |
267 |
| -#endif |
268 | 264 | case ZEND_SEND_UNPACK:
|
269 |
| - call_stack[call - 1].func = NULL; |
270 |
| - call_stack[call - 1].opline = NULL; |
| 265 | + case ZEND_SEND_USER: |
| 266 | + case ZEND_SEND_ARRAY: |
| 267 | + call_stack[call - 1].try_inline = 0; |
271 | 268 | break;
|
272 | 269 | default:
|
273 | 270 | break;
|
|
0 commit comments