Added infinite loop detection

This commit is contained in:
codemann8
2021-12-21 10:35:54 -06:00
parent a731bc0799
commit 0df739b283
3 changed files with 24 additions and 0 deletions

View File

@@ -1538,6 +1538,11 @@ class Region(object):
self.crystal_switch = False self.crystal_switch = False
def can_reach(self, state): def can_reach(self, state):
from Utils import stack_size3a
from DungeonGenerator import GenerationException
if stack_size3a() > 500:
raise GenerationException(f'Infinite loop detected for "{self.name}" located at \'Region.can_reach\'')
if state.stale[self.player]: if state.stale[self.player]:
state.update_reachable_regions(self.player) state.update_reachable_regions(self.player)
return self in state.reachable_regions[self.player] return self in state.reachable_regions[self.player]

View File

@@ -908,6 +908,9 @@ def build_accessible_region_list(world, start_region, player, build_copy_world=F
from Items import ItemFactory from Items import ItemFactory
def explore_region(region_name, region=None): def explore_region(region_name, region=None):
if stack_size3a() > 500:
raise GenerationException(f'Infinite loop detected for "{start_region}" located at \'build_accessible_region_list\'')
explored_regions.append(region_name) explored_regions.append(region_name)
if not region: if not region:
region = base_world.get_region(region_name, player) region = base_world.get_region(region_name, player)

View File

@@ -7,6 +7,7 @@ import sys
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from collections import defaultdict from collections import defaultdict
from functools import reduce from functools import reduce
from itertools import count
def int16_as_bytes(value): def int16_as_bytes(value):
@@ -674,6 +675,21 @@ def extract_data_from_jp_rom(rom):
print() print()
def stack_size3a(size=2):
# See reference: https://stackoverflow.com/questions/34115298/how-do-i-get-the-current-depth-of-the-python-interpreter-stack
"""Get stack size for caller's frame."""
frame = sys._getframe(size)
try:
for size in count(size, 8):
frame = frame.f_back.f_back.f_back.f_back.\
f_back.f_back.f_back.f_back
except AttributeError:
while frame:
frame = frame.f_back
size += 1
return size - 1
class bidict(dict): class bidict(dict):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(bidict, self).__init__(*args, **kwargs) super(bidict, self).__init__(*args, **kwargs)