diff options
Diffstat (limited to 'Zend/zend_builtin_functions.c')
| -rw-r--r-- | Zend/zend_builtin_functions.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 42d5f77af4..dc398e73de 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -502,10 +502,11 @@ ZEND_FUNCTION(get_class) } if (Z_OBJ_HT_PP(arg)->get_class_name == NULL || - Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_len, 0 TSRMLS_CC) != SUCCESS) { - zend_class_entry *ce, **_ce; + Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_len, 0 TSRMLS_CC) != SUCCESS) { + zend_class_entry *ce; - if (((_ce = zend_get_class_entry(*arg)) == NULL) || ((ce = *_ce) == NULL)) { + ce = zend_get_class_entry(*arg); + if (!ce) { RETURN_FALSE; } @@ -532,19 +533,20 @@ ZEND_FUNCTION(get_parent_class) if (Z_TYPE_PP(arg) == IS_OBJECT) { char *name; zend_uint name_length; - - if (Z_OBJ_HT_PP(arg)->get_class_name == NULL || - Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_length, 1 TSRMLS_CC) != SUCCESS) { - zend_class_entry *ce, **_ce; - - if (!(_ce = zend_get_class_entry(*arg)) || !(ce = *_ce) || !(ce = ce->parent)) { - RETURN_FALSE; - } + /* first try asking handler for parent class name */ + if (Z_OBJ_HT_PP(arg)->get_class_name != NULL && + Z_OBJ_HT_PP(arg)->get_class_name(*arg, &name, &name_length, 1 TSRMLS_CC) == SUCCESS) { name = ce->name; name_length = ce->name_length; + + RETURN_STRINGL(name, name_length, 1); + } + /* then try getting the class entry + if successfull, will fall through to standard ce handling */ + if(!Z_OBJ_HT_PP(arg)->get_class_entry || !(ce = zend_get_class_entry(*arg))) { + RETURN_FALSE; } - RETURN_STRINGL(name, name_length, 1); } else if (Z_TYPE_PP(arg) == IS_STRING) { zend_class_entry **pce; |
