File: RuntimeMarshal.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (78 lines) | stat: -rw-r--r-- 1,781 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

namespace Mono {
	internal static class RuntimeMarshal {
		internal static string PtrToUtf8String (IntPtr ptr)
		{
			unsafe {
				if (ptr == IntPtr.Zero)
					return string.Empty;

				byte* bytes = (byte*)ptr;
				int length = 0;

				try {
					while (bytes++ [0] != 0)
						length++;
				} catch (NullReferenceException) {
					throw new ArgumentOutOfRangeException ("ptr", "Value does not refer to a valid string.");
				}

				return new String ((sbyte*)ptr, 0, length, System.Text.Encoding.UTF8);
			}
		}

		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, bool freeStruct);
	}
}