mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-10-25 04:32:34 -07:00 
			
		
		
		
	* Implement syscall handlers using a source generator * Copy FlushProcessDataCache implementation to Syscall since it was only implemented on Syscall32 * Fix wrong argument order in some syscalls * Delete old Reflection.Emit based syscall handling code * Improvements to the code generation * ControlCodeMemory address and size is always 64-bit
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Microsoft.CodeAnalysis;
 | |
| using Microsoft.CodeAnalysis.CSharp.Syntax;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| 
 | |
| namespace Ryujinx.Horizon.Generators.Kernel
 | |
| {
 | |
|     class SyscallSyntaxReceiver : ISyntaxReceiver
 | |
|     {
 | |
|         public List<MethodDeclarationSyntax> SvcImplementations { get; }
 | |
| 
 | |
|         public SyscallSyntaxReceiver()
 | |
|         {
 | |
|             SvcImplementations = new List<MethodDeclarationSyntax>();
 | |
|         }
 | |
| 
 | |
|         public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
 | |
|         {
 | |
|             if (syntaxNode is ClassDeclarationSyntax classDeclaration && classDeclaration.AttributeLists.Count != 0)
 | |
|             {
 | |
|                 foreach (var attributeList in classDeclaration.AttributeLists)
 | |
|                 {
 | |
|                     if (attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "SvcImpl"))
 | |
|                     {
 | |
|                         foreach (var memberDeclaration in classDeclaration.Members)
 | |
|                         {
 | |
|                             if (memberDeclaration is MethodDeclarationSyntax methodDeclaration)
 | |
|                             {
 | |
|                                 VisitMethod(methodDeclaration);
 | |
|                             }
 | |
|                         }
 | |
| 
 | |
|                         break;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void VisitMethod(MethodDeclarationSyntax methodDeclaration)
 | |
|         {
 | |
|             if (methodDeclaration.AttributeLists.Count != 0)
 | |
|             {
 | |
|                 foreach (var attributeList in methodDeclaration.AttributeLists)
 | |
|                 {
 | |
|                     if (attributeList.Attributes.Any(x => x.Name.GetText().ToString() == "Svc"))
 | |
|                     {
 | |
|                         SvcImplementations.Add(methodDeclaration);
 | |
|                         break;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |