Sorry to spam the list with a reply to my own thread again, but there were some errors in the example I posted, which would defeat the whole idea of it being useful for somebody with the same question. Corrected example:

ZEND_METHOD(xydelta, setStartDocument) {
   zval *id, *doc = NULL;
   xydelta_object *intern;

   if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
     getThis(), "Oo", &id, xydelta_ce, &doc) == FAILURE) {
       RETURN_FALSE;
   }

   intern = (xydelta_object *)zend_object_store_get_object(id TSRMLS_CC);
   // Error checking removed for brevity...
   // ...

   // Clone zval* doc

   zend_object_handlers *handlers = doc->value.obj.handlers;

   zval *doc_clone;
   MAKE_STD_ZVAL(doc_clone);
   Z_TYPE_P(doc_clone) = IS_OBJECT;
   doc_clone->value.obj = handlers->clone_obj(doc);

   // Get cloned object
   intern->libxml_start_doc = (php_libxml_node_object *)
       zend_object_store_get_object(doc_clone TSRMLS_CC);
}

- Frankie Dintino

On 2009-03-12 00:21:49 -0400, fdint...@nflc.org (Frankie Dintino) said:


...

On 2009-03-10 16:03:19 -0400, he...@php.net (Marcus Boerger) said:

Hello Frankie,

DOMDocuments are reference counted, hence zou can simplz increase their
refcount when storing the connection and delete the ref when dropping the
connection, probably in your destructor.

Best regards,
 Marcus

Tuesday, March 10, 2009, 5:19:32 PM, you wrote:

I'm writing a PHP class with a method that has to be passed a
DOMDocument object, and it needs to retain that object throughout the
life of its instantiation. However, the (dom_object *) returned from
zend_parse_method_parameters is just a pointer to the passed object,
and so it disappears when the original document is unset or goes out of
scope. How would one go about cloning the DOMDocument to save in the
class's struct?

example:
ZEND_METHOD(xydelta, setStartDocument) {
zval *id, *doc = NULL;
xydelta_object *intern;

if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
"Oo", &id, xydelta_ce, &doc) == FAILURE) {
RETURN_FALSE;
}

intern = (xydelta_object *)zend_object_store_get_object(id TSRMLS_CC);
if (intern != NULL) {
// Error checking removed for brevity...
// ...

// This pointer cannot be accessed once the object that was used as
the first parameter goes out of scope
intern->libxml_start_doc = (php_libxml_node_object *)
zend_object_store_get_object(doc TSRMLS_CC);
}
}



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to