Module: wine Branch: master Commit: 15af19c6ecf63cca7c1326d53cc637f2ecbf7067 URL: http://source.winehq.org/git/wine.git/?a=commit;h=15af19c6ecf63cca7c1326d53c...
Author: Rob Shearman rob@codeweavers.com Date: Sun Jan 6 21:25:50 2008 +0000
widl: Add support for strict context handles.
---
tools/widl/parser.l | 1 + tools/widl/parser.y | 2 ++ tools/widl/typegen.c | 7 ++++++- tools/widl/widltypes.h | 1 + 4 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/tools/widl/parser.l b/tools/widl/parser.l index d2fd3c1..98f17af 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -299,6 +299,7 @@ static const struct keyword attr_keywords[] = {"single", tSINGLE}, {"size_is", tSIZEIS}, {"source", tSOURCE}, + {"strict_context_handle", tSTRICTCONTEXTHANDLE}, {"string", tSTRING}, {"switch_is", tSWITCHIS}, {"switch_type", tSWITCHTYPE}, diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 6c8337e..499ae15 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -225,6 +225,7 @@ static void check_all_user_types(ifref_list_t *ifaces); %token tSMALL %token tSOURCE %token tSTDCALL +%token tSTRICTCONTEXTHANDLE %token tSTRING tSTRUCT %token tSWITCH tSWITCHIS tSWITCHTYPE %token tTRANSMITAS @@ -497,6 +498,7 @@ attribute: { $$ = NULL; } | tRETVAL { $$ = make_attr(ATTR_RETVAL); } | tSIZEIS '(' m_exprs ')' { $$ = make_attrp(ATTR_SIZEIS, $3); } | tSOURCE { $$ = make_attr(ATTR_SOURCE); } + | tSTRICTCONTEXTHANDLE { $$ = make_attr(ATTR_STRICTCONTEXTHANDLE); } | tSTRING { $$ = make_attr(ATTR_STRING); } | tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); } | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, $3); } diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index b9d3306..3953b96 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -43,6 +43,7 @@
static const func_t *current_func; static const type_t *current_structure; +static const ifref_t *current_iface;
static struct list expr_eval_routines = LIST_INIT(expr_eval_routines); struct expr_eval_routine @@ -2057,7 +2058,10 @@ static size_t write_contexthandle_tfs(FILE *file, const type_t *type, unsigned int *typeformat_offset) { size_t start_offset = *typeformat_offset; - unsigned char flags = 0x08 /* strict */; + unsigned char flags = 0; + + if (is_attr(current_iface->attrs, ATTR_STRICTCONTEXTHANDLE)) + flags |= 0x08 /* strict */;
if (is_ptr(type)) { @@ -2280,6 +2284,7 @@ static size_t process_tfs(FILE *file, const ifref_list_t *ifaces, type_pred_t pr if (iface->iface->funcs) { const func_t *func; + current_iface = iface; LIST_FOR_EACH_ENTRY( func, iface->iface->funcs, const func_t, entry ) { if (is_local(func->def->attrs)) continue; diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 6930f71..acdc3f1 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -121,6 +121,7 @@ enum attr_type ATTR_RETVAL, ATTR_SIZEIS, ATTR_SOURCE, + ATTR_STRICTCONTEXTHANDLE, ATTR_STRING, ATTR_SWITCHIS, ATTR_SWITCHTYPE,