]> granicus.if.org Git - php/commitdiff
- Fixed bug #45089 (__callStatic $name case sensitivity)
authorFelipe Pena <felipe@php.net>
Tue, 3 Jun 2008 18:11:12 +0000 (18:11 +0000)
committerFelipe Pena <felipe@php.net>
Tue, 3 Jun 2008 18:11:12 +0000 (18:11 +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 476e2d04e764dce5b7e28f803dc3921ed2ed7cd8..aaeb6500d9bb410f7d67bf11abf5d0d310a9c4b7 100644 (file)
@@ -1919,11 +1919,8 @@ int zend_do_begin_class_member_function_call(znode *class_name, znode *method_na
                    memcmp(lcname, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == 0) {
                        zval_dtor(&method_name->u.constant);
                        SET_UNUSED(*method_name);
-                       efree(lcname);
-               } else {
-                       efree(Z_STRVAL(method_name->u.constant));
-                       Z_STRVAL(method_name->u.constant) = lcname;
                }
+               efree(lcname);
        }
 
        if (class_name->op_type == IS_CONST &&
index 929828654baa1d4181e46895a546ba6a1dd76cf2..6e351000e2cf1e1c9e53d476a2d03e815f51b601 100644 (file)
@@ -901,14 +901,11 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
                                        efree(function_name_lc);
                                }
                        } else if (calling_scope) {
-                               char *function_name_lc = zend_str_tolower_dup(fname, fname_len);
-
                                if (calling_scope->get_static_method) {
-                                       EX(function_state).function = calling_scope->get_static_method(calling_scope, function_name_lc, fname_len TSRMLS_CC);
+                                       EX(function_state).function = calling_scope->get_static_method(calling_scope, fname, fname_len TSRMLS_CC);
                                } else {
-                                       EX(function_state).function = zend_std_get_static_method(calling_scope, function_name_lc, fname_len TSRMLS_CC);
+                                       EX(function_state).function = zend_std_get_static_method(calling_scope, fname, fname_len TSRMLS_CC);
                                }
-                               efree(function_name_lc);
 
                                if (check_scope_or_static && EX(function_state).function
                                && !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC)
index 71f843b3397e94f21c8957a264387eacb982d8a0..cf5ebd4807f45941a88a0186521f9a813e23c402 100644 (file)
@@ -893,7 +893,9 @@ ZEND_API void zend_std_callstatic_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{
 ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, char *function_name_strval, int function_name_strlen TSRMLS_DC) /* {{{ */
 {
        zend_function *fbc = NULL;
-       char *lc_class_name;
+       char *lc_class_name, *lc_function_name = NULL;
+       
+       lc_function_name = zend_str_tolower_dup(function_name_strval, function_name_strlen);
 
        if (function_name_strlen == ce->name_length && ce->constructor) {
                lc_class_name = zend_str_tolower_dup(ce->name, ce->name_length);
@@ -902,7 +904,9 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, char *f
                }
                efree(lc_class_name);
        }
-       if (!fbc && zend_hash_find(&ce->function_table, function_name_strval, function_name_strlen+1, (void **) &fbc)==FAILURE) {
+       if (!fbc && zend_hash_find(&ce->function_table, lc_function_name, function_name_strlen+1, (void **) &fbc)==FAILURE) {
+               efree(lc_function_name);
+
                if (ce->__call &&
                    EG(This) &&
                    Z_OBJ_HT_P(EG(This))->get_class_entry &&
@@ -940,6 +944,7 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, char *f
                        zend_error(E_ERROR, "Call to undefined method %s::%s()", ce->name ? ce->name : "", function_name_strval);
                }
        }
+       efree(lc_function_name);
 
 #if MBO_0
        /* right now this function is used for non static method lookup too */
index d21c96592ca993239eaa2b1379a66343f240d620..885629b82bb84a87135b7653db2e1cc8e0354262 100644 (file)
@@ -1942,7 +1942,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
        }
        if(OP2_TYPE != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
                zend_free_op free_op2;
 
                if (OP2_TYPE == IS_CONST) {
@@ -1953,19 +1953,21 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (OP2_TYPE != IS_CONST) {
-                       efree(function_name_strval);
                        FREE_OP2();
                }
        } else {
index 749d6e0b0a1e2d75529ea3f7dc29373c4b68c860..cd7eba7a9cf309be5d3ef8403b753ad8e5516c69 100644 (file)
@@ -2449,7 +2449,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HAN
        }
        if(IS_CONST != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
 
 
                if (IS_CONST == IS_CONST) {
@@ -2460,19 +2460,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HAN
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CONST != IS_CONST) {
-                       efree(function_name_strval);
 
                }
        } else {
@@ -3020,7 +3022,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDL
        }
        if(IS_TMP_VAR != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
                zend_free_op free_op2;
 
                if (IS_TMP_VAR == IS_CONST) {
@@ -3031,19 +3033,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDL
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_TMP_VAR != IS_CONST) {
-                       efree(function_name_strval);
                        zval_dtor(free_op2.var);
                }
        } else {
@@ -3486,7 +3490,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
        }
        if(IS_VAR != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
                zend_free_op free_op2;
 
                if (IS_VAR == IS_CONST) {
@@ -3497,19 +3501,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_VAR != IS_CONST) {
-                       efree(function_name_strval);
                        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
                }
        } else {
@@ -3708,7 +3714,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HA
        }
        if(IS_UNUSED != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
 
 
                if (IS_UNUSED == IS_CONST) {
@@ -3719,19 +3725,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HA
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_UNUSED != IS_CONST) {
-                       efree(function_name_strval);
 
                }
        } else {
@@ -4142,7 +4150,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLE
        }
        if(IS_CV != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
 
 
                if (IS_CV == IS_CONST) {
@@ -4153,19 +4161,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLE
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CV != IS_CONST) {
-                       efree(function_name_strval);
 
                }
        } else {
@@ -10078,7 +10088,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
        }
        if(IS_CONST != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
 
 
                if (IS_CONST == IS_CONST) {
@@ -10089,19 +10099,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CONST != IS_CONST) {
-                       efree(function_name_strval);
 
                }
        } else {
@@ -11908,7 +11920,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
        }
        if(IS_TMP_VAR != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
                zend_free_op free_op2;
 
                if (IS_TMP_VAR == IS_CONST) {
@@ -11919,19 +11931,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_TMP_VAR != IS_CONST) {
-                       efree(function_name_strval);
                        zval_dtor(free_op2.var);
                }
        } else {
@@ -13708,7 +13722,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
        }
        if(IS_VAR != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
                zend_free_op free_op2;
 
                if (IS_VAR == IS_CONST) {
@@ -13719,19 +13733,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_VAR != IS_CONST) {
-                       efree(function_name_strval);
                        if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
                }
        } else {
@@ -14611,7 +14627,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAND
        }
        if(IS_UNUSED != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
 
 
                if (IS_UNUSED == IS_CONST) {
@@ -14622,19 +14638,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAND
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_UNUSED != IS_CONST) {
-                       efree(function_name_strval);
 
                }
        } else {
@@ -16112,7 +16130,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
        }
        if(IS_CV != IS_UNUSED) {
                char *function_name_strval;
-               int function_name_strlen;
+               int function_name_strlen = 0;
 
 
                if (IS_CV == IS_CONST) {
@@ -16123,19 +16141,21 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
 
                        if (Z_TYPE_P(function_name) != IS_STRING) {
                                zend_error_noreturn(E_ERROR, "Function name must be a string");
-                       }
-                       function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
-                       function_name_strlen = function_name->value.str.len;
+                       } else {
+                               function_name_strval = Z_STRVAL_P(function_name);
+                               function_name_strlen = Z_STRLEN_P(function_name);
+                       }
                }
 
-               if (ce->get_static_method) {
-                       EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
-               } else {
-                       EX(fbc) = zend_std_get_static_method(ce, 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_strval, function_name_strlen TSRMLS_CC);
+                       } else {
+                               EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+                       }
                }
 
                if (IS_CV != IS_CONST) {
-                       efree(function_name_strval);
 
                }
        } else {