widl: Protect from duplicated method names in C-style vtable struct.
This commit is contained in:
parent
6530e8a963
commit
0bc5e7a62a
|
@ -816,6 +816,28 @@ const var_t *is_callas(const attr_list_t *a)
|
||||||
return get_attrp(a, ATTR_CALLAS);
|
return get_attrp(a, ATTR_CALLAS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int is_inherited_method(const type_t *iface, const var_t *func)
|
||||||
|
{
|
||||||
|
while ((iface = type_iface_get_inherit(iface)))
|
||||||
|
{
|
||||||
|
const statement_t *stmt;
|
||||||
|
STATEMENTS_FOR_EACH_FUNC(stmt, type_iface_get_stmts(iface))
|
||||||
|
{
|
||||||
|
const var_t *funccmp = stmt->u.var;
|
||||||
|
|
||||||
|
if (!is_callas(func->attrs))
|
||||||
|
{
|
||||||
|
char inherit_name[256];
|
||||||
|
/* compare full name including property prefix */
|
||||||
|
strcpy(inherit_name, get_name(funccmp));
|
||||||
|
if (!strcmp(inherit_name, get_name(func))) return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void write_method_macro(FILE *header, const type_t *iface, const char *name)
|
static void write_method_macro(FILE *header, const type_t *iface, const char *name)
|
||||||
{
|
{
|
||||||
const statement_t *stmt;
|
const statement_t *stmt;
|
||||||
|
@ -967,7 +989,10 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char
|
||||||
if (!callconv) callconv = "STDMETHODCALLTYPE";
|
if (!callconv) callconv = "STDMETHODCALLTYPE";
|
||||||
indent(header, 0);
|
indent(header, 0);
|
||||||
write_type_decl_left(header, type_function_get_rettype(func->type));
|
write_type_decl_left(header, type_function_get_rettype(func->type));
|
||||||
fprintf(header, " (%s *%s)(\n", callconv, get_name(func));
|
if (is_inherited_method(iface, func))
|
||||||
|
fprintf(header, " (%s *%s_%s)(\n", callconv, iface->name, func->name);
|
||||||
|
else
|
||||||
|
fprintf(header, " (%s *%s)(\n", callconv, get_name(func));
|
||||||
write_args(header, type_get_function_args(func->type), name, 1, TRUE);
|
write_args(header, type_get_function_args(func->type), name, 1, TRUE);
|
||||||
fprintf(header, ");\n");
|
fprintf(header, ");\n");
|
||||||
fprintf(header, "\n");
|
fprintf(header, "\n");
|
||||||
|
|
Loading…
Reference in New Issue