Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:43341 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 22529 invoked from network); 13 Mar 2009 20:05:48 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 13 Mar 2009 20:05:48 -0000 X-Host-Fingerprint: 128.8.183.2 www.langsource.umd.edu Received: from [128.8.183.2] ([128.8.183.2:11704] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 66/66-09939-A9CBAB94 for ; Fri, 13 Mar 2009 15:05:47 -0500 To: internals@lists.php.net Date: Fri, 13 Mar 2009 16:05:43 -0400 Message-ID: <2009031316054316807-fdintino@nflcorg> References: <2009031012193216807-fdintino@nflcorg> <257144875.20090310210319@marcus-boerger.de> <2009031200214916807-fdintino@nflcorg> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit User-Agent: Unison/1.8.1 X-Posted-By: 128.8.183.2 Subject: Re: [PHP-DEV] Cloning of objects passed as parameters From: fdintino@nflc.org (Frankie Dintino) 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, fdintino@nflc.org (Frankie Dintino) said: > > ... > > On 2009-03-10 16:03:19 -0400, helly@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); >>> } >>> }