Skip to content

Commit 15f5936

Browse files
committed
Remove the implicit conversion from span<T> to T* and instead introduce a .data() member, matching the C++20 design for span<T>
1 parent d94a7f7 commit 15f5936

File tree

11 files changed

+34
-40
lines changed

11 files changed

+34
-40
lines changed

src/native/dnmd/src/inc/internal/dnmd_tools_platform.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
inline bool create_mdhandle(malloc_span<uint8_t> const& buffer, mdhandle_ptr& handle)
1414
{
1515
mdhandle_t h;
16-
if (!md_create_handle(buffer, buffer.size(), &h))
16+
if (!md_create_handle(buffer.data(), buffer.size(), &h))
1717
return false;
1818
handle.reset(h);
1919
return true;
@@ -71,7 +71,7 @@ inline bool read_in_file(char const* file, malloc_span<uint8_t>& b)
7171
return false;
7272

7373
b = { (uint8_t*)std::malloc(size), size };
74-
fd.read((char*)(uint8_t*)b, b.size());
74+
fd.read((char*)b.data(), b.size());
7575
return true;
7676
}
7777

@@ -82,7 +82,7 @@ inline bool write_out_file(char const* file, malloc_span<uint8_t> b)
8282
if (!fd)
8383
return false;
8484

85-
fd.write((char*)(uint8_t*)b, b.size());
85+
fd.write((char*)b.data(), b.size());
8686
return true;
8787
}
8888

@@ -95,7 +95,7 @@ inline bool find_pe_image_bitness(uint16_t machine, uint8_t& bitness)
9595
case ((x) ^ IMAGE_FILE_MACHINE_OS_MASK_NETBSD): \
9696
case ((x) ^ IMAGE_FILE_MACHINE_OS_MASK_SUN): \
9797
case (x)
98-
98+
9999
switch (machine)
100100
{
101101
MAKE_MACHINE_CASE(IMAGE_FILE_MACHINE_I386):
@@ -120,7 +120,7 @@ inline bool get_metadata_from_pe(malloc_span<uint8_t>& b)
120120

121121
// [TODO] Handle endian issues with .NET generated PE images
122122
// All integers should be read as little-endian.
123-
auto dos_header = (PIMAGE_DOS_HEADER)(void*)b;
123+
auto dos_header = (PIMAGE_DOS_HEADER)(void*)b.data();
124124
bool is_pe = dos_header->e_magic == IMAGE_DOS_SIGNATURE;
125125
if (!is_pe)
126126
return false;
@@ -138,7 +138,7 @@ inline bool get_metadata_from_pe(malloc_span<uint8_t>& b)
138138
size_t remaining_pe_size = b.size() - dos_header->e_lfanew;
139139
uint16_t section_header_count;
140140
uint8_t* section_header_begin;
141-
auto nt_header_any = (PIMAGE_NT_HEADERS)(b + dos_header->e_lfanew);
141+
auto nt_header_any = (PIMAGE_NT_HEADERS)(b.data() + dos_header->e_lfanew);
142142
uint16_t machine = nt_header_any->FileHeader.Machine;
143143

144144
uint8_t bitness;
@@ -196,7 +196,7 @@ inline bool get_metadata_from_pe(malloc_span<uint8_t>& b)
196196
if (cor_header_offset > b.size() - sizeof(IMAGE_COR20_HEADER))
197197
return false;
198198

199-
auto cor_header = (PIMAGE_COR20_HEADER)(b + cor_header_offset);
199+
auto cor_header = (PIMAGE_COR20_HEADER)(b.data() + cor_header_offset);
200200
tgt_header = find_section_header(section_headers, cor_header->MetaData.VirtualAddress);
201201
if (tgt_header == nullptr)
202202
return false;
@@ -209,15 +209,15 @@ inline bool get_metadata_from_pe(malloc_span<uint8_t>& b)
209209
if (metadata_offset > b.size())
210210
return false;
211211

212-
void* ptr = (void*)(b + metadata_offset);
212+
void* ptr = (void*)(b.data() + metadata_offset);
213213

214214
size_t metadata_length = cor_header->MetaData.Size;
215215
if (metadata_length > b.size() - metadata_offset)
216216
return false;
217217

218218
// Capture the metadata portion of the image.
219219
malloc_span<uint8_t> metadata = { (uint8_t*)std::malloc(metadata_length), metadata_length };
220-
std::memcpy(metadata, ptr, metadata.size());
220+
std::memcpy(metadata.data(), ptr, metadata.size());
221221
b = std::move(metadata);
222222
return true;
223223
}

