From: Máté Kocsis Date: Thu, 18 Feb 2021 10:14:36 +0000 (+0100) Subject: Generate ext/spl class entries from stubs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4f4c031f62e28ed53869a57264535a8739a010e9;p=php Generate ext/spl class entries from stubs Closes GH-6709 --- diff --git a/ext/spl/php_spl.stub.php b/ext/spl/php_spl.stub.php index 61b2165c9f..e7cc10dbc3 100644 --- a/ext/spl/php_spl.stub.php +++ b/ext/spl/php_spl.stub.php @@ -1,6 +1,6 @@ create_object = spl_array_object_new; + memcpy(&spl_handler_ArrayObject, &std_object_handlers, sizeof(zend_object_handlers)); spl_handler_ArrayObject.offset = XtOffsetOf(spl_array_object, std); @@ -1870,16 +1868,12 @@ PHP_MINIT_FUNCTION(spl_array) spl_handler_ArrayObject.dtor_obj = zend_objects_destroy_object; spl_handler_ArrayObject.free_obj = spl_array_object_free_storage; - REGISTER_SPL_STD_CLASS_EX(ArrayIterator, spl_array_object_new, class_ArrayIterator_methods); - REGISTER_SPL_IMPLEMENTS(ArrayIterator, Iterator); - REGISTER_SPL_IMPLEMENTS(ArrayIterator, ArrayAccess); - REGISTER_SPL_IMPLEMENTS(ArrayIterator, SeekableIterator); - REGISTER_SPL_IMPLEMENTS(ArrayIterator, Serializable); - REGISTER_SPL_IMPLEMENTS(ArrayIterator, Countable); - memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); + spl_ce_ArrayIterator = register_class_ArrayIterator(spl_ce_SeekableIterator, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable); + spl_ce_ArrayIterator->create_object = spl_array_object_new; spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator; spl_ce_ArrayIterator->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; + memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); REGISTER_SPL_CLASS_CONST_LONG(ArrayObject, "STD_PROP_LIST", SPL_ARRAY_STD_PROP_LIST); REGISTER_SPL_CLASS_CONST_LONG(ArrayObject, "ARRAY_AS_PROPS", SPL_ARRAY_ARRAY_AS_PROPS); @@ -1887,8 +1881,8 @@ PHP_MINIT_FUNCTION(spl_array) REGISTER_SPL_CLASS_CONST_LONG(ArrayIterator, "STD_PROP_LIST", SPL_ARRAY_STD_PROP_LIST); REGISTER_SPL_CLASS_CONST_LONG(ArrayIterator, "ARRAY_AS_PROPS", SPL_ARRAY_ARRAY_AS_PROPS); - REGISTER_SPL_SUB_CLASS_EX(RecursiveArrayIterator, ArrayIterator, spl_array_object_new, class_RecursiveArrayIterator_methods); - REGISTER_SPL_IMPLEMENTS(RecursiveArrayIterator, RecursiveIterator); + spl_ce_RecursiveArrayIterator = register_class_RecursiveArrayIterator(spl_ce_ArrayIterator, spl_ce_RecursiveIterator); + spl_ce_RecursiveArrayIterator->create_object = spl_array_object_new; spl_ce_RecursiveArrayIterator->get_iterator = spl_array_get_iterator; spl_ce_RecursiveArrayIterator->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; diff --git a/ext/spl/spl_array.stub.php b/ext/spl/spl_array.stub.php index 1567d107f2..f6f1427011 100644 --- a/ext/spl/spl_array.stub.php +++ b/ext/spl/spl_array.stub.php @@ -1,6 +1,6 @@ create_object = spl_filesystem_object_new; + memcpy(&spl_filesystem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); spl_filesystem_object_handlers.offset = XtOffsetOf(spl_filesystem_object, std); spl_filesystem_object_handlers.clone_obj = spl_filesystem_object_clone; @@ -2739,16 +2741,14 @@ PHP_MINIT_FUNCTION(spl_directory) spl_filesystem_object_handlers.free_obj = spl_filesystem_object_free_storage; spl_ce_SplFileInfo->serialize = zend_class_serialize_deny; spl_ce_SplFileInfo->unserialize = zend_class_unserialize_deny; - REGISTER_SPL_IMPLEMENTS(SplFileInfo, Stringable); - - - REGISTER_SPL_SUB_CLASS_EX(DirectoryIterator, SplFileInfo, spl_filesystem_object_new, class_DirectoryIterator_methods); - zend_class_implements(spl_ce_DirectoryIterator, 1, zend_ce_iterator); - REGISTER_SPL_IMPLEMENTS(DirectoryIterator, SeekableIterator); + spl_ce_DirectoryIterator = register_class_DirectoryIterator(spl_ce_SplFileInfo, spl_ce_SeekableIterator); + spl_ce_DirectoryIterator->create_object = spl_filesystem_object_new; spl_ce_DirectoryIterator->get_iterator = spl_filesystem_dir_get_iterator; - REGISTER_SPL_SUB_CLASS_EX(FilesystemIterator, DirectoryIterator, spl_filesystem_object_new, class_FilesystemIterator_methods); + spl_ce_FilesystemIterator = register_class_FilesystemIterator(spl_ce_DirectoryIterator); + spl_ce_FilesystemIterator->create_object = spl_filesystem_object_new; + spl_ce_FilesystemIterator->get_iterator = spl_filesystem_tree_get_iterator; REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_MODE_MASK", SPL_FILE_DIR_CURRENT_MODE_MASK); REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "CURRENT_AS_PATHNAME", SPL_FILE_DIR_CURRENT_AS_PATHNAME); @@ -2763,30 +2763,29 @@ PHP_MINIT_FUNCTION(spl_directory) REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "SKIP_DOTS", SPL_FILE_DIR_SKIPDOTS); REGISTER_SPL_CLASS_CONST_LONG(FilesystemIterator, "UNIX_PATHS", SPL_FILE_DIR_UNIXPATHS); - spl_ce_FilesystemIterator->get_iterator = spl_filesystem_tree_get_iterator; - - REGISTER_SPL_SUB_CLASS_EX(RecursiveDirectoryIterator, FilesystemIterator, spl_filesystem_object_new, class_RecursiveDirectoryIterator_methods); - REGISTER_SPL_IMPLEMENTS(RecursiveDirectoryIterator, RecursiveIterator); + spl_ce_RecursiveDirectoryIterator = register_class_RecursiveDirectoryIterator(spl_ce_FilesystemIterator, spl_ce_RecursiveIterator); + spl_ce_RecursiveDirectoryIterator->create_object = spl_filesystem_object_new; memcpy(&spl_filesystem_object_check_handlers, &spl_filesystem_object_handlers, sizeof(zend_object_handlers)); spl_filesystem_object_check_handlers.clone_obj = NULL; spl_filesystem_object_check_handlers.get_method = spl_filesystem_object_get_method_check; #ifdef HAVE_GLOB - REGISTER_SPL_SUB_CLASS_EX(GlobIterator, FilesystemIterator, spl_filesystem_object_new_check, class_GlobIterator_methods); - REGISTER_SPL_IMPLEMENTS(GlobIterator, Countable); + spl_ce_GlobIterator = register_class_GlobIterator(spl_ce_FilesystemIterator, zend_ce_countable); + spl_ce_GlobIterator->create_object = spl_filesystem_object_new_check; #endif - REGISTER_SPL_SUB_CLASS_EX(SplFileObject, SplFileInfo, spl_filesystem_object_new_check, class_SplFileObject_methods); - REGISTER_SPL_IMPLEMENTS(SplFileObject, RecursiveIterator); - REGISTER_SPL_IMPLEMENTS(SplFileObject, SeekableIterator); + spl_ce_SplFileObject = register_class_SplFileObject(spl_ce_SplFileInfo, spl_ce_RecursiveIterator, spl_ce_SeekableIterator); + spl_ce_SplFileObject->create_object = spl_filesystem_object_new_check; REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "DROP_NEW_LINE", SPL_FILE_OBJECT_DROP_NEW_LINE); REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_AHEAD", SPL_FILE_OBJECT_READ_AHEAD); REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "SKIP_EMPTY", SPL_FILE_OBJECT_SKIP_EMPTY); REGISTER_SPL_CLASS_CONST_LONG(SplFileObject, "READ_CSV", SPL_FILE_OBJECT_READ_CSV); - REGISTER_SPL_SUB_CLASS_EX(SplTempFileObject, SplFileObject, spl_filesystem_object_new_check, class_SplTempFileObject_methods); + spl_ce_SplTempFileObject = register_class_SplTempFileObject(spl_ce_SplFileObject); + spl_ce_SplTempFileObject->create_object = spl_filesystem_object_new_check; + return SUCCESS; } /* }}} */ diff --git a/ext/spl/spl_directory.stub.php b/ext/spl/spl_directory.stub.php index 681547e55f..80b708a3f4 100644 --- a/ext/spl/spl_directory.stub.php +++ b/ext/spl/spl_directory.stub.php @@ -1,8 +1,8 @@ create_object = spl_dllist_object_new; + spl_ce_SplDoublyLinkedList->get_iterator = spl_dllist_get_iterator; + memcpy(&spl_handler_SplDoublyLinkedList, &std_object_handlers, sizeof(zend_object_handlers)); spl_handler_SplDoublyLinkedList.offset = XtOffsetOf(spl_dllist_object, std); @@ -1347,17 +1352,12 @@ PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */ REGISTER_SPL_CLASS_CONST_LONG(SplDoublyLinkedList, "IT_MODE_DELETE",SPL_DLLIST_IT_DELETE); REGISTER_SPL_CLASS_CONST_LONG(SplDoublyLinkedList, "IT_MODE_KEEP", 0); - REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, Iterator); - REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, Countable); - REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, ArrayAccess); - REGISTER_SPL_IMPLEMENTS(SplDoublyLinkedList, Serializable); - - spl_ce_SplDoublyLinkedList->get_iterator = spl_dllist_get_iterator; - - REGISTER_SPL_SUB_CLASS_EX(SplQueue, SplDoublyLinkedList, spl_dllist_object_new, class_SplQueue_methods); - REGISTER_SPL_SUB_CLASS_EX(SplStack, SplDoublyLinkedList, spl_dllist_object_new, class_SplStack_methods); - + spl_ce_SplQueue = register_class_SplQueue(spl_ce_SplDoublyLinkedList); + spl_ce_SplQueue->create_object = spl_dllist_object_new; spl_ce_SplQueue->get_iterator = spl_dllist_get_iterator; + + spl_ce_SplStack = register_class_SplStack(spl_ce_SplDoublyLinkedList); + spl_ce_SplStack->create_object = spl_dllist_object_new; spl_ce_SplStack->get_iterator = spl_dllist_get_iterator; return SUCCESS; diff --git a/ext/spl/spl_dllist.stub.php b/ext/spl/spl_dllist.stub.php index 05f122204e..36b945afb7 100644 --- a/ext/spl/spl_dllist.stub.php +++ b/ext/spl/spl_dllist.stub.php @@ -1,6 +1,6 @@ create_object = spl_fixedarray_new; + spl_ce_SplFixedArray->get_iterator = spl_fixedarray_get_iterator; + spl_ce_SplFixedArray->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; + memcpy(&spl_handler_SplFixedArray, &std_object_handlers, sizeof(zend_object_handlers)); spl_handler_SplFixedArray.offset = XtOffsetOf(spl_fixedarray_object, std); @@ -853,12 +857,5 @@ PHP_MINIT_FUNCTION(spl_fixedarray) spl_handler_SplFixedArray.dtor_obj = zend_objects_destroy_object; spl_handler_SplFixedArray.free_obj = spl_fixedarray_object_free_storage; - REGISTER_SPL_IMPLEMENTS(SplFixedArray, Aggregate); - REGISTER_SPL_IMPLEMENTS(SplFixedArray, ArrayAccess); - REGISTER_SPL_IMPLEMENTS(SplFixedArray, Countable); - - spl_ce_SplFixedArray->get_iterator = spl_fixedarray_get_iterator; - spl_ce_SplFixedArray->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; - return SUCCESS; } diff --git a/ext/spl/spl_fixedarray.stub.php b/ext/spl/spl_fixedarray.stub.php index f2bb378f7a..32489d7199 100644 --- a/ext/spl/spl_fixedarray.stub.php +++ b/ext/spl/spl_fixedarray.stub.php @@ -1,6 +1,6 @@ create_object = obj_ctor; - } -} -/* }}} */ - -/* {{{ spl_register_sub_class */ -PHPAPI void spl_register_sub_class(zend_class_entry ** ppce, zend_class_entry * parent_ce, char * class_name, void *obj_ctor, const zend_function_entry * function_list) -{ - zend_class_entry ce; - - INIT_CLASS_ENTRY_EX(ce, class_name, strlen(class_name), function_list); - *ppce = zend_register_internal_class_ex(&ce, parent_ce); - - /* entries changed by initialize */ - if (obj_ctor) { - (*ppce)->create_object = obj_ctor; - } else { - (*ppce)->create_object = parent_ce->create_object; - } -} -/* }}} */ - -/* {{{ spl_register_property */ -void spl_register_property( zend_class_entry * class_entry, char *prop_name, int prop_name_len, int prop_flags) -{ - zend_declare_property_null(class_entry, prop_name, prop_name_len, prop_flags); -} -/* }}} */ - /* {{{ spl_add_class_name */ void spl_add_class_name(zval *list, zend_class_entry *pce, int allow, int ce_flags) { diff --git a/ext/spl/spl_functions.h b/ext/spl/spl_functions.h index b1f0653607..576117c4c8 100644 --- a/ext/spl/spl_functions.h +++ b/ext/spl/spl_functions.h @@ -21,36 +21,9 @@ typedef zend_object* (*create_object_func_t)(zend_class_entry *class_type); -#define REGISTER_SPL_STD_CLASS(class_name, obj_ctor) \ - spl_register_std_class(&spl_ce_ ## class_name, # class_name, obj_ctor, NULL); - -#define REGISTER_SPL_STD_CLASS_EX(class_name, obj_ctor, funcs) \ - spl_register_std_class(&spl_ce_ ## class_name, # class_name, obj_ctor, funcs); - -#define REGISTER_SPL_SUB_CLASS_EX(class_name, parent_class_name, obj_ctor, funcs) \ - spl_register_sub_class(&spl_ce_ ## class_name, spl_ce_ ## parent_class_name, # class_name, obj_ctor, funcs); - -#define REGISTER_SPL_INTERFACE(class_name) \ - spl_register_interface(&spl_ce_ ## class_name, # class_name, class_ ## class_name ## _methods); - -#define REGISTER_SPL_IMPLEMENTS(class_name, interface_name) \ - zend_class_implements(spl_ce_ ## class_name, 1, spl_ce_ ## interface_name); - -#define REGISTER_SPL_ITERATOR(class_name) \ - zend_class_implements(spl_ce_ ## class_name, 1, zend_ce_iterator); - -#define REGISTER_SPL_PROPERTY(class_name, prop_name, prop_flags) \ - spl_register_property(spl_ce_ ## class_name, prop_name, sizeof(prop_name)-1, prop_flags); - #define REGISTER_SPL_CLASS_CONST_LONG(class_name, const_name, value) \ zend_declare_class_constant_long(spl_ce_ ## class_name, const_name, sizeof(const_name)-1, (zend_long)value); -void spl_register_std_class(zend_class_entry ** ppce, char * class_name, create_object_func_t ctor, const zend_function_entry * function_list); -void spl_register_sub_class(zend_class_entry ** ppce, zend_class_entry * parent_ce, char * class_name, create_object_func_t ctor, const zend_function_entry * function_list); -void spl_register_interface(zend_class_entry ** ppce, char * class_name, const zend_function_entry *functions); - -void spl_register_property( zend_class_entry * class_entry, char *prop_name, int prop_name_len, int prop_flags); - /* sub: whether to allow subclasses/interfaces allow = 0: allow all classes and interfaces allow > 0: allow all that match and mask ce_flags diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index ba1b0fd681..61a24f8b3b 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -1113,7 +1113,10 @@ zend_object_iterator *spl_pqueue_get_iterator(zend_class_entry *ce, zval *object PHP_MINIT_FUNCTION(spl_heap) /* {{{ */ { - REGISTER_SPL_STD_CLASS_EX(SplHeap, spl_heap_object_new, class_SplHeap_methods); + spl_ce_SplHeap = register_class_SplHeap(zend_ce_iterator, zend_ce_countable); + spl_ce_SplHeap->create_object = spl_heap_object_new; + spl_ce_SplHeap->get_iterator = spl_heap_get_iterator; + memcpy(&spl_handler_SplHeap, &std_object_handlers, sizeof(zend_object_handlers)); spl_handler_SplHeap.offset = XtOffsetOf(spl_heap_object, std); @@ -1123,18 +1126,18 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */ spl_handler_SplHeap.dtor_obj = zend_objects_destroy_object; spl_handler_SplHeap.free_obj = spl_heap_object_free_storage; - REGISTER_SPL_IMPLEMENTS(SplHeap, Iterator); - REGISTER_SPL_IMPLEMENTS(SplHeap, Countable); - - spl_ce_SplHeap->get_iterator = spl_heap_get_iterator; - - REGISTER_SPL_SUB_CLASS_EX(SplMinHeap, SplHeap, spl_heap_object_new, class_SplMinHeap_methods); - REGISTER_SPL_SUB_CLASS_EX(SplMaxHeap, SplHeap, spl_heap_object_new, class_SplMaxHeap_methods); + spl_ce_SplMinHeap = register_class_SplMinHeap(spl_ce_SplHeap); + spl_ce_SplMinHeap->create_object = spl_heap_object_new; + spl_ce_SplMinHeap->get_iterator = spl_heap_get_iterator; + spl_ce_SplMaxHeap = register_class_SplMaxHeap(spl_ce_SplHeap); + spl_ce_SplMaxHeap->create_object = spl_heap_object_new; spl_ce_SplMaxHeap->get_iterator = spl_heap_get_iterator; - spl_ce_SplMinHeap->get_iterator = spl_heap_get_iterator; - REGISTER_SPL_STD_CLASS_EX(SplPriorityQueue, spl_heap_object_new, class_SplPriorityQueue_methods); + spl_ce_SplPriorityQueue = register_class_SplPriorityQueue(zend_ce_iterator, zend_ce_countable); + spl_ce_SplPriorityQueue->create_object = spl_heap_object_new; + spl_ce_SplPriorityQueue->get_iterator = spl_pqueue_get_iterator; + memcpy(&spl_handler_SplPriorityQueue, &std_object_handlers, sizeof(zend_object_handlers)); spl_handler_SplPriorityQueue.offset = XtOffsetOf(spl_heap_object, std); @@ -1144,11 +1147,6 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */ spl_handler_SplPriorityQueue.dtor_obj = zend_objects_destroy_object; spl_handler_SplPriorityQueue.free_obj = spl_heap_object_free_storage; - REGISTER_SPL_IMPLEMENTS(SplPriorityQueue, Iterator); - REGISTER_SPL_IMPLEMENTS(SplPriorityQueue, Countable); - - spl_ce_SplPriorityQueue->get_iterator = spl_pqueue_get_iterator; - REGISTER_SPL_CLASS_CONST_LONG(SplPriorityQueue, "EXTR_BOTH", SPL_PQUEUE_EXTR_BOTH); REGISTER_SPL_CLASS_CONST_LONG(SplPriorityQueue, "EXTR_PRIORITY", SPL_PQUEUE_EXTR_PRIORITY); REGISTER_SPL_CLASS_CONST_LONG(SplPriorityQueue, "EXTR_DATA", SPL_PQUEUE_EXTR_DATA); diff --git a/ext/spl/spl_heap.stub.php b/ext/spl/spl_heap.stub.php index 8c01068eae..2f31ded011 100644 --- a/ext/spl/spl_heap.stub.php +++ b/ext/spl/spl_heap.stub.php @@ -1,6 +1,6 @@ ce_flags |= ZEND_ACC_ABSTRACT; + zend_class_implements(class_entry, 2, class_entry_Iterator, class_entry_Countable); + + return class_entry; +} + +static zend_class_entry *register_class_SplMinHeap(zend_class_entry *class_entry_SplHeap) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "SplMinHeap", class_SplMinHeap_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_SplHeap); + + return class_entry; +} + +static zend_class_entry *register_class_SplMaxHeap(zend_class_entry *class_entry_SplHeap) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "SplMaxHeap", class_SplMaxHeap_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_SplHeap); + + return class_entry; +} diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index a4531f6056..71b8fb69d4 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -3217,11 +3217,13 @@ PHP_FUNCTION(iterator_apply) /* {{{ PHP_MINIT_FUNCTION(spl_iterators) */ PHP_MINIT_FUNCTION(spl_iterators) { - REGISTER_SPL_INTERFACE(RecursiveIterator); - REGISTER_SPL_ITERATOR(RecursiveIterator); + spl_ce_RecursiveIterator = register_class_RecursiveIterator(zend_ce_iterator); - REGISTER_SPL_STD_CLASS_EX(RecursiveIteratorIterator, spl_RecursiveIteratorIterator_new, class_RecursiveIteratorIterator_methods); - REGISTER_SPL_ITERATOR(RecursiveIteratorIterator); + spl_ce_OuterIterator = register_class_OuterIterator(zend_ce_iterator); + + spl_ce_RecursiveIteratorIterator = register_class_RecursiveIteratorIterator(spl_ce_OuterIterator); + spl_ce_RecursiveIteratorIterator->create_object = spl_RecursiveIteratorIterator_new; + spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator; memcpy(&spl_handlers_rec_it_it, &std_object_handlers, sizeof(zend_object_handlers)); spl_handlers_rec_it_it.offset = XtOffsetOf(spl_recursive_it_object, std); @@ -3238,43 +3240,36 @@ PHP_MINIT_FUNCTION(spl_iterators) spl_handlers_dual_it.free_obj = spl_dual_it_free_storage; spl_handlers_dual_it.get_gc = spl_dual_it_get_gc; - spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator; - REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "LEAVES_ONLY", RIT_LEAVES_ONLY); REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "SELF_FIRST", RIT_SELF_FIRST); REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "CHILD_FIRST", RIT_CHILD_FIRST); REGISTER_SPL_CLASS_CONST_LONG(RecursiveIteratorIterator, "CATCH_GET_CHILD", RIT_CATCH_GET_CHILD); - REGISTER_SPL_INTERFACE(OuterIterator); - REGISTER_SPL_ITERATOR(OuterIterator); - - REGISTER_SPL_STD_CLASS_EX(IteratorIterator, spl_dual_it_new, class_IteratorIterator_methods); - REGISTER_SPL_ITERATOR(IteratorIterator); - REGISTER_SPL_IMPLEMENTS(IteratorIterator, OuterIterator); + spl_ce_IteratorIterator = register_class_IteratorIterator(spl_ce_OuterIterator); + spl_ce_IteratorIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(FilterIterator, IteratorIterator, spl_dual_it_new, class_FilterIterator_methods); - spl_ce_FilterIterator->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; + spl_ce_FilterIterator = register_class_FilterIterator(spl_ce_IteratorIterator); + spl_ce_FilterIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(RecursiveFilterIterator, FilterIterator, spl_dual_it_new, class_RecursiveFilterIterator_methods); - REGISTER_SPL_IMPLEMENTS(RecursiveFilterIterator, RecursiveIterator); + spl_ce_RecursiveFilterIterator = register_class_RecursiveFilterIterator(spl_ce_FilterIterator, spl_ce_RecursiveIterator); + spl_ce_RecursiveFilterIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(CallbackFilterIterator, FilterIterator, spl_dual_it_new, class_CallbackFilterIterator_methods); + spl_ce_CallbackFilterIterator = register_class_CallbackFilterIterator(spl_ce_FilterIterator); + spl_ce_CallbackFilterIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(RecursiveCallbackFilterIterator, CallbackFilterIterator, spl_dual_it_new, class_RecursiveCallbackFilterIterator_methods); - REGISTER_SPL_IMPLEMENTS(RecursiveCallbackFilterIterator, RecursiveIterator); + spl_ce_RecursiveCallbackFilterIterator = register_class_RecursiveCallbackFilterIterator(spl_ce_CallbackFilterIterator, spl_ce_RecursiveIterator); + spl_ce_RecursiveCallbackFilterIterator->create_object = spl_dual_it_new; + spl_ce_ParentIterator = register_class_ParentIterator(spl_ce_RecursiveFilterIterator); + spl_ce_ParentIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(ParentIterator, RecursiveFilterIterator, spl_dual_it_new, class_ParentIterator_methods); + spl_ce_SeekableIterator = register_class_SeekableIterator(zend_ce_iterator); - REGISTER_SPL_INTERFACE(SeekableIterator); - REGISTER_SPL_ITERATOR(SeekableIterator); + spl_ce_LimitIterator = register_class_LimitIterator(spl_ce_IteratorIterator); + spl_ce_LimitIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(LimitIterator, IteratorIterator, spl_dual_it_new, class_LimitIterator_methods); - - REGISTER_SPL_SUB_CLASS_EX(CachingIterator, IteratorIterator, spl_dual_it_new, class_CachingIterator_methods); - REGISTER_SPL_IMPLEMENTS(CachingIterator, ArrayAccess); - REGISTER_SPL_IMPLEMENTS(CachingIterator, Countable); - REGISTER_SPL_IMPLEMENTS(CachingIterator, Stringable); + spl_ce_CachingIterator = register_class_CachingIterator(spl_ce_IteratorIterator, zend_ce_arrayaccess, zend_ce_countable, zend_ce_stringable); + spl_ce_CachingIterator->create_object = spl_dual_it_new; REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "CALL_TOSTRING", CIT_CALL_TOSTRING); REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "CATCH_GET_CHILD", CIT_CATCH_GET_CHILD); @@ -3283,17 +3278,21 @@ PHP_MINIT_FUNCTION(spl_iterators) REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "TOSTRING_USE_INNER", CIT_TOSTRING_USE_INNER); REGISTER_SPL_CLASS_CONST_LONG(CachingIterator, "FULL_CACHE", CIT_FULL_CACHE); - REGISTER_SPL_SUB_CLASS_EX(RecursiveCachingIterator, CachingIterator, spl_dual_it_new, class_RecursiveCachingIterator_methods); - REGISTER_SPL_IMPLEMENTS(RecursiveCachingIterator, RecursiveIterator); + spl_ce_RecursiveCachingIterator = register_class_RecursiveCachingIterator(spl_ce_CachingIterator, spl_ce_RecursiveIterator); + spl_ce_RecursiveCachingIterator->create_object = spl_dual_it_new; + + spl_ce_NoRewindIterator = register_class_NoRewindIterator(spl_ce_IteratorIterator); + spl_ce_NoRewindIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(NoRewindIterator, IteratorIterator, spl_dual_it_new, class_NoRewindIterator_methods); + spl_ce_AppendIterator = register_class_AppendIterator(spl_ce_IteratorIterator); + spl_ce_AppendIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(AppendIterator, IteratorIterator, spl_dual_it_new, class_AppendIterator_methods); + spl_ce_InfiniteIterator = register_class_InfiniteIterator(spl_ce_IteratorIterator); + spl_ce_InfiniteIterator->create_object = spl_dual_it_new; - REGISTER_SPL_IMPLEMENTS(RecursiveIteratorIterator, OuterIterator); + spl_ce_RegexIterator = register_class_RegexIterator(spl_ce_FilterIterator); + spl_ce_RegexIterator->create_object = spl_dual_it_new; - REGISTER_SPL_SUB_CLASS_EX(InfiniteIterator, IteratorIterator, spl_dual_it_new, class_InfiniteIterator_methods); - REGISTER_SPL_SUB_CLASS_EX(RegexIterator, FilterIterator, spl_dual_it_new, class_RegexIterator_methods); REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "USE_KEY", REGIT_USE_KEY); REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "INVERT_MATCH",REGIT_INVERTED); REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "MATCH", REGIT_MODE_MATCH); @@ -3301,14 +3300,15 @@ PHP_MINIT_FUNCTION(spl_iterators) REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "ALL_MATCHES", REGIT_MODE_ALL_MATCHES); REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "SPLIT", REGIT_MODE_SPLIT); REGISTER_SPL_CLASS_CONST_LONG(RegexIterator, "REPLACE", REGIT_MODE_REPLACE); - REGISTER_SPL_PROPERTY(RegexIterator, "replacement", 0); - REGISTER_SPL_SUB_CLASS_EX(RecursiveRegexIterator, RegexIterator, spl_dual_it_new, class_RecursiveRegexIterator_methods); - REGISTER_SPL_IMPLEMENTS(RecursiveRegexIterator, RecursiveIterator); - REGISTER_SPL_STD_CLASS_EX(EmptyIterator, NULL, class_EmptyIterator_methods); - REGISTER_SPL_ITERATOR(EmptyIterator); + spl_ce_RecursiveRegexIterator = register_class_RecursiveRegexIterator(spl_ce_RegexIterator, spl_ce_RecursiveIterator); + spl_ce_RecursiveRegexIterator->create_object = spl_dual_it_new; + + spl_ce_EmptyIterator = register_class_EmptyIterator(zend_ce_iterator); + + spl_ce_RecursiveTreeIterator = register_class_RecursiveTreeIterator(spl_ce_RecursiveIteratorIterator); + spl_ce_RecursiveTreeIterator->create_object = spl_RecursiveTreeIterator_new; - REGISTER_SPL_SUB_CLASS_EX(RecursiveTreeIterator, RecursiveIteratorIterator, spl_RecursiveTreeIterator_new, class_RecursiveTreeIterator_methods); REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "BYPASS_CURRENT", RTIT_BYPASS_CURRENT); REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "BYPASS_KEY", RTIT_BYPASS_KEY); REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "PREFIX_LEFT", 0); diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h index 8c611f946d..d733fb18a1 100644 --- a/ext/spl/spl_iterators.h +++ b/ext/spl/spl_iterators.h @@ -21,14 +21,6 @@ #include "php_spl.h" #include "ext/pcre/php_pcre.h" -#define spl_ce_Aggregate zend_ce_aggregate -#define spl_ce_ArrayAccess zend_ce_arrayaccess -#define spl_ce_Countable zend_ce_countable -#define spl_ce_Iterator zend_ce_iterator -#define spl_ce_Serializable zend_ce_serializable -#define spl_ce_Stringable zend_ce_stringable -#define spl_ce_Traversable zend_ce_traversable - extern PHPAPI zend_class_entry *spl_ce_AppendIterator; extern PHPAPI zend_class_entry *spl_ce_CachingIterator; extern PHPAPI zend_class_entry *spl_ce_CallbackFilterIterator; diff --git a/ext/spl/spl_iterators.stub.php b/ext/spl/spl_iterators.stub.php index 6a60b2acaf..2038fd6499 100644 --- a/ext/spl/spl_iterators.stub.php +++ b/ext/spl/spl_iterators.stub.php @@ -1,6 +1,6 @@ ce_flags |= ZEND_ACC_ABSTRACT; + + return class_entry; +} + +static zend_class_entry *register_class_RecursiveFilterIterator(zend_class_entry *class_entry_FilterIterator, zend_class_entry *class_entry_RecursiveIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "RecursiveFilterIterator", class_RecursiveFilterIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_FilterIterator); + class_entry->ce_flags |= ZEND_ACC_ABSTRACT; + zend_class_implements(class_entry, 1, class_entry_RecursiveIterator); + + return class_entry; +} + +static zend_class_entry *register_class_ParentIterator(zend_class_entry *class_entry_RecursiveFilterIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ParentIterator", class_ParentIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_RecursiveFilterIterator); + + return class_entry; +} + +static zend_class_entry *register_class_SeekableIterator(zend_class_entry *class_entry_Iterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "SeekableIterator", class_SeekableIterator_methods); + class_entry = zend_register_internal_interface(&ce); + zend_class_implements(class_entry, 1, class_entry_Iterator); + + return class_entry; +} + +static zend_class_entry *register_class_LimitIterator(zend_class_entry *class_entry_IteratorIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "LimitIterator", class_LimitIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator); + + return class_entry; +} + +static zend_class_entry *register_class_CachingIterator(zend_class_entry *class_entry_IteratorIterator, zend_class_entry *class_entry_ArrayAccess, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_Stringable) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "CachingIterator", class_CachingIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator); + zend_class_implements(class_entry, 3, class_entry_ArrayAccess, class_entry_Countable, class_entry_Stringable); + + return class_entry; +} + +static zend_class_entry *register_class_RecursiveCachingIterator(zend_class_entry *class_entry_CachingIterator, zend_class_entry *class_entry_RecursiveIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "RecursiveCachingIterator", class_RecursiveCachingIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_CachingIterator); + zend_class_implements(class_entry, 1, class_entry_RecursiveIterator); + + return class_entry; +} + +static zend_class_entry *register_class_NoRewindIterator(zend_class_entry *class_entry_IteratorIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "NoRewindIterator", class_NoRewindIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator); + + return class_entry; +} + +static zend_class_entry *register_class_AppendIterator(zend_class_entry *class_entry_IteratorIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "AppendIterator", class_AppendIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator); + + return class_entry; +} + +static zend_class_entry *register_class_InfiniteIterator(zend_class_entry *class_entry_IteratorIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "InfiniteIterator", class_InfiniteIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_IteratorIterator); + + return class_entry; +} + +static zend_class_entry *register_class_RegexIterator(zend_class_entry *class_entry_FilterIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "RegexIterator", class_RegexIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_FilterIterator); + + zval property_replacement_default_value; + ZVAL_NULL(&property_replacement_default_value); + zend_string *property_replacement_name = zend_string_init("replacement", sizeof("replacement") - 1, 1); + zend_declare_property_ex(class_entry, property_replacement_name, &property_replacement_default_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(property_replacement_name); + + return class_entry; +} + +static zend_class_entry *register_class_RecursiveRegexIterator(zend_class_entry *class_entry_RegexIterator, zend_class_entry *class_entry_RecursiveIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "RecursiveRegexIterator", class_RecursiveRegexIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_RegexIterator); + zend_class_implements(class_entry, 1, class_entry_RecursiveIterator); + + return class_entry; +} + +static zend_class_entry *register_class_RecursiveTreeIterator(zend_class_entry *class_entry_RecursiveIteratorIterator) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "RecursiveTreeIterator", class_RecursiveTreeIterator_methods); + class_entry = zend_register_internal_class_ex(&ce, class_entry_RecursiveIteratorIterator); + + return class_entry; +} diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 3fd50ceb89..999c54d1f4 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -1190,10 +1190,12 @@ PHP_METHOD(MultipleIterator, key) /* {{{ PHP_MINIT_FUNCTION(spl_observer) */ PHP_MINIT_FUNCTION(spl_observer) { - REGISTER_SPL_INTERFACE(SplObserver); - REGISTER_SPL_INTERFACE(SplSubject); + spl_ce_SplObserver = register_class_SplObserver(); + spl_ce_SplSubject = register_class_SplSubject(); + + spl_ce_SplObjectStorage = register_class_SplObjectStorage(zend_ce_countable, zend_ce_iterator, zend_ce_serializable, zend_ce_arrayaccess); + spl_ce_SplObjectStorage->create_object = spl_SplObjectStorage_new; - REGISTER_SPL_STD_CLASS_EX(SplObjectStorage, spl_SplObjectStorage_new, class_SplObjectStorage_methods); memcpy(&spl_handler_SplObjectStorage, &std_object_handlers, sizeof(zend_object_handlers)); spl_handler_SplObjectStorage.offset = XtOffsetOf(spl_SplObjectStorage, std); @@ -1203,13 +1205,8 @@ PHP_MINIT_FUNCTION(spl_observer) spl_handler_SplObjectStorage.dtor_obj = zend_objects_destroy_object; spl_handler_SplObjectStorage.free_obj = spl_SplObjectStorage_free_storage; - REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Countable); - REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Iterator); - REGISTER_SPL_IMPLEMENTS(SplObjectStorage, Serializable); - REGISTER_SPL_IMPLEMENTS(SplObjectStorage, ArrayAccess); - - REGISTER_SPL_STD_CLASS_EX(MultipleIterator, spl_SplObjectStorage_new, class_MultipleIterator_methods); - REGISTER_SPL_ITERATOR(MultipleIterator); + spl_ce_MultipleIterator = register_class_MultipleIterator(zend_ce_iterator); + spl_ce_MultipleIterator->create_object = spl_SplObjectStorage_new; REGISTER_SPL_CLASS_CONST_LONG(MultipleIterator, "MIT_NEED_ANY", MIT_NEED_ANY); REGISTER_SPL_CLASS_CONST_LONG(MultipleIterator, "MIT_NEED_ALL", MIT_NEED_ALL); diff --git a/ext/spl/spl_observer.stub.php b/ext/spl/spl_observer.stub.php index b7b423e984..4baab933ef 100644 --- a/ext/spl/spl_observer.stub.php +++ b/ext/spl/spl_observer.stub.php @@ -1,6 +1,6 @@