widl #38: modules
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Tue Feb 8 06:48:45 CST 2005
Huw Davies <huw at codeweavers.com>
Add support for modules.
--
Huw Davies
huw at codeweavers.com
--- tools/widl/write_msft.c 2005-02-08 12:37:01.782970000 +0000
+++ tools/widl/write_msft.c 2005-02-08 12:44:35.830057884 +0000
@@ -1166,15 +1166,25 @@ static HRESULT add_func_desc(msft_typein
char *namedata;
attr_t *attr;
unsigned int funcflags = 0, callconv = 4 /* CC_STDCALL */;
- unsigned int funckind = 1 /* FUNC_PUREVIRTUAL */, invokekind = 1 /* INVOKE_FUNC */;
+ unsigned int funckind, invokekind = 1 /* INVOKE_FUNC */;
int help_context = 0, help_string_context = 0, help_string_offset = -1;
+ int entry = -1, entry_is_ord = 0;
+
+ chat("add_func_desc(%p,%d)\n", typeinfo, index);
id = ((0x6000 | (typeinfo->typeinfo->datatype2 & 0xffff)) << 16) | index;
- if((typeinfo->typeinfo->typekind & 15) == TKIND_DISPATCH)
+ switch(typeinfo->typeinfo->typekind & 15) {
+ case TKIND_DISPATCH:
funckind = 0x4; /* FUNC_DISPATCH */
-
- chat("add_func_desc(%p,%d)\n", typeinfo, index);
+ break;
+ case TKIND_MODULE:
+ funckind = 0x3; /* FUNC_STATIC */
+ break;
+ default:
+ funckind = 0x1; /* FUNC_PUREVIRTUAL */
+ break;
+ }
for(attr = func->def->attrs; attr; attr = NEXT_LINK(attr)) {
if(attr->type == ATTR_LOCAL) {
@@ -1201,16 +1211,25 @@ static HRESULT add_func_desc(msft_typein
for(attr = func->def->attrs; attr; attr = NEXT_LINK(attr)) {
expr_t *expr = attr->u.pval;
switch(attr->type) {
+ case ATTR_ENTRY_ORDINAL:
+ extra_attr = max(extra_attr, 3);
+ entry = expr->cval;
+ entry_is_ord = 1;
+ break;
+ case ATTR_ENTRY_STRING:
+ extra_attr = max(extra_attr, 3);
+ entry = ctl2_alloc_string(typeinfo->typelib, attr->u.pval);
+ break;
case ATTR_HELPCONTEXT:
- extra_attr = 1;
+ extra_attr = max(extra_attr, 1);
help_context = expr->u.lval;
break;
case ATTR_HELPSTRING:
- extra_attr = 2;
+ extra_attr = max(extra_attr, 2);
help_string_offset = ctl2_alloc_string(typeinfo->typelib, attr->u.pval);
break;
case ATTR_HELPSTRINGCONTEXT:
- extra_attr = 6;
+ extra_attr = max(extra_attr, 6);
help_string_context = expr->u.lval;
break;
case ATTR_HIDDEN:
@@ -1304,6 +1323,7 @@ static HRESULT add_func_desc(msft_typein
typedata[3] = ((52 /*sizeof(FUNCDESC)*/ + decoded_size) << 16) | typeinfo->typeinfo->cbSizeVft;
typedata[4] = (next_idx << 16) | (callconv << 8) | (invokekind << 3) | funckind;
if(num_defaults) typedata[4] |= 0x1000;
+ if(entry_is_ord) typedata[4] |= 0x2000;
typedata[5] = num_params;
/* NOTE: High word of typedata[3] is total size of FUNCDESC + size of all ELEMDESCs for params + TYPEDESCs for pointer params and return types. */
@@ -1315,7 +1335,7 @@ static HRESULT add_func_desc(msft_typein
case 6: typedata[11] = help_string_context;
case 5: typedata[10] = -1;
case 4: typedata[9] = -1;
- case 3: typedata[8] = -1;
+ case 3: typedata[8] = entry;
case 2: typedata[7] = help_string_offset;
case 1: typedata[6] = help_context;
case 0:
@@ -1403,7 +1423,8 @@ static HRESULT add_func_desc(msft_typein
if(num_defaults) typeinfo->typeinfo->res3 += num_params * 0x4;
/* adjust size of VTBL */
- typeinfo->typeinfo->cbSizeVft += 4;
+ if(funckind != 0x3 /* FUNC_STATIC */)
+ typeinfo->typeinfo->cbSizeVft += 4;
/* Increment the number of function elements */
typeinfo->typeinfo->cElement += 1;
@@ -1411,8 +1432,13 @@ static HRESULT add_func_desc(msft_typein
namedata = typeinfo->typelib->typelib_segment_data[MSFT_SEG_NAME] + name_offset;
if (*((INT *)namedata) == -1) {
*((INT *)namedata) = typeinfo->typelib->typelib_typeinfo_offsets[typeinfo->typeinfo->typekind >> 16];
+ if((typeinfo->typeinfo->typekind & 15) == TKIND_MODULE)
+ namedata[9] |= 0x10;
+ } else
namedata[9] &= ~0x10;
- }
+
+ if((typeinfo->typeinfo->typekind & 15) == TKIND_MODULE)
+ namedata[9] |= 0x20;
if(invokekind != 0x4 /* INVOKE_PROPERTYPUT */ && invokekind != 0x8 /* INVOKE_PROPERTYPUTREF */) {
/* don't give the arg of a [propput*] func a name */
@@ -1613,6 +1639,15 @@ static msft_typeinfo_t *create_msft_type
for( ; attr; attr = NEXT_LINK(attr)) {
switch(attr->type) {
+ case ATTR_DISPINTERFACE:
+ break;
+
+ case ATTR_DLLNAME:
+ {
+ int offset = ctl2_alloc_string(typelib, attr->u.pval);
+ typeinfo->datatype1 = offset;
+ break;
+ }
case ATTR_HELPCONTEXT:
{
expr_t *expr = (expr_t*)attr->u.pval;
@@ -1752,7 +1787,7 @@ static void add_dispinterface_typeinfo(m
func = PREV_LINK(func);
}
}
-
+
static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface)
{
int idx = 0;
@@ -1941,6 +1976,28 @@ static void add_coclass_typeinfo(msft_ty
msft_typeinfo->typeinfo->typekind |= 0x2200;
}
+static void add_module_typeinfo(msft_typelib_t *typelib, type_t *module)
+{
+ int idx = 0;
+ func_t *func;
+ msft_typeinfo_t *msft_typeinfo;
+
+ module->typelib_idx = typelib->typelib_header.nrtypeinfos;
+ msft_typeinfo = create_msft_typeinfo(typelib, TKIND_MODULE, module->name, module->attrs,
+ typelib->typelib_header.nrtypeinfos);
+ msft_typeinfo->typeinfo->typekind |= 0x0a00;
+
+ if((func = module->funcs)) {
+ while(NEXT_LINK(func)) func = NEXT_LINK(func);
+ while(func) {
+ if(add_func_desc(msft_typeinfo, func, idx) == S_OK)
+ idx++;
+ func = PREV_LINK(func);
+ }
+ }
+ msft_typeinfo->typeinfo->size = idx;
+}
+
static void add_entry(msft_typelib_t *typelib, typelib_entry_t *entry)
{
switch(entry->kind) {
@@ -1964,6 +2021,10 @@ static void add_entry(msft_typelib_t *ty
add_coclass_typeinfo(typelib, entry->u.class);
break;
+ case TKIND_MODULE:
+ add_module_typeinfo(typelib, entry->u.module);
+ break;
+
default:
error("add_entry: unhandled type %d\n", entry->kind);
break;
More information about the wine-patches
mailing list