Robert Shearman : widl: Write out more TYPEFLAGs and add more type library-specific

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 9 05:47:33 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 91c35be7cc38289e622ccfa7863ed7ac024e1610
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=91c35be7cc38289e622ccfa7863ed7ac024e1610

Author: Robert Shearman <rob at codeweavers.com>
Date:   Thu Feb  9 12:10:08 2006 +0100

widl: Write out more TYPEFLAGs and add more type library-specific
attributes to the parser.

---

 tools/widl/parser.l     |   19 +++++++------------
 tools/widl/parser.y     |   25 +++++++++++++++++++------
 tools/widl/widltypes.h  |    8 ++++++++
 tools/widl/write_msft.c |   22 +++++++++++++++++++++-
 4 files changed, 55 insertions(+), 19 deletions(-)

diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index c053c12..6087197 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -179,7 +179,6 @@ static struct keyword {
 	{"aggregatable",		tAGGREGATABLE},
 	{"allocate",			tALLOCATE},
 	{"appobject",			tAPPOBJECT},
-	{"arrays",			tARRAYS},
 	{"async",			tASYNC},
 	{"async_uuid",			tASYNCUUID},
 	{"auto_handle",			tAUTOHANDLE},
@@ -203,51 +202,45 @@ static struct keyword {
 	{"cpp_quote",			tCPPQUOTE},
 /* ... */
 	{"default",			tDEFAULT},
+	{"defaultcollelem",		tDEFAULTCOLLELEM},
 	{"defaultvalue",		tDEFAULTVALUE},
-/* ... */
+	{"defaultvtable",		tDEFAULTVTABLE},
 	{"dispinterface",		tDISPINTERFACE},
-/* ... */
 	{"displaybind",			tDISPLAYBIND},
 	{"dllname",			tDLLNAME},
 	{"double",			tDOUBLE},
 	{"dual",			tDUAL},
-/* ... */
 	{"endpoint",			tENDPOINT},
 	{"entry",			tENTRY},
 	{"enum",			tENUM},
 	{"error_status_t",		tERRORSTATUST},
 	{"explicit_handle",		tEXPLICITHANDLE},
 	{"extern",			tEXTERN},
-/* ... */
 	{"float",			tFLOAT},
-/* ... */
 	{"handle",			tHANDLE},
 	{"handle_t",			tHANDLET},
-/* ... */
 	{"helpcontext",			tHELPCONTEXT},
 	{"helpfile",			tHELPFILE},
 	{"helpstring",			tHELPSTRING},
 	{"helpstringcontext",		tHELPSTRINGCONTEXT},
 	{"helpstringdll",		tHELPSTRINGDLL},
-/* ... */
 	{"hidden",                      tHIDDEN},
 	{"hyper",			tHYPER},
 	{"id",				tID},
 	{"idempotent",			tIDEMPOTENT},
 /* ... */
 	{"iid_is",			tIIDIS},
-/* ... */
+	{"immediatebind",		tIMMEDIATEBIND},
 	{"implicit_handle",		tIMPLICITHANDLE},
 	{"import",			tIMPORT},
 	{"importlib",			tIMPORTLIB},
 	{"in",				tIN},
-	{"include",			tINCLUDE},
 	{"in_line",			tINLINE},
 	{"input_sync",			tINPUTSYNC},
 	{"int",				tINT},
 /* ... */
 	{"interface",			tINTERFACE},
-/* ... */
+	{"lcid",			tLCID},
 	{"length_is",			tLENGTHIS},
 	{"library",			tLIBRARY},
 /* ... */
@@ -258,7 +251,9 @@ static struct keyword {
 /* ... */
 	{"module",			tMODULE},
 /* ... */
+	{"nonbrowsable",		tNONBROWSABLE},
 	{"noncreatable",		tNONCREATABLE},
+	{"nonextensible",		tNONEXTENSIBLE},
 	{"object",			tOBJECT},
 	{"odl",				tODL},
 	{"oleautomation",		tOLEAUTOMATION},
@@ -279,7 +274,7 @@ static struct keyword {
 /* ... */
 	{"readonly",			tREADONLY},
 	{"ref",				tREF},
-/* ... */
+	{"requestedit",			tREQUESTEDIT},
 	{"restricted",                  tRESTRICTED},
 	{"retval",			tRETVAL},
 /* ... */
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index d6f0f6b..77219d8 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -126,13 +126,15 @@ static type_t std_uhyper = { "MIDL_uhype
 %token <uuid> aUUID
 %token aEOF
 %token SHL SHR
-%token tAGGREGATABLE tALLOCATE tAPPOBJECT tARRAYS tASYNC tASYNCUUID
+%token tAGGREGATABLE tALLOCATE tAPPOBJECT tASYNC tASYNCUUID
 %token tAUTOHANDLE tBINDABLE tBOOLEAN tBROADCAST tBYTE tBYTECOUNT
 %token tCALLAS tCALLBACK tCASE tCDECL tCHAR tCOCLASS tCODE tCOMMSTATUS
 %token tCONST tCONTEXTHANDLE tCONTEXTHANDLENOSERIALIZE
 %token tCONTEXTHANDLESERIALIZE tCONTROL tCPPQUOTE
 %token tDEFAULT
+%token tDEFAULTCOLLELEM
 %token tDEFAULTVALUE
+%token tDEFAULTVTABLE
 %token tDISPLAYBIND
 %token tDISPINTERFACE
 %token tDLLNAME tDOUBLE tDUAL
@@ -147,18 +149,22 @@ static type_t std_uhyper = { "MIDL_uhype
 %token tHIDDEN
 %token tHYPER tID tIDEMPOTENT
 %token tIIDIS
+%token tIMMEDIATEBIND
 %token tIMPLICITHANDLE
 %token tIMPORT tIMPORTLIB
-%token tIN tINCLUDE tINLINE
+%token tIN tINLINE
 %token tINPUTSYNC
 %token tINT tINT64
 %token tINTERFACE
+%token tLCID
 %token tLENGTHIS tLIBRARY
 %token tLOCAL
 %token tLONG
 %token tMETHODS
 %token tMODULE
+%token tNONBROWSABLE
 %token tNONCREATABLE
+%token tNONEXTENSIBLE
 %token tOBJECT tODL tOLEAUTOMATION
 %token tOPTIONAL
 %token tOUT
@@ -169,6 +175,7 @@ static type_t std_uhyper = { "MIDL_uhype
 %token tPUBLIC
 %token tRANGE
 %token tREADONLY tREF
+%token tREQUESTEDIT
 %token tRESTRICTED
 %token tRETVAL
 %token tSHORT
@@ -192,9 +199,6 @@ static type_t std_uhyper = { "MIDL_uhype
 %token tVOID
 %token tWCHAR tWIREMARSHAL
 
-/* used in attr_t */
-%token tPOINTERTYPE
-
 %type <attr> m_attributes attributes attrib_list attribute
 %type <expr> m_exprs /* exprs expr_list */ m_expr expr expr_list_const expr_const
 %type <expr> array array_list
@@ -338,7 +342,9 @@ attrib_list: attribute
 	;
 
 attribute:
-	  tASYNC				{ $$ = make_attr(ATTR_ASYNC); }
+	  tAGGREGATABLE				{ $$ = make_attr(ATTR_AGGREGATABLE); }
+	| tAPPOBJECT				{ $$ = make_attr(ATTR_APPOBJECT); }
+	| tASYNC				{ $$ = make_attr(ATTR_ASYNC); }
 	| tAUTOHANDLE				{ $$ = make_attr(ATTR_AUTO_HANDLE); }
 	| tBINDABLE				{ $$ = make_attr(ATTR_BINDABLE); }
 	| tCALLAS '(' ident ')'			{ $$ = make_attrp(ATTR_CALLAS, $3); }
@@ -348,8 +354,10 @@ attribute:
 	| tCONTEXTHANDLESERIALIZE		{ $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
 	| tCONTROL				{ $$ = make_attr(ATTR_CONTROL); }
 	| tDEFAULT				{ $$ = make_attr(ATTR_DEFAULT); }
+	| tDEFAULTCOLLELEM			{ $$ = make_attr(ATTR_DEFAULTCOLLELEM); }
 	| tDEFAULTVALUE '(' expr_const ')'	{ $$ = make_attrp(ATTR_DEFAULTVALUE_EXPR, $3); }
 	| tDEFAULTVALUE '(' aSTRING ')'		{ $$ = make_attrp(ATTR_DEFAULTVALUE_STRING, $3); }
+	| tDEFAULTVTABLE			{ $$ = make_attr(ATTR_DEFAULTVTABLE); }
 	| tDISPLAYBIND				{ $$ = make_attr(ATTR_DISPLAYBIND); }
 	| tDLLNAME '(' aSTRING ')'		{ $$ = make_attrp(ATTR_DLLNAME, $3); }
 	| tDUAL					{ $$ = make_attr(ATTR_DUAL); }
@@ -367,12 +375,15 @@ attribute:
 	| tID '(' expr_const ')'		{ $$ = make_attrp(ATTR_ID, $3); }
 	| tIDEMPOTENT				{ $$ = make_attr(ATTR_IDEMPOTENT); }
 	| tIIDIS '(' ident ')'			{ $$ = make_attrp(ATTR_IIDIS, $3); }
+	| tIMMEDIATEBIND			{ $$ = make_attr(ATTR_IMMEDIATEBIND); }
 	| tIMPLICITHANDLE '(' tHANDLET aIDENTIFIER ')'	{ $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $4); }
 	| tIN					{ $$ = make_attr(ATTR_IN); }
 	| tINPUTSYNC				{ $$ = make_attr(ATTR_INPUTSYNC); }
 	| tLENGTHIS '(' m_exprs ')'		{ $$ = make_attrp(ATTR_LENGTHIS, $3); }
 	| tLOCAL				{ $$ = make_attr(ATTR_LOCAL); }
+	| tNONBROWSABLE				{ $$ = make_attr(ATTR_NONBROWSABLE); }
 	| tNONCREATABLE				{ $$ = make_attr(ATTR_NONCREATABLE); }
+	| tNONEXTENSIBLE			{ $$ = make_attr(ATTR_NONEXTENSIBLE); }
 	| tOBJECT				{ $$ = make_attr(ATTR_OBJECT); }
 	| tODL					{ $$ = make_attr(ATTR_ODL); }
 	| tOLEAUTOMATION			{ $$ = make_attr(ATTR_OLEAUTOMATION); }
@@ -385,6 +396,7 @@ attribute:
 	| tPUBLIC				{ $$ = make_attr(ATTR_PUBLIC); }
 	| tRANGE '(' expr_const ',' expr_const ')' { LINK($5, $3); $$ = make_attrp(ATTR_RANGE, $5); }
 	| tREADONLY				{ $$ = make_attr(ATTR_READONLY); }
+	| tREQUESTEDIT				{ $$ = make_attr(ATTR_REQUESTEDIT); }
 	| tRESTRICTED				{ $$ = make_attr(ATTR_RESTRICTED); }
 	| tRETVAL				{ $$ = make_attr(ATTR_RETVAL); }
 	| tSIZEIS '(' m_exprs ')'		{ $$ = make_attrp(ATTR_SIZEIS, $3); }
@@ -552,6 +564,7 @@ ident:	  aIDENTIFIER				{ $$ = make_var(
 	| aKNOWNTYPE				{ $$ = make_var($<str>1); }
 	| tASYNC				{ $$ = make_var($<str>1); }
 	| tID					{ $$ = make_var($<str>1); }
+	| tLCID					{ $$ = make_var($<str>1); }
 	| tRANGE				{ $$ = make_var($<str>1); }
 	| tRETVAL				{ $$ = make_var($<str>1); }
 	| tVERSION				{ $$ = make_var($<str>1); }
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 6af89ad..30620d0 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -56,6 +56,8 @@ typedef struct _typelib_t typelib_t;
 
 enum attr_type
 {
+    ATTR_AGGREGATABLE,
+    ATTR_APPOBJECT,
     ATTR_ASYNC,
     ATTR_AUTO_HANDLE,
     ATTR_BINDABLE,
@@ -64,8 +66,10 @@ enum attr_type
     ATTR_CONTEXTHANDLE,
     ATTR_CONTROL,
     ATTR_DEFAULT,
+    ATTR_DEFAULTCOLLELEM,
     ATTR_DEFAULTVALUE_EXPR,
     ATTR_DEFAULTVALUE_STRING,
+    ATTR_DEFAULTVTABLE,
     ATTR_DISPINTERFACE,
     ATTR_DISPLAYBIND,
     ATTR_DLLNAME,
@@ -84,12 +88,15 @@ enum attr_type
     ATTR_ID,
     ATTR_IDEMPOTENT,
     ATTR_IIDIS,
+    ATTR_IMMEDIATEBIND,
     ATTR_IMPLICIT_HANDLE,
     ATTR_IN,
     ATTR_INPUTSYNC,
     ATTR_LENGTHIS,
     ATTR_LOCAL,
+    ATTR_NONBROWSABLE,
     ATTR_NONCREATABLE,
+    ATTR_NONEXTENSIBLE,
     ATTR_OBJECT,
     ATTR_ODL,
     ATTR_OLEAUTOMATION,
@@ -103,6 +110,7 @@ enum attr_type
     ATTR_PUBLIC,
     ATTR_RANGE,
     ATTR_READONLY,
+    ATTR_REQUESTEDIT,
     ATTR_RESTRICTED,
     ATTR_RETVAL,
     ATTR_SIZEIS,
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index f749542..725b361 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -1667,6 +1667,21 @@ static msft_typeinfo_t *create_msft_type
 
     for( ; attr; attr = NEXT_LINK(attr)) {
         switch(attr->type) {
+        case ATTR_AGGREGATABLE:
+            if (kind == TKIND_COCLASS)
+                typeinfo->flags |= 0x400; /* TYPEFLAG_FAGGREGATABLE */
+            break;
+
+        case ATTR_APPOBJECT:
+            if (kind == TKIND_COCLASS)
+                typeinfo->flags |= 0x1; /* TYPEFLAG_FAPPOBJECT */
+            break;
+
+        case ATTR_CONTROL:
+            if (kind == TKIND_COCLASS)
+                typeinfo->flags |= 0x20; /* TYPEFLAG_FCONTROL */
+            break;
+
         case ATTR_DISPINTERFACE:
             break;
 
@@ -1678,7 +1693,8 @@ static msft_typeinfo_t *create_msft_type
           }
 
         case ATTR_DUAL:
-            typeinfo->flags |= 0x40; /* TYPEFLAG_FDUAL */
+            /* FIXME: check interface is compatible */
+            typeinfo->flags |= 0x140; /* TYPEFLAG_FDUAL | TYPEFLAG_FOLEAUTOMATION */
             break;
 
         case ATTR_HELPCONTEXT:
@@ -1708,6 +1724,10 @@ static msft_typeinfo_t *create_msft_type
             typeinfo->flags &= ~0x2; /* TYPEFLAG_FCANCREATE */
             break;
 
+        case ATTR_NONEXTENSIBLE:
+            typeinfo->flags |= 0x80; /* TYPEFLAG_FNONEXTENSIBLE */
+            break;
+
         case ATTR_ODL:
             break;
 




More information about the wine-cvs mailing list