timezone: Fix regression caused by #3361 (#3418)

Because of that PR, TimeZoneRule was bigger than 0x4000 thanks to a
misuse of a constant.

This commit address this issue and add a new unit test to ensure the size of
TimeZoneRule is 0x4000 bytes.

Also address suggestions that were lost on the original PR.
This commit is contained in:
Mary 2022-06-24 21:11:56 +02:00 committed by GitHub
parent 30ee70a9bc
commit 2382717600
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 7 deletions

View File

@ -4,7 +4,7 @@ using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Time.TimeZone namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
{ {
[StructLayout(LayoutKind.Sequential, Size = Size, Pack = 4)] [StructLayout(LayoutKind.Sequential, Size = Size, Pack = 4)]
struct TimeTypeInfo public struct TimeTypeInfo
{ {
public const int Size = 0x10; public const int Size = 0x10;

View File

@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Time.TimeZone namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
{ {
[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 0x4000, CharSet = CharSet.Ansi)] [StructLayout(LayoutKind.Sequential, Pack = 4, Size = 0x4000, CharSet = CharSet.Ansi)]
struct TimeZoneRule public struct TimeZoneRule
{ {
public const int TzMaxTypes = 128; public const int TzMaxTypes = 128;
public const int TzMaxChars = 50; public const int TzMaxChars = 50;
@ -25,20 +25,20 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
public bool GoAhead; public bool GoAhead;
[StructLayout(LayoutKind.Sequential, Size = sizeof(long) * TzMaxTimes)] [StructLayout(LayoutKind.Sequential, Size = sizeof(long) * TzMaxTimes)]
private struct AtsStorageStruct {} private struct AtsStorageStruct { }
private AtsStorageStruct _ats; private AtsStorageStruct _ats;
public Span<long> Ats => SpanHelpers.AsSpan<AtsStorageStruct, long>(ref _ats); public Span<long> Ats => SpanHelpers.AsSpan<AtsStorageStruct, long>(ref _ats);
[StructLayout(LayoutKind.Sequential, Size = sizeof(byte) * TzMaxTimes)] [StructLayout(LayoutKind.Sequential, Size = sizeof(byte) * TzMaxTimes)]
private struct TypesStorageStruct {} private struct TypesStorageStruct { }
private TypesStorageStruct _types; private TypesStorageStruct _types;
public Span<byte> Types => SpanHelpers.AsByteSpan<TypesStorageStruct>(ref _types); public Span<byte> Types => SpanHelpers.AsByteSpan(ref _types);
[StructLayout(LayoutKind.Sequential, Size = TimeTypeInfo.Size * TzMaxTimes)] [StructLayout(LayoutKind.Sequential, Size = TimeTypeInfo.Size * TzMaxTypes)]
private struct TimeTypeInfoStorageStruct { } private struct TimeTypeInfoStorageStruct { }
private TimeTypeInfoStorageStruct _ttis; private TimeTypeInfoStorageStruct _ttis;
@ -46,7 +46,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
public Span<TimeTypeInfo> Ttis => SpanHelpers.AsSpan<TimeTypeInfoStorageStruct, TimeTypeInfo>(ref _ttis); public Span<TimeTypeInfo> Ttis => SpanHelpers.AsSpan<TimeTypeInfoStorageStruct, TimeTypeInfo>(ref _ttis);
[StructLayout(LayoutKind.Sequential, Size = sizeof(byte) * TzCharsArraySize)] [StructLayout(LayoutKind.Sequential, Size = sizeof(byte) * TzCharsArraySize)]
private struct CharsStorageStruct {} private struct CharsStorageStruct { }
private CharsStorageStruct _chars; private CharsStorageStruct _chars;
public Span<byte> Chars => SpanHelpers.AsByteSpan(ref _chars); public Span<byte> Chars => SpanHelpers.AsByteSpan(ref _chars);

View File

@ -24,6 +24,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Ryujinx.Audio\Ryujinx.Audio.csproj" /> <ProjectReference Include="..\Ryujinx.Audio\Ryujinx.Audio.csproj" />
<ProjectReference Include="..\Ryujinx.Cpu\Ryujinx.Cpu.csproj" /> <ProjectReference Include="..\Ryujinx.Cpu\Ryujinx.Cpu.csproj" />
<ProjectReference Include="..\Ryujinx.HLE\Ryujinx.HLE.csproj" />
<ProjectReference Include="..\Ryujinx.Memory\Ryujinx.Memory.csproj" /> <ProjectReference Include="..\Ryujinx.Memory\Ryujinx.Memory.csproj" />
<ProjectReference Include="..\Ryujinx.Tests.Unicorn\Ryujinx.Tests.Unicorn.csproj" /> <ProjectReference Include="..\Ryujinx.Tests.Unicorn\Ryujinx.Tests.Unicorn.csproj" />
<ProjectReference Include="..\ARMeilleure\ARMeilleure.csproj" /> <ProjectReference Include="..\ARMeilleure\ARMeilleure.csproj" />

View File

@ -0,0 +1,18 @@
using NUnit.Framework;
using Ryujinx.HLE.HOS.Services.Time.TimeZone;
using System.Runtime.CompilerServices;
namespace Ryujinx.Tests.Time
{
internal class TimeZoneRuleTests
{
class EffectInfoParameterTests
{
[Test]
public void EnsureTypeSize()
{
Assert.AreEqual(0x4000, Unsafe.SizeOf<TimeZoneRule>());
}
}
}
}