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:
ACGNnsj 2023-03-28 20:59:43 +08:00 committed by GitHub
parent 7ca779a26d
commit 460f96967d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 68 additions and 106 deletions

View file

@ -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)

View file

@ -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);
}
} }
} }
} }

View file

@ -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)

View file

@ -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)

View file

@ -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;

View file

@ -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)