swig wraps C++ objects as zend overloaded objects, the property getters and
setters fall back to storing things in the
Z_OBJPROP_P(property_reference->object) hash but I'm not doing it properly
and I can't work out what I'm doing wrong.

The propget functions are generated like this:

static pval _wrap_propget_ArrayStruct(zend_property_reference
*property_referenc
e) {
  pval result;
  pval **_result;
  zend_llist_element *element = property_reference->elements_list->head;
  zend_overloaded_element *property=(zend_overloaded_element
*)element->data;

  /* Parent class hierachy dispatcher */
  if (_propget_ArrayStruct(property_reference, &result)==SUCCESS) return
result;

  /* Nope? return it ourselves from property hash*/
  if
(zend_hash_find(Z_OBJPROP_P(property_reference->object),Z_STRVAL_P(&(proper
ty->element)),1+Z_STRLEN_P(&(property->element)),(void**)&_result)==SUCCESS)
ret
urn **_result;
  result.type = IS_NULL;
  return result;
}

No the trouble is I don't get reference counting/copying/whatever right,
and, if for example I store a string in the hash, then later, if I read the
string back a few times I find it's value changes, so I'm sure I'm passing
around a free'd zval.

The set function is generated like this:
static int _wrap_propset_ArrayStruct(zend_property_reference
*property_reference
, pval *value) {
  zend_llist_element *element = property_reference->elements_list->head;
  zend_overloaded_element *property=(zend_overloaded_element
*)element->data;
  /* Parent class hierachy dispatcher */
  if (_propset_ArrayStruct(property_reference, value)==SUCCESS) return
SUCCESS;

  /* nope? set it ourselves */
  return
add_property_zval_ex(property_reference->object,Z_STRVAL_P(&(property->
element)),1+Z_STRLEN_P(&(property->element)),value);
}

I've tried zval_copy_ctor, SEPERATE_ZVAL and the like both before storing
and after reading but I can't get any joy:

This sort of php script:
<?php
// Sample test file

require "arrays.php";

$ss=new simplestruct();
$ss->array_c="ab";
var_dump($ss);
var_dump($ss->array_c);
$x=$ss->array_c;
print "1 $x\n";
$x=$ss->array_c;
print "2 $x\n";
$x=$ss->array_c;
print "3 $x\n";
var_dump($x);

?>

outputs this:
X-Powered-By: PHP/4.2.1
Content-type: text/html

object(simplestruct)(2) {
  ["_cPtr"]=>
  resource(1) of type (_p_SimpleStruct)
  ["array_c"]=>
  &string(2) "ab"
}
string(2) "ab"
1 1
2 2
3 3
string(2) "T"

instead of
string(2) "ab"
1 ab
2 ab
3 ab
string(2) "ab"






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

Reply via email to