summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/com_dotnet/com_handlers.c2
-rw-r--r--ext/com_dotnet/com_iterator.c59
-rw-r--r--ext/com_dotnet/com_saproxy.c6
-rw-r--r--ext/com_dotnet/php_com_dotnet_internal.h4
4 files changed, 43 insertions, 28 deletions
diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c
index d535affc5d..06ca1f120b 100644
--- a/ext/com_dotnet/com_handlers.c
+++ b/ext/com_dotnet/com_handlers.c
@@ -499,7 +499,7 @@ static int com_object_cast(zval *readobj, zval *writeobj, int type TSRMLS_DC)
VariantInit(&v);
if (V_VT(&obj->v) == VT_DISPATCH) {
- if (FAILURE == php_com_do_invoke_by_id(obj, DISPID_VALUE,
+ if (SUCCESS != php_com_do_invoke_by_id(obj, DISPID_VALUE,
DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, 0, NULL, 1 TSRMLS_CC)) {
VariantCopy(&v, &obj->v);
}
diff --git a/ext/com_dotnet/com_iterator.c b/ext/com_dotnet/com_iterator.c
index 454d5a2f55..2527dacea2 100644
--- a/ext/com_dotnet/com_iterator.c
+++ b/ext/com_dotnet/com_iterator.c
@@ -38,6 +38,7 @@ struct php_com_iterator {
VARIANT safe_array;
VARTYPE sa_type;
LONG sa_max;
+ zval *zdata;
};
static void com_iter_dtor(zend_object_iterator *iter TSRMLS_DC)
@@ -49,6 +50,9 @@ static void com_iter_dtor(zend_object_iterator *iter TSRMLS_DC)
}
VariantClear(&I->v);
VariantClear(&I->safe_array);
+ if (I->zdata) {
+ zval_ptr_dtor((zval**)&I->zdata);
+ }
efree(I);
}
@@ -56,32 +60,18 @@ static int com_iter_valid(zend_object_iterator *iter TSRMLS_DC)
{
struct php_com_iterator *I = (struct php_com_iterator*)iter->data;
- if (I->key == (ulong)-1) {
- return FAILURE;
+ if (I->zdata) {
+ return SUCCESS;
}
- return SUCCESS;
+
+ return FAILURE;
}
static void com_iter_get_data(zend_object_iterator *iter, zval ***data TSRMLS_DC)
{
struct php_com_iterator *I = (struct php_com_iterator*)iter->data;
- zval **ptr_ptr;
- zval *ptr;
-
- /* sanity */
- if (I->key == (ulong)-1) {
- *data = NULL;
- return;
- }
-
- MAKE_STD_ZVAL(ptr);
- php_com_zval_from_variant(ptr, &I->v, I->code_page TSRMLS_CC);
- /* php_com_wrap_variant(ptr, &I->v, I->code_page TSRMLS_CC); */
- ptr_ptr = emalloc(sizeof(*ptr_ptr));
- *ptr_ptr = ptr;
- *data = ptr_ptr;
- return;
+ *data = &I->zdata;
}
static int com_iter_get_key(zend_object_iterator *iter, char **str_key, uint *str_key_len,
@@ -100,15 +90,20 @@ static int com_iter_move_forwards(zend_object_iterator *iter TSRMLS_DC)
{
struct php_com_iterator *I = (struct php_com_iterator*)iter->data;
unsigned long n_fetched;
+ zval *ptr;
/* release current cached element */
VariantClear(&I->v);
+ if (I->zdata) {
+ zval_ptr_dtor((zval**)&I->zdata);
+ I->zdata = NULL;
+ }
+
if (I->ev) {
/* Get the next element */
if (SUCCEEDED(IEnumVARIANT_Next(I->ev, 1, &I->v, &n_fetched)) && n_fetched > 0) {
I->key++;
- return SUCCESS;
} else {
/* indicate that there are no more items */
I->key = (ulong)-1;
@@ -121,13 +116,17 @@ static int com_iter_move_forwards(zend_object_iterator *iter TSRMLS_DC)
return FAILURE;
}
I->key++;
- if (php_com_safearray_get_elem(&I->safe_array, &I->v, (LONG)I->key TSRMLS_CC)) {
- return SUCCESS;
- } else {
+ if (php_com_safearray_get_elem(&I->safe_array, &I->v, (LONG)I->key TSRMLS_CC) == 0) {
I->key = (ulong)-1;
return FAILURE;
}
}
+
+ MAKE_STD_ZVAL(ptr);
+ php_com_zval_from_variant(ptr, &I->v, I->code_page TSRMLS_CC);
+ /* php_com_wrap_variant(ptr, &I->v, I->code_page TSRMLS_CC); */
+ I->zdata = ptr;
+ return SUCCESS;
}
@@ -140,7 +139,7 @@ static zend_object_iterator_funcs com_iter_funcs = {
NULL
};
-zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object TSRMLS_DC)
+zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC)
{
php_com_dotnet_object *obj;
struct php_com_iterator *I;
@@ -148,6 +147,11 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object TSRMLS
DISPPARAMS dp;
VARIANT v;
unsigned long n_fetched;
+ zval *ptr;
+
+ if (by_ref) {
+ zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
+ }
obj = CDNO_FETCH(object);
@@ -163,6 +167,7 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object TSRMLS
I->iter.funcs = &com_iter_funcs;
I->iter.data = I;
I->code_page = obj->code_page;
+ I->zdata = NULL;
VariantInit(&I->safe_array);
VariantInit(&I->v);
@@ -189,6 +194,9 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object TSRMLS
/* pre-fetch the element */
if (php_com_safearray_get_elem(&I->safe_array, &I->v, bound TSRMLS_CC)) {
I->key = bound;
+ MAKE_STD_ZVAL(ptr);
+ php_com_zval_from_variant(ptr, &I->v, I->code_page TSRMLS_CC);
+ I->zdata = ptr;
} else {
I->key = (ulong)-1;
}
@@ -220,6 +228,9 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object TSRMLS
if (SUCCEEDED(IEnumVARIANT_Next(I->ev, 1, &I->v, &n_fetched)) && n_fetched > 0) {
/* indicate that we have element 0 */
I->key = 0;
+ MAKE_STD_ZVAL(ptr);
+ php_com_zval_from_variant(ptr, &I->v, I->code_page TSRMLS_CC);
+ I->zdata = ptr;
} else {
/* indicate that there are no more items */
I->key = (ulong)-1;
diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c
index f9ae38ca95..8cc0c5e64b 100644
--- a/ext/com_dotnet/com_saproxy.c
+++ b/ext/com_dotnet/com_saproxy.c
@@ -554,12 +554,16 @@ static zend_object_iterator_funcs saproxy_iter_funcs = {
};
-zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *object TSRMLS_DC)
+zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC)
{
php_com_saproxy *proxy = SA_FETCH(object);
php_com_saproxy_iter *I;
int i;
+ if (by_ref) {
+ zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
+ }
+
I = ecalloc(1, sizeof(*I));
I->iter.funcs = &saproxy_iter_funcs;
I->iter.data = I;
diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h
index 4c442389f6..2cd0c2b960 100644
--- a/ext/com_dotnet/php_com_dotnet_internal.h
+++ b/ext/com_dotnet/php_com_dotnet_internal.h
@@ -82,7 +82,7 @@ zend_object_handlers php_com_object_handlers;
void php_com_object_enable_event_sink(php_com_dotnet_object *obj, int enable TSRMLS_DC);
/* com_saproxy.c */
-zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *object TSRMLS_DC);
+zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC);
int php_com_saproxy_create(zval *com_object, zval *proxy_out, zval *index TSRMLS_DC);
/* com_olechar.c */
@@ -177,7 +177,7 @@ ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj
int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int printdef, GUID *guid, int codepage TSRMLS_DC);
/* com_iterator.c */
-zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object TSRMLS_DC);
+zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC);
#endif