summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarald Radi <phanto@php.net>2002-05-02 13:41:30 +0000
committerHarald Radi <phanto@php.net>2002-05-02 13:41:30 +0000
commit5771743122bef3d113ba12a605333d41aec8057b (patch)
treeccac2b4eee6b99a3d7ef2885db80c1502b40fff0
parentdbe6bdca919ff6b9380e9e6636912e37f9f4fe83 (diff)
downloadphp-git-5771743122bef3d113ba12a605333d41aec8057b.tar.gz
MFH
-rw-r--r--ext/com/COM.c39
-rw-r--r--ext/rpc/com/com_wrapper.c39
2 files changed, 44 insertions, 34 deletions
diff --git a/ext/com/COM.c b/ext/com/COM.c
index 4abd400462..cb42bfc4f7 100644
--- a/ext/com/COM.c
+++ b/ext/com/COM.c
@@ -1439,34 +1439,38 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
pval *object_handle;
PHP_FN(com_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
- if (!zend_is_true(return_value)) {
- ZVAL_FALSE(object);
- return;
+ if (zend_is_true(return_value)) {
+ ALLOC_ZVAL(object_handle);
+ *object_handle = *return_value;
+ pval_copy_constructor(object_handle);
+ INIT_PZVAL(object_handle);
+ zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
+ pval_destructor(&function_name->element);
+ } else {
+ ZVAL_NULL(object);
}
- ALLOC_ZVAL(object_handle);
- *object_handle = *return_value;
- pval_copy_constructor(object_handle);
- INIT_PZVAL(object_handle);
- zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
- pval_destructor(&function_name->element);
return;
}
+ RETVAL_NULL();
property = php_COM_get_property_handler(property_reference);
- if (Z_TYPE(property) == IS_NULL) {
- if (property.refcount == 1) {
- pval_destructor(&property);
- }
+
+ if (Z_TYPE(property) != IS_OBJECT) {
+ pval_destructor(&property);
pval_destructor(&function_name->element);
+
+ /* error message - function call on a non-object */
return;
}
+
zend_hash_index_find(Z_OBJPROP(property), 0, (void **) &handle);
obj = (comval *)zend_list_find(Z_LVAL_PP(handle), &type);
if (!obj || (type != IS_COM)) {
pval_destructor(&property);
pval_destructor(&function_name->element);
+
return;
}
@@ -1486,9 +1490,7 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
arguments = (pval **) emalloc(sizeof(pval *)*arg_count);
zend_get_parameters_array(ht, arg_count, arguments);
- if (do_COM_invoke(obj , &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == FAILURE) {
- RETVAL_FALSE;
- } else {
+ if (do_COM_invoke(obj , &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == SUCCESS) {
php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
}
@@ -1496,9 +1498,12 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
efree(arguments);
}
- if (property.refcount == 1) {
+ if (zend_llist_count(property_reference->elements_list) > 1) {
+ /* destruct temporary object */
+ zend_list_delete(Z_LVAL_PP(handle));
pval_destructor(&property);
}
+
pval_destructor(&function_name->element);
}
diff --git a/ext/rpc/com/com_wrapper.c b/ext/rpc/com/com_wrapper.c
index 4abd400462..cb42bfc4f7 100644
--- a/ext/rpc/com/com_wrapper.c
+++ b/ext/rpc/com/com_wrapper.c
@@ -1439,34 +1439,38 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
pval *object_handle;
PHP_FN(com_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
- if (!zend_is_true(return_value)) {
- ZVAL_FALSE(object);
- return;
+ if (zend_is_true(return_value)) {
+ ALLOC_ZVAL(object_handle);
+ *object_handle = *return_value;
+ pval_copy_constructor(object_handle);
+ INIT_PZVAL(object_handle);
+ zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
+ pval_destructor(&function_name->element);
+ } else {
+ ZVAL_NULL(object);
}
- ALLOC_ZVAL(object_handle);
- *object_handle = *return_value;
- pval_copy_constructor(object_handle);
- INIT_PZVAL(object_handle);
- zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
- pval_destructor(&function_name->element);
return;
}
+ RETVAL_NULL();
property = php_COM_get_property_handler(property_reference);
- if (Z_TYPE(property) == IS_NULL) {
- if (property.refcount == 1) {
- pval_destructor(&property);
- }
+
+ if (Z_TYPE(property) != IS_OBJECT) {
+ pval_destructor(&property);
pval_destructor(&function_name->element);
+
+ /* error message - function call on a non-object */
return;
}
+
zend_hash_index_find(Z_OBJPROP(property), 0, (void **) &handle);
obj = (comval *)zend_list_find(Z_LVAL_PP(handle), &type);
if (!obj || (type != IS_COM)) {
pval_destructor(&property);
pval_destructor(&function_name->element);
+
return;
}
@@ -1486,9 +1490,7 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
arguments = (pval **) emalloc(sizeof(pval *)*arg_count);
zend_get_parameters_array(ht, arg_count, arguments);
- if (do_COM_invoke(obj , &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == FAILURE) {
- RETVAL_FALSE;
- } else {
+ if (do_COM_invoke(obj , &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == SUCCESS) {
php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
}
@@ -1496,9 +1498,12 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
efree(arguments);
}
- if (property.refcount == 1) {
+ if (zend_llist_count(property_reference->elements_list) > 1) {
+ /* destruct temporary object */
+ zend_list_delete(Z_LVAL_PP(handle));
pval_destructor(&property);
}
+
pval_destructor(&function_name->element);
}