summaryrefslogtreecommitdiff
path: root/ext/spl
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-02-17 17:59:18 +0400
committerDmitry Stogov <dmitry@zend.com>2014-02-17 17:59:18 +0400
commit2b9b9afa7a9a66f9c80013ce4121183bdff434e8 (patch)
tree6fa09b93653af14de10c02215632e5cc458cf60a /ext/spl
parent50661690709630bd5dcea599bb0f276083292921 (diff)
downloadphp-git-2b9b9afa7a9a66f9c80013ce4121183bdff434e8.tar.gz
Use better data structures (incomplete)
Diffstat (limited to 'ext/spl')
-rw-r--r--ext/spl/php_spl.c4
-rw-r--r--ext/spl/spl_array.c9
-rw-r--r--ext/spl/spl_directory.c47
-rw-r--r--ext/spl/spl_dllist.c15
-rw-r--r--ext/spl/spl_functions.c8
-rw-r--r--ext/spl/spl_functions.h2
-rw-r--r--ext/spl/spl_heap.c21
-rw-r--r--ext/spl/spl_observer.c9
8 files changed, 54 insertions, 61 deletions
diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c
index 35b6e549f2..238b7574a0 100644
--- a/ext/spl/php_spl.c
+++ b/ext/spl/php_spl.c
@@ -573,7 +573,7 @@ PHP_FUNCTION(spl_autoload_register)
if (obj_ptr && !(alfi.func_ptr->common.fn_flags & ZEND_ACC_STATIC)) {
/* add object id to the hash to ensure uniqueness, for more reference look at bug #40091 */
- STR_EREALLOC(lc_name, lc_name->len + 2 + sizeof(zend_uint));
+ STR_REALLOC(lc_name, lc_name->len + 2 + sizeof(zend_uint), 0);
memcpy(lc_name->val + lc_name->len - 2 - sizeof(zend_uint), &Z_OBJ_HANDLE_P(obj_ptr), sizeof(zend_uint));
lc_name->val[lc_name->len] = '\0';
alfi.obj = obj_ptr;
@@ -685,7 +685,7 @@ PHP_FUNCTION(spl_autoload_unregister)
/* remove specific */
success = zend_hash_del(SPL_G(autoload_functions), lc_name);
if (success != SUCCESS && obj_ptr) {
- STR_EREALLOC(lc_name, lc_name->len + 2 + sizeof(zend_uint));
+ STR_REALLOC(lc_name, lc_name->len + 2 + sizeof(zend_uint), 0);
memcpy(lc_name->val + lc_name->len - 2 - sizeof(zend_uint), &Z_OBJ_HANDLE_P(obj_ptr), sizeof(zend_uint));
lc_name->val[lc_name->len] = '\0';
success = zend_hash_del(SPL_G(autoload_functions), lc_name);
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 903ca7882f..ec28e2e4fd 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -784,8 +784,7 @@ static HashTable *spl_array_get_properties(zval *object TSRMLS_DC) /* {{{ */
static HashTable* spl_array_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /* {{{ */
{
zval *storage;
- int name_len;
- char *zname;
+ zend_string *zname;
zend_class_entry *base;
spl_array_object *intern = (spl_array_object*)Z_OBJ_P(obj);
@@ -811,9 +810,9 @@ static HashTable* spl_array_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /*
zval_add_ref(storage);
base = (Z_OBJ_HT_P(obj) == &spl_handler_ArrayIterator) ? spl_ce_ArrayIterator : spl_ce_ArrayObject;
- zname = spl_gen_private_prop_name(base, "storage", sizeof("storage")-1, &name_len TSRMLS_CC);
- zend_symtable_str_update(intern->debug_info, zname, name_len, storage);
- efree(zname);
+ zname = spl_gen_private_prop_name(base, "storage", sizeof("storage")-1 TSRMLS_CC);
+ zend_symtable_update(intern->debug_info, zname, storage);
+ STR_RELEASE(zname);
}
return intern->debug_info;
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index f2093d9cb4..0d2621c6ed 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -586,8 +586,9 @@ static HashTable *spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
spl_filesystem_object *intern = (spl_filesystem_object*)Z_OBJ_P(obj);
zval tmp;
HashTable *rv;
- char *pnstr, *path;
- int pnlen, path_len;
+ zend_string *pnstr;
+ char *path;
+ int path_len;
char stmp[2];
*is_temp = 1;
@@ -601,14 +602,14 @@ static HashTable *spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
zend_hash_copy(rv, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
- pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", sizeof("pathName")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "pathName", sizeof("pathName")-1 TSRMLS_CC);
path = spl_filesystem_object_get_pathname(intern, &path_len TSRMLS_CC);
ZVAL_STRINGL(&tmp, path, path_len);
- zend_symtable_str_update(rv, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_symtable_update(rv, pnstr, &tmp);
+ STR_RELEASE(pnstr);
if (intern->file_name) {
- pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplFileInfo, "fileName", sizeof("fileName")-1 TSRMLS_CC);
spl_filesystem_object_get_path(intern, &path_len TSRMLS_CC);
if (path_len && path_len < intern->file_name_len) {
@@ -616,45 +617,45 @@ static HashTable *spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
} else {
ZVAL_STRINGL(&tmp, intern->file_name, intern->file_name_len);
}
- zend_symtable_str_update(rv, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_symtable_update(rv, pnstr, &tmp);
+ STR_RELEASE(pnstr);
}
if (intern->type == SPL_FS_DIR) {
#ifdef HAVE_GLOB
- pnstr = spl_gen_private_prop_name(spl_ce_DirectoryIterator, "glob", sizeof("glob")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_DirectoryIterator, "glob", sizeof("glob")-1 TSRMLS_CC);
if (php_stream_is(intern->u.dir.dirp ,&php_glob_stream_ops)) {
ZVAL_STRINGL(&tmp, intern->_path, intern->_path_len);
} else {
ZVAL_BOOL(&tmp, 0);
}
- zend_symtable_str_update(rv, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_symtable_update(rv, pnstr, &tmp);
+ STR_RELEASE(pnstr);
#endif
- pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "subPathName", sizeof("subPathName")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_RecursiveDirectoryIterator, "subPathName", sizeof("subPathName")-1 TSRMLS_CC);
if (intern->u.dir.sub_path) {
ZVAL_STRINGL(&tmp, intern->u.dir.sub_path, intern->u.dir.sub_path_len);
} else {
ZVAL_STRINGL(&tmp, "", 0);
}
- zend_symtable_str_update(rv, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_symtable_update(rv, pnstr, &tmp);
+ STR_RELEASE(pnstr);
}
if (intern->type == SPL_FS_FILE) {
- pnstr = spl_gen_private_prop_name(spl_ce_SplFileObject, "openMode", sizeof("openMode")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplFileObject, "openMode", sizeof("openMode")-1 TSRMLS_CC);
ZVAL_STRINGL(&tmp, intern->u.file.open_mode, intern->u.file.open_mode_len);
- zend_symtable_str_update(rv, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_symtable_update(rv, pnstr, &tmp);
+ STR_RELEASE(pnstr);
stmp[1] = '\0';
stmp[0] = intern->u.file.delimiter;
- pnstr = spl_gen_private_prop_name(spl_ce_SplFileObject, "delimiter", sizeof("delimiter")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplFileObject, "delimiter", sizeof("delimiter")-1 TSRMLS_CC);
ZVAL_STRINGL(&tmp, stmp, 1);
- zend_symtable_str_update(rv, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_symtable_update(rv, pnstr, &tmp);
+ STR_RELEASE(pnstr);
stmp[0] = intern->u.file.enclosure;
- pnstr = spl_gen_private_prop_name(spl_ce_SplFileObject, "enclosure", sizeof("enclosure")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplFileObject, "enclosure", sizeof("enclosure")-1 TSRMLS_CC);
ZVAL_STRINGL(&tmp, stmp, 1);
- zend_symtable_str_update(rv, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_symtable_update(rv, pnstr, &tmp);
+ STR_RELEASE(pnstr);
}
return rv;
diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c
index 1fc4f13cad..35fa40a7c1 100644
--- a/ext/spl/spl_dllist.c
+++ b/ext/spl/spl_dllist.c
@@ -500,8 +500,7 @@ static HashTable* spl_dllist_object_get_debug_info(zval *obj, int *is_temp TSRML
spl_dllist_object *intern = (spl_dllist_object*)Z_OBJ_P(obj);
spl_ptr_llist_element *current = intern->llist->head, *next;
zval tmp, dllist_array;
- char *pnstr;
- int pnlen;
+ zend_string *pnstr;
int i = 0;
*is_temp = 0;
@@ -518,10 +517,10 @@ static HashTable* spl_dllist_object_get_debug_info(zval *obj, int *is_temp TSRML
}
zend_hash_copy(intern->debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
- pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "flags", sizeof("flags")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "flags", sizeof("flags")-1 TSRMLS_CC);
ZVAL_LONG(&tmp, intern->flags);
- zend_hash_str_add(intern->debug_info, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_hash_add(intern->debug_info, pnstr, &tmp);
+ STR_RELEASE(pnstr);
array_init(&dllist_array);
@@ -535,9 +534,9 @@ static HashTable* spl_dllist_object_get_debug_info(zval *obj, int *is_temp TSRML
current = next;
}
- pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "dllist", sizeof("dllist")-1, &pnlen TSRMLS_CC);
- zend_hash_str_add(intern->debug_info, pnstr, pnlen, &dllist_array);
- efree(pnstr);
+ pnstr = spl_gen_private_prop_name(spl_ce_SplDoublyLinkedList, "dllist", sizeof("dllist")-1 TSRMLS_CC);
+ zend_hash_add(intern->debug_info, pnstr, &dllist_array);
+ STR_RELEASE(pnstr);
}
return intern->debug_info;
diff --git a/ext/spl/spl_functions.c b/ext/spl/spl_functions.c
index e3cf1323c3..97a9509caa 100644
--- a/ext/spl/spl_functions.c
+++ b/ext/spl/spl_functions.c
@@ -133,13 +133,9 @@ int spl_add_classes(zend_class_entry *pce, zval *list, int sub, int allow, int c
}
/* }}} */
-char * spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len, int *name_len TSRMLS_DC) /* {{{ */
+zend_string * spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len TSRMLS_DC) /* {{{ */
{
- char *rv;
-
- zend_mangle_property_name(&rv, name_len, ce->name->val, ce->name->len, prop_name, prop_len, 0);
-
- return rv;
+ return zend_mangle_property_name(ce->name->val, ce->name->len, prop_name, prop_len, 0);
}
/* }}} */
diff --git a/ext/spl/spl_functions.h b/ext/spl/spl_functions.h
index a15da36357..1d116ff783 100644
--- a/ext/spl/spl_functions.h
+++ b/ext/spl/spl_functions.h
@@ -66,7 +66,7 @@ void spl_add_traits(zval * list, zend_class_entry * pce, int allow, int ce_flags
int spl_add_classes(zend_class_entry *pce, zval *list, int sub, int allow, int ce_flags TSRMLS_DC);
/* caller must efree(return) */
-char * spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len, int *name_len TSRMLS_DC);
+zend_string *spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len TSRMLS_DC);
#define SPL_ME(class_name, function_name, arg_info, flags) \
PHP_ME( spl_ ## class_name, function_name, arg_info, flags)
diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c
index 1520bfb401..45b50c2d25 100644
--- a/ext/spl/spl_heap.c
+++ b/ext/spl/spl_heap.c
@@ -508,8 +508,7 @@ static int spl_heap_object_count_elements(zval *object, long *count TSRMLS_DC) /
static HashTable* spl_heap_object_get_debug_info_helper(zend_class_entry *ce, zval *obj, int *is_temp TSRMLS_DC) { /* {{{ */
spl_heap_object *intern = (spl_heap_object*)Z_OBJ_P(obj);
zval tmp, heap_array;
- char *pnstr;
- int pnlen;
+ zend_string *pnstr;
int i;
*is_temp = 0;
@@ -527,15 +526,15 @@ static HashTable* spl_heap_object_get_debug_info_helper(zend_class_entry *ce, zv
zend_hash_copy(intern->debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
- pnstr = spl_gen_private_prop_name(ce, "flags", sizeof("flags")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(ce, "flags", sizeof("flags")-1 TSRMLS_CC);
ZVAL_LONG(&tmp, intern->flags);
- zend_hash_str_update(intern->debug_info, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_hash_update(intern->debug_info, pnstr, &tmp);
+ STR_RELEASE(pnstr);
- pnstr = spl_gen_private_prop_name(ce, "isCorrupted", sizeof("isCorrupted")-1, &pnlen TSRMLS_CC);
+ pnstr = spl_gen_private_prop_name(ce, "isCorrupted", sizeof("isCorrupted")-1 TSRMLS_CC);
ZVAL_BOOL(&tmp, intern->heap->flags&SPL_HEAP_CORRUPTED);
- zend_hash_str_update(intern->debug_info, pnstr, pnlen, &tmp);
- efree(pnstr);
+ zend_hash_update(intern->debug_info, pnstr, &tmp);
+ STR_RELEASE(pnstr);
array_init(&heap_array);
@@ -544,9 +543,9 @@ static HashTable* spl_heap_object_get_debug_info_helper(zend_class_entry *ce, zv
Z_ADDREF_P(&intern->heap->elements[i]);
}
- pnstr = spl_gen_private_prop_name(ce, "heap", sizeof("heap")-1, &pnlen TSRMLS_CC);
- zend_hash_str_update(intern->debug_info, pnstr, pnlen, &heap_array);
- efree(pnstr);
+ pnstr = spl_gen_private_prop_name(ce, "heap", sizeof("heap")-1 TSRMLS_CC);
+ zend_hash_update(intern->debug_info, pnstr, &heap_array);
+ STR_RELEASE(pnstr);
}
return intern->debug_info;
diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c
index 92baee4b0c..c91379bf20 100644
--- a/ext/spl/spl_observer.c
+++ b/ext/spl/spl_observer.c
@@ -303,8 +303,7 @@ static HashTable* spl_object_storage_debug_info(zval *obj, int *is_temp TSRMLS_D
HashPosition pos;
zval tmp, storage;
char md5str[33];
- int name_len;
- char *zname;
+ zend_string *zname;
*is_temp = 0;
@@ -334,9 +333,9 @@ static HashTable* spl_object_storage_debug_info(zval *obj, int *is_temp TSRMLS_D
zend_hash_move_forward_ex(&intern->storage, &pos);
}
- zname = spl_gen_private_prop_name(spl_ce_SplObjectStorage, "storage", sizeof("storage")-1, &name_len TSRMLS_CC);
- zend_symtable_str_update(intern->debug_info, zname, name_len, &storage);
- efree(zname);
+ zname = spl_gen_private_prop_name(spl_ce_SplObjectStorage, "storage", sizeof("storage")-1 TSRMLS_CC);
+ zend_symtable_update(intern->debug_info, zname, &storage);
+ STR_RELEASE(zname);
}
return intern->debug_info;