summaryrefslogtreecommitdiff
path: root/Zend/zend_extensions.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_extensions.c')
-rw-r--r--Zend/zend_extensions.c68
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