Rob Shearman : widl: Write the typelib based on the statement list generated in the typelib_t object instead of using hooks in the parser code .

Alexandre Julliard julliard at winehq.org
Mon Dec 29 08:48:02 CST 2008


Module: wine
Branch: master
Commit: 5223d04a7ccf204e2976eae0dfe6cf006ba30c50
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5223d04a7ccf204e2976eae0dfe6cf006ba30c50

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Mon Dec 29 12:06:06 2008 +0000

widl: Write the typelib based on the statement list generated in the typelib_t object instead of using hooks in the parser code.

---

 tools/widl/parser.y     |   25 ++++------------
 tools/widl/typelib.c    |   15 ---------
 tools/widl/typelib.h    |    2 -
 tools/widl/widltypes.h  |    1 -
 tools/widl/write_msft.c |   73 +++++++++++++++++++++++++++++------------------
 5 files changed, 51 insertions(+), 65 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 1866a1e..cdb7a3a 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -369,27 +369,23 @@ gbl_statements:					{ $$ = NULL; }
 						  if (!parse_only && do_header) write_coclass_forward($2);
 						}
 	| gbl_statements coclassdef		{ $$ = append_statement($1, make_statement_type_decl($2));
-						  add_typelib_entry($2);
 						  reg_type($2, $2->name, 0);
 						  if (!parse_only && do_header) write_coclass_forward($2);
 						}
-	| gbl_statements moduledef		{ $$ = append_statement($1, make_statement_module($2));
-						  add_typelib_entry($2);
-						}
+	| gbl_statements moduledef		{ $$ = append_statement($1, make_statement_module($2)); }
 	| gbl_statements librarydef		{ $$ = append_statement($1, make_statement_library($2)); }
 	| gbl_statements statement		{ $$ = append_statement($1, $2); }
 	;
 
 imp_statements:					{ $$ = NULL; }
-	| imp_statements interfacedec		{ $$ = append_statement($1, make_statement_reference($2)); if (!parse_only) add_typelib_entry($2); }
-	| imp_statements interfacedef		{ $$ = append_statement($1, make_statement_type_decl($2)); if (!parse_only) add_typelib_entry($2); }
+	| imp_statements interfacedec		{ $$ = append_statement($1, make_statement_reference($2)); }
+	| imp_statements interfacedef		{ $$ = append_statement($1, make_statement_type_decl($2)); }
 	| imp_statements coclass ';'		{ $$ = $1; reg_type($2, $2->name, 0); if (!parse_only && do_header) write_coclass_forward($2); }
 	| imp_statements coclassdef		{ $$ = append_statement($1, make_statement_type_decl($2));
-						  if (!parse_only) add_typelib_entry($2);
 						  reg_type($2, $2->name, 0);
 						  if (!parse_only && do_header) write_coclass_forward($2);
 						}
-	| imp_statements moduledef		{ $$ = append_statement($1, make_statement_module($2)); if (!parse_only) add_typelib_entry($2); }
+	| imp_statements moduledef		{ $$ = append_statement($1, make_statement_module($2)); }
 	| imp_statements statement		{ $$ = append_statement($1, $2); }
 	| imp_statements importlib		{ $$ = append_statement($1, make_statement_importlib($2)); }
 	| imp_statements librarydef		{ $$ = append_statement($1, make_statement_library($2)); }
@@ -644,10 +640,7 @@ enum:	  ident '=' expr_int_const		{ $$ = reg_const($1);
 						}
 	;
 
-enumdef: tENUM t_ident '{' enums '}'		{ $$ = type_new_enum($2, $4);
-                                                  if(in_typelib)
-                                                      add_typelib_entry($$);
-						}
+enumdef: tENUM t_ident '{' enums '}'		{ $$ = type_new_enum($2, $4); }
 	;
 
 m_exprs:  m_expr                                { $$ = append_expr( NULL, $1 ); }
@@ -1048,10 +1041,7 @@ pointer_type:
 	| tPTR					{ $$ = RPC_FC_FP; }
 	;
 
-structdef: tSTRUCT t_ident '{' fields '}'	{ $$ = type_new_struct($2, TRUE, $4);
-                                                  if(in_typelib)
-                                                      add_typelib_entry($$);
-                                                }
+structdef: tSTRUCT t_ident '{' fields '}'	{ $$ = type_new_struct($2, TRUE, $4); }
 	;
 
 type:	  tVOID					{ $$ = find_type_or_error("void", 0); }
@@ -1783,7 +1773,6 @@ static typelib_t *make_library(const char *name, const attr_list_t *attrs)
     typelib->name = xstrdup(name);
     typelib->filename = NULL;
     typelib->attrs = attrs;
-    list_init( &typelib->entries );
     list_init( &typelib->importlibs );
     return typelib;
 }
@@ -2746,8 +2735,6 @@ static statement_t *process_typedefs(declarator_list_t *decls)
 
         if (! parse_only && do_header)
             write_typedef(type);
-        if (in_typelib && is_attr(type->attrs, ATTR_PUBLIC))
-            add_typelib_entry(type);
 
         type_list = &(*type_list)->next;
         free(decl);
diff --git a/tools/widl/typelib.c b/tools/widl/typelib.c
index 2706870..446f9a5 100644
--- a/tools/widl/typelib.c
+++ b/tools/widl/typelib.c
@@ -46,8 +46,6 @@
 #include "widltypes.h"
 #include "typelib_struct.h"
 
-int in_typelib = 0;
-
 static typelib_t *typelib;
 
 type_t *duptype(type_t *t, int dupname)
