summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/com/COM.c10
-rw-r--r--ext/com/variant.h19
-rw-r--r--ext/rpc/com/com_wrapper.c10
-rw-r--r--ext/rpc/com/variant.h19
4 files changed, 40 insertions, 18 deletions
diff --git a/ext/com/COM.c b/ext/com/COM.c
index f82602fb12..fda0b948da 100644
--- a/ext/com/COM.c
+++ b/ext/com/COM.c
@@ -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);
}
diff --git a/ext/com/variant.h b/ext/com/variant.h
index ce5b4e66ae..3fd11f32e4 100644
--- a/ext/com/variant.h
+++ b/ext/com/variant.h
@@ -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 */
diff --git a/ext/rpc/com/com_wrapper.c b/ext/rpc/com/com_wrapper.c
index f82602fb12..fda0b948da 100644
--- a/ext/rpc/com/com_wrapper.c
+++ b/ext/rpc/com/com_wrapper.c
@@ -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);
}
diff --git a/ext/rpc/com/variant.h b/ext/rpc/com/variant.h
index ce5b4e66ae..3fd11f32e4 100644
--- a/ext/rpc/com/variant.h
+++ b/ext/rpc/com/variant.h
@@ -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 */