I originally posted this about 20 hours ago, and it has still not appeared on the newsgroup. I assume something went wrong, and apologize if it appears twice.
In my original message, I neglected to mention that I am compiling code this with PHP 4.2.3, though I have had similar problems with an earlier version of this extension (on another dev server) with 4.3.0. --- Hello all, I have scoured the php.dev group, reading most of the messages I could find regarding extensions and modules, but could not find any other reports of this problem anywhere. I have a feeling there is an obvious answer. I have a PHP_FUNCTION() defined within my extension, which is in turn calling a standard C function (called "getDataReply()") which is passed the standard return_value zval*. My getDataReply() function initializes a Zend object (which I have defined) using object_init_ex(), then calls the object's constructor, and then assigns some values to the members of the object. That is all well and good. Everything works great. I can use a php_var_dump() and everything looks as it should. I even do another php_var_dump(&return_value, 1 TSRMLS_CC) within my PHP_FUNCTION(), and sure enough... return_value still contains the proper data structure (see below). The problem occurs as soon as control returns to the script. In my test script, I do a var_dump() and the data is corrupted! I have looked at the Zend internals but forgive me, I don't have the time or patience to to step line-by-line through code (using gdb) that has few comments and which I don't understand very well. Can anyone please give me some ideas as to what I could be doing wrong here? NOTE that I have discovered that if I perform a deep copy using zend_copy_ctor(return_value) before returning to the script, my data is undamaged... but then I have a big memory leak. I also anticipate having very large data sets within my objects, and deep-copying all of that every time would be very expensive. Here is a how I am calling my C function from within my PHP function: PHP_FUNCTION(eo_create_object) { .. .. do stuff .. /* let's see what the server has to say */ temp = getDataReply(conn, return_value); if ( temp ) { .. in this case return_value is set based on the value of temp, a .. fairly simple data structure (but this code is NOT being reached; .. see below. return_value is only being modified by the above .. function. } else { printf("temp is NULL\n"); } printf("done with getDataReply()\n"); /* this php_var_dump() returns uncorrupted data */ php_var_dump(&return_value, 1 TSRMLS_CC); } // end eo_create_object() I don't see why it should make any difference, but in another source file, getDataReply() is declared like this: variant *getDataReply(eo_connection *conn, zval *return_value) { .. do stuff, init return_value as eo_table class, init it, and fill w/data } The following are the exact results of the php_var_dump() from within zif_eo_create_object(), _immediately_ before returning control to the script. ----------------------- temp is NULL done with getDataReply() object(eo_table)(10) { ["serverId"]=> string(14) "N^VESoDMN(94)" ["rows"]=> int(0) ["cols"]=> int(0) ["namedCols"]=> bool(false) ["errorText"]=> string(0) "" ["errorItem"]=> string(0) "" ["errorId"]=> int(0) ["flags"]=> int(0) ["colNames"]=> NULL ["table"]=> NULL } Those data are correct, everything looks PERFECT. --------- Here is what I am doing in the test script (PHP code): <?php /* $conn is a resource, $o is an associative array */ $table = eo_create_object($conn, '...table', 0, $o, NULL, NULL, NULL); var_dump($table); ?> And here are the results of the last var_dump(): object(eo_table)(10) { ["serverId"]=> &UNKNOWN:0 ["rows"]=> &UNKNOWN:0 ["cols"]=> int(0) ["namedCols"]=> bool(false) ["errorText"]=> string(0) "" ["errorItem"]=> string(0) "" ["errorId"]=> int(0) ["flags"]=> int(0) ["colNames"]=> NULL ["table"]=> NULL } ...as you can see, some of the values have been corrupted. As soon as I try to access $table->serverId, PHP segfaults in erealloc(). I will not include the backtrace here as it seems irrelevant; serverId no longer has a legitimate value, so of course it cannot be accessed. This is a simple example. The member variable "table", when it has a value, contains an associative array. Sometimes those values are OK, sometimes they are corrupted. I have had other strange corruptions in returned values, and I do not understand why. Thanks for any help you can offer, Eric -- This message was created in a marvelously Microsoft-free computing environment. To email me, ADD "spam" before the "bo" -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php