src/native/dnmd/src/inc/internal/span.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ class span
2929
return _size;
3030
}
3131

32-
operator T* () noexcept
32+
T* data() noexcept
3333
{
3434
return _ptr;
3535
}
3636

37-
operator T const* () const noexcept
37+
T const* data() const noexcept
3838
{
3939
return _ptr;
4040
}
@@ -137,7 +137,7 @@ span<T> slice(span<T> b, size_t offset)
137137
{
138138
if (offset > b.size())
139139
throw std::out_of_range{ "Out of bounds access" };
140-
return { b + offset, b.size() - offset };
140+
return { b.data() + offset, b.size() - offset };
141141
}
142142

143-
#endif // _SRC_INC_INTERNAL_SPAN_HPP_
143+
#endif // _SRC_INC_INTERNAL_SPAN_HPP_

src/native/dnmd/src/interfaces/importhelpers.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,13 @@ namespace
206206
if (publicKeyBlob.size() < sizeof(PublicKeyBlob))
207207
return CORSEC_E_INVALID_PUBLICKEY;
208208

209-
PublicKeyBlob const* publicKey = reinterpret_cast<PublicKeyBlob const*>((uint8_t const*)publicKeyBlob);
209+
PublicKeyBlob const* publicKey = reinterpret_cast<PublicKeyBlob const*>(publicKeyBlob.data());
210210

211211
if (publicKey->PublicKeyLength != publicKeyBlob.size() - sizeof(PublicKeyBlob))
212212
return CORSEC_E_INVALID_PUBLICKEY;
213213

214214
if (publicKeyBlob.size() == sizeof(StrongNameKeys::EcmaPublicKey)
215-
&& std::memcmp(publicKeyBlob, StrongNameKeys::EcmaPublicKey, sizeof(StrongNameKeys::EcmaPublicKey)) == 0)
215+
&& std::memcmp(publicKeyBlob.data(), StrongNameKeys::EcmaPublicKey, sizeof(StrongNameKeys::EcmaPublicKey)) == 0)
216216
{
217217
return S_OK;
218218
}
@@ -685,14 +685,10 @@ namespace
685685
if (!md_set_column_value_as_utf8(assemblyRef, mdtAssemblyRef_Culture, assemblyCulture))
686686
return E_FAIL;
687687

688-
uint8_t const* hash = sourceAssemblyHash;
689-
uint32_t hashLength = (uint32_t)sourceAssemblyHash.size();
690-
if (!md_set_column_value_as_blob(assemblyRef, mdtAssemblyRef_HashValue, hash, hashLength))
688+
if (!md_set_column_value_as_blob(assemblyRef, mdtAssemblyRef_HashValue, sourceAssemblyHash.data(), (uint32_t)sourceAssemblyHash.size()))
691689
return E_FAIL;
692690

693-
uint8_t const* publicKeyTokenBlob = publicKeyToken.data();
694-
uint32_t publicKeyTokenLength = (uint32_t)publicKeyToken.size();
695-
if (!md_set_column_value_as_blob(assemblyRef, mdtAssemblyRef_PublicKeyOrToken, publicKeyTokenBlob, publicKeyTokenLength))
691+
if (!md_set_column_value_as_blob(assemblyRef, mdtAssemblyRef_PublicKeyOrToken, publicKeyToken.data(), (uint32_t)publicKeyToken.size()))
696692
return E_FAIL;
697693

