diff options
Diffstat (limited to 'Zend/zend_extensions.c')
| -rw-r--r-- | Zend/zend_extensions.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index 00e4f659a0..bec776e68c 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -22,6 +22,7 @@ #include "zend_extensions.h" ZEND_API zend_llist zend_extensions; +ZEND_API uint32_t zend_extension_flags = 0; static int last_resource_number; int zend_load_extension(const char *path) @@ -137,6 +138,21 @@ int zend_register_extension(zend_extension *new_extension, DL_HANDLE handle) zend_llist_add_element(&zend_extensions, &extension); + if (extension.op_array_ctor) { + zend_extension_flags |= ZEND_EXTENSIONS_HAVE_OP_ARRAY_CTOR; + } + if (extension.op_array_dtor) { + zend_extension_flags |= ZEND_EXTENSIONS_HAVE_OP_ARRAY_DTOR; + } + if (extension.op_array_handler) { + zend_extension_flags |= ZEND_EXTENSIONS_HAVE_OP_ARRAY_HANDLER; + } + if (extension.op_array_persist_calc) { + zend_extension_flags |= ZEND_EXTENSIONS_HAVE_OP_ARRAY_PERSIST_CALC; + } + if (extension.op_array_persist) { + zend_extension_flags |= ZEND_EXTENSIONS_HAVE_OP_ARRAY_PERSIST; + } /*fprintf(stderr, "Loaded %s, version %s\n", extension.name, extension.version);*/ #endif @@ -245,6 +261,58 @@ ZEND_API zend_extension *zend_get_extension(const char *extension_name) return NULL; } +typedef struct _zend_extension_persist_data { + zend_op_array *op_array; + size_t size; + char *mem; +} zend_extension_persist_data; + +static void zend_extension_op_array_persist_calc_handler(zend_extension *extension, zend_extension_persist_data *data) +{ + if (extension->op_array_persist_calc) { + data->size += extension->op_array_persist_calc(data->op_array); + } +} + +static void zend_extension_op_array_persist_handler(zend_extension *extension, zend_extension_persist_data *data) +{ + if (extension->op_array_persist) { + size_t size = extension->op_array_persist(data->op_array, data->mem); + if (size) { + data->mem = (void*)((char*)data->mem + size); + data->size += size; + } + } +} + +ZEND_API size_t zend_extensions_op_array_persist_calc(zend_op_array *op_array) +{ + if (zend_extension_flags & ZEND_EXTENSIONS_HAVE_OP_ARRAY_PERSIST_CALC) { + zend_extension_persist_data data; + + data.op_array = op_array; + data.size = 0; + data.mem = NULL; + zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_persist_calc_handler, &data); + return data.size; + } + return 0; +} + +ZEND_API size_t zend_extensions_op_array_persist(zend_op_array *op_array, void *mem) +{ + if (zend_extension_flags & ZEND_EXTENSIONS_HAVE_OP_ARRAY_PERSIST) { + zend_extension_persist_data data; + + data.op_array = op_array; + data.size = 0; + data.mem = mem; + zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_persist_handler, &data); + return data.size; + } + return 0; +} + /* * Local variables: * tab-width: 4 |
