mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
365 lines
6.4 KiB
365 lines
6.4 KiB
// Copyright (c) 2018 Siegfried Pammer |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a copy of this |
|
// software and associated documentation files (the "Software"), to deal in the Software |
|
// without restriction, including without limitation the rights to use, copy, modify, merge, |
|
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons |
|
// to whom the Software is furnished to do so, subject to the following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included in all copies or |
|
// substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
|
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR |
|
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE |
|
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|
// DEALINGS IN THE SOFTWARE. |
|
|
|
using System; |
|
using System.Runtime.InteropServices; |
|
|
|
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
|
{ |
|
internal class CS73_StackAllocInitializers |
|
{ |
|
[StructLayout(LayoutKind.Sequential, Size = 5)] |
|
private struct StructWithSize5 |
|
{ |
|
public byte a; |
|
public byte b; |
|
public byte c; |
|
public byte d; |
|
public byte e; |
|
|
|
public StructWithSize5(byte a, byte b, byte c, byte d, byte e) |
|
{ |
|
this.a = a; |
|
this.b = b; |
|
this.c = c; |
|
this.d = d; |
|
this.e = e; |
|
} |
|
} |
|
|
|
public unsafe string SimpleStackAllocStruct1() |
|
{ |
|
StructWithSize5* ptr = stackalloc StructWithSize5[4] { |
|
new StructWithSize5(1, 2, 3, 4, 5), |
|
new StructWithSize5(11, 22, 33, 44, 55), |
|
new StructWithSize5(1, 4, 8, 6, 2), |
|
new StructWithSize5(12, 23, 34, 45, 56) |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocBool() |
|
{ |
|
bool* ptr = stackalloc bool[4] { |
|
false, |
|
true, |
|
false, |
|
true |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string DoNotInlineTest() |
|
{ |
|
bool* ptr = stackalloc bool[4] { |
|
false, |
|
true, |
|
false, |
|
true |
|
}; |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocByte() |
|
{ |
|
byte* ptr = stackalloc byte[2] { |
|
0, |
|
1 |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer(ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocPrimesAsBytes() |
|
{ |
|
byte* ptr = stackalloc byte[55] { |
|
1, |
|
2, |
|
3, |
|
5, |
|
7, |
|
11, |
|
13, |
|
17, |
|
19, |
|
23, |
|
29, |
|
31, |
|
37, |
|
41, |
|
43, |
|
47, |
|
53, |
|
59, |
|
61, |
|
67, |
|
71, |
|
73, |
|
79, |
|
83, |
|
89, |
|
97, |
|
101, |
|
103, |
|
107, |
|
109, |
|
113, |
|
127, |
|
131, |
|
137, |
|
139, |
|
149, |
|
151, |
|
157, |
|
163, |
|
167, |
|
173, |
|
179, |
|
181, |
|
191, |
|
193, |
|
197, |
|
199, |
|
211, |
|
223, |
|
227, |
|
229, |
|
233, |
|
239, |
|
241, |
|
251 |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer(ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocChar() |
|
{ |
|
char* ptr = stackalloc char[4] { |
|
'1', |
|
'2', |
|
'3', |
|
'4' |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocCharAlphabet() |
|
{ |
|
char* ptr = stackalloc char[26] { |
|
'A', |
|
'B', |
|
'C', |
|
'D', |
|
'E', |
|
'F', |
|
'G', |
|
'H', |
|
'I', |
|
'J', |
|
'K', |
|
'L', |
|
'M', |
|
'N', |
|
'O', |
|
'P', |
|
'Q', |
|
'R', |
|
'S', |
|
'T', |
|
'U', |
|
'V', |
|
'W', |
|
'X', |
|
'Y', |
|
'Z' |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocSByte() |
|
{ |
|
sbyte* ptr = stackalloc sbyte[3] { |
|
1, |
|
2, |
|
3 |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocInt16() |
|
{ |
|
short* ptr = stackalloc short[3] { |
|
1, |
|
2, |
|
3 |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocUInt16() |
|
{ |
|
ushort* ptr = stackalloc ushort[3] { |
|
1, |
|
2, |
|
3 |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocInt32() |
|
{ |
|
int* ptr = stackalloc int[3] { |
|
1, |
|
2, |
|
3 |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocInt32(int a, int b, int c) |
|
{ |
|
int* ptr = stackalloc int[6] { |
|
1, |
|
a, |
|
2, |
|
b, |
|
3, |
|
c |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocInt32Fibonacci() |
|
{ |
|
int* ptr = stackalloc int[17] { |
|
1, |
|
1, |
|
2, |
|
3, |
|
5, |
|
8, |
|
13, |
|
21, |
|
34, |
|
55, |
|
89, |
|
144, |
|
233, |
|
377, |
|
610, |
|
987, |
|
1597 |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocUInt32() |
|
{ |
|
uint* ptr = stackalloc uint[3] { |
|
1u, |
|
2u, |
|
3u |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocInt64() |
|
{ |
|
long* ptr = stackalloc long[3] { |
|
1L, |
|
2L, |
|
3L |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocUInt64() |
|
{ |
|
ulong* ptr = stackalloc ulong[3] { |
|
1uL, |
|
2uL, |
|
3uL |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string SimpleStackAllocInt32NonConstant(int a, int b, int c) |
|
{ |
|
int* ptr = stackalloc int[6] { |
|
0, |
|
1, |
|
0, |
|
a, |
|
b, |
|
c |
|
}; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string NotAnInitializer(int a, int b, int c) |
|
{ |
|
int* ptr = stackalloc int[6]; |
|
ptr[1] = a; |
|
ptr[3] = b; |
|
ptr[5] = c; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
} |
|
|
|
public unsafe string NegativeOffsets(int a, int b, int c) |
|
{ |
|
#if OPT |
|
byte* intPtr = stackalloc byte[12]; |
|
*(int*)intPtr = 1; |
|
*(int*)(intPtr - 4) = 2; |
|
*(int*)(intPtr - 8) = 3; |
|
int* ptr = (int*)intPtr; |
|
Console.WriteLine(*ptr); |
|
return UsePointer((byte*)ptr); |
|
#else |
|
byte* ptr = stackalloc byte[12]; |
|
*(int*)ptr = 1; |
|
*(int*)(ptr - 4) = 2; |
|
*(int*)(ptr - 8) = 3; |
|
int* ptr2 = (int*)ptr; |
|
Console.WriteLine(*ptr2); |
|
return UsePointer((byte*)ptr2); |
|
#endif |
|
} |
|
|
|
public unsafe string UsePointer(byte* ptr) |
|
{ |
|
return ptr->ToString(); |
|
} |
|
} |
|
}
|
|
|