Xamarin Public Jenkins (auto-signing) 94b2861243 Imported Upstream version 4.8.0.309
Former-commit-id: 5f9c6ae75f295e057a7d2971f3a6df4656fa8850
2016-11-10 13:04:39 +00:00

66 lines
1.4 KiB
C#

using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
namespace Mono {
internal static class RuntimeMarshal {
internal static string PtrToUtf8String (IntPtr ptr)
{
unsafe {
return new String ((sbyte*)ptr);
}
}
internal static SafeStringMarshal MarshalString (string str)
{
return new SafeStringMarshal (str);
}
static int DecodeBlobSize (IntPtr in_ptr, out IntPtr out_ptr)
{
uint size;
unsafe {
byte *ptr = (byte*)in_ptr;
if ((*ptr & 0x80) == 0) {
size = (uint)(ptr [0] & 0x7f);
ptr++;
} else if ((*ptr & 0x40) == 0){
size = (uint)(((ptr [0] & 0x3f) << 8) + ptr [1]);
ptr += 2;
} else {
size = (uint)(((ptr [0] & 0x1f) << 24) +
(ptr [1] << 16) +
(ptr [2] << 8) +
ptr [3]);
ptr += 4;
}
out_ptr = (IntPtr)ptr;
}
return (int)size;
}
internal static byte[] DecodeBlobArray (IntPtr ptr)
{
IntPtr out_ptr;
int size = DecodeBlobSize (ptr, out out_ptr);
byte[] res = new byte [size];
Marshal.Copy (out_ptr, res, 0, size);
return res;
}
internal static int AsciHexDigitValue (int c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return c - 'A' + 10;
}
[MethodImpl (MethodImplOptions.InternalCall)]
internal static extern void FreeAssemblyName (ref MonoAssemblyName name);
}
}