Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 64ea348

Browse files
mikednjkotas
authored andcommitted
Replace a few for loops with foreach to avoid loop cloning (#15668)
A pattern like int len = a.Length; for (int i = 0; i < len; i++) { ... a[i] ... } may result in unnecessary loop cloning. Anyway, there's no real reason to use a for loop in any of these case. Avois the need for a cast too. Also remove duplicated code related to AppDomain.OnXResolveEvent method.
1 parent 22658ba commit 64ea348

File tree

4 files changed

+14
-48
lines changed

4 files changed

+14
-48
lines changed

src/mscorlib/src/System/AppDomain.cs

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -511,58 +511,29 @@ private void OnAssemblyLoadEvent(RuntimeAssembly LoadedAssembly)
511511
// This method is called by the VM.
512512
private RuntimeAssembly OnResourceResolveEvent(RuntimeAssembly assembly, String resourceName)
513513
{
514-
ResolveEventHandler eventHandler = _ResourceResolve;
515-
if (eventHandler == null)
516-
return null;
517-
518-
Delegate[] ds = eventHandler.GetInvocationList();
519-
int len = ds.Length;
520-
for (int i = 0; i < len; i++)
521-
{
522-
Assembly asm = ((ResolveEventHandler)ds[i])(this, new ResolveEventArgs(resourceName, assembly));
523-
RuntimeAssembly ret = GetRuntimeAssembly(asm);
524-
if (ret != null)
525-
return ret;
526-
}
527-
528-
return null;
514+
return InvokeResolveEvent(_ResourceResolve, assembly, resourceName);
529515
}
530516

531517
// This method is called by the VM
532518
private RuntimeAssembly OnTypeResolveEvent(RuntimeAssembly assembly, String typeName)
533519
{
534-
ResolveEventHandler eventHandler = _TypeResolve;
535-
if (eventHandler == null)
536-
return null;
537-
538-
Delegate[] ds = eventHandler.GetInvocationList();
539-
int len = ds.Length;
540-
for (int i = 0; i < len; i++)
541-
{
542-
Assembly asm = ((ResolveEventHandler)ds[i])(this, new ResolveEventArgs(typeName, assembly));
543-
RuntimeAssembly ret = GetRuntimeAssembly(asm);
544-
if (ret != null)
545-
return ret;
546-
}
547-
548-
return null;
520+
return InvokeResolveEvent(_TypeResolve, assembly, typeName);
549521
}
550522

551523
// This method is called by the VM.
552524
private RuntimeAssembly OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName)
553525
{
554-
ResolveEventHandler eventHandler = _AssemblyResolve;
526+
return InvokeResolveEvent(_AssemblyResolve, assembly, assemblyFullName);
527+
}
555528

529+
private RuntimeAssembly InvokeResolveEvent(ResolveEventHandler eventHandler, RuntimeAssembly assembly, string name)
530+
{
556531
if (eventHandler == null)
557-
{
558532
return null;
559-
}
560533

561-
Delegate[] ds = eventHandler.GetInvocationList();
562-
int len = ds.Length;
563-
for (int i = 0; i < len; i++)
534+
foreach (ResolveEventHandler handler in eventHandler.GetInvocationList())
564535
{
565-
Assembly asm = ((ResolveEventHandler)ds[i])(this, new ResolveEventArgs(assemblyFullName, assembly));
536+
Assembly asm = handler(this, new ResolveEventArgs(name, assembly));
566537
RuntimeAssembly ret = GetRuntimeAssembly(asm);
567538
if (ret != null)
568539
return ret;

src/mscorlib/src/System/Reflection/RuntimeAssembly.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -676,11 +676,9 @@ private RuntimeModule OnModuleResolveEvent(String moduleName)
676676
if (moduleResolve == null)
677677
return null;
678678

679-
Delegate[] ds = moduleResolve.GetInvocationList();
680-
int len = ds.Length;
681-
for (int i = 0; i < len; i++)
679+
foreach (ModuleResolveEventHandler handler in moduleResolve.GetInvocationList())
682680
{
683-
RuntimeModule ret = (RuntimeModule)((ModuleResolveEventHandler)ds[i])(this, new ResolveEventArgs(moduleName, this));
681+
RuntimeModule ret = (RuntimeModule)handler(this, new ResolveEventArgs(moduleName, this));
684682
if (ret != null)
685683
return ret;
686684
}

src/mscorlib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMetadata.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@ internal static string[] OnDesignerNamespaceResolveEvent(AppDomain appDomain, st
2424
EventHandler<DesignerNamespaceResolveEventArgs> eventHandler = DesignerNamespaceResolve;
2525
if (eventHandler != null)
2626
{
27-
Delegate[] ds = eventHandler.GetInvocationList();
28-
int len = ds.Length;
29-
for (int i = 0; i < len; i++)
27+
foreach (EventHandler<DesignerNamespaceResolveEventArgs> handler in eventHandler.GetInvocationList())
3028
{
3129
DesignerNamespaceResolveEventArgs eventArgs = new DesignerNamespaceResolveEventArgs(namespaceName);
3230

33-
((EventHandler<DesignerNamespaceResolveEventArgs>)ds[i])(appDomain, eventArgs);
31+
handler(appDomain, eventArgs);
3432

3533
Collection<string> assemblyFilesCollection = eventArgs.ResolvedAssemblyFiles;
3634
if (assemblyFilesCollection.Count > 0)

src/mscorlib/src/System/Runtime/Loader/AssemblyLoadContext.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,9 @@ private Assembly GetFirstResolvedAssembly(AssemblyName assemblyName)
193193
if (assemblyResolveHandler != null)
194194
{
195195
// Loop through the event subscribers and return the first non-null Assembly instance
196-
Delegate[] arrSubscribers = assemblyResolveHandler.GetInvocationList();
197-
for (int i = 0; i < arrSubscribers.Length; i++)
196+
foreach (Func<AssemblyLoadContext, AssemblyName, Assembly> handler in assemblyResolveHandler.GetInvocationList())
198197
{
199-
resolvedAssembly = ((Func<AssemblyLoadContext, AssemblyName, Assembly>)arrSubscribers[i])(this, assemblyName);
198+
resolvedAssembly = handler(this, assemblyName);
200199
if (resolvedAssembly != null)
201200
{
202201
break;

0 commit comments

Comments
 (0)