summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/com/COM.c18
-rw-r--r--ext/com/com.h10
-rw-r--r--ext/com/conversion.c5
-rw-r--r--ext/rpc/com/com_wrapper.c18
-rw-r--r--ext/rpc/com/com_wrapper.h10
-rw-r--r--ext/rpc/com/conversion.c5
6 files changed, 26 insertions, 40 deletions
diff --git a/ext/com/COM.c b/ext/com/COM.c
index f8149faf7c..2e57eb1bd6 100644
--- a/ext/com/COM.c
+++ b/ext/com/COM.c
@@ -1427,25 +1427,13 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
PHPAPI zval *php_COM_object_from_dispatch(IDispatch *disp, zval *val TSRMLS_DC)
{
comval *obj;
- long rid;
zval *zobj;
ALLOC_COM(obj);
- C_DISPATCH(obj) = disp;
- php_COM_set(obj, &C_DISPATCH(obj), FALSE TSRMLS_CC);
-
- /* resource */
- rid = zend_list_insert(obj, IS_COM);
-
- if (val == NULL)
- MAKE_STD_ZVAL(val);
- ZVAL_RESOURCE(val, rid);
-
- /* now we want an object */
MAKE_STD_ZVAL(zobj);
- object_init_ex(zobj, &COM_class_entry);
- zend_hash_index_update(Z_OBJPROP_P(zobj), 0, &val, sizeof(zval *), NULL);
-
+ php_COM_set(obj, &disp, FALSE TSRMLS_CC);
+ ZVAL_COM_EX(zobj, obj, val);
+
return zobj;
}
diff --git a/ext/com/com.h b/ext/com/com.h
index 62d08c3acd..2930f86fd9 100644
--- a/ext/com/com.h
+++ b/ext/com/com.h
@@ -24,13 +24,19 @@ typedef struct comval_ {
END_EXTERN_C()
#define ZVAL_COM(z,o) { \
- zval *handle; \
+ zval *handle = NULL; \
+ ZVAL_COM_EX(z,o,handle) \
+ }
+
+#define ZVAL_COM_EX(z,o,handle) { \
HashTable *properties; \
\
ALLOC_HASHTABLE(properties); \
zend_hash_init(properties, 0, NULL, ZVAL_PTR_DTOR, 0); \
\
- MAKE_STD_ZVAL(handle); \
+ if (handle == NULL) { \
+ MAKE_STD_ZVAL(handle); \
+ } \
ZVAL_LONG(handle, zend_list_insert((o), IS_COM)); \
\
zval_copy_ctor(handle); \
diff --git a/ext/com/conversion.c b/ext/com/conversion.c
index 130885edd9..c9e4f89414 100644
--- a/ext/com/conversion.c
+++ b/ext/com/conversion.c
@@ -56,8 +56,6 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage T
case IS_OBJECT:
if (!strcmp(Z_OBJCE_P(pval_arg)->name, "VARIANT")) {
type = VT_VARIANT|VT_BYREF;
- } else if (!strcmp(Z_OBJCE_P(pval_arg)->name, "COM")) {
- type = VT_DISPATCH;
} else {
type = VT_DISPATCH;
}
@@ -275,8 +273,9 @@ PHPAPI void php_pval_to_variant_ex2(pval *pval_arg, VARIANT *var_arg, int type,
comval_to_variant(pval_arg, var_arg TSRMLS_CC);
} else {
V_DISPATCH(var_arg) = php_COM_export_object(pval_arg TSRMLS_CC);
- if (V_DISPATCH(var_arg))
+ if (V_DISPATCH(var_arg)) {
V_VT(var_arg) = VT_DISPATCH;
+ }
}
if (V_VT(var_arg) != VT_DISPATCH) {
VariantInit(var_arg);
diff --git a/ext/rpc/com/com_wrapper.c b/ext/rpc/com/com_wrapper.c
index f8149faf7c..2e57eb1bd6 100644
--- a/ext/rpc/com/com_wrapper.c
+++ b/ext/rpc/com/com_wrapper.c
@@ -1427,25 +1427,13 @@ PHPAPI int php_COM_set_property_handler(zend_property_reference *property_refere
PHPAPI zval *php_COM_object_from_dispatch(IDispatch *disp, zval *val TSRMLS_DC)
{
comval *obj;
- long rid;
zval *zobj;
ALLOC_COM(obj);
- C_DISPATCH(obj) = disp;
- php_COM_set(obj, &C_DISPATCH(obj), FALSE TSRMLS_CC);
-
- /* resource */
- rid = zend_list_insert(obj, IS_COM);
-
- if (val == NULL)
- MAKE_STD_ZVAL(val);
- ZVAL_RESOURCE(val, rid);
-
- /* now we want an object */
MAKE_STD_ZVAL(zobj);
- object_init_ex(zobj, &COM_class_entry);
- zend_hash_index_update(Z_OBJPROP_P(zobj), 0, &val, sizeof(zval *), NULL);
-
+ php_COM_set(obj, &disp, FALSE TSRMLS_CC);
+ ZVAL_COM_EX(zobj, obj, val);
+
return zobj;
}
diff --git a/ext/rpc/com/com_wrapper.h b/ext/rpc/com/com_wrapper.h
index 62d08c3acd..2930f86fd9 100644
--- a/ext/rpc/com/com_wrapper.h
+++ b/ext/rpc/com/com_wrapper.h
@@ -24,13 +24,19 @@ typedef struct comval_ {
END_EXTERN_C()
#define ZVAL_COM(z,o) { \
- zval *handle; \
+ zval *handle = NULL; \
+ ZVAL_COM_EX(z,o,handle) \
+ }
+
+#define ZVAL_COM_EX(z,o,handle) { \
HashTable *properties; \
\
ALLOC_HASHTABLE(properties); \
zend_hash_init(properties, 0, NULL, ZVAL_PTR_DTOR, 0); \
\
- MAKE_STD_ZVAL(handle); \
+ if (handle == NULL) { \
+ MAKE_STD_ZVAL(handle); \
+ } \
ZVAL_LONG(handle, zend_list_insert((o), IS_COM)); \
\
zval_copy_ctor(handle); \
diff --git a/ext/rpc/com/conversion.c b/ext/rpc/com/conversion.c
index 130885edd9..c9e4f89414 100644
--- a/ext/rpc/com/conversion.c
+++ b/ext/rpc/com/conversion.c
@@ -56,8 +56,6 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage T
case IS_OBJECT:
if (!strcmp(Z_OBJCE_P(pval_arg)->name, "VARIANT")) {
type = VT_VARIANT|VT_BYREF;
- } else if (!strcmp(Z_OBJCE_P(pval_arg)->name, "COM")) {
- type = VT_DISPATCH;
} else {
type = VT_DISPATCH;
}
@@ -275,8 +273,9 @@ PHPAPI void php_pval_to_variant_ex2(pval *pval_arg, VARIANT *var_arg, int type,
comval_to_variant(pval_arg, var_arg TSRMLS_CC);
} else {
V_DISPATCH(var_arg) = php_COM_export_object(pval_arg TSRMLS_CC);
- if (V_DISPATCH(var_arg))
+ if (V_DISPATCH(var_arg)) {
V_VT(var_arg) = VT_DISPATCH;
+ }
}
if (V_VT(var_arg) != VT_DISPATCH) {
VariantInit(var_arg);