PATCH: VT_DISPATCH / VT_UNKNOWN Coercion
Marcus Meissner
marcus at jet.franken.de
Sat Jan 11 05:54:48 CST 2003
Hi,
Some Coerce fixes. I checked the VT_DISPATCH and VT_UNKNOWN cases with
some very hacky testcases against the native implementation.
Ciao, Marcus
Changelog:
Coerce VT_UNKNOWN <-> VT_DISPATCH, NULL is valid in these cases.
Drop VT_x -> VT_x coercions, they are handled before the switch()
already.
Index: dlls/oleaut32/variant.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
retrieving revision 1.53
diff -u -u -r1.53 variant.c
--- dlls/oleaut32/variant.c 7 Jan 2003 20:36:24 -0000 1.53
+++ dlls/oleaut32/variant.c 11 Jan 2003 11:51:08 -0000
@@ -1029,9 +1029,7 @@
/* Trivial Case: If the coercion is from two types that are
* identical then we can blindly copy from one argument to another.*/
if ((vt==vtFrom))
- {
return VariantCopy(pd,ps);
- }
/* Cases requiring thought*/
switch( vt )
@@ -1050,9 +1048,6 @@
case( VT_I1 ):
switch( vtFrom )
{
- case( VT_I1 ):
- res = VariantCopy( pd, ps );
- break;
case( VT_I2 ):
res = VarI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,cVal) );
break;
@@ -1095,7 +1090,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_I1\n", vtFrom );
break;
}
break;
@@ -1106,9 +1101,6 @@
case( VT_I1 ):
res = VarI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,iVal) );
break;
- case( VT_I2 ):
- res = VariantCopy( pd, ps );
- break;
case( VT_INT ):
case( VT_I4 ):
res = VarI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,iVal) );
@@ -1148,7 +1140,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_I2\n", vtFrom);
break;
}
break;
@@ -1211,7 +1203,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_INT/VT_I4\n", vtFrom);
break;
}
break;
@@ -1264,7 +1256,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_UI1\n", vtFrom);
break;
}
break;
@@ -1317,7 +1309,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_UI2\n", vtFrom);
break;
}
break;
@@ -1370,7 +1362,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_UINT/VT_UI4\n", vtFrom);
break;
}
break;
@@ -1427,7 +1419,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_R4\n", vtFrom);
break;
}
break;
@@ -1480,7 +1472,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_R8\n", vtFrom);
break;
}
break;
@@ -1518,9 +1510,6 @@
case( VT_R8 ):
res = VarDateFromR8( V_UNION(ps,dblVal), &V_UNION(pd,date) );
break;
- case( VT_DATE ):
- res = VariantCopy( pd, ps );
- break;
case( VT_BOOL ):
res = VarDateFromBool( V_UNION(ps,boolVal), &V_UNION(pd,date) );
break;
@@ -1537,7 +1526,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_DATE\n", vtFrom);
break;
}
break;
@@ -1582,9 +1571,6 @@
case( VT_DATE ):
res = VarBoolFromDate( V_UNION(ps,date), &V_UNION(pd,boolVal) );
break;
- case( VT_BOOL ):
- res = VariantCopy( pd, ps );
- break;
case( VT_BSTR ):
res = VarBoolFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,boolVal) );
break;
@@ -1598,7 +1584,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_BOOL\n", vtFrom);
break;
}
break;
@@ -1661,7 +1647,7 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_BSTR\n", vtFrom);
break;
}
break;
@@ -1719,20 +1705,66 @@
case( VT_UNKNOWN ):
default:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ FIXME("Coercion from %d to VT_CY\n", vtFrom);
break;
}
break;
case( VT_UNKNOWN ):
- if (vtFrom == VT_DISPATCH)
- {
- res = IDispatch_QueryInterface(V_DISPATCH(ps), &IID_IUnknown, (LPVOID*)&V_UNKNOWN(pd));
+ switch (vtFrom) {
+ case VT_DISPATCH:
+ if (V_DISPATCH(ps) == NULL) {
+ V_UNKNOWN(pd) = NULL;
+ } else {
+ res = IDispatch_QueryInterface(V_DISPATCH(ps), &IID_IUnknown, (LPVOID*)&V_UNKNOWN(pd));
+ }
+ break;
+ case VT_EMPTY: case VT_NULL: case VT_I2: case VT_I4:
+ case VT_R4: case VT_R8: case VT_CY: case VT_DATE:
+ case VT_BSTR: case VT_ERROR: case VT_BOOL:
+ case VT_VARIANT: case VT_DECIMAL: case VT_I1: case VT_UI1:
+ case VT_UI2: case VT_UI4: case VT_I8: case VT_UI8: case VT_INT:
+ case VT_UINT: case VT_VOID: case VT_HRESULT: case VT_PTR:
+ case VT_SAFEARRAY: case VT_CARRAY: case VT_USERDEFINED:
+ case VT_LPSTR: case VT_LPWSTR: case VT_RECORD: case VT_FILETIME:
+ case VT_BLOB: case VT_STREAM: case VT_STORAGE:
+ case VT_STREAMED_OBJECT: case VT_STORED_OBJECT: case VT_BLOB_OBJECT:
+ case VT_CF: case VT_CLSID:
+ res = DISP_E_TYPEMISMATCH;
+ break;
+ default:
+ FIXME("Coercion from %d to VT_UNKNOWN unhandled.\n", vtFrom);
+ res = DISP_E_BADVARTYPE;
+ break;
}
- else
- {
+ break;
+
+ case( VT_DISPATCH ):
+ switch (vtFrom) {
+ case VT_UNKNOWN:
+ if (V_UNION(ps,punkVal) == NULL) {
+ V_UNION(pd,pdispVal) = NULL;
+ } else {
+ res = IUnknown_QueryInterface(V_UNION(ps,punkVal), &IID_IDispatch, (LPVOID*)&V_UNION(pd,pdispVal));
+ }
+ break;
+ case VT_EMPTY: case VT_NULL: case VT_I2: case VT_I4:
+ case VT_R4: case VT_R8: case VT_CY: case VT_DATE:
+ case VT_BSTR: case VT_ERROR: case VT_BOOL:
+ case VT_VARIANT: case VT_DECIMAL: case VT_I1: case VT_UI1:
+ case VT_UI2: case VT_UI4: case VT_I8: case VT_UI8: case VT_INT:
+ case VT_UINT: case VT_VOID: case VT_HRESULT: case VT_PTR:
+ case VT_SAFEARRAY: case VT_CARRAY: case VT_USERDEFINED:
+ case VT_LPSTR: case VT_LPWSTR: case VT_RECORD: case VT_FILETIME:
+ case VT_BLOB: case VT_STREAM: case VT_STORAGE:
+ case VT_STREAMED_OBJECT: case VT_STORED_OBJECT: case VT_BLOB_OBJECT:
+ case VT_CF: case VT_CLSID:
res = DISP_E_TYPEMISMATCH;
- FIXME("Coercion from %d to %d\n", vtFrom, vt );
+ break;
+ default:
+ FIXME("Coercion from %d to VT_DISPATCH unhandled.\n", vtFrom);
+ res = DISP_E_BADVARTYPE;
+ break;
}
break;
More information about the wine-patches
mailing list