Commit 3991b057 authored by Alexandre Julliard's avatar Alexandre Julliard

widl: Add progid, threading and vi_progid attributes for coclasses.

This is a Wine extension, modelled after the corresponding attributes supported by Visual C++.
parent ad6b7cd4
...@@ -289,11 +289,13 @@ static const struct keyword attr_keywords[] = ...@@ -289,11 +289,13 @@ static const struct keyword attr_keywords[] =
{"aggregatable", tAGGREGATABLE}, {"aggregatable", tAGGREGATABLE},
{"allocate", tALLOCATE}, {"allocate", tALLOCATE},
{"annotation", tANNOTATION}, {"annotation", tANNOTATION},
{"apartment", tAPARTMENT},
{"appobject", tAPPOBJECT}, {"appobject", tAPPOBJECT},
{"async", tASYNC}, {"async", tASYNC},
{"async_uuid", tASYNCUUID}, {"async_uuid", tASYNCUUID},
{"auto_handle", tAUTOHANDLE}, {"auto_handle", tAUTOHANDLE},
{"bindable", tBINDABLE}, {"bindable", tBINDABLE},
{"both", tBOTH},
{"broadcast", tBROADCAST}, {"broadcast", tBROADCAST},
{"byte_count", tBYTECOUNT}, {"byte_count", tBYTECOUNT},
{"call_as", tCALLAS}, {"call_as", tCALLAS},
...@@ -320,6 +322,7 @@ static const struct keyword attr_keywords[] = ...@@ -320,6 +322,7 @@ static const struct keyword attr_keywords[] =
{"explicit_handle", tEXPLICITHANDLE}, {"explicit_handle", tEXPLICITHANDLE},
{"fault_status", tFAULTSTATUS}, {"fault_status", tFAULTSTATUS},
{"force_allocate", tFORCEALLOCATE}, {"force_allocate", tFORCEALLOCATE},
{"free", tFREE},
{"handle", tHANDLE}, {"handle", tHANDLE},
{"helpcontext", tHELPCONTEXT}, {"helpcontext", tHELPCONTEXT},
{"helpfile", tHELPFILE}, {"helpfile", tHELPFILE},
...@@ -342,6 +345,7 @@ static const struct keyword attr_keywords[] = ...@@ -342,6 +345,7 @@ static const struct keyword attr_keywords[] =
{"local", tLOCAL}, {"local", tLOCAL},
{"maybe", tMAYBE}, {"maybe", tMAYBE},
{"message", tMESSAGE}, {"message", tMESSAGE},
{"neutral", tNEUTRAL},
{"nocode", tNOCODE}, {"nocode", tNOCODE},
{"nonbrowsable", tNONBROWSABLE}, {"nonbrowsable", tNONBROWSABLE},
{"noncreatable", tNONCREATABLE}, {"noncreatable", tNONCREATABLE},
...@@ -356,6 +360,7 @@ static const struct keyword attr_keywords[] = ...@@ -356,6 +360,7 @@ static const struct keyword attr_keywords[] =
{"out", tOUT}, {"out", tOUT},
{"partial_ignore", tPARTIALIGNORE}, {"partial_ignore", tPARTIALIGNORE},
{"pointer_default", tPOINTERDEFAULT}, {"pointer_default", tPOINTERDEFAULT},
{"progid", tPROGID},
{"propget", tPROPGET}, {"propget", tPROPGET},
{"propput", tPROPPUT}, {"propput", tPROPPUT},
{"propputref", tPROPPUTREF}, {"propputref", tPROPPUTREF},
...@@ -369,12 +374,14 @@ static const struct keyword attr_keywords[] = ...@@ -369,12 +374,14 @@ static const struct keyword attr_keywords[] =
{"requestedit", tREQUESTEDIT}, {"requestedit", tREQUESTEDIT},
{"restricted", tRESTRICTED}, {"restricted", tRESTRICTED},
{"retval", tRETVAL}, {"retval", tRETVAL},
{"single", tSINGLE},
{"size_is", tSIZEIS}, {"size_is", tSIZEIS},
{"source", tSOURCE}, {"source", tSOURCE},
{"strict_context_handle", tSTRICTCONTEXTHANDLE}, {"strict_context_handle", tSTRICTCONTEXTHANDLE},
{"string", tSTRING}, {"string", tSTRING},
{"switch_is", tSWITCHIS}, {"switch_is", tSWITCHIS},
{"switch_type", tSWITCHTYPE}, {"switch_type", tSWITCHTYPE},
{"threading", tTHREADING},
{"transmit_as", tTRANSMITAS}, {"transmit_as", tTRANSMITAS},
{"uidefault", tUIDEFAULT}, {"uidefault", tUIDEFAULT},
{"unique", tUNIQUE}, {"unique", tUNIQUE},
...@@ -384,6 +391,7 @@ static const struct keyword attr_keywords[] = ...@@ -384,6 +391,7 @@ static const struct keyword attr_keywords[] =
{"v1_enum", tV1ENUM}, {"v1_enum", tV1ENUM},
{"vararg", tVARARG}, {"vararg", tVARARG},
{"version", tVERSION}, {"version", tVERSION},
{"vi_progid", tVIPROGID},
{"wire_marshal", tWIREMARSHAL}, {"wire_marshal", tWIREMARSHAL},
}; };
......
...@@ -239,7 +239,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s ...@@ -239,7 +239,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
%token tOUT %token tOUT
%token tPARTIALIGNORE tPASCAL %token tPARTIALIGNORE tPASCAL
%token tPOINTERDEFAULT %token tPOINTERDEFAULT
%token tPROPERTIES %token tPROGID tPROPERTIES
%token tPROPGET tPROPPUT tPROPPUTREF %token tPROPGET tPROPPUT tPROPPUTREF
%token tPROXY tPTR %token tPROXY tPTR
%token tPUBLIC %token tPUBLIC
...@@ -260,7 +260,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s ...@@ -260,7 +260,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
%token tSTRICTCONTEXTHANDLE %token tSTRICTCONTEXTHANDLE
%token tSTRING tSTRUCT %token tSTRING tSTRUCT
%token tSWITCH tSWITCHIS tSWITCHTYPE %token tSWITCH tSWITCHIS tSWITCHTYPE
%token tTRANSMITAS %token tTHREADING tTRANSMITAS
%token tTRUE %token tTRUE
%token tTYPEDEF %token tTYPEDEF
%token tUIDEFAULT tUNION %token tUIDEFAULT tUNION
...@@ -269,9 +269,10 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s ...@@ -269,9 +269,10 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
%token tUSESGETLASTERROR tUSERMARSHAL tUUID %token tUSESGETLASTERROR tUSERMARSHAL tUUID
%token tV1ENUM %token tV1ENUM
%token tVARARG %token tVARARG
%token tVERSION %token tVERSION tVIPROGID
%token tVOID %token tVOID
%token tWCHAR tWIREMARSHAL %token tWCHAR tWIREMARSHAL
%token tAPARTMENT tNEUTRAL tSINGLE tFREE tBOTH
%type <attr> attribute type_qualifier function_specifier %type <attr> attribute type_qualifier function_specifier
%type <attr_list> m_attributes attributes attrib_list m_type_qual_list %type <attr_list> m_attributes attributes attrib_list m_type_qual_list
...@@ -299,7 +300,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s ...@@ -299,7 +300,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s
%type <declarator> m_abstract_declarator abstract_declarator abstract_declarator_no_direct abstract_direct_declarator %type <declarator> m_abstract_declarator abstract_declarator abstract_declarator_no_direct abstract_direct_declarator
%type <declarator_list> declarator_list struct_declarator_list %type <declarator_list> declarator_list struct_declarator_list
%type <type> coclass coclasshdr coclassdef %type <type> coclass coclasshdr coclassdef
%type <num> pointer_type version %type <num> pointer_type threading_type version
%type <str> libraryhdr callconv cppquote importlib import t_ident %type <str> libraryhdr callconv cppquote importlib import t_ident
%type <uuid> uuid_string %type <uuid> uuid_string
%type <import> import_start %type <import> import_start
...@@ -538,6 +539,7 @@ attribute: { $$ = NULL; } ...@@ -538,6 +539,7 @@ attribute: { $$ = NULL; }
| tOUT { $$ = make_attr(ATTR_OUT); } | tOUT { $$ = make_attr(ATTR_OUT); }
| tPARTIALIGNORE { $$ = make_attr(ATTR_PARTIALIGNORE); } | tPARTIALIGNORE { $$ = make_attr(ATTR_PARTIALIGNORE); }
| tPOINTERDEFAULT '(' pointer_type ')' { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); } | tPOINTERDEFAULT '(' pointer_type ')' { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); }
| tPROGID '(' aSTRING ')' { $$ = make_attrp(ATTR_PROGID, $3); }
| tPROPGET { $$ = make_attr(ATTR_PROPGET); } | tPROPGET { $$ = make_attr(ATTR_PROPGET); }
| tPROPPUT { $$ = make_attr(ATTR_PROPPUT); } | tPROPPUT { $$ = make_attr(ATTR_PROPPUT); }
| tPROPPUTREF { $$ = make_attr(ATTR_PROPPUTREF); } | tPROPPUTREF { $$ = make_attr(ATTR_PROPPUTREF); }
...@@ -559,6 +561,7 @@ attribute: { $$ = NULL; } ...@@ -559,6 +561,7 @@ attribute: { $$ = NULL; }
| tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); } | tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); }
| tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, $3); } | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, $3); }
| tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, $3); } | tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, $3); }
| tTHREADING '(' threading_type ')' { $$ = make_attrv(ATTR_THREADING, $3); }
| tUIDEFAULT { $$ = make_attr(ATTR_UIDEFAULT); } | tUIDEFAULT { $$ = make_attr(ATTR_UIDEFAULT); }
| tUSESGETLASTERROR { $$ = make_attr(ATTR_USESGETLASTERROR); } | tUSESGETLASTERROR { $$ = make_attr(ATTR_USESGETLASTERROR); }
| tUSERMARSHAL '(' type ')' { $$ = make_attrp(ATTR_USERMARSHAL, $3); } | tUSERMARSHAL '(' type ')' { $$ = make_attrp(ATTR_USERMARSHAL, $3); }
...@@ -566,6 +569,7 @@ attribute: { $$ = NULL; } ...@@ -566,6 +569,7 @@ attribute: { $$ = NULL; }
| tV1ENUM { $$ = make_attr(ATTR_V1ENUM); } | tV1ENUM { $$ = make_attr(ATTR_V1ENUM); }
| tVARARG { $$ = make_attr(ATTR_VARARG); } | tVARARG { $$ = make_attr(ATTR_VARARG); }
| tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); } | tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); }
| tVIPROGID '(' aSTRING ')' { $$ = make_attrp(ATTR_VIPROGID, $3); }
| tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, $3); } | tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, $3); }
| pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); } | pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); }
; ;
...@@ -1069,6 +1073,14 @@ init_declarator: ...@@ -1069,6 +1073,14 @@ init_declarator:
| declarator '=' expr_const { $$ = $1; $1->var->eval = $3; } | declarator '=' expr_const { $$ = $1; $1->var->eval = $3; }
; ;
threading_type:
tAPARTMENT { $$ = THREADING_APARTMENT; }
| tNEUTRAL { $$ = THREADING_NEUTRAL; }
| tSINGLE { $$ = THREADING_SINGLE; }
| tFREE { $$ = THREADING_FREE; }
| tBOTH { $$ = THREADING_BOTH; }
;
pointer_type: pointer_type:
tREF { $$ = RPC_FC_RP; } tREF { $$ = RPC_FC_RP; }
| tUNIQUE { $$ = RPC_FC_UP; } | tUNIQUE { $$ = RPC_FC_UP; }
...@@ -2070,6 +2082,7 @@ struct allowed_attr allowed_attr[] = ...@@ -2070,6 +2082,7 @@ struct allowed_attr allowed_attr[] =
/* ATTR_PARTIALIGNORE */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "partial_ignore" }, /* ATTR_PARTIALIGNORE */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "partial_ignore" },
/* ATTR_POINTERDEFAULT */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" }, /* ATTR_POINTERDEFAULT */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" },
/* ATTR_POINTERTYPE */ { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, "ref, unique or ptr" }, /* ATTR_POINTERTYPE */ { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, "ref, unique or ptr" },
/* ATTR_PROGID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "progid" },
/* ATTR_PROPGET */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propget" }, /* ATTR_PROPGET */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propget" },
/* ATTR_PROPPUT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propput" }, /* ATTR_PROPPUT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propput" },
/* ATTR_PROPPUTREF */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propputref" }, /* ATTR_PROPPUTREF */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propputref" },
...@@ -2087,6 +2100,7 @@ struct allowed_attr allowed_attr[] = ...@@ -2087,6 +2100,7 @@ struct allowed_attr allowed_attr[] =
/* ATTR_STRING */ { 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, "string" }, /* ATTR_STRING */ { 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, "string" },
/* ATTR_SWITCHIS */ { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "switch_is" }, /* ATTR_SWITCHIS */ { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "switch_is" },
/* ATTR_SWITCHTYPE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, "switch_type" }, /* ATTR_SWITCHTYPE */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, "switch_type" },
/* ATTR_THREADING */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "threading" },
/* ATTR_TRANSMITAS */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "transmit_as" }, /* ATTR_TRANSMITAS */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "transmit_as" },
/* ATTR_UIDEFAULT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "uidefault" }, /* ATTR_UIDEFAULT */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "uidefault" },
/* ATTR_USESGETLASTERROR */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "usesgetlasterror" }, /* ATTR_USESGETLASTERROR */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "usesgetlasterror" },
...@@ -2095,6 +2109,7 @@ struct allowed_attr allowed_attr[] = ...@@ -2095,6 +2109,7 @@ struct allowed_attr allowed_attr[] =
/* ATTR_V1ENUM */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, "v1_enum" }, /* ATTR_V1ENUM */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, "v1_enum" },
/* ATTR_VARARG */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "vararg" }, /* ATTR_VARARG */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "vararg" },
/* ATTR_VERSION */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "version" }, /* ATTR_VERSION */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "version" },
/* ATTR_VIPROGID */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "vi_progid" },
/* ATTR_WIREMARSHAL */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "wire_marshal" }, /* ATTR_WIREMARSHAL */ { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "wire_marshal" },
}; };
......
...@@ -135,6 +135,7 @@ enum attr_type ...@@ -135,6 +135,7 @@ enum attr_type
ATTR_PARTIALIGNORE, ATTR_PARTIALIGNORE,
ATTR_POINTERDEFAULT, ATTR_POINTERDEFAULT,
ATTR_POINTERTYPE, ATTR_POINTERTYPE,
ATTR_PROGID,
ATTR_PROPGET, ATTR_PROPGET,
ATTR_PROPPUT, ATTR_PROPPUT,
ATTR_PROPPUTREF, ATTR_PROPPUTREF,
...@@ -152,6 +153,7 @@ enum attr_type ...@@ -152,6 +153,7 @@ enum attr_type
ATTR_STRING, ATTR_STRING,
ATTR_SWITCHIS, ATTR_SWITCHIS,
ATTR_SWITCHTYPE, ATTR_SWITCHTYPE,
ATTR_THREADING,
ATTR_TRANSMITAS, ATTR_TRANSMITAS,
ATTR_UIDEFAULT, ATTR_UIDEFAULT,
ATTR_USERMARSHAL, ATTR_USERMARSHAL,
...@@ -160,6 +162,7 @@ enum attr_type ...@@ -160,6 +162,7 @@ enum attr_type
ATTR_V1ENUM, ATTR_V1ENUM,
ATTR_VARARG, ATTR_VARARG,
ATTR_VERSION, ATTR_VERSION,
ATTR_VIPROGID,
ATTR_WIREMARSHAL ATTR_WIREMARSHAL
}; };
...@@ -240,6 +243,15 @@ enum statement_type ...@@ -240,6 +243,15 @@ enum statement_type
STMT_CPPQUOTE STMT_CPPQUOTE
}; };
enum threading_type
{
THREADING_APARTMENT = 1,
THREADING_NEUTRAL,
THREADING_SINGLE,
THREADING_FREE,
THREADING_BOTH
};
enum type_basic_type enum type_basic_type
{ {
TYPE_BASIC_INT8 = 1, TYPE_BASIC_INT8 = 1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment