Type library creation, take 3, part 5 of 6

Nyef nyef at softhome.net
Sat Feb 7 06:12:10 CST 2004


Hello all.

This is the fifth of six patches covering my changes to the
type library creation code over the past fortnight.

This patch contains:

    Fixes and support for TypeInfo alignment values.

--Alastair Bridgewater
-------------- next part --------------
--- typelib2.c.last	2004-02-07 06:53:27.000000000 -0500
+++ typelib2.c	2004-02-07 06:53:30.000000000 -0500
@@ -1442,8 +1442,39 @@
         ICreateTypeInfo2* iface,
         WORD cbAlignment)
 {
-    FIXME("(%p,%d), stub!\n", iface, cbAlignment);
-    return E_OUTOFMEMORY;
+    ICOM_THIS(ICreateTypeInfo2Impl, iface);
+
+    TRACE("(%p,%d)\n", iface, cbAlignment);
+
+    if (!cbAlignment) return E_INVALIDARG;
+    if (cbAlignment > 16) return E_INVALIDARG;
+
+    This->typeinfo->typekind &= ~0xffc0;
+    This->typeinfo->typekind |= cbAlignment << 6;
+
+    /* FIXME: There's probably some way to simplify this. */
+    switch (This->typeinfo->typekind & 15) {
+    case TKIND_ALIAS:
+    default:
+	break;
+
+    case TKIND_ENUM:
+    case TKIND_INTERFACE:
+    case TKIND_DISPATCH:
+    case TKIND_COCLASS:
+	if (cbAlignment > 4) cbAlignment = 4;
+	break;
+
+    case TKIND_RECORD:
+    case TKIND_MODULE:
+    case TKIND_UNION:
+	cbAlignment = 1;
+	break;
+    }
+
+    This->typeinfo->typekind |= cbAlignment << 11;
+
+    return S_OK;
 }
 
 /******************************************************************************
@@ -2770,34 +2801,34 @@
 
     pCreateTypeInfo2Impl->typeinfo = typeinfo;
 
-    if (tkind == TKIND_ENUM) {
-	typeinfo->typekind |= TKIND_ENUM | 0x2120;
+    typeinfo->typekind |= tkind | 0x20;
+    ICreateTypeInfo2_SetAlignment((ICreateTypeInfo2 *)pCreateTypeInfo2Impl, 4);
+
+    switch (tkind) {
+    case TKIND_ENUM:
+    case TKIND_INTERFACE:
+    case TKIND_DISPATCH:
+    case TKIND_COCLASS:
 	typeinfo->size = 4;
-    } else if (tkind == TKIND_RECORD) {
-	typeinfo->typekind |= TKIND_RECORD | 0x0920;
+	break;
+
+    case TKIND_RECORD:
+    case TKIND_UNION:
 	typeinfo->size = 0;
-    } else if (tkind == TKIND_MODULE) {
-	typeinfo->typekind |= TKIND_MODULE | 0x0920;
+	break;
+
+    case TKIND_MODULE:
 	typeinfo->size = 2;
-    } else if (tkind == TKIND_INTERFACE) {
-	typeinfo->typekind |= TKIND_INTERFACE | 0x2120;
-	typeinfo->size = 4;
-    } else if (tkind == TKIND_DISPATCH) {
-	typeinfo->typekind |= TKIND_DISPATCH | 0x2120;
-	typeinfo->size = 4;
-    } else if (tkind == TKIND_COCLASS) {
-	typeinfo->typekind |= TKIND_COCLASS | 0x2120;
-	typeinfo->size = 4;
-    } else if (tkind == TKIND_ALIAS) {
-	typeinfo->typekind |= TKIND_ALIAS | 0x2120;
-	typeinfo->size = -0x75; /* ??? */
-    } else if (tkind == TKIND_UNION) {
-	typeinfo->typekind |= TKIND_UNION | 0x0920;
-	typeinfo->size = 0;
-    } else {
+	break;
+
+    case TKIND_ALIAS:
+	typeinfo->size = -0x75;
+	break;
+
+    default:
 	FIXME("(%s,%d), unrecognized typekind %d\n", debugstr_w(szName), tkind, tkind);
-	typeinfo->typekind |= tkind;
 	typeinfo->size = 0xdeadbeef;
+	break;
     }
 
     if (typelib->last_typeinfo) typelib->last_typeinfo->next_typeinfo = pCreateTypeInfo2Impl;


More information about the wine-patches mailing list