]> granicus.if.org Git - php/commitdiff
- MFB: Fixed bug #45089 (__callStatic $name case sensitivity)
authorFelipe Pena <felipe@php.net>
Tue, 3 Jun 2008 19:01:26 +0000 (19:01 +0000)
committerFelipe Pena <felipe@php.net>
Tue, 3 Jun 2008 19:01:26 +0000 (19:01 +0000)
Zend/tests/call_static.phpt
Zend/zend_compile.c
Zend/zend_execute_API.c
Zend/zend_object_handlers.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index e77a158914dfaa3c45f517d853be75db2ea79886..c37bc722303dc37b5639bbfc564a9670716470d1 100755 (executable)
@@ -15,6 +15,6 @@ call_user_func(array("Test", "Three"), NULL, 0, false);
 Test::Four(5, 6, 7, 8);
 
 --EXPECT--
-two() called with 2 arguments
-three() called with 3 arguments
-four() called with 4 arguments
+Two() called with 2 arguments
+Three() called with 3 arguments
+Four() called with 4 arguments
index c11de553f38003191da0167817f35795669be6ce..173b3cc066968e34a8cbbe020be93dee5ca3cedb 100644 (file)
@@ -1999,12 +1999,8 @@ int zend_do_begin_class_member_function_call(znode *class_name, znode *method_na
                                ZEND_U_EQUAL(Z_TYPE(method_name->u.constant), lcname, Z_UNILEN(method_name->u.constant), ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1)) {
                        zval_dtor(&method_name->u.constant);
                        SET_UNUSED(*method_name);
-                       efree(lcname.v);
-               } else {
-                       efree(Z_USTRVAL(method_name->u.constant));
-                       Z_UNIVAL(method_name->u.constant) = lcname;
-                       Z_UNILEN(method_name->u.constant) = lcname_len;
                }
