mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-12-22 21:02:03 +00:00
Slight Code Refactoring (#4373)
* Simplify return statements by using ternary expressions * Remove a redundant type conversion * Reduce nesting by inverting "if" statements * Try to improve code readability by using LINQ and inverting "if" statements * Try to improve code readability by using LINQ, using ternary expressions, and inverting "if" statements * Add line breaks to long LINQ * Add line breaks to long LINQ
This commit is contained in:
parent
7ca779a26d
commit
460f96967d
6 changed files with 68 additions and 106 deletions
Ryujinx.Horizon.Kernel.Generators/Kernel
Ryujinx.Horizon
|
@ -4,6 +4,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Ryujinx.Horizon.Generators.Kernel
|
namespace Ryujinx.Horizon.Generators.Kernel
|
||||||
{
|
{
|
||||||
|
@ -151,24 +152,15 @@ namespace Ryujinx.Horizon.Generators.Kernel
|
||||||
GenerateMethod32(generator, context.Compilation, method);
|
GenerateMethod32(generator, context.Compilation, method);
|
||||||
GenerateMethod64(generator, context.Compilation, method);
|
GenerateMethod64(generator, context.Compilation, method);
|
||||||
|
|
||||||
foreach (var attributeList in method.AttributeLists)
|
foreach (AttributeSyntax attribute in method.AttributeLists.SelectMany(attributeList =>
|
||||||
|
attributeList.Attributes.Where(attribute =>
|
||||||
|
GetCanonicalTypeName(context.Compilation, attribute) == TypeSvcAttribute)))
|
||||||
{
|
{
|
||||||
foreach (var attribute in attributeList.Attributes)
|
syscalls.AddRange(from attributeArg in attribute.ArgumentList.Arguments
|
||||||
{
|
where attributeArg.Expression.Kind() == SyntaxKind.NumericLiteralExpression
|
||||||
if (GetCanonicalTypeName(context.Compilation, attribute) != TypeSvcAttribute)
|
select (LiteralExpressionSyntax)attributeArg.Expression
|
||||||
{
|
into numericLiteral
|
||||||
continue;
|
select new SyscallIdAndName((int)numericLiteral.Token.Value, method.Identifier.Text));
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var attributeArg in attribute.ArgumentList.Arguments)
|
|
||||||
{
|
|
||||||
if (attributeArg.Expression.Kind() == SyntaxKind.NumericLiteralExpression)
|
|
||||||
{
|
|
||||||
LiteralExpressionSyntax numericLiteral = (LiteralExpressionSyntax)attributeArg.Expression;
|
|
||||||
syscalls.Add(new SyscallIdAndName((int)numericLiteral.Token.Value, method.Identifier.Text));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -510,28 +502,14 @@ namespace Ryujinx.Horizon.Generators.Kernel
|
||||||
|
|
||||||
private static string GenerateCastFromUInt64(string value, string canonicalTargetTypeName, string targetTypeName)
|
private static string GenerateCastFromUInt64(string value, string canonicalTargetTypeName, string targetTypeName)
|
||||||
{
|
{
|
||||||
if (canonicalTargetTypeName == TypeSystemBoolean)
|
return canonicalTargetTypeName == TypeSystemBoolean ? $"({value} & 1) != 0" : $"({targetTypeName}){value}";
|
||||||
{
|
|
||||||
return $"({value} & 1) != 0";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $"({targetTypeName}){value}";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool IsPointerSized(Compilation compilation, ParameterSyntax parameterSyntax)
|
private static bool IsPointerSized(Compilation compilation, ParameterSyntax parameterSyntax)
|
||||||
{
|
{
|
||||||
foreach (var attributeList in parameterSyntax.AttributeLists)
|
return parameterSyntax.AttributeLists.Any(attributeList =>
|
||||||
{
|
attributeList.Attributes.Any(attribute =>
|
||||||
foreach (var attribute in attributeList.Attributes)
|
GetCanonicalTypeName(compilation, attribute) == TypePointerSizedAttribute));
|
||||||
{
|
|
||||||
if (GetCanonicalTypeName(compilation, attribute) == TypePointerSizedAttribute)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialize(GeneratorInitializationContext context)
|
public void Initialize(GeneratorInitializationContext context)
|
||||||
|
|
|
@ -16,38 +16,37 @@ namespace Ryujinx.Horizon.Generators.Kernel
|
||||||
|
|
||||||
public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
|
public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
|
||||||
{
|
{
|
||||||
if (syntaxNode is ClassDeclarationSyntax classDeclaration && classDeclaration.AttributeLists.Count != 0)
|
if (!(syntaxNode is ClassDeclarationSyntax classDeclaration) || classDeclaration.AttributeLists.Count == 0)
|
||||||
{
|
{
|
||||||
foreach (var attributeList in classDeclaration.AttributeLists)
|
return;
|
||||||
{
|
}
|
||||||
if (attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "SvcImpl"))
|
|
||||||
{
|
|
||||||
foreach (var memberDeclaration in classDeclaration.Members)
|
|
||||||
{
|
|
||||||
if (memberDeclaration is MethodDeclarationSyntax methodDeclaration)
|
|
||||||
{
|
|
||||||
VisitMethod(methodDeclaration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
if (!classDeclaration.AttributeLists.Any(attributeList =>
|
||||||
}
|
attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "SvcImpl")))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var memberDeclaration in classDeclaration.Members)
|
||||||
|
{
|
||||||
|
if (memberDeclaration is MethodDeclarationSyntax methodDeclaration)
|
||||||
|
{
|
||||||
|
VisitMethod(methodDeclaration);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void VisitMethod(MethodDeclarationSyntax methodDeclaration)
|
private void VisitMethod(MethodDeclarationSyntax methodDeclaration)
|
||||||
{
|
{
|
||||||
if (methodDeclaration.AttributeLists.Count != 0)
|
if (methodDeclaration.AttributeLists.Count == 0)
|
||||||
{
|
{
|
||||||
foreach (var attributeList in methodDeclaration.AttributeLists)
|
return;
|
||||||
{
|
}
|
||||||
if (attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "Svc"))
|
|
||||||
{
|
if (methodDeclaration.AttributeLists.Any(attributeList =>
|
||||||
SvcImplementations.Add(methodDeclaration);
|
attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "Svc")))
|
||||||
break;
|
{
|
||||||
}
|
SvcImplementations.Add(methodDeclaration);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,12 +40,7 @@ namespace Ryujinx.Horizon.Sdk.Sf
|
||||||
var runtimeMetadata = context.Processor.GetRuntimeMetadata();
|
var runtimeMetadata = context.Processor.GetRuntimeMetadata();
|
||||||
Result result = context.Processor.PrepareForProcess(ref context, runtimeMetadata);
|
Result result = context.Processor.PrepareForProcess(ref context, runtimeMetadata);
|
||||||
|
|
||||||
if (result.IsFailure)
|
return result.IsFailure ? result : _invoke(ref context, _processor, runtimeMetadata, inRawData, ref outHeader);
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _invoke(ref context, _processor, runtimeMetadata, inRawData, ref outHeader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GetCmifOutHeaderPointer(ref Span<CmifOutHeader> outHeader, ref Span<byte> outRawData)
|
public static void GetCmifOutHeaderPointer(ref Span<CmifOutHeader> outHeader, ref Span<byte> outRawData)
|
||||||
|
|
|
@ -53,7 +53,7 @@ namespace Ryujinx.Horizon.Sdk.Sf
|
||||||
|
|
||||||
public static void SerializeArg<T>(Span<byte> outRawData, int offset, T value) where T : unmanaged
|
public static void SerializeArg<T>(Span<byte> outRawData, int offset, T value) where T : unmanaged
|
||||||
{
|
{
|
||||||
MemoryMarshal.Cast<byte, T>(outRawData.Slice(offset, Unsafe.SizeOf<T>()))[0] = (T)value;
|
MemoryMarshal.Cast<byte, T>(outRawData.Slice(offset, Unsafe.SizeOf<T>()))[0] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SerializeCopyHandle(HipcMessageData response, int index, int value)
|
public static void SerializeCopyHandle(HipcMessageData response, int index, int value)
|
||||||
|
|
|
@ -41,10 +41,8 @@ namespace Ryujinx.Horizon.Sdk.Sf
|
||||||
{
|
{
|
||||||
_args = args;
|
_args = args;
|
||||||
|
|
||||||
for (int i = 0; i < args.Length; i++)
|
foreach (CommandArg argInfo in args)
|
||||||
{
|
{
|
||||||
var argInfo = args[i];
|
|
||||||
|
|
||||||
switch (argInfo.Type)
|
switch (argInfo.Type)
|
||||||
{
|
{
|
||||||
case CommandArgType.Buffer:
|
case CommandArgType.Buffer:
|
||||||
|
@ -239,14 +237,13 @@ namespace Ryujinx.Horizon.Sdk.Sf
|
||||||
{
|
{
|
||||||
return mode == HipcBufferMode.NonSecure;
|
return mode == HipcBufferMode.NonSecure;
|
||||||
}
|
}
|
||||||
else if (flags.HasFlag(HipcBufferFlags.MapTransferAllowsNonDevice))
|
|
||||||
|
if (flags.HasFlag(HipcBufferFlags.MapTransferAllowsNonDevice))
|
||||||
{
|
{
|
||||||
return mode == HipcBufferMode.NonDevice;
|
return mode == HipcBufferMode.NonDevice;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
return mode == HipcBufferMode.Normal;
|
||||||
return mode == HipcBufferMode.Normal;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetOutBuffers(HipcMessageData response, bool[] isBufferMapAlias)
|
public void SetOutBuffers(HipcMessageData response, bool[] isBufferMapAlias)
|
||||||
|
@ -261,28 +258,30 @@ namespace Ryujinx.Horizon.Sdk.Sf
|
||||||
}
|
}
|
||||||
|
|
||||||
var flags = _args[i].BufferFlags;
|
var flags = _args[i].BufferFlags;
|
||||||
if (flags.HasFlag(HipcBufferFlags.Out))
|
if (!flags.HasFlag(HipcBufferFlags.Out))
|
||||||
{
|
{
|
||||||
var buffer = _bufferRanges[i];
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags.HasFlag(HipcBufferFlags.Pointer))
|
var buffer = _bufferRanges[i];
|
||||||
|
|
||||||
|
if (flags.HasFlag(HipcBufferFlags.Pointer))
|
||||||
|
{
|
||||||
|
response.SendStatics[recvPointerIndex] = new HipcStaticDescriptor(buffer.Address, (ushort)buffer.Size, recvPointerIndex);
|
||||||
|
}
|
||||||
|
else if (flags.HasFlag(HipcBufferFlags.AutoSelect))
|
||||||
|
{
|
||||||
|
if (!isBufferMapAlias[i])
|
||||||
{
|
{
|
||||||
response.SendStatics[recvPointerIndex] = new HipcStaticDescriptor(buffer.Address, (ushort)buffer.Size, recvPointerIndex);
|
response.SendStatics[recvPointerIndex] = new HipcStaticDescriptor(buffer.Address, (ushort)buffer.Size, recvPointerIndex);
|
||||||
}
|
}
|
||||||
else if (flags.HasFlag(HipcBufferFlags.AutoSelect))
|
else
|
||||||
{
|
{
|
||||||
if (!isBufferMapAlias[i])
|
response.SendStatics[recvPointerIndex] = new HipcStaticDescriptor(0UL, 0, recvPointerIndex);
|
||||||
{
|
|
||||||
response.SendStatics[recvPointerIndex] = new HipcStaticDescriptor(buffer.Address, (ushort)buffer.Size, recvPointerIndex);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
response.SendStatics[recvPointerIndex] = new HipcStaticDescriptor(0UL, 0, recvPointerIndex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
recvPointerIndex++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recvPointerIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,15 +338,17 @@ namespace Ryujinx.Horizon.Sdk.Sf
|
||||||
|
|
||||||
int inObjectIndex = 0;
|
int inObjectIndex = 0;
|
||||||
|
|
||||||
for (int i = 0; i < _args.Length; i++)
|
foreach (CommandArg t in _args)
|
||||||
{
|
{
|
||||||
if (_args[i].Type == CommandArgType.InObject)
|
if (t.Type != CommandArgType.InObject)
|
||||||
{
|
{
|
||||||
int index = inObjectIndex++;
|
continue;
|
||||||
var inObject = inObjects[index];
|
|
||||||
|
|
||||||
objects[index] = inObject?.ServiceObject;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int index = inObjectIndex++;
|
||||||
|
var inObject = inObjects[index];
|
||||||
|
|
||||||
|
objects[index] = inObject?.ServiceObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result.Success;
|
return Result.Success;
|
||||||
|
|
|
@ -37,12 +37,7 @@ namespace Ryujinx.Horizon.Sm.Impl
|
||||||
|
|
||||||
result = GetServiceImpl(out handle, ref _services[serviceIndex]);
|
result = GetServiceImpl(out handle, ref _services[serviceIndex]);
|
||||||
|
|
||||||
if (result == KernelResult.SessionCountExceeded)
|
return result == KernelResult.SessionCountExceeded ? SmResult.OutOfSessions : result;
|
||||||
{
|
|
||||||
return SmResult.OutOfSessions;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Result GetServiceImpl(out int handle, ref ServiceInfo serviceInfo)
|
private Result GetServiceImpl(out int handle, ref ServiceInfo serviceInfo)
|
||||||
|
@ -61,13 +56,7 @@ namespace Ryujinx.Horizon.Sm.Impl
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Validation with GetProcessInfo etc.
|
// TODO: Validation with GetProcessInfo etc.
|
||||||
|
return HasServiceInfo(name) ? SmResult.AlreadyRegistered : RegisterServiceImpl(out handle, processId, name, maxSessions, isLight);
|
||||||
if (HasServiceInfo(name))
|
|
||||||
{
|
|
||||||
return SmResult.AlreadyRegistered;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RegisterServiceImpl(out handle, processId, name, maxSessions, isLight);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Result RegisterServiceForSelf(out int handle, ServiceName name, int maxSessions)
|
public Result RegisterServiceForSelf(out int handle, ServiceName name, int maxSessions)
|
||||||
|
|
Loading…
Reference in a new issue