Browse Source

Add new API for resources

experimetnal/RETURN_REF_PATCH
Zeev Suraski 27 years ago
parent
commit
3feb4b3bdd
  1. 44
      Zend/zend_list.c
  2. 11
      Zend/zend_list.h
  3. 6
      Zend/zend_modules.h

44
Zend/zend_list.c

@ -18,6 +18,8 @@
*/
/* resource lists */
#include "zend.h"
#include "zend_list.h"
#include "zend_API.h"
@ -137,6 +139,48 @@ ZEND_API void *zend_plist_find(int id, int *type)
}
ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, char *resource_type_name, int resource_type)
{
return zend_fetch_resource_ex(passed_id, default_id, resource_type_name, 1, resource_type);
}
ZEND_API void *zend_fetch_resource_ex(zval *passed_id, int default_id, char *resource_type_name, int num_resource_types, ...)
{
int id;
int actual_resource_type;
void *resource;
va_list resource_types;
int i;
if (default_id==-1) { /* use id */
if (passed_id->type != IS_RESOURCE) {
zend_error(E_WARNING, "Supplied argument is not a valid %s resource", resource_type_name);
return NULL;
}
id = passed_id->value.lval;
} else {
id = default_id;
}
resource = zend_list_find(id, &actual_resource_type);
if (!resource) {
zend_error(E_WARNING, "%d is not a valid %s resource", resource_type_name);
return NULL;
}
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);
return resource;
}
}
va_end(resource_types);
return NULL;
}
int list_entry_destructor(void *ptr)
{
list_entry *le = (list_entry *) ptr;

11
Zend/zend_list.h

@ -62,7 +62,18 @@ ZEND_API int zend_list_delete(int id);
ZEND_API int zend_plist_delete(int id);
ZEND_API void *zend_list_find(int id, int *type);
ZEND_API void *zend_plist_find(int id, int *type);
ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, char *resource_type_name, int resource_type);
ZEND_API void *zend_fetch_resource_ex(zval *passed_id, int default_id, char *resource_type_name, int num_resource_types, ...);
extern ZEND_API int le_index_ptr; /* list entry type for index pointers */
#define ZEND_VERIFY_RESOURCE(rsrc) \
if (!rsrc) { \
RETURN_FALSE; \
}
#define ZEND_FETCH_RESOURCE(rsrc, rsrc_type, passed_id, default_id, resource_type_name, resource_type) \
rsrc = (rsrc_type) zend_fetch_resource(passed_id, default_id, resource_type_name, resource_type); \
ZEND_VERIFY_RESOURCE(rsrc);
#endif

6
Zend/zend_modules.h

@ -56,9 +56,9 @@ struct _zend_module_entry {
extern HashTable module_registry;
extern void module_destructor(zend_module_entry *module);
extern int module_registry_cleanup(zend_module_entry *module);
extern int module_registry_request_startup(zend_module_entry *module);
void module_destructor(zend_module_entry *module);
int module_registry_cleanup(zend_module_entry *module);
int module_registry_request_startup(zend_module_entry *module);
#define ZEND_MODULE_DTOR (int (*)(void *)) module_destructor
#endif
Loading…
Cancel
Save