summaryrefslogtreecommitdiff
path: root/Zend/zend_list.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2015-02-02 13:23:16 +0800
committerXinchen Hui <laruence@gmail.com>2015-02-02 13:23:16 +0800
commit942809909e1bc125db038796c0a1a0b53eeaca7d (patch)
treebddec8b44878488fc73e8fe2fb9e30b7ee4f9b67 /Zend/zend_list.c
parentc9e44dc2dfa7ad91fe9253378a49e9f5b057992e (diff)
downloadphp-git-942809909e1bc125db038796c0a1a0b53eeaca7d.tar.gz
Cleanup resource handling APIs
Diffstat (limited to 'Zend/zend_list.c')
-rw-r--r--Zend/zend_list.c122
1 files changed, 71 insertions, 51 deletions
diff --git a/Zend/zend_list.c b/Zend/zend_list.c
index ceedadf467..6344074d9c 100644
--- a/Zend/zend_list.c
+++ b/Zend/zend_list.c
@@ -89,77 +89,97 @@ ZEND_API int zend_list_close(zend_resource *res)
return SUCCESS;
}
-ZEND_API zend_resource* zend_register_resource(zval *rsrc_result, void *rsrc_pointer, int rsrc_type)
+ZEND_API zend_resource* zend_register_resource(void *rsrc_pointer, int rsrc_type)
{
zval *zv;
zv = zend_list_insert(rsrc_pointer, rsrc_type);
- if (rsrc_result) {
- ZVAL_COPY_VALUE(rsrc_result, zv);
- return Z_RES_P(rsrc_result);
- } else {
- return Z_RES_P(zv);
- }
+ return Z_RES_P(zv);
}
-ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, const char *resource_type_name, int *found_resource_type, int num_resource_types, ...)
+ZEND_API void *zend_fetch_resource2(zend_resource *res, const char *resource_type_name, int *found_type, int resource_type1, int resource_type2)
{
- int actual_resource_type;
-// void *resource;
- va_list resource_types;
- int i;
- zend_resource *res;
- const char *space;
- const char *class_name;
-
- if (default_id==-1) { /* use id */
- if (!passed_id) {
- if (resource_type_name) {
- class_name = get_active_class_name(&space);
- zend_error(E_WARNING, "%s%s%s(): no %s resource supplied", class_name, space, get_active_function_name(), resource_type_name);
- }
- return NULL;
- } else if (Z_TYPE_P(passed_id) != IS_RESOURCE) {
- if (resource_type_name) {
- class_name = get_active_class_name(&space);
- zend_error(E_WARNING, "%s%s%s(): supplied argument is not a valid %s resource", class_name, space, get_active_function_name(), resource_type_name);
- }
- return NULL;
- }
- } else {
- passed_id = zend_hash_index_find(&EG(regular_list), default_id);
- if (!passed_id) {
- if (resource_type_name) {
- class_name = get_active_class_name(&space);
- zend_error(E_WARNING, "%s%s%s(): %d is not a valid %s resource", class_name, space, get_active_function_name(), default_id, resource_type_name);
- }
- return NULL;
+ if (resource_type1 == res->type) {
+ if (found_type) {
+ *found_type = resource_type1;
}
+ return res->ptr;
}
- res = Z_RES_P(passed_id);
- actual_resource_type = res->type;
-
- va_start(resource_types, num_resource_types);
- for (i=0; i<num_resource_types; i++) {
- if (actual_resource_type == va_arg(resource_types, int)) {
- va_end(resource_types);
- if (found_resource_type) {
- *found_resource_type = actual_resource_type;
- }
- return res->ptr;
+
+ if (resource_type2 == res->type) {
+ if (found_type) {
+ *found_type = resource_type2;
}
+ return res->ptr;
+ }
+
+ if (resource_type_name) {
+ const char *space;
+ const char *class_name = get_active_class_name(&space);
+ zend_error(E_WARNING, "%s%s%s(): supplied resource is not a valid %s resource", class_name, space, get_active_function_name(), resource_type_name);
+ }
+
+ return NULL;
+}
+
+ZEND_API void *zend_fetch_resource(zend_resource *res, const char *resource_type_name, int resource_type)
+{
+ if (resource_type == res->type) {
+ return res->ptr;
}
- va_end(resource_types);
if (resource_type_name) {
- class_name = get_active_class_name(&space);
+ const char *space;
+ const char *class_name = get_active_class_name(&space);
zend_error(E_WARNING, "%s%s%s(): supplied resource is not a valid %s resource", class_name, space, get_active_function_name(), resource_type_name);
}
return NULL;
}
+ZEND_API void *zend_fetch_resource_ex(zval *res, const char *resource_type_name, int resource_type)
+{
+ const char *space, *class_name;
+ if (res == NULL) {
+ if (resource_type_name) {
+ class_name = get_active_class_name(&space);
+ zend_error(E_WARNING, "%s%s%s(): no %s resource supplied", class_name, space, get_active_function_name(), resource_type_name);
+ }
+ return NULL;
+ }
+ if (Z_TYPE_P(res) != IS_RESOURCE) {
+ if (resource_type_name) {
+ class_name = get_active_class_name(&space);
+ zend_error(E_WARNING, "%s%s%s(): supplied argument is not a valid %s resource", class_name, space, get_active_function_name(), resource_type_name);
+ }
+ return NULL;
+ }
+
+ return zend_fetch_resource(Z_RES_P(res), resource_type_name, resource_type);
+}
+
+ZEND_API void *zend_fetch_resource2_ex(zval *res, const char *resource_type_name, int *found_type, int resource_type1, int resource_type2)
+{
+ const char *space, *class_name;
+ if (res == NULL) {
+ if (resource_type_name) {
+ class_name = get_active_class_name(&space);
+ zend_error(E_WARNING, "%s%s%s(): no %s resource supplied", class_name, space, get_active_function_name(), resource_type_name);
+ }
+ return NULL;
+ }
+ if (Z_TYPE_P(res) != IS_RESOURCE) {
+ if (resource_type_name) {
+ class_name = get_active_class_name(&space);
+ zend_error(E_WARNING, "%s%s%s(): supplied argument is not a valid %s resource", class_name, space, get_active_function_name(), resource_type_name);
+ }
+ return NULL;
+ }
+
+ return zend_fetch_resource2(Z_RES_P(res), resource_type_name, found_type, resource_type1, resource_type2);
+}
+
void list_entry_destructor(zval *zv)
{
zend_resource *res = Z_RES_P(zv);