+               efree(lcname.v);
        }
 
        if (class_name->op_type == IS_CONST &&
index df4700acb60e1cac2874a63dd89e759acbc68813..00cc88743b1ba5d185e2dcad0a1f45ec17afa743 100644 (file)
@@ -996,15 +996,11 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
                                        efree(function_name_lc.v);
                                }
                        } else if (calling_scope) {
-                               unsigned int lcname_len;
-                               zstr lcname = zend_u_str_case_fold(Z_TYPE_P(fci->function_name), fname, fname_len, 1, &lcname_len);
-
                                if (calling_scope->get_static_method) {
-                                       EX(function_state).function = calling_scope->get_static_method(calling_scope, Z_TYPE_P(fci->function_name), lcname, lcname_len TSRMLS_CC);
+                                       EX(function_state).function = calling_scope->get_static_method(calling_scope, Z_TYPE_P(fci->function_name), fname, fname_len TSRMLS_CC);
                                } else {
-                                       EX(function_state).function = zend_std_get_static_method(calling_scope, Z_TYPE_P(fci->function_name), lcname, lcname_len TSRMLS_CC);
+                                       EX(function_state).function = zend_std_get_static_method(calling_scope, Z_TYPE_P(fci->function_name), fname, fname_len TSRMLS_CC);
                                }
-                               efree(lcname.v);
 
                                if (check_scope_or_static && EX(function_state).function
                                && !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC)
index 9b16d39bec25b1fd998ad98ba2d0947c6bc4b3ab..4e2d7e1d44cba0f58c2d5a5061ff2b50f6a68338 100644 (file)
@@ -906,6 +906,10 @@ ZEND_API void zend_std_callstatic_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{
 ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_uchar type, zstr function_name_strval, int function_name_strlen TSRMLS_DC) /* {{{ */
 {
        zend_function *fbc = NULL;
+       zstr lc_function_name;
+       unsigned int lc_function_name_len;
+       
+       lc_function_name = zend_u_str_case_fold(type, function_name_strval, function_name_strlen, 0, &lc_function_name_len);
 
        if (function_name_strlen == ce->name_length && ce->constructor) {
                zstr lc_class_name;
@@ -920,7 +924,9 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_uc
                efree(lc_class_name.v);
        }
 
-       if (!fbc && zend_u_hash_find(&ce->function_table, type, function_name_strval, function_name_strlen + 1, (void **) &fbc)==FAILURE) {
+       if (!fbc && zend_u_hash_find(&ce->function_table, type, lc_function_name, function_name_strlen + 1, (void **) &fbc)==FAILURE) {
+               efree(lc_function_name.v);
+
                if (ce->__call &&
                    EG(This) &&
                    Z_OBJ_HT_P(EG(This))->get_class_entry &&
@@ -972,6 +978,7 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_uc
                        zend_error(E_ERROR, "Call to undefined method %R::%R()", type, class_name, type, function_name_strval);
                }
        }
+       efree(lc_function_name.v);
 
 #if MBO_0
        /* right now this function is used for non static method lookup too */
index 446a7a881e146ef16c5bb83ee814165bd64a42b8..4f827779117bcad7499e719901ccbf003044706e 100644 (file)
@@ -1996,7 +1996,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
        }
        if(OP2_TYPE != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
 
@@ -2009,19 +2009,22 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (OP2_TYPE != IS_CONST) {
-                       efree(function_name_strval.v);
                        FREE_OP2();
                }
        } else {
index ea2dcdbcbce0ac548c7f648a89842f89fab424a9..76f02ee2c20aad97bb61ee1044cf957cfa92480b 100644 (file)
@@ -2523,7 +2523,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HAN
        }
        if(IS_CONST != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
 
@@ -2536,19 +2536,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HAN
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CONST != IS_CONST) {
-                       efree(function_name_strval.v);
 
                }
        } else {
@@ -3101,7 +3104,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDL
        }
        if(IS_TMP_VAR != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
 
@@ -3114,19 +3117,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDL
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_TMP_VAR != IS_CONST) {
-                       efree(function_name_strval.v);
                        zval_dtor(free_op2.var);
                }
        } else {
@@ -3570,7 +3576,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
        }
        if(IS_VAR != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
 
@@ -3583,19 +3589,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_VAR != IS_CONST) {
-                       efree(function_name_strval.v);
                        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
                }
        } else {
@@ -3795,7 +3804,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HA
        }
        if(IS_UNUSED != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
 
@@ -3808,19 +3817,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HA
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_UNUSED != IS_CONST) {
-                       efree(function_name_strval.v);
 
                }
        } else {
@@ -4232,7 +4244,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLE
        }
        if(IS_CV != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
 
@@ -4245,19 +4257,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLE
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CV != IS_CONST) {
-                       efree(function_name_strval.v);
 
                }
        } else {
@@ -10463,7 +10478,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
        }
        if(IS_CONST != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
 
@@ -10476,19 +10491,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CONST != IS_CONST) {
-                       efree(function_name_strval.v);
 
                }
        } else {
@@ -12351,7 +12369,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
        }
        if(IS_TMP_VAR != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
 
@@ -12364,19 +12382,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_TMP_VAR != IS_CONST) {
-                       efree(function_name_strval.v);
                        zval_dtor(free_op2.var);
                }
        } else {
@@ -14209,7 +14230,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
        }
        if(IS_VAR != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
                zend_free_op free_op2;
                zend_uchar function_name_type;
 
@@ -14222,19 +14243,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_VAR != IS_CONST) {
-                       efree(function_name_strval.v);
                        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
                }
        } else {
@@ -15165,7 +15189,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAND
        }
        if(IS_UNUSED != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
 
@@ -15178,19 +15202,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAND
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_UNUSED != IS_CONST) {
-                       efree(function_name_strval.v);
 
                }
        } else {
@@ -16673,7 +16700,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
        }
        if(IS_CV != IS_UNUSED) {
                zstr function_name_strval;
-               unsigned int function_name_strlen;
+               unsigned int function_name_strlen = 0;
 
                zend_uchar function_name_type;
 
@@ -16686,19 +16713,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
 
                        if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
+                       } else {
+                               function_name_strval = Z_UNIVAL_P(function_name);
+                               function_name_strlen = Z_UNILEN_P(function_name);
+                               function_name_type   = Z_TYPE_P(function_name);
                        }
-                       function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen);
-                       function_name_type   = Z_TYPE_P(function_name);
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+               if (function_name_strlen) {
+                       if (ce->get_static_method) {
+                               EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CV != IS_CONST) {
-                       efree(function_name_strval.v);
 
                }
        } else {