698694
*targetAssembly = assemblyRef;
@@ -1704,9 +1700,7 @@ HRESULT ImportReferenceToTypeDefOrRefOrSpec(
17041700
if (!md_append_row(targetModule, mdtid_TypeSpec, &typeSpec))
17051701
return E_FAIL;
17061702

1707-
uint8_t const* importedSignatureData = importedSignature;
1708-
uint32_t importedSignatureLength = (uint32_t)importedSignature.size();
1709-
if (!md_set_column_value_as_blob(typeSpec, mdtTypeSpec_Signature, importedSignatureData, importedSignatureLength))
1703+
if (!md_set_column_value_as_blob(typeSpec, mdtTypeSpec_Signature, importedSignature.data(), (uint32_t)importedSignature.size()))
17101704
return E_FAIL;
17111705

17121706
if (!md_cursor_to_token(typeSpec, importedToken))

src/native/dnmd/src/interfaces/metadataimport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1153,7 +1153,7 @@ HRESULT STDMETHODCALLTYPE MetadataImportRO::FindMethod(
11531153
if (!md_get_column_value_as_blob(target, mdtMethodDef_Signature, &sig, &sigLen))
11541154
return CLDB_E_FILE_CORRUPT;
11551155
if (sigLen != methodDefSig.size()
1156-
|| ::memcmp(methodDefSig, sig, sigLen) != 0)
1156+
|| ::memcmp(methodDefSig.data(), sig, sigLen) != 0)
11571157
{
11581158
continue;
11591159
}

src/native/dnmd/src/interfaces/pal.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ int strcat_s(char* dest, rsize_t destsz, char const* src)
113113

114114
bool pal::ComputeSha1Hash(span<uint8_t const> data, std::array<uint8_t, SHA1_HASH_SIZE>& hashDestination)
115115
{
116-
minipal_sha1(data, data.size(), hashDestination.data(), SHA1_HASH_SIZE);
116+
minipal_sha1(data.data(), data.size(), hashDestination.data(), SHA1_HASH_SIZE);
117117
return true;
118118
}
119119

src/native/dnmd/src/interfaces/signatures.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,23 @@ namespace
1111
std::tuple<uint32_t, span<T>> read_compressed_uint(span<T> signature)
1212
{
1313
ULONG value = 0;
14-
signature = slice(signature, CorSigUncompressData(signature, &value));
14+
signature = slice(signature, CorSigUncompressData(signature.data(), &value));
1515
return std::make_tuple(value, signature);
1616
}
1717

1818
template<typename T, typename = typename std::enable_if<std::is_same<typename std::remove_const<T>::type, uint8_t>::value>::type>
1919
std::tuple<int32_t, span<T>> read_compressed_int(span<T> signature)
2020
{
2121
int value = 0;
22-
signature = slice(signature, CorSigUncompressSignedInt(signature, &value));
22+
signature = slice(signature, CorSigUncompressSignedInt(signature.data(), &value));
2323
return std::make_tuple(value, signature);
2424
}
2525

2626
template<typename T, typename = typename std::enable_if<std::is_same<typename std::remove_const<T>::type, uint8_t>::value>::type>
2727
std::tuple<mdToken, span<T>> read_compressed_token(span<T> signature)
2828
{
2929
mdToken value = mdTokenNil;
30-
signature = slice(signature, CorSigUncompressToken(signature, &value));
30+
signature = slice(signature, CorSigUncompressToken(signature.data(), &value));
3131
return std::make_tuple(value, signature);
3232
}
3333

@@ -272,14 +272,14 @@ void GetMethodDefSigFromMethodRefSig(span<uint8_t> methodRefSig, inline_span<uin
272272
methodDefSig[offset++] = callingConvention;
273273
if ((callingConvention & IMAGE_CEE_CS_CALLCONV_GENERIC) == IMAGE_CEE_CS_CALLCONV_GENERIC)
274274
{
275-
offset += CorSigCompressData(genericParameterCount, methodDefSig + offset);
275+
offset += CorSigCompressData(genericParameterCount, methodDefSig.data() + offset);
276276
}
277-
std::memcpy(methodDefSig + offset, compressedNewParamCount, newParamCountCompressedSize);
277+
std::memcpy(methodDefSig.data() + offset, compressedNewParamCount.data(), newParamCountCompressedSize);
278278
offset += newParamCountCompressedSize;
279279

280280
// Now that we've re-written the parameter count, we can copy the rest of the signature directly from the MethodRefSig
281281
assert(returnTypeAndParameters.size() >= methodDefSigBufferLength - offset);
282-
std::memcpy(methodDefSig + offset, returnTypeAndParameters, methodDefSigBufferLength - offset);
282+
std::memcpy(methodDefSig.data() + offset, returnTypeAndParameters.data(), methodDefSigBufferLength - offset);
283283

284284
return;
285285
}

src/native/dnmd/src/mdmerge/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void merge(merge_config_t cfg)
8282
size_t save_size;
8383
md_write_to_buffer(handle.get(), nullptr, &save_size);
8484
malloc_span<uint8_t> out_buffer { (uint8_t*)malloc(save_size), save_size };
85-
if (!md_write_to_buffer(handle.get(), out_buffer, &save_size))
85+
if (!md_write_to_buffer(handle.get(), out_buffer.data(), &save_size))
8686
{
8787
std::fprintf(stderr, "Failed to save image.\n");
8888
}

src/native/dnmd/test/regpal/pal.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ bool pal::ReadFile(pal::path path, malloc_span<uint8_t>& b)
140140
b = { (uint8_t*)std::malloc(size), size };
141141

142142
DWORD bytesRead;
143-
if (!ReadFile(file.get(), b, (DWORD)b.size(), &bytesRead, nullptr))
143+
if (!::ReadFile(file.get(), b.data(), (DWORD)b.size(), &bytesRead, nullptr))
144144
return false;
145145

146146
return bytesRead == b.size();

src/native/dnmd/test/regperf/perf.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ int main(int argc, char** argv)
207207
}
208208

