123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- using NUnit.Framework;
- using Unity.Burst;
- using Unity.Mathematics;
-
- namespace Burst.Compiler.IL.Tests
- {
- internal class TestConstArrays
- {
- [TestCompiler]
- public static int ReadFromIntArray()
- {
- return StructWithConstArray1.IntValues[1];
- }
-
- [TestCompiler]
- public static unsafe int ReadViaFixed()
- {
- fixed (int* ptr = StructWithConstArray1.IntValues)
- {
- return ptr[2];
- }
- }
-
- [TestCompiler]
- public static int ReadFromColorArray()
- {
- var color = StructWithConstArrayWithStruct1.Colors[1];
- return ((color.R * 255) + color.G) * 255 + color.B;
- }
-
- [TestCompiler]
- public static int ReadFromColorArray2()
- {
- var color = StaticArrayStruct.Colors[1];
- return ((color.R * 255) + color.G) * 255 + color.B;
- }
-
- struct StructWithConstArray1
- {
- public static readonly int[] IntValues = new int[4] { 1, 2, 3, 4 };
- }
-
- struct StructWithConstArrayWithStruct1
- {
- public static readonly Color[] Colors = { new Color(), new Color(1, 2, 3, 255) };
- }
-
- private struct Color
- {
- public Color(byte r, byte g, byte b, byte a)
- {
- R = r;
- G = g;
- B = b;
- A = a;
- }
-
- public byte R, G, B, A;
- }
-
- private struct StaticArrayStruct
- {
- public static readonly double[] Doubles = { 3, 6, 9, 42, 43 };
- public static readonly byte[] Bytes = { 1, 2, 3 };
- public static readonly ushort[] UShorts = { 2, 6, 8, 2, 0 };
- public static readonly int[] Ints = { -6, 6, 50 };
- public static readonly int[] ZeroData = { 0, 0, 0, 0 };
- public static readonly int[] ZeroLength = { };
- public static readonly Color[] ZeroLengthStruct = { };
- public static readonly Color[] Colors = { new Color(), new Color(1, 2, 3, 255) };
- public static readonly int3[] Positions = { new int3(0, 0, 1), new int3(0, 1, 0), new int3(1, 0, 0) };
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayLength()
- {
- return StaticArrayStruct.Doubles.Length + StaticArrayStruct.Bytes.Length +
- StaticArrayStruct.UShorts.Length + StaticArrayStruct.Ints.Length +
- StaticArrayStruct.ZeroData.Length + StaticArrayStruct.ZeroLength.Length +
- StaticArrayStruct.ZeroLengthStruct.Length + StaticArrayStruct.Colors.Length +
- StaticArrayStruct.Positions.Length;
- }
-
- private struct StructP
- {
- public static readonly int[] Value = new int[One()];
-
- public static int One()
- {
- return 1;
- }
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayNonConstantLength()
- {
- return StructP.Value.Length;
- }
-
- private struct StructQ
- {
- public static readonly int[] Value = new int[10];
-
- public static int One()
- {
- return 1;
- }
-
- static StructQ()
- {
- Value[One()] = 1;
- }
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayWithNonConstantStelemIndex()
- {
- return StructQ.Value[1];
- }
-
- private struct StructR
- {
- #pragma warning disable 0649
- public static int[] Value;
- #pragma warning restore 0649
-
- static StructR()
- {
- Value[0] = 1;
- }
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoadingFromManagedNonReadonlyStaticFieldNotSupported)]
- public static int TestStaticReadonlyArrayExplicitConstructionOfUninitialized()
- {
- return StructR.Value.Length;
- }
-
- private struct StructS
- {
- public static readonly int[] Value = new int[10];
-
- static StructS()
- {
- Value[0] = 1;
- Value[1] = 2;
- Value[2] = 8;
- Value[3] = 2;
- Value[4] = 0;
- Value[5] = 2;
- Value[6] = 1;
- Value[7] = 2;
- Value[8] = 2;
- Value[9] = 3;
- }
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayExplicitConstruction()
- {
- int sum = 0;
- for (int i = 0; i < 10; i++) sum += StructS.Value[i];
- return sum;
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayLdelem()
- {
- var doubles = StaticArrayStruct.Doubles[0];
- for (int i = 1; i < StaticArrayStruct.Doubles.Length; i++) doubles += StaticArrayStruct.Doubles[i];
-
- var bytes = StaticArrayStruct.Bytes[0];
- for (int i = 1; i < StaticArrayStruct.Bytes.Length; i++) bytes += StaticArrayStruct.Bytes[i];
-
- var ushorts = StaticArrayStruct.UShorts[0];
- for (int i = 1; i < StaticArrayStruct.UShorts.Length; i++) ushorts += StaticArrayStruct.UShorts[i];
-
- var ints = StaticArrayStruct.Ints[0];
- for (int i = 1; i < StaticArrayStruct.Ints.Length; i++) ints += StaticArrayStruct.Ints[i];
-
- ints += StaticArrayStruct.ZeroData[0];
- for (int i = 1; i < StaticArrayStruct.ZeroData.Length; i++) ints += StaticArrayStruct.ZeroData[i];
-
- for (int i = 0; i < StaticArrayStruct.ZeroLength.Length; i++) doubles += StaticArrayStruct.ZeroLength[i];
-
- bytes = (byte)(StaticArrayStruct.Colors[0].R + StaticArrayStruct.Colors[0].G
- + StaticArrayStruct.Colors[0].B
- + StaticArrayStruct.Colors[0].A);
-
- for (int i = 1; i < StaticArrayStruct.Colors.Length; i++)
- bytes += (byte)(StaticArrayStruct.Colors[i].R + StaticArrayStruct.Colors[i].G
- + StaticArrayStruct.Colors[i].B
- + StaticArrayStruct.Colors[i].A);
-
- for (int i = 1; i < StaticArrayStruct.Positions.Length; i++)
- ints += math.dot(StaticArrayStruct.Positions[i - 1], StaticArrayStruct.Positions[i]);
-
- return (int)doubles + bytes + ushorts + ints;
- }
-
- private static T TakesRef<T>(ref T x)
- {
- return x;
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayWithElementRef()
- {
- return TakesRef(ref StaticArrayStruct.Ints[1]);
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayWithElementVectorRef()
- {
- var x = TakesRef(ref StaticArrayStruct.Positions[1]);
- return math.dot(x, x);
- }
-
- [TestCompiler(1)]
- [TestCompiler(2)]
- [TestCompiler(3)]
- [TestCompiler(4)]
- public static int TestStaticReadonlyArrayWithDynamicLdelem(int count)
- {
- int sum = 0;
-
- for (int i = 0; i < count; i++)
- {
- sum += (int)StaticArrayStruct.Doubles[i];
- }
-
- return sum;
- }
-
- public struct ContainerStruct
- {
- public SmallStruct A;
- public SmallStruct B;
-
- public static readonly ContainerStruct[] CoolStructs =
- {
- new ContainerStruct
- {
- A = new SmallStruct { a = 3, b = 5 },
- B = new SmallStruct { a = 9, b = 10 }
- },
- new ContainerStruct
- {
- A = new SmallStruct { a = 1, b = 5 },
- B = new SmallStruct { a = 7, b = 8 }
- }
- };
- }
-
- [TestCompiler]
- public static int TestStaticReadonlyArrayOfStructOfStructs()
- {
- return ContainerStruct.CoolStructs[0].A.a + ContainerStruct.CoolStructs[0].A.b +
- ContainerStruct.CoolStructs[0].B.a + ContainerStruct.CoolStructs[0].B.b +
- ContainerStruct.CoolStructs[1].A.a + ContainerStruct.CoolStructs[1].A.b +
- ContainerStruct.CoolStructs[1].B.a + ContainerStruct.CoolStructs[1].B.b;
- }
-
- /* There's currently no way of settings the safety checks on from here
- [TestCompiler(0xFFFFFFF, ExpectedException = typeof(IndexOutOfRangeException))]
- public static int TestStaticReadonlyLdelemDynamicIndexOfBounds(int x)
- {
- return StaticArrayStruct.Ints[x];
- }
- */
-
- public struct SmallStruct
- {
- public int a;
- public int b;
- }
-
- public struct NullArrayHolder
- {
- public static readonly int[] Array = null;
- }
-
- [TestCompiler()]
- public static int TestStaticReadonlyNullArray()
- {
- if (NullArrayHolder.Array == null)
- {
- return 40;
- }
-
- return 3;
- }
-
- private static readonly int[] SomeArray = { 42, 13 };
-
- [TestCompiler(42)]
- public static int StoreNullIntoLocalArray(int x)
- {
- int[] someArray;
-
- if (x == 0)
- {
- someArray = SomeArray;
- }
- else
- {
- someArray = null;
- }
-
- return someArray?.Length ?? 0;
- }
- }
- }
|