diff options
author | Harald Radi <phanto@php.net> | 2002-05-02 13:41:30 +0000 |
---|---|---|
committer | Harald Radi <phanto@php.net> | 2002-05-02 13:41:30 +0000 |
commit | 5771743122bef3d113ba12a605333d41aec8057b (patch) | |
tree | ccac2b4eee6b99a3d7ef2885db80c1502b40fff0 | |
parent | dbe6bdca919ff6b9380e9e6636912e37f9f4fe83 (diff) | |
download | php-git-5771743122bef3d113ba12a605333d41aec8057b.tar.gz |
MFH
-rw-r--r-- | ext/com/COM.c | 39 | ||||
-rw-r--r-- | ext/rpc/com/com_wrapper.c | 39 |
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); } |