From: Vibhav Pant <vibhavp@gmail.com> --- MAINTAINERS | 4 +++ dlls/rometadata/mdtables.c | 57 +++++++++++++++++++++++++++--- dlls/rometadata/tests/rometadata.c | 44 +++++++++++------------ 3 files changed, 78 insertions(+), 27 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 9426d3f117c..02eadb08131 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -423,6 +423,10 @@ WinRT Devices P: Vibhav Pant <vibhavp@gmail.com> @vibhavp F: dlls/windows.devices.enumeration/ +WinRT Metadata +P: Vibhav Pant <vibhavp@gmail.com> @vibhavp +F: dlls/rometadata/ + X11 Driver M: Alexandre Julliard <julliard@winehq.org> @julliard P: Rémi Bernon <rbernon@codeweavers.com> @rbernon diff --git a/dlls/rometadata/mdtables.c b/dlls/rometadata/mdtables.c index b8c8475ce20..5559a058880 100644 --- a/dlls/rometadata/mdtables.c +++ b/dlls/rometadata/mdtables.c @@ -1,7 +1,7 @@ /* * IMetaDataTables, IMetaDataImport implementation * - * Copyright 2025 Vibhav Pant + * Copyright 2025-2026 Vibhav Pant * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -789,15 +789,62 @@ static HRESULT WINAPI import_ResolveTypeRef(IMetaDataImport *iface, mdTypeRef ty static HRESULT WINAPI import_EnumMembers(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef type_def, mdToken *member_defs, ULONG len, ULONG *count) { - FIXME("(%p, %p, %#x, %p, %lu, %p): stub!\n", iface, henum, type_def, member_defs, len, count); - return E_NOTIMPL; + TRACE("(%p, %p, %s, %p, %lu, %p)\n", iface, henum, debugstr_mdToken(type_def), member_defs, len, count); + return IMetaDataImport_EnumMembersWithName(iface, henum, type_def, NULL, member_defs, len, count); } static HRESULT WINAPI import_EnumMembersWithName(IMetaDataImport *iface, HCORENUM *henum, mdTypeDef token, const WCHAR *name, mdToken *member_defs, ULONG len, ULONG *count) { - FIXME("(%p, %p, %#x, %s, %p, %lu, %p): stub!\n", iface, henum, token, debugstr_w(name), member_defs, len, count); - return E_NOTIMPL; + TRACE("(%p, %p, %s, %s, %p, %lu, %p)\n", iface, henum, debugstr_mdToken(token), debugstr_w(name), member_defs, len, + count); + + if (!*henum) + { + HCORENUM methods_enum = NULL, fields_enum = NULL; + ULONG methods_len, fields_len; + mdToken *tokens = NULL; + HRESULT hr; + + if (FAILED((hr = IMetaDataImport_EnumMethodsWithName(iface, &methods_enum, token, name, NULL, 0, NULL)))) + return hr; + if (FAILED((hr = IMetaDataImport_CountEnum(iface, methods_enum, &methods_len)))) goto done; + + if (FAILED((hr = IMetaDataImport_EnumFieldsWithName(iface, &fields_enum, token, name, NULL, 0, NULL)))) + goto done; + if (FAILED((hr = IMetaDataImport_CountEnum(iface, fields_enum, &fields_len)))) goto done; + + if (!methods_len && !fields_len) + { + hr = S_FALSE; + goto done; + } + if (!(tokens = calloc(methods_len + fields_len, sizeof(*tokens)))) + { + hr = E_OUTOFMEMORY; + goto done; + } + if (methods_len) + { + hr = IMetaDataImport_EnumMethodsWithName(iface, &methods_enum, token, name, tokens, methods_len, NULL); + if (FAILED(hr)) goto done; + } + if (fields_len) + { + hr = IMetaDataImport_EnumFieldsWithName(iface, &fields_enum, token, name, &tokens[methods_len], fields_len, + NULL); + if (FAILED(hr)) goto done; + } + done: + IMetaDataImport_CloseEnum(iface, methods_enum); + IMetaDataImport_CloseEnum(iface, fields_enum); + if (hr == S_OK) + hr = token_enum_list_create(henum, methods_len + fields_len, tokens); + free(tokens); + if (hr != S_OK) return hr; + } + + return token_enum_get_entries(*henum, member_defs, len, count); } static HRESULT table_create_enum_from_token_list(IMetaDataTables *iface, enum table table, enum table list_table, diff --git a/dlls/rometadata/tests/rometadata.c b/dlls/rometadata/tests/rometadata.c index a426934a399..3dc29f77da4 100644 --- a/dlls/rometadata/tests/rometadata.c +++ b/dlls/rometadata/tests/rometadata.c @@ -1216,14 +1216,14 @@ static void test_IMetaDataImport(void) henum2 = NULL; token = mdTokenNil; hr = IMetaDataImport_EnumMembersWithName(md_import, &henum2, typedef2, name, &token, 1, NULL); - todo_wine ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(!!henum2, "got henum2 %p\n", henum2); + ok(hr == S_OK, "got hr %#lx\n", hr); + ok(!!henum2, "got henum2 %p\n", henum2); buf_len2 = 0; hr = IMetaDataImport_CountEnum(md_import, henum2, &buf_len2); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(buf_len2 == 1, "got buf_len2 %lu\n", buf_len2); - todo_wine ok(token == methoddef_tokens[i], "got token %s != %s\n", debugstr_mdToken(token), - debugstr_mdToken(methoddef_tokens[i])); + ok(buf_len2 == 1, "got buf_len2 %lu\n", buf_len2); + ok(token == methoddef_tokens[i], "got token %s != %s\n", debugstr_mdToken(token), + debugstr_mdToken(methoddef_tokens[i])); IMetaDataImport_CloseEnum(md_import, henum2); winetest_pop_context(); @@ -1248,22 +1248,22 @@ static void test_IMetaDataImport(void) henum = NULL; hr = IMetaDataImport_EnumMembers(md_import, &henum, typedef2, NULL, 0, NULL); - todo_wine ok(hr == S_FALSE, "got hr %#lx\n", hr); - todo_wine ok(!!henum, "got henum %p\n", henum); + ok(hr == S_FALSE, "got hr %#lx\n", hr); + ok(!!henum, "got henum %p\n", henum); buf_len2 = 0; hr = IMetaDataImport_CountEnum(md_import, henum, &buf_len2); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); + ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); IMetaDataImport_CloseEnum(md_import, henum); henum = NULL; hr = IMetaDataImport_EnumMembersWithName(md_import, &henum, typedef2, NULL, NULL, 0, NULL); - todo_wine ok(hr == S_FALSE, "got hr %#lx\n", hr); - todo_wine ok(!!henum, "got henum %p\n", henum); + ok(hr == S_FALSE, "got hr %#lx\n", hr); + ok(!!henum, "got henum %p\n", henum); buf_len2 = 0; hr = IMetaDataImport_CountEnum(md_import, henum, &buf_len2); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); + ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); IMetaDataImport_CloseEnum(md_import, henum); for (i = 0; i < ARRAY_SIZE(field_enum_test_cases); i++) @@ -1309,22 +1309,22 @@ static void test_IMetaDataImport(void) henum = NULL; hr = IMetaDataImport_EnumMembers(md_import, &henum, typedef1, NULL, 0, NULL); - todo_wine ok(hr == S_FALSE, "got hr %#lx\n", hr); - todo_wine ok(!!henum, "got henum %p\n", henum); + ok(hr == S_FALSE, "got hr %#lx\n", hr); + ok(!!henum, "got henum %p\n", henum); buf_len2 = 0; hr = IMetaDataImport_CountEnum(md_import, henum, &buf_len2); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); + ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); IMetaDataImport_CloseEnum(md_import, henum); henum = NULL; hr = IMetaDataImport_EnumMembersWithName(md_import, &henum, typedef1, NULL, NULL, 0, NULL); - todo_wine ok(hr == S_FALSE, "got hr %#lx\n", hr); - todo_wine ok(!!henum, "got henum %p\n", henum); + ok(hr == S_FALSE, "got hr %#lx\n", hr); + ok(!!henum, "got henum %p\n", henum); buf_len2 = 0; hr = IMetaDataImport_CountEnum(md_import, henum, &buf_len2); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); + ok(buf_len2 == buf_len, "got buf_len2 %lu != %lu\n", buf_len2, buf_len); IMetaDataImport_CloseEnum(md_import, henum); for (field_idx = 0; field_idx < buf_len; field_idx++) @@ -1374,14 +1374,14 @@ static void test_IMetaDataImport(void) henum = NULL; fielddef = mdFieldDefNil; hr = IMetaDataImport_EnumMembersWithName(md_import, &henum, typedef2, name, &fielddef, 1, NULL); - todo_wine ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(!!henum, "got henum %p\n", henum); + ok(hr == S_OK, "got hr %#lx\n", hr); + ok(!!henum, "got henum %p\n", henum); buf_len2 = 0; hr = IMetaDataImport_CountEnum(md_import, henum, &buf_len2); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(buf_len2 == 1, "got buf_len2 %lu\n", buf_len2); - todo_wine ok(fielddef == fielddef_tokens[field_idx], "got fielddef %s != %s\n", debugstr_mdToken(fielddef), - debugstr_mdToken(fielddef_tokens[field_idx])); + ok(buf_len2 == 1, "got buf_len2 %lu\n", buf_len2); + ok(fielddef == fielddef_tokens[field_idx], "got fielddef %s != %s\n", debugstr_mdToken(fielddef), + debugstr_mdToken(fielddef_tokens[field_idx])); IMetaDataImport_CloseEnum(md_import, henum); fielddef = mdFieldDefNil; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11548