diff options
author | Marcus Boerger <helly@php.net> | 2003-11-09 14:05:36 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2003-11-09 14:05:36 +0000 |
commit | 159c538bcf7cc649410a7e91b11584dcebcf1b55 (patch) | |
tree | 2e5d3063aaf3733744fa81a1614fd526f9881be1 /ext/spl/spl_engine.c | |
parent | 44dc9eb3e4ae8be3d3d187b8e6335d768447fed5 (diff) | |
download | php-git-159c538bcf7cc649410a7e91b11584dcebcf1b55.tar.gz |
Major update:
- Remove all overloading hooks -> array_read/array_access must be rewritten
- Remove all basic iterators
- Remove all 'spl_' prefixing exposed to user level
- Add RecursiveIterator, RecursiveIteratorIterator
- Add DirectoryIterator, DirectoryTreeIterator
- Add some examples
Diffstat (limited to 'ext/spl/spl_engine.c')
-rwxr-xr-x | ext/spl/spl_engine.c | 200 |
1 files changed, 26 insertions, 174 deletions
diff --git a/ext/spl/spl_engine.c b/ext/spl/spl_engine.c index 349a599784..ec43c6fdd9 100755 --- a/ext/spl/spl_engine.c +++ b/ext/spl/spl_engine.c @@ -23,115 +23,53 @@ #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" -#include "zend_compile.h" +#include "zend_interfaces.h" #include "php_spl.h" #include "spl_functions.h" #include "spl_engine.h" -/* {{{ spl_instanciate */ -void spl_instanciate(zend_class_entry *pce, zval **object TSRMLS_DC) +#include "spl_array.h" + +/* {{{ spl_instantiate */ +void spl_instantiate(zend_class_entry *pce, zval **object, int alloc TSRMLS_DC) { - ALLOC_ZVAL(*object); + if (alloc) { + ALLOC_ZVAL(*object); + } object_init_ex(*object, pce); (*object)->refcount = 1; (*object)->is_ref = 1; /* check if this can be hold always */ } /* }}} */ -/* {{{ spl_instanciate_arg_ex2 */ -int spl_instanciate_arg_ex2(zend_class_entry *pce, zval **retval, zval *arg1, zval *arg2 TSRMLS_DC) +/* {{{ spl_instantiate_arg_ex1 */ +int spl_instantiate_arg_ex1(zend_class_entry *pce, zval **retval, int alloc, zval *arg1 TSRMLS_DC) { - zval *object; - - spl_instanciate(pce, &object TSRMLS_CC); + zval *tmp; - retval = &EG(uninitialized_zval_ptr); + spl_instantiate(pce, retval, alloc TSRMLS_CC); - spl_call_method(&object, pce, &pce->constructor, pce->constructor->common.function_name, strlen(pce->constructor->common.function_name), retval, 2, arg1, arg2 TSRMLS_CC); - *retval = object; - return 0; -} -/* }}} */ - -/* {{{ spl_get_zval_ptr_ptr - Remember to call spl_unlock_ptr_ptr when needed */ -zval ** spl_get_zval_ptr_ptr(znode *node, temp_variable *Ts TSRMLS_DC) -{ - if (node->op_type==IS_VAR) { - return T(node->u.var).var.ptr_ptr; - } else { - return NULL; - } -} -/* }}} */ - -/* {{{ spl_unlock_zval_ptr_ptr */ -void spl_unlock_zval_ptr_ptr(znode *node, temp_variable *Ts TSRMLS_DC) -{ - if (node->op_type==IS_VAR) { - if (T(node->u.var).var.ptr_ptr) { - spl_pzval_unlock_func(*T(node->u.var).var.ptr_ptr TSRMLS_CC); - } else if (T(node->u.var).EA.type==IS_STRING_OFFSET) { - spl_pzval_unlock_func(T(node->u.var).EA.data.str_offset.str TSRMLS_CC); - } + zend_call_method(retval, pce, &pce->constructor, pce->constructor->common.function_name, strlen(pce->constructor->common.function_name), &tmp, 1, arg1, NULL TSRMLS_CC); + if (tmp) { + zval_ptr_dtor(&tmp); } + return 0; } /* }}} */ -/* {{{ spl_get_zval_ptr */ -zval * spl_get_zval_ptr(znode *node, temp_variable *Ts, zval **should_free TSRMLS_DC) +/* {{{ spl_instantiate_arg_ex2 */ +int spl_instantiate_arg_ex2(zend_class_entry *pce, zval **retval, int alloc, zval *arg1, zval *arg2 TSRMLS_DC) { - switch (node->op_type) { - case IS_CONST: - *should_free = 0; - return &node->u.constant; - break; - case IS_TMP_VAR: - return *should_free = &T(node->u.var).tmp_var; - break; - case IS_VAR: - if (T(node->u.var).var.ptr) { - spl_pzval_unlock_func(T(node->u.var).var.ptr TSRMLS_CC); - *should_free = 0; - return T(node->u.var).var.ptr; - } else { - *should_free = &T(node->u.var).tmp_var; - - switch (T(node->u.var).EA.type) { - case IS_STRING_OFFSET: { - temp_variable *T = &T(node->u.var); - zval *str = T->EA.data.str_offset.str; - - if (T->EA.data.str_offset.str->type != IS_STRING - || (T->EA.data.str_offset.offset<0) - || (T->EA.data.str_offset.str->value.str.len <= T->EA.data.str_offset.offset)) { - zend_error(E_NOTICE, "Uninitialized string offset: %d", T->EA.data.str_offset.offset); - T->tmp_var.value.str.val = empty_string; - T->tmp_var.value.str.len = 0; - } else { - char c = str->value.str.val[T->EA.data.str_offset.offset]; - - T->tmp_var.value.str.val = estrndup(&c, 1); - T->tmp_var.value.str.len = 1; - } - spl_pzval_unlock_func(str TSRMLS_CC); - T->tmp_var.refcount=1; - T->tmp_var.is_ref=1; - T->tmp_var.type = IS_STRING; - return &T->tmp_var; - } - break; - } - } - break; - case IS_UNUSED: - *should_free = 0; - return NULL; - break; - EMPTY_SWITCH_DEFAULT_CASE() + zval *tmp; + + spl_instantiate(pce, retval, alloc TSRMLS_CC); + + zend_call_method(retval, pce, &pce->constructor, pce->constructor->common.function_name, strlen(pce->constructor->common.function_name), &tmp, 2, arg1, arg2 TSRMLS_CC); + if (tmp) { + zval_ptr_dtor(&tmp); } - return NULL; + return 0; } /* }}} */ @@ -149,92 +87,6 @@ int spl_is_instance_of(zval **obj, zend_class_entry *ce TSRMLS_DC) } /* }}} */ -/* {{{ spl_implements */ -spl_is_a spl_implements(zend_class_entry *ce) -{ - register spl_is_a is_a = 0; - register int i = ce->num_interfaces; - register zend_class_entry **pce = ce->interfaces; - - while (i--) { - if (*pce == spl_ce_iterator) is_a |= SPL_IS_A_ITERATOR; - else if (*pce == spl_ce_forward) is_a |= SPL_IS_A_FORWARD; - else if (*pce == spl_ce_assoc) is_a |= SPL_IS_A_ASSOC; - else if (*pce == spl_ce_sequence) is_a |= SPL_IS_A_SEQUENCE; - else if (*pce == spl_ce_array_read) is_a |= SPL_IS_A_ARRAY_READ; - else if (*pce == spl_ce_array_access) is_a |= SPL_IS_A_ARRAY_ACCESS; - pce++; - } - return is_a; -} -/* }}} */ - -/* {{{ spl_call_method */ -zval * spl_call_method(zval **object_pp, zend_class_entry *obj_ce, zend_function **fn_proxy, char *function_name, int function_name_len, zval **retval_ptr, int param_count, zval* arg1, zval* arg2 TSRMLS_DC) -{ - int result; - zend_fcall_info fci; - zval z_fname; - zval *retval; - - zval **params[2]; - - params[0] = &arg1; - params[1] = &arg2; - - fci.size = sizeof(fci); - /*fci.function_table = NULL; will be read form zend_class_entry of object if needed */ - fci.object_pp = object_pp; - fci.function_name = &z_fname; - fci.retval_ptr_ptr = retval_ptr ? retval_ptr : &retval; - fci.param_count = param_count; - fci.params = params; - fci.no_separation = 1; - fci.symbol_table = NULL; - - if (!fn_proxy && !obj_ce) { - /* no interest in caching and no information already present that is - * needed later inside zend_call_function. */ - ZVAL_STRINGL(&z_fname, function_name, function_name_len, 0); - result = zend_call_function(&fci, NULL TSRMLS_CC); - } else { - zend_fcall_info_cache fcic; - - fcic.initialized = 1; - if (!obj_ce) { - obj_ce = Z_OBJCE_PP(object_pp); - } - if (!fn_proxy || !*fn_proxy) { - if (zend_hash_find(&obj_ce->function_table, function_name, function_name_len+1, (void **) &fcic.function_handler) == FAILURE) { - /* error at c-level */ - zend_error(E_CORE_ERROR, "Couldn't find implementation for method %s::%s\n", obj_ce->name, function_name); - } - if (fn_proxy) { - *fn_proxy = fcic.function_handler; - } - } else { - fcic.function_handler = *fn_proxy; - } - fcic.calling_scope = obj_ce; - fcic.object_pp = object_pp; - result = zend_call_function(&fci, &fcic TSRMLS_CC); - } - if (result == FAILURE) { - /* error at c-level */ - if (!obj_ce) { - obj_ce = Z_OBJCE_PP(object_pp); - } - zend_error(E_CORE_ERROR, "Couldn't execute method %s::%s\n", obj_ce->name, function_name); - } - if (!retval_ptr && retval) { - zval_dtor(retval); - FREE_ZVAL(retval); - return NULL; - } - return *retval_ptr; -} -/* }}} */ - /* * Local variables: * tab-width: 4 |