]> granicus.if.org Git - php/commitdiff
Re-committing Alan's is_a revert/fix for bug #55475
authorRasmus Lerdorf <rasmus@php.net>
Fri, 23 Sep 2011 09:52:09 +0000 (09:52 +0000)
committerRasmus Lerdorf <rasmus@php.net>
Fri, 23 Sep 2011 09:52:09 +0000 (09:52 +0000)
Dmitry had done so earlier, but reverted pending discussion.
It is completely clear that this should never have been changed in the
5.3 branch in the first place giving the number of things that broke
because of it.

Zend/zend_builtin_functions.c
Zend/zend_ini_scanner.c
Zend/zend_ini_scanner_defs.h

index fc094a5e5f173f30a9f78475a5aa3cba9e434d3f..1eec9b7275fcdf348eff4a9fd92b4664edc38a04 100644 (file)
@@ -816,13 +816,19 @@ static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool only_subclass)
        int class_name_len;
        zend_class_entry *instance_ce;
        zend_class_entry **ce;
+       zend_bool allow_string = only_subclass;
        zend_bool retval;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &obj, &class_name, &class_name_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs|b", &obj, &class_name, &class_name_len, &allow_string) == FAILURE) {
                return;
        }
-       
-       if (Z_TYPE_P(obj) == IS_STRING) {
+       /*
+          allow_string - is_a default is no, is_subclass_of is yes. 
+          if it's allowed, then the autoloader will be called if the class does not exist.
+          default behaviour is different, as 'is_a' usage is normally to test mixed return values 
+       */
+
+       if (allow_string && Z_TYPE_P(obj) == IS_STRING) {
                zend_class_entry **the_ce;
                if (zend_lookup_class(Z_STRVAL_P(obj), Z_STRLEN_P(obj), &the_ce TSRMLS_CC) == FAILURE) {
                        RETURN_FALSE;
@@ -848,7 +854,7 @@ static void is_a_impl(INTERNAL_FUNCTION_PARAMETERS, zend_bool only_subclass)
 }
 
 
-/* {{{ proto bool is_subclass_of(object object, string class_name)
+/* {{{ proto bool is_subclass_of(mixed object_or_string, string class_name [, bool allow_string=true])
    Returns true if the object has this class as one of its parents */
 ZEND_FUNCTION(is_subclass_of)
 {
@@ -857,8 +863,8 @@ ZEND_FUNCTION(is_subclass_of)
 /* }}} */
 
 
-/* {{{ proto bool is_a(object object, string class_name)
-   Returns true if the object is of this class or has this class as one of its parents */
+/* {{{ proto bool is_a(mixed object_or_string, string class_name [, bool allow_string=false])
+   Returns true if the first argument is an object and is this class or has this class as one of its parents, */
 ZEND_FUNCTION(is_a)
 {
        is_a_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
index d07b8553c7b2d1d25d0ed4aa55f9243624f16047..57e62dcca669b00fe53e716eb5c065e2e524fe2d 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Sun Aug  1 12:07:43 2010 */
+/* Generated by re2c 0.13.5 on Fri Aug 26 18:01:17 2011 */
 #line 1 "Zend/zend_ini_scanner.l"
 /*
    +----------------------------------------------------------------------+
index 6dc3fd7cf91b2ffd3aa74ba74fee84f780e075a4..b3e2d726bd3e90f60695f592b11f1d691207a70d 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Sun Aug  1 12:07:43 2010 */
+/* Generated by re2c 0.13.5 on Fri Aug 26 18:01:17 2011 */
 #line 3 "Zend/zend_ini_scanner_defs.h"
 
 enum YYCONDTYPE {