Eric Kohl : widl: Add the [allocate] acf attribute.
Alexandre Julliard
julliard at winehq.org
Tue Oct 27 16:43:50 CDT 2020
Module: wine
Branch: master
Commit: ba72ef6c22b26ef9addc8c9af6c2e9ab88529ca5
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ba72ef6c22b26ef9addc8c9af6c2e9ab88529ca5
Author: Eric Kohl <eric.kohl at reactos.org>
Date: Wed Oct 14 23:24:34 2020 +0200
widl: Add the [allocate] acf attribute.
Signed-off-by: Eric Kohl <eric.kohl at reactos.org>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
tools/widl/parser.l | 3 +++
tools/widl/parser.y | 33 +++++++++++++++++++++++++++++----
tools/widl/typegen.c | 7 +++++++
tools/widl/widltypes.h | 1 +
4 files changed, 40 insertions(+), 4 deletions(-)
diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index 925265d00db..f2c09cd8051 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -318,6 +318,7 @@ static const struct keyword keywords[] = {
static const struct keyword attr_keywords[] =
{
{"aggregatable", tAGGREGATABLE},
+ {"all_nodes", tALLNODES},
{"allocate", tALLOCATE},
{"annotation", tANNOTATION},
{"apartment", tAPARTMENT},
@@ -345,6 +346,7 @@ static const struct keyword attr_keywords[] =
{"disable_consistency_check", tDISABLECONSISTENCYCHECK},
{"displaybind", tDISPLAYBIND},
{"dllname", tDLLNAME},
+ {"dont_free", tDONTFREE},
{"dual", tDUAL},
{"enable_allocate", tENABLEALLOCATE},
{"encode", tENCODE},
@@ -406,6 +408,7 @@ static const struct keyword attr_keywords[] =
{"restricted", tRESTRICTED},
{"retval", tRETVAL},
{"single", tSINGLE},
+ {"single_node", tSINGLENODE},
{"size_is", tSIZEIS},
{"source", tSOURCE},
{"strict_context_handle", tSTRICTCONTEXTHANDLE},
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 5bc0d82703e..686aa6b58a8 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -172,7 +172,7 @@ static typelib_t *current_typelib;
%token GREATEREQUAL LESSEQUAL
%token LOGICALOR LOGICALAND
%token ELLIPSIS
-%token tAGGREGATABLE tALLOCATE tANNOTATION tAPPOBJECT tASYNC tASYNCUUID
+%token tAGGREGATABLE tALLNODES tALLOCATE tANNOTATION tAPPOBJECT tASYNC tASYNCUUID
%token tAUTOHANDLE tBINDABLE tBOOLEAN tBROADCAST tBYTE tBYTECOUNT
%token tCALLAS tCALLBACK tCASE tCDECL tCHAR tCOCLASS tCODE tCOMMSTATUS
%token tCONST tCONTEXTHANDLE tCONTEXTHANDLENOSERIALIZE
@@ -183,7 +183,7 @@ static typelib_t *current_typelib;
%token tDEFAULTVTABLE
%token tDISABLECONSISTENCYCHECK tDISPLAYBIND
%token tDISPINTERFACE
-%token tDLLNAME tDOUBLE tDUAL
+%token tDLLNAME tDONTFREE tDOUBLE tDUAL
%token tENABLEALLOCATE tENCODE tENDPOINT
%token tENTRY tENUM tERRORSTATUST
%token tEXPLICITHANDLE tEXTERN
@@ -235,7 +235,7 @@ static typelib_t *current_typelib;
%token tRETVAL
%token tSAFEARRAY
%token tSHORT
-%token tSIGNED
+%token tSIGNED tSINGLENODE
%token tSIZEIS tSIZEOF
%token tSMALL
%token tSOURCE
@@ -296,6 +296,7 @@ static typelib_t *current_typelib;
%type <statement> statement typedef pragma_warning
%type <stmt_list> gbl_statements imp_statements int_statements
%type <warning_list> warnings
+%type <num> allocate_option_list allocate_option
%left ','
%right '?' ':'
@@ -1150,16 +1151,20 @@ version:
acf_statements
: /* empty */
| acf_interface acf_statements
+ ;
acf_int_statements
: /* empty */
| acf_int_statement acf_int_statements
+ ;
acf_int_statement
: tTYPEDEF acf_attributes aKNOWNTYPE ';'
{ type_t *type = find_type_or_error($3, 0);
type->attrs = append_attr_list(type->attrs, $2);
}
+ ;
+
acf_interface
: acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'
{ type_t *iface = find_type_or_error2($3, 0);
@@ -1167,19 +1172,38 @@ acf_interface
error_loc("%s is not an interface\n", iface->name);
iface->attrs = append_attr_list(iface->attrs, $1);
}
+ ;
acf_attributes
: /* empty */ { $$ = NULL; };
| '[' acf_attribute_list ']' { $$ = $2; };
+ ;
acf_attribute_list
: acf_attribute { $$ = append_attr(NULL, $1); }
| acf_attribute_list ',' acf_attribute { $$ = append_attr($1, $3); }
+ ;
acf_attribute
- : tENCODE { $$ = make_attr(ATTR_ENCODE); }
+ : tALLOCATE '(' allocate_option_list ')'
+ { $$ = make_attrv(ATTR_ALLOCATE, $3); }
+ | tENCODE { $$ = make_attr(ATTR_ENCODE); }
| tDECODE { $$ = make_attr(ATTR_DECODE); }
| tEXPLICITHANDLE { $$ = make_attr(ATTR_EXPLICIT_HANDLE); }
+ ;
+
+allocate_option_list
+ : allocate_option { $$ = $1; }
+ | allocate_option_list ',' allocate_option
+ { $$ = $1 | $3; }
+ ;
+
+allocate_option
+ : tDONTFREE { $$ = FC_DONT_FREE; }
+ | tFREE { $$ = 0; }
+ | tALLNODES { $$ = FC_ALLOCATE_ALL_NODES; }
+ | tSINGLENODE { $$ = 0; }
+ ;
%%
@@ -2122,6 +2146,7 @@ struct allowed_attr allowed_attr[] =
{
/* attr { D ACF I Fn ARG T En Enm St Un Fi L DI M C <display name> } */
/* ATTR_AGGREGATABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "aggregatable" },
+ /* ATTR_ALLOCATE */ { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "allocate" },
/* ATTR_ANNOTATION */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "annotation" },
/* ATTR_APPOBJECT */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "appobject" },
/* ATTR_ASYNC */ { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "async" },
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 04280cbb722..4874dfd6c24 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -2153,6 +2153,9 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs
type_t *ref = type_pointer_get_ref_type(type);
if(is_declptr(ref) && !is_user_type(ref))
flags |= FC_POINTER_DEREF;
+ if (pointer_type != FC_RP) {
+ flags |= get_attrv(type->attrs, ATTR_ALLOCATE);
+ }
}
print_file(file, 2, "0x%x, 0x%x,\t\t/* %s",
@@ -2165,6 +2168,10 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs
fprintf(file, " [allocated_on_stack]");
if (flags & FC_POINTER_DEREF)
fprintf(file, " [pointer_deref]");
+ if (flags & FC_DONT_FREE)
+ fprintf(file, " [dont_free]");
+ if (flags & FC_ALLOCATE_ALL_NODES)
+ fprintf(file, " [all_nodes]");
fprintf(file, " */\n");
}
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 085a0ff55f5..2e2ee7a206b 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -69,6 +69,7 @@ typedef struct list warning_list_t;
enum attr_type
{
ATTR_AGGREGATABLE,
+ ATTR_ALLOCATE,
ATTR_ANNOTATION,
ATTR_APPOBJECT,
ATTR_ASYNC,
More information about the wine-cvs
mailing list