forked from php/php-src
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
# After 4 Month work and endless discussions...
- Loading branch information
Showing
9 changed files
with
278 additions
and
15 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
/* | ||
+----------------------------------------------------------------------+ | ||
| Zend Engine | | ||
+----------------------------------------------------------------------+ | ||
| Copyright (c) 1998-2003 Zend Technologies Ltd. (http://www.zend.com) | | ||
+----------------------------------------------------------------------+ | ||
| This source file is subject to version 2.00 of the Zend license, | | ||
| that is bundled with this package in the file LICENSE, and is | | ||
| available through the world-wide-web at the following url: | | ||
| http://www.zend.com/license/2_00.txt. | | ||
| If you did not receive a copy of the Zend license and are unable to | | ||
| obtain it through the world-wide-web, please send a note to | | ||
| [email protected] so we can mail you a copy immediately. | | ||
+----------------------------------------------------------------------+ | ||
| Author: Wez Furlong <[email protected]> | | ||
| Marcus Boerger <[email protected]> | | ||
+----------------------------------------------------------------------+ | ||
*/ | ||
|
||
/* $Id$ */ | ||
|
||
#include "zend.h" | ||
#include "zend_API.h" | ||
|
||
static zend_class_entry zend_iterator_class_entry; | ||
|
||
static zend_class_entry *iter_handler_get_ce(zval *object TSRMLS_DC) | ||
{ | ||
return &zend_iterator_class_entry; | ||
} | ||
|
||
static zend_object_handlers iterator_object_handlers = { | ||
ZEND_OBJECTS_STORE_HANDLERS, | ||
NULL, /* prop read */ | ||
NULL, /* prop write */ | ||
NULL, /* read dim */ | ||
NULL, /* write dim */ | ||
NULL, | ||
NULL, /* get */ | ||
NULL, /* set */ | ||
NULL, /* isset */ | ||
NULL, /* unset */ | ||
NULL, /* dim unset */ | ||
NULL, /* props get */ | ||
NULL, /* method get */ | ||
NULL, /* call */ | ||
NULL, /* get ctor */ | ||
iter_handler_get_ce, | ||
NULL, /* get class name */ | ||
NULL, /* compare */ | ||
NULL /* cast */ | ||
}; | ||
|
||
ZEND_API void zend_register_iterator_wrapper(TSRMLS_D) | ||
{ | ||
INIT_CLASS_ENTRY(zend_iterator_class_entry, "__iterator_wrapper", NULL); | ||
} | ||
|
||
static void iter_wrapper_dtor(void *object, zend_object_handle handle TSRMLS_DC) | ||
{ | ||
zend_object_iterator *iter = (zend_object_iterator*)object; | ||
iter->funcs->dtor(iter TSRMLS_CC); | ||
} | ||
|
||
ZEND_API zval *zend_iterator_wrap(zend_object_iterator *iter TSRMLS_DC) | ||
{ | ||
zval *wrapped; | ||
|
||
MAKE_STD_ZVAL(wrapped); | ||
Z_TYPE_P(wrapped) = IS_OBJECT; | ||
wrapped->value.obj.handle = zend_objects_store_put(iter, iter_wrapper_dtor, NULL TSRMLS_CC); | ||
wrapped->value.obj.handlers = &iterator_object_handlers; | ||
|
||
return wrapped; | ||
} | ||
|
||
ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap( | ||
zval *array_ptr, zend_object_iterator **iter TSRMLS_DC) | ||
{ | ||
zend_class_entry *ce; | ||
|
||
switch (Z_TYPE_P(array_ptr)) { | ||
case IS_OBJECT: | ||
ce = Z_OBJCE_P(array_ptr); | ||
if (ce == &zend_iterator_class_entry) { | ||
*iter = (zend_object_iterator *)zend_object_store_get_object(array_ptr TSRMLS_CC); | ||
return ZEND_ITER_OBJECT; | ||
} | ||
return ZEND_ITER_INVALID; | ||
|
||
case IS_ARRAY: | ||
*iter = NULL; | ||
return HASH_OF(array_ptr) ? ZEND_ITER_PLAIN_ARRAY : ZEND_ITER_INVALID; | ||
|
||
default: | ||
*iter = NULL; | ||
return ZEND_ITER_INVALID; | ||
} | ||
} | ||
|
||
/* | ||
* Local variables: | ||
* tab-width: 4 | ||
* c-basic-offset: 4 | ||
* indent-tabs-mode: t | ||
* End: | ||
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
+----------------------------------------------------------------------+ | ||
| Zend Engine | | ||
+----------------------------------------------------------------------+ | ||
| Copyright (c) 1998-2003 Zend Technologies Ltd. (http://www.zend.com) | | ||
+----------------------------------------------------------------------+ | ||
| This source file is subject to version 2.00 of the Zend license, | | ||
| that is bundled with this package in the file LICENSE, and is | | ||
| available through the world-wide-web at the following url: | | ||
| http://www.zend.com/license/2_00.txt. | | ||
| If you did not receive a copy of the Zend license and are unable to | | ||
| obtain it through the world-wide-web, please send a note to | | ||
| [email protected] so we can mail you a copy immediately. | | ||
+----------------------------------------------------------------------+ | ||
| Author: Wez Furlong <[email protected]> | | ||
| Marcus Boerger <[email protected]> | | ||
+----------------------------------------------------------------------+ | ||
*/ | ||
|
||
/* $Id$ */ | ||
|
||
/* These iterators were designed to operate within the foreach() | ||
* structures provided by the engine, but could be extended for use | ||
* with other iterative engine opcodes. | ||
* These methods have similar semantics to the zend_hash API functions | ||
* with similar names. | ||
* */ | ||
|
||
typedef struct _zend_object_iterator zend_object_iterator; | ||
|
||
typedef struct _zend_object_iterator_funcs { | ||
/* release all resources associated with this iterator instance */ | ||
void (*dtor)(zend_object_iterator *iter TSRMLS_DC); | ||
|
||
/* rewind to start of data (optional, may be NULL) */ | ||
void (*rewind)(zend_object_iterator *iter TSRMLS_DC); | ||
|
||
/* check for end of iteration (FAILURE or SUCCESS for more data) */ | ||
int (*has_more)(zend_object_iterator *iter TSRMLS_DC); | ||
|
||
/* fetch the item data for the current element */ | ||
void (*get_current_data)(zend_object_iterator *iter, zval ***data TSRMLS_DC); | ||
|
||
/* fetch the key for the current element (return HASH_KEY_IS_STRING or HASH_KEY_IS_LONG) */ | ||
int (*get_current_key)(zend_object_iterator *iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC); | ||
|
||
/* step forwards to next element */ | ||
void (*move_forward)(zend_object_iterator *iter TSRMLS_DC); | ||
} zend_object_iterator_funcs; | ||
|
||
struct _zend_object_iterator { | ||
void *data; | ||
zend_object_iterator_funcs *funcs; | ||
}; | ||
|
||
typedef zval *(*zend_object_new_iterator_t)(zend_class_entry *ce, zval *object TSRMLS_DC); | ||
|
||
typedef struct _zend_class_iterator_funcs { | ||
zend_object_iterator_funcs funcs; | ||
zend_object_new_iterator_t new_iterator; | ||
union _zend_function *zf_new_iterator; | ||
union _zend_function *zf_has_more; | ||
union _zend_function *zf_current; | ||
union _zend_function *zf_key; | ||
union _zend_function *zf_next; | ||
union _zend_function *zf_rewind; | ||
} zend_class_iterator_funcs; | ||
|
||
enum zend_object_iterator_kind { | ||
ZEND_ITER_INVALID, | ||
ZEND_ITER_PLAIN_ARRAY, | ||
ZEND_ITER_OBJECT | ||
}; | ||
|
||
/* given a zval, returns stuff that can be used to iterate it. */ | ||
ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(zval *array_ptr, zend_object_iterator **iter TSRMLS_DC); | ||
|
||
/* given an iterator, wrap it up as a zval for use by the engine opcodes */ | ||
ZEND_API zval *zend_iterator_wrap(zend_object_iterator *iter TSRMLS_DC); | ||
|
||
ZEND_API void zend_register_iterator_wrapper(TSRMLS_D); | ||
|
||
/* | ||
* Local variables: | ||
* tab-width: 4 | ||
* c-basic-offset: 4 | ||
* indent-tabs-mode: t | ||
* End: | ||
*/ |
Oops, something went wrong.