From e5858e2c7d0a46b771e874e37efb77f69120c141 Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Sat, 14 Dec 2019 18:18:51 -0300
Subject: [PATCH] Add a limit for the number of instructions in a function
 (#843)

---
 ARMeilleure/Decoders/Decoder.cs | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/ARMeilleure/Decoders/Decoder.cs b/ARMeilleure/Decoders/Decoder.cs
index 2311e9e96e..8eb2a99d6d 100644
--- a/ARMeilleure/Decoders/Decoder.cs
+++ b/ARMeilleure/Decoders/Decoder.cs
@@ -10,6 +10,11 @@ namespace ARMeilleure.Decoders
 {
     static class Decoder
     {
+        // We define a limit on the number of instructions that a function may have,
+        // this prevents functions being potentially too large, which would
+        // take too long to compile and use too much memory.
+        private const int MaxInstsPerFunction = 5000;
+
         private delegate object MakeOp(InstDescriptor inst, ulong address, int opCode);
 
         private static ConcurrentDictionary<Type, MakeOp> _opActivators;
@@ -36,10 +41,17 @@ namespace ARMeilleure.Decoders
 
             Dictionary<ulong, Block> visited = new Dictionary<ulong, Block>();
 
+            int opsCount = 0;
+
             Block GetBlock(ulong blkAddress)
             {
                 if (!visited.TryGetValue(blkAddress, out Block block))
                 {
+                    if (opsCount > MaxInstsPerFunction)
+                    {
+                        return null;
+                    }
+
                     block = new Block(blkAddress);
 
                     workQueue.Enqueue(block);
@@ -92,6 +104,8 @@ namespace ARMeilleure.Decoders
 
                 FillBlock(memory, mode, currBlock, limitAddress);
 
+                opsCount += currBlock.OpCodes.Count;
+
                 if (currBlock.OpCodes.Count != 0)
                 {
                     // Set child blocks. "Branch" is the block the branch instruction