]> granicus.if.org Git - php/commitdiff
Initialize op_array->run_time_cache on slow path of INIT_FCALL opcode and omit corres...
authorDmitry Stogov <dmitry@zend.com>
Mon, 4 Apr 2016 21:01:00 +0000 (00:01 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 4 Apr 2016 21:01:00 +0000 (00:01 +0300)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b143211726f4f1064cda2db209376a1b1596d210..006a5a1d7d0fd1f0f15b17bd6fc3430b92d63deb 100644 (file)
@@ -2154,10 +2154,6 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
                GC_REFCOUNT(Z_OBJ(EX(This)))++;
        }
 
-       if (UNEXPECTED(!op_array->run_time_cache)) {
-               op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
-               memset(op_array->run_time_cache, 0, op_array->cache_size);
-       }
        EX_LOAD_RUN_TIME_CACHE(op_array);
        EX_LOAD_LITERALS(op_array);
 
@@ -2166,6 +2162,14 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
 }
 /* }}} */
 
+static zend_never_inline void ZEND_FASTCALL init_func_run_time_cache(zend_op_array *op_array) /* {{{ */
+{
+       ZEND_ASSERT(op_array->run_time_cache == NULL);
+       op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
+       memset(op_array->run_time_cache, 0, op_array->cache_size);
+}
+/* }}} */
+
 static zend_always_inline void i_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value) /* {{{ */
 {
        ZEND_ASSERT(EX(func) == (zend_function*)op_array);
@@ -2335,6 +2339,10 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data
 
        EX(symbol_table) = NULL;
 
+       if (UNEXPECTED(!op_array->run_time_cache)) {
+               init_func_run_time_cache(op_array);
+       }
+
        i_init_func_execute_data(execute_data, op_array, return_value, 1);
 
        return execute_data;
index ba6c950e9507bdbe53aa7675500bf2d201d7a414..8403f786b0de0b5d7d52abf8cff011dfe08755bc 100644 (file)
@@ -3155,6 +3155,9 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -3267,6 +3270,9 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (OP2_TYPE != IS_CONST) {
                        FREE_OP2();
                }
@@ -3280,6 +3286,9 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -3336,17 +3345,20 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM)
        zval *function_name, *func;
        zend_execute_data *call;
 
-       fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+       function_name = (zval*)EX_CONSTANT(opline->op2);
+       fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name));
        if (UNEXPECTED(fbc == NULL)) {
-               function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
-               func = zend_hash_find(EG(function_table), Z_STR_P(function_name));
+               func = zend_hash_find(EG(function_table), Z_STR_P(function_name+1));
                if (UNEXPECTED(func == NULL)) {
                        SAVE_OPLINE();
-                       zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
                        HANDLE_EXCEPTION();
                }
                fbc = Z_FUNC_P(func);
-               CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
+               CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
        }
        call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
                fbc, opline->extended_value, NULL, NULL);
@@ -3561,6 +3573,9 @@ ZEND_VM_C_LABEL(try_function_name):
                FREE_OP2();
                HANDLE_EXCEPTION();
        }
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+               init_func_run_time_cache(&fbc->op_array);
+       }
        call = zend_vm_stack_push_call_frame(call_info,
                fbc, opline->extended_value, called_scope, object);
        call->prev_execute_data = EX(call);
@@ -3610,6 +3625,9 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMPVAR|CV, NUM)
                                HANDLE_EXCEPTION();
                        }
                }
+               if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&func->op_array);
+               }
        } else {
                zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
                efree(error);
@@ -3650,6 +3668,9 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM)
                }
                fbc = Z_FUNC_P(func);
                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
@@ -3679,6 +3700,9 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM)
                }
                fbc = Z_FUNC_P(func);
                CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call = zend_vm_stack_push_call_frame_ex(
@@ -5121,6 +5145,9 @@ ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, ANY, NUM)
                        ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
                        opline->extended_value, NULL, NULL);
        } else {
+               if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&constructor->op_array);
+               }
                /* We are not handling overloaded classes right now */
                call = zend_vm_stack_push_call_frame(
                        ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
@@ -8153,9 +8180,11 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
                ZEND_ASSERT(!(fbc->common.fn_flags & ZEND_ACC_GENERATOR));
 
                call->symbol_table = NULL;
+               if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                i_init_func_execute_data(call, &fbc->op_array,
                                ret, (fbc->common.fn_flags & ZEND_ACC_STATIC) == 0);
-
                if (EXPECTED(zend_execute_ex == execute_ex)) {
                        ZEND_VM_ENTER();
                } else {
index 9122529a1a3b08fa8bf8c16ac267417eb748088b..0eb5dc77808cc785c28883433ae83575fee3d66c 100644 (file)
@@ -2107,9 +2107,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
                ZEND_ASSERT(!(fbc->common.fn_flags & ZEND_ACC_GENERATOR));
 
                call->symbol_table = NULL;
+               if (UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                i_init_func_execute_data(call, &fbc->op_array,
                                ret, (fbc->common.fn_flags & ZEND_ACC_STATIC) == 0);
-
                if (EXPECTED(zend_execute_ex == execute_ex)) {
                        ZEND_VM_ENTER();
                } else {
@@ -2250,17 +2252,20 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_
        zval *function_name, *func;
        zend_execute_data *call;
 
-       fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
+       function_name = (zval*)EX_CONSTANT(opline->op2);
+       fbc = CACHED_PTR(Z_CACHE_SLOT_P(function_name));
        if (UNEXPECTED(fbc == NULL)) {
-               function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
-               func = zend_hash_find(EG(function_table), Z_STR_P(function_name));
+               func = zend_hash_find(EG(function_table), Z_STR_P(function_name+1));
                if (UNEXPECTED(func == NULL)) {
                        SAVE_OPLINE();
-                       zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
                        HANDLE_EXCEPTION();
                }
                fbc = Z_FUNC_P(func);
-               CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
+               CACHE_PTR(Z_CACHE_SLOT_P(function_name), fbc);
        }
        call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
                fbc, opline->extended_value, NULL, NULL);
@@ -2475,6 +2480,9 @@ try_function_name:
 
                HANDLE_EXCEPTION();
        }
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+               init_func_run_time_cache(&fbc->op_array);
+       }
        call = zend_vm_stack_push_call_frame(call_info,
                fbc, opline->extended_value, called_scope, object);
        call->prev_execute_data = EX(call);
@@ -2506,6 +2514,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CON
                }
                fbc = Z_FUNC_P(func);
                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
