From 5aaeb88d8b753a3b51e81c36dba6293dd436148b Mon Sep 17 00:00:00 2001 From: Emiel Bruijntjes Date: Tue, 4 Mar 2014 19:41:43 +0100 Subject: fixed compile issue, overwriting the default object handlers is of course not a very smart thing to do... --- src/classbase.cpp | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/classbase.cpp b/src/classbase.cpp index f9b58d0..e813617 100644 --- a/src/classbase.cpp +++ b/src/classbase.cpp @@ -37,6 +37,34 @@ static ClassBase *cpp_class(zend_class_entry *entry) return *((ClassBase **)(comment + 1)); } +/** + * Retrieve pointer to our own object handlers + * @return zend_object_handlers + */ +zend_object_handlers *ClassBase::objectHandlers() +{ + // keep static structure + static zend_object_handlers handlers; + + // is the object already initialized? + static bool initialized = false; + + // already initialized? + if (initialized) return &handlers; + + // initialize the handlers + memcpy(&handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); + + // install custom clone function + handlers.clone_obj = &ClassBase::cloneObject; + + // remember that object is now initialized + initialized = true; + + // done + return &handlers; +} + /** * Function that is called to create space for a cloned object * @param val The object to be cloned @@ -63,11 +91,8 @@ zend_object_value ClassBase::cloneObject(zval *val TSRMLS_DC) zend_object_value result; // set the handlers - result.handlers = zend_get_std_object_handlers(); + result.handlers = ClassBase::objectHandlers(); - // we need a special handler for cloning - result.handlers->clone_obj = &ClassBase::cloneObject; - // store the object MixedObject *new_object = cpp->store(entry); @@ -102,11 +127,8 @@ zend_object_value ClassBase::createObject(zend_class_entry *entry TSRMLS_DC) zend_object_value result; // set the handlers - result.handlers = zend_get_std_object_handlers(); + result.handlers = ClassBase::objectHandlers(); - // we need a special handler for cloning - result.handlers->clone_obj = ClassBase::cloneObject; - // store the object cpp->store(entry); -- cgit v1.2.3