]> granicus.if.org Git - php/commitdiff
While the compiler does not have the FBC set for zend_get_call_op, optimizer does...
authorJoe Watkins <krakjoe@php.net>
Thu, 21 Feb 2019 22:54:26 +0000 (23:54 +0100)
committerJoe Watkins <krakjoe@php.net>
Thu, 21 Feb 2019 22:54:26 +0000 (23:54 +0100)
If someone has a better patch, please merge it ASAP, this appears to be correct as I and Nikita originally thought.

Revert "Revert "zend_get_call_op ignoring compiler flags zend_get_call_op will ignore ZEND_COMPILE_IGNORE_USER_FUNCTIONS and ZEND_COMPILE_IGNORE_USER_FUNCTIONS, breaking the intention of these flags""

This reverts commit 0bbbd0f9e7449a2f204f959d06e5266175a86be9.

UPGRADING.INTERNALS
Zend/zend_compile.c

index 578637144bbd4329724976ca9867eccfccec9c28..fa02216f509d1a8bf07810b75884e46be87fb5c1 100644 (file)
@@ -17,6 +17,7 @@ PHP 7.4 INTERNALS UPGRADE NOTES
   n. Assignments to references
   o. ZEND_COMPILE_EXTENDED_INFO split
   p. ZEND_EXT_FCALL_BEGIN can access arguments
+  q. ZEND_COMPILE_IGNORE_USER_FUNCTIONS and ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS
 
 2. Build system changes
   a. Abstract
@@ -178,6 +179,11 @@ PHP 7.4 INTERNALS UPGRADE NOTES
   p. ZEND_EXT_BEGIN_FCALL is emitted after arguments are sent, this means
      that handlers may access arguments.
 
+  q. ZEND_COMPILE_IGNORE_USER_FUNCTIONS and ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS
+     are respected by zend_get_call_op such that when set, the only possible
+     call opcodes are ZEND_DO_FCALL and ZEND_DO_FCALL_BY_NAME, previously they
+     were ignored by zend_get_call_op.
+     
 ========================
 2. Build system changes
 ========================
index 1f6449fa9481a8cebc5113367e0dbfe593e6b7e0..eee2347f494f26b56e6f32bf03661271cd0beb99 100644 (file)
@@ -3044,7 +3044,7 @@ uint32_t zend_compile_args(zend_ast *ast, zend_function *fbc) /* {{{ */
 ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc) /* {{{ */
 {
        if (fbc) {
-               if (fbc->type == ZEND_INTERNAL_FUNCTION) {
+               if (fbc->type == ZEND_INTERNAL_FUNCTION && !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS)) {
                        if (init_op->opcode == ZEND_INIT_FCALL && !zend_execute_internal) {
                                if (!(fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED|ZEND_ACC_HAS_TYPE_HINTS|ZEND_ACC_RETURN_REFERENCE))) {
                                        return ZEND_DO_ICALL;
@@ -3052,7 +3052,7 @@ ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc)
                                        return ZEND_DO_FCALL_BY_NAME;
                                }
                        }
-               } else {
+               } else if (!(CG(compiler_options) & ZEND_COMPILE_IGNORE_USER_FUNCTIONS)){
                        if (zend_execute_ex == execute_ex && !(fbc->common.fn_flags & ZEND_ACC_ABSTRACT)) {
                                return ZEND_DO_UCALL;
                        }