]> granicus.if.org Git - php/commitdiff
com_*() functions returned an oo-resource instead of an resource id,
authorHarald Radi <phanto@php.net>
Sat, 8 Sep 2001 20:40:56 +0000 (20:40 +0000)
committerHarald Radi <phanto@php.net>
Sat, 8 Sep 2001 20:40:56 +0000 (20:40 +0000)
thus subsequent com_*() calls to com-returnvalues failed.

ext/com/COM.c
ext/com/variant.h
ext/rpc/com/com_wrapper.c
ext/rpc/com/variant.h

index f82602fb12c275ffe930c6dd64eb566e98f48da3..fda0b948dabe07cdcbece0b4d48f7e7e69dcbcdf 100644 (file)
@@ -804,9 +804,8 @@ PHP_FUNCTION(com_invoke)
                RETURN_FALSE;
        }
 
-       php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
+       RETVAL_VARIANT(var_result);
 
-       FREE_VARIANT(var_result);
        efree(arguments);
 }
 /* }}} */
@@ -1049,9 +1048,7 @@ PHP_FUNCTION(com_propget)
                RETURN_FALSE;
        }
 
-       php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
-
-       FREE_VARIANT(var_result);
+       RETVAL_VARIANT(var_result);
 }
 /* }}} */
 
@@ -1201,8 +1198,7 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
                pval_destructor(&overloaded_property->element);
        }
 
-       if (obj_prop != NULL)
-       {
+       if (obj_prop != NULL) {
                RETVAL_COM(obj);
        }
 
index ce5b4e66ae959714a091a3fc81c3ea26600f2540..3fd11f32e47135265eee6947ebafadf7bfce5597 100644 (file)
@@ -3,15 +3,30 @@
 
 #if PHP_WIN32
 
-#define ALLOC_VARIANT(v)       (v) = (VARIANT *) emalloc(sizeof(VARIANT));             \
+#define ALLOC_VARIANT(v)       (v) = (VARIANT *) emalloc(sizeof(VARIANT));                                     \
                                                        VariantInit(v);
 
-#define FREE_VARIANT(v)                VariantClear(v);                                                                \
+#define FREE_VARIANT(v)                VariantClear(v);                                                                                        \
                                                        efree(v);
 
 
 #define IS_VARIANT                     php_VARIANT_get_le_variant()
 
+#define ZVAL_VARIANT(z, v)             if (V_VT(v) == VT_DISPATCH) {                                                   \
+                                                                       comval *obj;                                                                            \
+                                                                       ALLOC_COM(obj);                                                                         \
+                                                                       php_COM_set(obj, &V_DISPATCH(v), TRUE TSRMLS_CC);       \
+                                                                       ZVAL_LONG((z), zend_list_insert(obj, IS_COM));          \
+                                                               } else {                                                                                                \
+                                                                       php_variant_to_pval((v), (z), codepage TSRMLS_CC);      \
+                                                                       FREE_VARIANT(v);                                                                        \
+                                                               }
+
+#define RETVAL_VARIANT(v)      ZVAL_VARIANT(return_value, (v));
+#define RETURN_VARIANT(v)      RETVAL_VARIANT(v)                                                                                       \
+                                                       return;
+
+
 #endif  /* PHP_WIN32 */
 
 #endif  /* VARIANT_H */
index f82602fb12c275ffe930c6dd64eb566e98f48da3..fda0b948dabe07cdcbece0b4d48f7e7e69dcbcdf 100644 (file)
@@ -804,9 +804,8 @@ PHP_FUNCTION(com_invoke)
                RETURN_FALSE;
        }
 
-       php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
+       RETVAL_VARIANT(var_result);
 
-       FREE_VARIANT(var_result);
        efree(arguments);
 }
 /* }}} */
@@ -1049,9 +1048,7 @@ PHP_FUNCTION(com_propget)
                RETURN_FALSE;
        }
 
-       php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
-
-       FREE_VARIANT(var_result);
+       RETVAL_VARIANT(var_result);
 }
 /* }}} */
 
@@ -1201,8 +1198,7 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
                pval_destructor(&overloaded_property->element);
        }
 
-       if (obj_prop != NULL)
-       {
+       if (obj_prop != NULL) {
                RETVAL_COM(obj);
        }
 
index ce5b4e66ae959714a091a3fc81c3ea26600f2540..3fd11f32e47135265eee6947ebafadf7bfce5597 100644 (file)
@@ -3,15 +3,30 @@
 
 #if PHP_WIN32
 
-#define ALLOC_VARIANT(v)       (v) = (VARIANT *) emalloc(sizeof(VARIANT));             \
+#define ALLOC_VARIANT(v)       (v) = (VARIANT *) emalloc(sizeof(VARIANT));                                     \
                                                        VariantInit(v);
 
-#define FREE_VARIANT(v)                VariantClear(v);                                                                \
+#define FREE_VARIANT(v)                VariantClear(v);                                                                                        \
                                                        efree(v);
 
 
 #define IS_VARIANT                     php_VARIANT_get_le_variant()
 
+#define ZVAL_VARIANT(z, v)             if (V_VT(v) == VT_DISPATCH) {                                                   \
+                                                                       comval *obj;                                                                            \
+                                                                       ALLOC_COM(obj);                                                                         \
+                                                                       php_COM_set(obj, &V_DISPATCH(v), TRUE TSRMLS_CC);       \
+                                                                       ZVAL_LONG((z), zend_list_insert(obj, IS_COM));          \
+                                                               } else {                                                                                                \
+                                                                       php_variant_to_pval((v), (z), codepage TSRMLS_CC);      \
+                                                                       FREE_VARIANT(v);                                                                        \
+                                                               }
+
+#define RETVAL_VARIANT(v)      ZVAL_VARIANT(return_value, (v));
+#define RETURN_VARIANT(v)      RETVAL_VARIANT(v)                                                                                       \
+                                                       return;
+
+
 #endif  /* PHP_WIN32 */
 
 #endif  /* VARIANT_H */