1 : /*
2 : +----------------------------------------------------------------------+
3 : | Zend Engine |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 2.00 of the Zend license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.zend.com/license/2_00.txt. |
11 : | If you did not receive a copy of the Zend license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@zend.com so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Author: Wez Furlong <wez@thebrainroom.com> |
16 : | Marcus Boerger <helly@php.net> |
17 : +----------------------------------------------------------------------+
18 : */
19 :
20 : /* $Id: zend_iterators.c 272367 2008-12-31 11:12:40Z sebastian $ */
21 :
22 : #include "zend.h"
23 : #include "zend_API.h"
24 :
25 : static zend_class_entry zend_iterator_class_entry;
26 :
27 : static zend_object_handlers iterator_object_handlers = {
28 : ZEND_OBJECTS_STORE_HANDLERS,
29 : NULL, /* prop read */
30 : NULL, /* prop write */
31 : NULL, /* read dim */
32 : NULL, /* write dim */
33 : NULL,
34 : NULL, /* get */
35 : NULL, /* set */
36 : NULL, /* has prop */
37 : NULL, /* unset prop */
38 : NULL, /* has dim */
39 : NULL, /* unset dim */
40 : NULL, /* props get */
41 : NULL, /* method get */
42 : NULL, /* call */
43 : NULL, /* get ctor */
44 : NULL, /* get_ce */
45 : NULL, /* get class name */
46 : NULL, /* compare */
47 : NULL, /* cast */
48 : NULL /* count */
49 : };
50 :
51 : ZEND_API void zend_register_iterator_wrapper(TSRMLS_D) /* {{{ */
52 34014 : {
53 34014 : INIT_CLASS_ENTRY(zend_iterator_class_entry, "__iterator_wrapper", NULL);
54 34014 : free(zend_iterator_class_entry.name.s);
55 34014 : zend_iterator_class_entry.name.s = "__iterator_wrapper";
56 34014 : }
57 : /* }}} */
58 :
59 : static void iter_wrapper_dtor(void *object, zend_object_handle handle TSRMLS_DC) /* {{{ */
60 1192 : {
61 1192 : zend_object_iterator *iter = (zend_object_iterator*)object;
62 1192 : iter->funcs->dtor(iter TSRMLS_CC);
63 1192 : }
64 : /* }}} */
65 :
66 : ZEND_API zval *zend_iterator_wrap(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
67 1194 : {
68 : zval *wrapped;
69 :
70 1194 : MAKE_STD_ZVAL(wrapped);
71 1194 : Z_TYPE_P(wrapped) = IS_OBJECT;
72 1194 : Z_OBJ_HANDLE_P(wrapped) = zend_objects_store_put(iter, iter_wrapper_dtor, NULL, NULL TSRMLS_CC);
73 1194 : Z_OBJ_HT_P(wrapped) = &iterator_object_handlers;
74 :
75 1194 : return wrapped;
76 : }
77 : /* }}} */
78 :
79 : ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(zval *array_ptr, zend_object_iterator **iter TSRMLS_DC) /* {{{ */
80 3685198 : {
81 3685198 : switch (Z_TYPE_P(array_ptr)) {
82 : case IS_OBJECT:
83 8434 : if (Z_OBJ_HT_P(array_ptr) == &iterator_object_handlers) {
84 7776 : *iter = (zend_object_iterator *)zend_object_store_get_object(array_ptr TSRMLS_CC);
85 7776 : return ZEND_ITER_OBJECT;
86 : }
87 658 : if (HASH_OF(array_ptr)) {
88 658 : return ZEND_ITER_PLAIN_OBJECT;
89 : }
90 0 : return ZEND_ITER_INVALID;
91 :
92 : case IS_ARRAY:
93 3676760 : if (HASH_OF(array_ptr)) {
94 3676760 : return ZEND_ITER_PLAIN_ARRAY;
95 : }
96 0 : return ZEND_ITER_INVALID;
97 :
98 : default:
99 4 : return ZEND_ITER_INVALID;
100 : }
101 : }
102 : /* }}} */
103 :
104 : /*
105 : * Local variables:
106 : * tab-width: 4
107 : * c-basic-offset: 4
108 : * indent-tabs-mode: t
109 : * End:
110 : */
|