209209
RETURN_IF_FAILED(PerfInitialize(
210-
dataImage,
210+
dataImage.data(),
211211
(uint32_t)dataImage.size()));
212212

213213
benchmark::Initialize(&argc, argv);

src/native/dnmd/test/regtest/discovery.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ namespace
150150
THROW_IF_FAILED(image->GetSaveSize(cssAccurate, &size));
151151

152152
malloc_span<uint8_t> imageWithIndirectionTables{ (uint8_t*)malloc(size), size };
153-
THROW_IF_FAILED(image->SaveToMemory(imageWithIndirectionTables, size));
153+
THROW_IF_FAILED(image->SaveToMemory(imageWithIndirectionTables.data(), size));
154154

155155
return imageWithIndirectionTables;
156156
}

src/native/dnmd/test/regtest/metadata.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,14 +1624,14 @@ TEST(FindTest, FindAPIs)
16241624
malloc_span<uint8_t> metadata = GetRegressionAssemblyMetadata();
16251625

16261626
minipal::com_ptr<IMetaDataImport2> baselineImport;
1627-
ASSERT_HRESULT_SUCCEEDED(CreateImport(TestBaseline::Metadata, metadata, (uint32_t)metadata.size(), &baselineImport));
1627+
ASSERT_HRESULT_SUCCEEDED(CreateImport(TestBaseline::Metadata, metadata.data(), (uint32_t)metadata.size(), &baselineImport));
16281628
// Load metadata
16291629
minipal::com_ptr<IMetaDataImport2> currentImport;
16301630

16311631
minipal::com_ptr<IMetaDataDispenser> dispenser;
16321632
ASSERT_HRESULT_SUCCEEDED(GetDispenser(IID_IMetaDataDispenser, (void**)&dispenser));
16331633

1634-
ASSERT_HRESULT_SUCCEEDED(CreateImport(dispenser, metadata, (uint32_t)metadata.size(), &currentImport));
1634+
ASSERT_HRESULT_SUCCEEDED(CreateImport(dispenser, metadata.data(), (uint32_t)metadata.size(), &currentImport));
16351635

16361636
static auto FindTokenByName = [](IMetaDataImport2* import, LPCWSTR name, mdToken enclosing = mdTokenNil) -> mdToken
16371637
{
@@ -1767,7 +1767,7 @@ TEST_P(MetadataImportTest, ImportAPIs)
17671767
{
17681768
auto param = GetParam();
17691769
span<uint8_t> blob = GetMetadataForFile(param);
1770-
void const* data = blob;
1770+
void const* data = blob.data();
17711771
uint32_t dataLen = (uint32_t)blob.size();
17721772

17731773
// Load metadata
@@ -2004,7 +2004,7 @@ TEST_P(MetaDataLongRunningTest, ImportAPIs)
20042004
{
20052005
auto param = GetParam();
20062006
span<uint8_t> blob = GetMetadataForFile(param);
2007-
void const* data = blob;
2007+
void const* data = blob.data();
20082008
uint32_t dataLen = (uint32_t)blob.size();
20092009

20102010
// Load metadata

0 commit comments

Comments
 (0)