diff --git a/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs b/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs index 77c6a8bde1..aa4e3e8dfb 100644 --- a/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs +++ b/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs @@ -277,6 +277,17 @@ private void TestRemainder3Structs() Assert.AreEqual(local.C, 77, "Three byte struct third value read correctly"); } + private void TestArrayRange() + { + byte[] array = new byte[16]; + for (int i = 0; i < 16; i++) + { + array[i] = (byte)i; + } + byte[] slice = array[1..5]; + Assert.AreEqual(new byte[] { 1, 2, 3, 4 }, slice, "Taking the slice of a byte array works"); + } + protected override void Run() { TestStep1(); @@ -289,6 +300,7 @@ protected override void Run() ConstrainedTest.MutateStructTest(); Assert.IsTrue(true, "After MutateTestStruct"); TestRemainder3Structs(); + TestArrayRange(); TestController.Completed(); } diff --git a/source/Cosmos.Core_Plugs/System/ArrayImpl.cs b/source/Cosmos.Core_Plugs/System/ArrayImpl.cs index 61bda41ea7..c607b33802 100644 --- a/source/Cosmos.Core_Plugs/System/ArrayImpl.cs +++ b/source/Cosmos.Core_Plugs/System/ArrayImpl.cs @@ -1,4 +1,5 @@ using System; +using Cosmos.Core; using Cosmos.Debug.Kernel; using IL2CPU.API; using IL2CPU.API.Attribs; @@ -147,5 +148,10 @@ public static object InternalGetValue(Array aThis, IntPtr aIntPtr) { return aThis.GetValue((int)aIntPtr); } + + public static Array CreateInstance(Type type, int size) + { + return GCImpl.CreateNewArray((int)VTablesImpl.GetSize(((CosmosRuntimeType)type).mTypeId), size); + } } } diff --git a/source/Cosmos.Core_Plugs/System/GCImplCreateNewArrayAsm.cs b/source/Cosmos.Core_Plugs/System/GCImplCreateNewArrayAsm.cs index 2261d9e1f2..94c2abd5a8 100644 --- a/source/Cosmos.Core_Plugs/System/GCImplCreateNewArrayAsm.cs +++ b/source/Cosmos.Core_Plugs/System/GCImplCreateNewArrayAsm.cs @@ -20,8 +20,6 @@ public override void AssembleNew(Assembler aAssembler, object aMethodInfo) XS.Set(ECX, EBP, sourceDisplacement: 8); // size XS.Set(EDX, EBP, sourceDisplacement: 12); // length - - XS.Push(ECX); // size of element XS.Set(EAX, ECX); XS.Multiply(EDX); // total element size