Index: zend_API.c =================================================================== RCS file: /repository/ZendEngine2/zend_API.c,v retrieving revision 1.278 diff -u -r1.278 zend_API.c --- zend_API.c 17 Feb 2005 21:05:04 -0000 1.278 +++ zend_API.c 18 Feb 2005 13:05:51 -0000 @@ -1822,10 +1822,47 @@ } if (ce) { + zend_function *fbc; + zend_object *zobj; + zval tmp_obj; + + if (Z_TYPE_PP(obj) == IS_OBJECT) { + zobj = zend_objects_get_address(*obj TSRMLS_CC); + tmp_obj = **obj; + } + else { + tmp_obj.value.obj = zend_objects_new(&zobj, ce TSRMLS_CC); + ALLOC_HASHTABLE(zobj->properties); + zend_hash_init(zobj->properties, 0, NULL, ZVAL_PTR_DTOR, 0); + } + lcname = zend_str_tolower_dup(Z_STRVAL_PP(method), Z_STRLEN_PP(method)); - if (zend_hash_exists(&ce->function_table, lcname, Z_STRLEN_PP(method)+1)) { - retval = 1; + + retval = 1; + + if (zend_hash_find(&zobj->ce->function_table, lcname, Z_STRLEN_PP(method)+1, (void **)&fbc) == SUCCESS) { + if (fbc->op_array.fn_flags & ZEND_ACC_PUBLIC) { + if (EG(scope) && fbc->op_array.fn_flags & ZEND_ACC_CHANGED) { + zend_function *priv_fbc; + + if (zend_hash_find(&EG(scope)->function_table, lcname, Z_STRLEN_PP(method)+1, (void **) &priv_fbc)==SUCCESS + && priv_fbc->common.fn_flags & ZEND_ACC_PRIVATE) { + retval = 0; + } + } + } else if (fbc->op_array.fn_flags & ZEND_ACC_PRIVATE) { + + if (!zend_check_private(fbc, tmp_obj.value.obj.handlers->get_class_entry(&tmp_obj TSRMLS_CC), fbc->common.fn_flags, lcname, Z_STRLEN_PP(method) TSRMLS_CC)) { + retval = 0; + } + } else if ((fbc->common.fn_flags & ZEND_ACC_PROTECTED)) { + if (!zend_check_protected(fbc->common.scope, EG(scope))) { + retval = 0; + } + } + } + /* check for __call too */ if (retval == 0 && ce->__call != 0) { retval = 1; Index: zend_object_handlers.c =================================================================== RCS file: /repository/ZendEngine2/zend_object_handlers.c,v retrieving revision 1.109 diff -u -r1.109 zend_object_handlers.c --- zend_object_handlers.c 2 Feb 2005 07:19:22 -0000 1.109 +++ zend_object_handlers.c 18 Feb 2005 13:05:56 -0000 @@ -535,7 +535,7 @@ * Returns the function address that should be called, or NULL * if no such function exists. */ -static inline zend_function *zend_check_private(zend_function *fbc, zend_class_entry *ce, int fn_flags, char *function_name_strval, int function_name_strlen TSRMLS_DC) +ZEND_API inline zend_function *zend_check_private(zend_function *fbc, zend_class_entry *ce, int fn_flags, char *function_name_strval, int function_name_strlen TSRMLS_DC) { if (!ce) { return 0; Index: zend_object_handlers.h =================================================================== RCS file: /repository/ZendEngine2/zend_object_handlers.h,v retrieving revision 1.42 diff -u -r1.42 zend_object_handlers.h --- zend_object_handlers.h 30 Oct 2004 19:11:37 -0000 1.42 +++ zend_object_handlers.h 18 Feb 2005 13:05:57 -0000 @@ -137,6 +137,8 @@ #define IS_ZEND_STD_OBJECT(z) ((z).type == IS_OBJECT && (Z_OBJ_HT((z))->get_class_entry != NULL)) #define HAS_CLASS_ENTRY(z) (Z_OBJ_HT(z)->get_class_entry != NULL) +ZEND_API inline union _zend_function *zend_check_private(union _zend_function *fbc, zend_class_entry *ce, int fn_flags, char *function_name_strval, int function_name_strlen TSRMLS_CC); + ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope); ZEND_API int zend_check_property_access(zend_object *zobj, char *prop_info_name TSRMLS_DC);