@@ -2535,6 +2546,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(
                }
                fbc = Z_FUNC_P(func);
                CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call = zend_vm_stack_push_call_frame_ex(
@@ -2941,6 +2955,9 @@ try_function_name:
 
                HANDLE_EXCEPTION();
        }
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+               init_func_run_time_cache(&fbc->op_array);
+       }
        call = zend_vm_stack_push_call_frame(call_info,
                fbc, opline->extended_value, called_scope, object);
        call->prev_execute_data = EX(call);
@@ -3197,6 +3214,9 @@ try_function_name:
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
        }
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+               init_func_run_time_cache(&fbc->op_array);
+       }
        call = zend_vm_stack_push_call_frame(call_info,
                fbc, opline->extended_value, called_scope, object);
        call->prev_execute_data = EX(call);
@@ -3801,6 +3821,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP
                        ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
                        opline->extended_value, NULL, NULL);
        } else {
+               if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&constructor->op_array);
+               }
                /* We are not handling overloaded classes right now */
                call = zend_vm_stack_push_call_frame(
                        ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
@@ -6020,6 +6043,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -6130,6 +6156,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_CONST != IS_CONST) {
 
                }
@@ -6143,6 +6172,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -6233,6 +6265,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CONS
                                HANDLE_EXCEPTION();
                        }
                }
+               if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&func->op_array);
+               }
        } else {
                zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
                efree(error);
@@ -8039,6 +8074,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_UNUSED != IS_CONST) {
 
                }
@@ -8052,6 +8090,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -9843,6 +9884,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -9953,6 +9997,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_CV != IS_CONST) {
 
                }
@@ -9966,6 +10013,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -10056,6 +10106,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_CV_H
                                HANDLE_EXCEPTION();
                        }
                }
+               if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&func->op_array);
+               }
        } else {
                zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
                efree(error);
@@ -11752,6 +11805,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -11863,6 +11919,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
                        zval_ptr_dtor_nogc(free_op2);
                }
@@ -11876,6 +11935,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -11966,6 +12028,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_USER_CALL_SPEC_CONST_TMPV
                                HANDLE_EXCEPTION();
                        }
                }
+               if (EXPECTED(func->type == ZEND_USER_FUNCTION) && UNEXPECTED(!func->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&func->op_array);
+               }
        } else {
                zend_internal_type_error(EX_USES_STRICT_TYPES(), "%s() expects parameter 1 to be a valid callback, %s", Z_STRVAL_P(EX_CONSTANT(opline->op1)), error);
                efree(error);
@@ -16562,6 +16627,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO
                        ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
                        opline->extended_value, NULL, NULL);
        } else {
+               if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&constructor->op_array);
+               }
                /* We are not handling overloaded classes right now */
                call = zend_vm_stack_push_call_frame(
                        ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
@@ -19644,6 +19712,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_CONST != IS_CONST) {
 
                }
@@ -19657,6 +19728,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -21535,6 +21609,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_UNUSED != IS_CONST) {
 
                }
@@ -21548,6 +21625,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -24068,6 +24148,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_CV != IS_CONST) {
 
                }
@@ -24081,6 +24164,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -26518,6 +26604,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
                        zval_ptr_dtor_nogc(free_op2);
                }
@@ -26531,6 +26620,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -26884,6 +26976,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_O
                        ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
                        opline->extended_value, NULL, NULL);
        } else {
+               if (EXPECTED(constructor->type == ZEND_USER_FUNCTION) && UNEXPECTED(!constructor->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&constructor->op_array);
+               }
                /* We are not handling overloaded classes right now */
                call = zend_vm_stack_push_call_frame(
                        ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
@@ -28603,6 +28698,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -28713,6 +28811,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_CONST != IS_CONST) {
 
                }
@@ -28726,6 +28827,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -30040,6 +30144,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_UNUSED != IS_CONST) {
 
                }
@@ -30053,6 +30160,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -31923,6 +32033,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -32033,6 +32146,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if (IS_CV != IS_CONST) {
 
                }
@@ -32046,6 +32162,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -34183,6 +34302,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -34294,6 +34416,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), ce, fbc);
                        }
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
                if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
                        zval_ptr_dtor_nogc(free_op2);
                }
@@ -34307,6 +34432,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        HANDLE_EXCEPTION();
                }
                fbc = ce->constructor;
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        object = NULL;
@@ -39589,6 +39717,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -46077,6 +46208,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -49617,6 +49751,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -51843,6 +51980,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -54183,6 +54323,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;
@@ -55427,6 +55570,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
                    EXPECTED(obj == orig_obj)) {
                        CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(function_name), called_scope, fbc);
                }
+               if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!fbc->op_array.run_time_cache)) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
        }
 
        call_info = ZEND_CALL_NESTED_FUNCTION;