Robert Shearman : oleaut:
Rename SLTG_DoType to SLTG_DoElem and split out the common TYPEDESC
generating code to SLTG_DoType .
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jul 6 06:08:43 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 23e089a09fba1f05b4c33dbbbf90f64c5ac01f51
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=23e089a09fba1f05b4c33dbbbf90f64c5ac01f51
Author: Robert Shearman <rob at codeweavers.com>
Date: Mon Jul 3 13:53:52 2006 +0100
oleaut: Rename SLTG_DoType to SLTG_DoElem and split out the common TYPEDESC generating code to SLTG_DoType.
Process SLTG alias types with SLTG_DoType as the data is stored in the
same format as in other components of the typelib.
---
dlls/oleaut32/typelib.c | 76 +++++++++++++++++++----------------------------
dlls/oleaut32/typelib.h | 8 -----
2 files changed, 31 insertions(+), 53 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index a72bff5..61a8266 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -2635,26 +2635,9 @@ static DWORD SLTG_ReadLibBlk(LPVOID pLib
return ptr - (char*)pLibBlk;
}
-static WORD *SLTG_DoType(WORD *pType, char *pBlk, ELEMDESC *pElem)
+static WORD *SLTG_DoType(WORD *pType, char *pBlk, TYPEDESC *pTD)
{
BOOL done = FALSE;
- TYPEDESC *pTD = &pElem->tdesc;
-
- /* Handle [in/out] first */
- if((*pType & 0xc000) == 0xc000)
- pElem->u.paramdesc.wParamFlags = PARAMFLAG_NONE;
- else if(*pType & 0x8000)
- pElem->u.paramdesc.wParamFlags = PARAMFLAG_FIN | PARAMFLAG_FOUT;
- else if(*pType & 0x4000)
- pElem->u.paramdesc.wParamFlags = PARAMFLAG_FOUT;
- else
- pElem->u.paramdesc.wParamFlags = PARAMFLAG_FIN;
-
- if(*pType & 0x2000)
- pElem->u.paramdesc.wParamFlags |= PARAMFLAG_FLCID;
-
- if(*pType & 0x80)
- pElem->u.paramdesc.wParamFlags |= PARAMFLAG_FRETVAL;
while(!done) {
if((*pType & 0xe00) == 0xe00) {
@@ -2718,6 +2701,27 @@ static WORD *SLTG_DoType(WORD *pType, ch
return pType;
}
+static WORD *SLTG_DoElem(WORD *pType, char *pBlk, ELEMDESC *pElem)
+{
+ /* Handle [in/out] first */
+ if((*pType & 0xc000) == 0xc000)
+ pElem->u.paramdesc.wParamFlags = PARAMFLAG_NONE;
+ else if(*pType & 0x8000)
+ pElem->u.paramdesc.wParamFlags = PARAMFLAG_FIN | PARAMFLAG_FOUT;
+ else if(*pType & 0x4000)
+ pElem->u.paramdesc.wParamFlags = PARAMFLAG_FOUT;
+ else
+ pElem->u.paramdesc.wParamFlags = PARAMFLAG_FIN;
+
+ if(*pType & 0x2000)
+ pElem->u.paramdesc.wParamFlags |= PARAMFLAG_FLCID;
+
+ if(*pType & 0x80)
+ pElem->u.paramdesc.wParamFlags |= PARAMFLAG_FRETVAL;
+
+ return SLTG_DoType(pType, pBlk, &pElem->tdesc);
+}
+
static void SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeInfoImpl *pTI,
char *pNameTable)
@@ -2889,7 +2893,7 @@ static void SLTG_ProcessInterface(char *
pType = (WORD*)(pFirstItem + pFunc->rettype);
- SLTG_DoType(pType, pFirstItem, &(*ppFuncDesc)->funcdesc.elemdescFunc);
+ SLTG_DoElem(pType, pFirstItem, &(*ppFuncDesc)->funcdesc.elemdescFunc);
(*ppFuncDesc)->funcdesc.lprgelemdescParam =
HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
@@ -2926,13 +2930,13 @@ static void SLTG_ProcessInterface(char *
if(HaveOffs) { /* the next word is an offset to type */
pType = (WORD*)(pFirstItem + *pArg);
- SLTG_DoType(pType, pFirstItem,
+ SLTG_DoElem(pType, pFirstItem,
&(*ppFuncDesc)->funcdesc.lprgelemdescParam[param]);
pArg++;
} else {
if(paramName)
paramName--;
- pArg = SLTG_DoType(pArg, pFirstItem,
+ pArg = SLTG_DoElem(pArg, pFirstItem,
&(*ppFuncDesc)->funcdesc.lprgelemdescParam[param]);
}
@@ -2989,7 +2993,7 @@ static void SLTG_ProcessRecord(char *pBl
break;
}
- SLTG_DoType(pType, pFirstItem,
+ SLTG_DoElem(pType, pFirstItem,
&(*ppVarDesc)->vardesc.elemdescVar);
/* FIXME("helpcontext, helpstring\n"); */
@@ -3006,8 +3010,7 @@ static void SLTG_ProcessAlias(char *pBlk
char *pNameTable, SLTG_TypeInfoHeader *pTIHeader,
SLTG_TypeInfoTail *pTITail)
{
- SLTG_AliasItem *pItem;
- TYPEDESC *tdesc = &pTI->TypeAttr.tdescAlias;
+ WORD *pType;
if (pTITail->simple_alias) {
/* if simple alias, no more processing required */
@@ -3015,27 +3018,10 @@ static void SLTG_ProcessAlias(char *pBlk
return;
}
- /* otherwise it is an offset */
- pItem = (SLTG_AliasItem *)(pBlk + pTITail->tdescalias_vt);
-
- /* This is used for creating a TYPEDESC chain in case of VT_USERDEFINED */
- while (TRUE) {
- if (pItem->flags != 0)
- FIXME("unknown flag(s) 0x%x for type 0x%x\n", pItem->flags, pItem->vt);
-
- if (pItem->vt == VT_USERDEFINED) {
- tdesc->vt = pItem->vt;
- /* guessing here ... */
- pItem++;
- tdesc->u.hreftype = *(WORD *)pItem;
- pItem = (SLTG_AliasItem *)((char *)pItem + sizeof(WORD));
- FIXME("Guessing TKIND_ALIAS of VT_USERDEFINED with hreftype 0x%lx\n", tdesc->u.hreftype);
- break;
- } else {
- FIXME("unhandled alias vt 0x%x\n", pItem->vt);
- break;
- }
- }
+ /* otherwise it is an offset to a type */
+ pType = (WORD *)(pBlk + pTITail->tdescalias_vt);
+
+ SLTG_DoType(pType, pBlk, &pTI->TypeAttr.tdescAlias);
}
static void SLTG_ProcessDispatch(char *pBlk, ITypeInfoImpl *pTI,
diff --git a/dlls/oleaut32/typelib.h b/dlls/oleaut32/typelib.h
index ca0fb26..9c91011 100644
--- a/dlls/oleaut32/typelib.h
+++ b/dlls/oleaut32/typelib.h
@@ -477,14 +477,6 @@ typedef struct {
#define SLTG_ENUMITEM_MAGIC 0x120a
typedef struct {
-/*00*/ BYTE vt; /* vartype */
-/*01*/ BYTE flags; /* unknown flags */
-} SLTG_AliasItem;
-
-#define SLTG_ALIASITEM_MAGIC 0x001d
-
-
-typedef struct {
BYTE magic; /* 0x4c or 0x6c */
BYTE inv; /* high nibble is INVOKE_KIND, low nibble = 2 */
WORD next; /* byte offset from beginning of group to next fn */
More information about the wine-cvs
mailing list