chregu          Mon Jul 12 09:04:01 2004 EDT

  Modified files:              
    /php-src/ext/xsl    php_xsl.c 
  Log:
  implement the clone code for the XSLTProcessor object and fix #29108 
  "xslt segfaults when ze1_compatibility_mode is on" (By Rob Richards)
  
  
  
http://cvs.php.net/diff.php/php-src/ext/xsl/php_xsl.c?r1=1.21&r2=1.22&ty=u
Index: php-src/ext/xsl/php_xsl.c
diff -u php-src/ext/xsl/php_xsl.c:1.21 php-src/ext/xsl/php_xsl.c:1.22
--- php-src/ext/xsl/php_xsl.c:1.21      Wed Apr  7 12:48:11 2004
+++ php-src/ext/xsl/php_xsl.c   Mon Jul 12 09:04:01 2004
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: php_xsl.c,v 1.21 2004/04/07 16:48:11 rrichards Exp $ */
+/* $Id: php_xsl.c,v 1.22 2004/07/12 13:04:01 chregu Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -70,10 +70,57 @@
 /* {{{ xsl_objects_clone */
 void xsl_objects_clone(void *object, void **object_clone TSRMLS_DC)
 {
-       /* TODO */
+       xsl_object *intern = (xsl_object *) object;
+       xsl_object *clone;
+       zval *tmp;
+       zend_class_entry *class_type;
+
+       class_type = intern->std.ce;
+
+       clone = emalloc(sizeof(xsl_object));
+       clone->std.ce = class_type;
+       clone->std.in_get = 0;
+       clone->std.in_set = 0;
+       clone->ptr = NULL;
+       clone->prop_handler = NULL;
+       clone->parameter = NULL;
+       clone->hasKeys = intern->hasKeys;
+       clone->registerPhpFunctions = 0;
+
+       ALLOC_HASHTABLE(clone->std.properties);
+       zend_hash_init(clone->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
+       zend_hash_copy(clone->std.properties, &class_type->default_properties, 
(copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
+       ALLOC_HASHTABLE(clone->parameter);
+       zend_hash_init(clone->parameter, 0, NULL, ZVAL_PTR_DTOR, 0);
+
+       *object_clone = (void *) clone;
 }
 /* }}} */
 
+zend_object_value xsl_objects_store_clone_obj(zval *zobject TSRMLS_DC)
+{
+       zend_object_value retval;
+       void *new_object;
+       xsl_object *intern;
+       struct _store_object *obj;
+       zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
+
+       obj = &EG(objects_store).object_buckets[handle].bucket.obj;
+       
+       if (obj->clone == NULL) {
+               zend_error(E_CORE_ERROR, "Trying to clone uncloneable object of class 
%s", Z_OBJCE_P(zobject)->name);
+       }               
+
+       obj->clone(obj->object, &new_object TSRMLS_CC);
+
+       retval.handle = zend_objects_store_put(new_object, obj->dtor, 
obj->free_storage, obj->clone TSRMLS_CC);
+       intern = (xsl_object *) new_object;
+       intern->handle = retval.handle;
+       retval.handlers = Z_OBJ_HT_P(zobject);
+       
+       return retval;
+}
+
 /* {{{ xsl_objects_free_storage */
 void xsl_objects_free_storage(void *object TSRMLS_DC)
 {
@@ -134,7 +181,8 @@
        zend_class_entry ce;
        
        memcpy(&xsl_object_handlers, zend_get_std_object_handlers(), 
sizeof(zend_object_handlers));
-       
+       xsl_object_handlers.clone_obj = xsl_objects_store_clone_obj;
+
        REGISTER_XSL_CLASS(ce, "XSLTProcessor", NULL, 
php_xsl_xsltprocessor_class_functions, xsl_xsltprocessor_class_entry);
 #if HAVE_XSL_EXSLT
        exsltRegisterAll();

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to