@@ -246,7 +244,6 @@ unsigned short get_type_vt(type_t *t)
 
 void start_typelib(typelib_t *typelib_type)
 {
-    in_typelib++;
     if (!do_typelib) return;
 
     typelib = typelib_type;
@@ -255,23 +252,11 @@ void start_typelib(typelib_t *typelib_type)
 
 void end_typelib(void)
 {
-    in_typelib--;
     if (!typelib) return;
 
     create_msft_typelib(typelib);
 }
 
-void add_typelib_entry(type_t *t)
-{
-    typelib_entry_t *entry;
-    if (!typelib) return;
-
-    chat("add kind %i: %s\n", t->kind, t->name);
-    entry = xmalloc(sizeof(*entry));
-    entry->type = t;
-    list_add_tail( &typelib->entries, &entry->entry );
-}
-
 static void tlb_read(int fd, void *buf, int count)
 {
     if(read(fd, buf, count) < count)
diff --git a/tools/widl/typelib.h b/tools/widl/typelib.h
index 486dbb4..58bad43 100644
--- a/tools/widl/typelib.h
+++ b/tools/widl/typelib.h
@@ -21,10 +21,8 @@
 #ifndef __WIDL_TYPELIB_H
 #define __WIDL_TYPELIB_H
 
-extern int in_typelib;
 extern void start_typelib(typelib_t *typelib_type);
 extern void end_typelib(void);
-extern void add_typelib_entry(type_t *t);
 extern void add_importlib(const char *name);
 
 /* Copied from wtypes.h. Not included directly because that would create a
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 01e6d32..cb670eb 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -387,7 +387,6 @@ struct _typelib_t {
     char *name;
     char *filename;
     const attr_list_t *attrs;
-    struct list entries;
     struct list importlibs;
     statement_list_t *stmts;
 };
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 2340216..01e98a6 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -2191,38 +2191,54 @@ static void add_module_typeinfo(msft_typelib_t *typelib, type_t *module)
     msft_typeinfo->typeinfo->size = idx;
 }
 
-static void add_entry(msft_typelib_t *typelib, typelib_entry_t *entry)
+static void add_entry(msft_typelib_t *typelib, const statement_t *stmt)
 {
-    switch(entry->type->kind) {
-    case TKIND_INTERFACE:
-    case TKIND_DISPATCH:
-        add_interface_typeinfo(typelib, entry->type);
-        break;
-
-    case TKIND_RECORD:
-        add_structure_typeinfo(typelib, entry->type);
-        break;
-
-    case TKIND_ENUM:
-        add_enum_typeinfo(typelib, entry->type);
+    switch(stmt->type) {
+    case STMT_LIBRARY:
+    case STMT_IMPORT:
+    case STMT_CPPQUOTE:
+    case STMT_DECLARATION:
+        /* not included in typelib */
         break;
-
-    case TKIND_ALIAS:
-        add_typedef_typeinfo(typelib, entry->type);
+    case STMT_IMPORTLIB:
+        /* not processed here */
         break;
-
-    case TKIND_COCLASS:
-        add_coclass_typeinfo(typelib, entry->type);
+    case STMT_TYPEDEF:
+    {
+        const type_list_t *type_entry = stmt->u.type_list;
+        for (; type_entry; type_entry = type_entry->next)
+            if (is_attr(type_entry->type->attrs, ATTR_PUBLIC))
+                add_typedef_typeinfo(typelib, type_entry->type);
         break;
-
-    case TKIND_MODULE:
-        add_module_typeinfo(typelib, entry->type);
+    }
+    case STMT_MODULE:
+        add_module_typeinfo(typelib, stmt->u.type);
         break;
-
-    default:
-        error("add_entry: unhandled type %d\n", entry->type->kind);
+    case STMT_TYPE:
+    case STMT_TYPEREF:
+    {
+        type_t *type = stmt->u.type;
+        switch (type->kind) {
+        case TKIND_INTERFACE:
+        case TKIND_DISPATCH:
+            add_interface_typeinfo(typelib, type);
+            break;
+        case TKIND_RECORD:
+            add_structure_typeinfo(typelib, type);
+            break;
+        case TKIND_ENUM:
+            add_enum_typeinfo(typelib, type);
+            break;
+        case TKIND_COCLASS:
+            add_coclass_typeinfo(typelib, type);
+            break;
+        default:
+            error("add_entry: unhandled type %d\n", type->kind);
+            break;
+        }
         break;
     }
+    }
 }
 
 static void set_name(msft_typelib_t *typelib)
@@ -2497,7 +2513,7 @@ int create_msft_typelib(typelib_t *typelib)
 {
     msft_typelib_t *msft;
     int failed = 0;
-    typelib_entry_t *entry;
+    const statement_t *stmt;
     time_t cur_time;
     char *time_override;
     unsigned int version = 5 << 24 | 1 << 16 | 164; /* 5.01.0164 */
@@ -2550,8 +2566,9 @@ int create_msft_typelib(typelib_t *typelib)
     set_custdata(msft, &midl_time_guid, VT_UI4, &cur_time, &msft->typelib_header.CustomDataOffset);
     set_custdata(msft, &midl_version_guid, VT_UI4, &version, &msft->typelib_header.CustomDataOffset);
 
-    LIST_FOR_EACH_ENTRY( entry, &typelib->entries, typelib_entry_t, entry )
-        add_entry(msft, entry);
+    if (typelib->stmts)
+        LIST_FOR_EACH_ENTRY( stmt, typelib->stmts, const statement_t, entry )
+            add_entry(msft, stmt);
 
     save_all_changes(msft);
     free(msft);




More information about the wine-cvs mailing list