Skip to content

Commit c40ddeb

Browse files
Make the ZLib P/Invokes all blittable (#53968)
* Make the ZLib P/Invokes all blittable
1 parent f18a704 commit c40ddeb

2 files changed

Lines changed: 61 additions & 33 deletions

File tree

src/libraries/Common/src/Interop/Interop.zlib.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,34 @@ internal static partial class Interop
99
internal static partial class zlib
1010
{
1111
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_DeflateInit2_")]
12-
internal static extern ZLibNative.ErrorCode DeflateInit2_(
13-
ref ZLibNative.ZStream stream,
12+
internal static extern unsafe ZLibNative.ErrorCode DeflateInit2_(
13+
ZLibNative.ZStream* stream,
1414
ZLibNative.CompressionLevel level,
1515
ZLibNative.CompressionMethod method,
1616
int windowBits,
1717
int memLevel,
1818
ZLibNative.CompressionStrategy strategy);
1919

2020
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_Deflate")]
21-
internal static extern ZLibNative.ErrorCode Deflate(ref ZLibNative.ZStream stream, ZLibNative.FlushCode flush);
21+
internal static extern unsafe ZLibNative.ErrorCode Deflate(ZLibNative.ZStream* stream, ZLibNative.FlushCode flush);
2222

2323
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_DeflateReset")]
24-
internal static extern ZLibNative.ErrorCode DeflateReset(ref ZLibNative.ZStream stream);
24+
internal static extern unsafe ZLibNative.ErrorCode DeflateReset(ZLibNative.ZStream* stream);
2525

2626
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_DeflateEnd")]
27-
internal static extern ZLibNative.ErrorCode DeflateEnd(ref ZLibNative.ZStream stream);
27+
internal static extern unsafe ZLibNative.ErrorCode DeflateEnd(ZLibNative.ZStream* stream);
2828

2929
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_InflateInit2_")]
30-
internal static extern ZLibNative.ErrorCode InflateInit2_(ref ZLibNative.ZStream stream, int windowBits);
30+
internal static extern unsafe ZLibNative.ErrorCode InflateInit2_(ZLibNative.ZStream* stream, int windowBits);
3131

3232
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_Inflate")]
33-
internal static extern ZLibNative.ErrorCode Inflate(ref ZLibNative.ZStream stream, ZLibNative.FlushCode flush);
33+
internal static extern unsafe ZLibNative.ErrorCode Inflate(ZLibNative.ZStream* stream, ZLibNative.FlushCode flush);
3434

3535
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_InflateReset")]
36-
internal static extern ZLibNative.ErrorCode InflateReset(ref ZLibNative.ZStream stream);
36+
internal static extern unsafe ZLibNative.ErrorCode InflateReset(ZLibNative.ZStream* stream);
3737

3838
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_InflateEnd")]
39-
internal static extern ZLibNative.ErrorCode InflateEnd(ref ZLibNative.ZStream stream);
39+
internal static extern unsafe ZLibNative.ErrorCode InflateEnd(ZLibNative.ZStream* stream);
4040

4141
[DllImport(Libraries.CompressionNative, EntryPoint = "CompressionNative_Crc32")]
4242
internal static extern unsafe uint crc32(uint crc, byte* buffer, int len);

src/libraries/Common/src/System/IO/Compression/ZLibNative.cs

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -262,81 +262,109 @@ private void EnsureState(State requiredState)
262262
}
263263

264264

265-
public ErrorCode DeflateInit2_(CompressionLevel level, int windowBits, int memLevel, CompressionStrategy strategy)
265+
public unsafe ErrorCode DeflateInit2_(CompressionLevel level, int windowBits, int memLevel, CompressionStrategy strategy)
266266
{
267267
EnsureNotDisposed();
268268
EnsureState(State.NotInitialized);
269269

270-
ErrorCode errC = Interop.zlib.DeflateInit2_(ref _zStream, level, CompressionMethod.Deflated, windowBits, memLevel, strategy);
271-
_initializationState = State.InitializedForDeflate;
270+
fixed (ZStream* stream = &_zStream)
271+
{
272+
ErrorCode errC = Interop.zlib.DeflateInit2_(stream, level, CompressionMethod.Deflated, windowBits, memLevel, strategy);
273+
_initializationState = State.InitializedForDeflate;
272274

273-
return errC;
275+
return errC;
276+
}
274277
}
275278

276279

277-
public ErrorCode Deflate(FlushCode flush)
280+
public unsafe ErrorCode Deflate(FlushCode flush)
278281
{
279282
EnsureNotDisposed();
280283
EnsureState(State.InitializedForDeflate);
281-
return Interop.zlib.Deflate(ref _zStream, flush);
284+
285+
fixed (ZStream* stream = &_zStream)
286+
{
287+
return Interop.zlib.Deflate(stream, flush);
288+
}
282289
}
283290

284291

285-
public ErrorCode DeflateReset()
292+
public unsafe ErrorCode DeflateReset()
286293
{
287294
EnsureNotDisposed();
288295
EnsureState(State.InitializedForDeflate);
289-
return Interop.zlib.DeflateReset(ref _zStream);
296+
297+
fixed (ZStream* stream = &_zStream)
298+
{
299+
return Interop.zlib.DeflateReset(stream);
300+
}
290301
}
291302

292-
public ErrorCode DeflateEnd()
303+
public unsafe ErrorCode DeflateEnd()
293304
{
294305
EnsureNotDisposed();
295306
EnsureState(State.InitializedForDeflate);
296307

297-
ErrorCode errC = Interop.zlib.DeflateEnd(ref _zStream);
298-
_initializationState = State.Disposed;
308+
fixed (ZStream* stream = &_zStream)
309+
{
310+
ErrorCode errC = Interop.zlib.DeflateEnd(stream);
311+
_initializationState = State.Disposed;
299312

300-
return errC;
313+
return errC;
314+
}
301315
}
302316

303317

304-
public ErrorCode InflateInit2_(int windowBits)
318+
public unsafe ErrorCode InflateInit2_(int windowBits)
305319
{
306320
EnsureNotDisposed();
307321
EnsureState(State.NotInitialized);
308322

309-
ErrorCode errC = Interop.zlib.InflateInit2_(ref _zStream, windowBits);
310-
_initializationState = State.InitializedForInflate;
323+
fixed (ZStream* stream = &_zStream)
324+
{
325+
ErrorCode errC = Interop.zlib.InflateInit2_(stream, windowBits);
326+
_initializationState = State.InitializedForInflate;
311327

312-
return errC;
328+
return errC;
329+
}
313330
}
314331

315332

316-
public ErrorCode Inflate(FlushCode flush)
333+
public unsafe ErrorCode Inflate(FlushCode flush)
317334
{
318335
EnsureNotDisposed();
319336
EnsureState(State.InitializedForInflate);
320-
return Interop.zlib.Inflate(ref _zStream, flush);
337+
338+
fixed (ZStream* stream = &_zStream)
339+
{
340+
return Interop.zlib.Inflate(stream, flush);
341+
}
321342
}
322343

323344

324-
public ErrorCode InflateReset()
345+
public unsafe ErrorCode InflateReset()
325346
{
326347
EnsureNotDisposed();
327348
EnsureState(State.InitializedForInflate);
328-
return Interop.zlib.InflateReset(ref _zStream);
349+
350+
fixed (ZStream* stream = &_zStream)
351+
{
352+
return Interop.zlib.InflateReset(stream);
353+
}
329354
}
330355

331-
public ErrorCode InflateEnd()
356+
public unsafe ErrorCode InflateEnd()
332357
{
333358
EnsureNotDisposed();
334359
EnsureState(State.InitializedForInflate);
335360

336-
ErrorCode errC = Interop.zlib.InflateEnd(ref _zStream);
337-
_initializationState = State.Disposed;
361+
fixed (ZStream* stream = &_zStream)
362+
{
363+
ErrorCode errC = Interop.zlib.InflateEnd(stream);
364+
_initializationState = State.Disposed;
338365

339-
return errC;
366+
return errC;
367+
}
340368
}
341369

342370
// This can work even after XxflateEnd().

0 commit comments

Comments
 (0)