mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 12:30:32 +00:00
156 lines
No EOL
5.5 KiB
C#
156 lines
No EOL
5.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Cosmos.IL2CPU.Plugs;
|
|
|
|
namespace Cosmos.IL2CPU.X86.Plugs.CustomImplementations.System
|
|
{
|
|
[Plug(Target = typeof(Array))]
|
|
public class ArrayImpl
|
|
{
|
|
|
|
[PlugMethod(Signature = "System_Void__System_Array_Clear_System_Array__System_Int32__System_Int32_")]
|
|
public static unsafe void Clear(uint* aArray, uint aIndex, uint aLength)
|
|
{
|
|
aArray += 3;
|
|
uint xElementSize = *aArray;
|
|
aArray += 1;
|
|
byte* xBytes = (byte*)aArray;
|
|
for (uint i = aIndex * xElementSize; i < ((aIndex + aLength) * xElementSize); i++)
|
|
{
|
|
xBytes[i] = 0;
|
|
}
|
|
}
|
|
|
|
public static int GetUpperBound(Array aThis, int aDimension)
|
|
{
|
|
return GetLength(aThis, aDimension) - 1;
|
|
}
|
|
|
|
public static int GetLength(Array aThis, int aDimension)
|
|
{
|
|
if (aDimension != 0)
|
|
{
|
|
throw new NotSupportedException("Multidimensional array's are not yet supported!");
|
|
}
|
|
return aThis.Length;
|
|
}
|
|
|
|
[PlugMethod(Assembler = typeof(Assemblers.Array_get_Length))]
|
|
public static int get_Length(Array aThis)
|
|
{
|
|
//aThis += 2;
|
|
//return *aThis;
|
|
return 0;
|
|
}
|
|
|
|
[PlugMethod(Signature = "System_Boolean__System_Array_TrySZBinarySearch_System_Array__System_Int32__System_Int32__System_Object___System_Int32_")]
|
|
public static unsafe bool TrySZBinarySearch(uint* aArray, uint sourceIndex, uint count, uint value, out uint retVal)
|
|
{
|
|
return TrySZIndexOf(aArray, sourceIndex, count, value, out retVal);
|
|
}
|
|
|
|
[PlugMethod(Signature = "System_Boolean__System_Array_TrySZLastIndexOf_System_Array__System_Int32__System_Int32__System_Object___System_Int32_")]
|
|
public static unsafe bool TrySZLastIndexOf(uint* aArray, uint sourceIndex, uint count, uint value, out uint retVal)
|
|
{
|
|
aArray += 4;
|
|
for (uint i = (sourceIndex + count); i > sourceIndex; i--)
|
|
{
|
|
if (aArray[i - 1] == value)
|
|
{
|
|
retVal = i - 1;
|
|
return true;
|
|
}
|
|
}
|
|
retVal = 0;
|
|
return false;
|
|
}
|
|
|
|
//[PlugMethod(Signature = "System_Boolean__System_Array_TrySZIndexOf_System_Array__System_Int32__System_Int32__System_Object__System_Int32__")]
|
|
private static unsafe bool TrySZIndexOf(uint* aArray, uint sourceIndex, uint count, uint value, out uint retVal)
|
|
{
|
|
aArray += 4;
|
|
for (uint i = sourceIndex; i < (sourceIndex + count); i++)
|
|
{
|
|
if (aArray[i] == value)
|
|
{
|
|
retVal = i;
|
|
return true;
|
|
}
|
|
}
|
|
retVal = 0;
|
|
return false;
|
|
}
|
|
|
|
[PlugMethod(Assembler = typeof(Assemblers.Array_InternalCopy))]
|
|
public static void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable)
|
|
{
|
|
}
|
|
|
|
public unsafe static int get_Rank(int* aThis)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
public static unsafe int GetLowerBound(int* aThis, int aDimension)
|
|
{
|
|
if (aDimension != 0)
|
|
{
|
|
//throw new NotSupportedException("Multidimensional arrays not supported yet!");
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
[PlugMethod(Signature = "System_Object__System_Array_GetValue_System_Int32_")]
|
|
public static unsafe uint GetValue(uint* aThis, int aIndex)
|
|
{
|
|
aThis += 3;
|
|
uint xElementSize = *aThis;
|
|
aThis += 1;
|
|
aThis = ((uint*)(((byte*)aThis) + aIndex * xElementSize));
|
|
switch (xElementSize)
|
|
{
|
|
case 1:
|
|
return *((byte*)aThis);
|
|
case 2:
|
|
return *((ushort*)aThis);
|
|
case 3:
|
|
return (*((uint*)aThis)) & 0x0FFFFFFF;
|
|
case 4:
|
|
return *((uint*)aThis);
|
|
}
|
|
throw new NotSupportedException("GetValue not supported in this situation!");
|
|
}
|
|
|
|
public static unsafe object GetValue(Array aThis, params int[] aIndices)
|
|
{
|
|
throw new NotImplementedException("Multidimensional arrays not supported yet!");
|
|
}
|
|
|
|
[PlugMethod(Signature = "System_Void__System_Array_SetValue_System_Object__System_Int32_")]
|
|
public static unsafe void SetValue(uint* aThis, uint aValue, int aIndex)
|
|
{
|
|
aThis += 3;
|
|
uint xElementSize = *aThis;
|
|
aThis += 1;
|
|
aThis = ((uint*)(((byte*)aThis) + aIndex * xElementSize));
|
|
switch (xElementSize)
|
|
{
|
|
case 1:
|
|
*((byte*)aThis) = (byte)aValue;
|
|
return;
|
|
case 2:
|
|
*((ushort*)aThis) = (ushort)aValue;
|
|
return;
|
|
case 3:
|
|
*((uint*)aThis) = (uint)aValue;
|
|
return;
|
|
case 4:
|
|
*((uint*)aThis) = (uint)aValue;
|
|
return;
|
|
}
|
|
throw new NotSupportedException("SetValue not supported in this situation!");
|
|
}
|
|
}
|
|
} |