Skip to content

Commit 4619316

Browse files
committed
Changed cycle detection trigger.
1 parent 5c791cb commit 4619316

File tree

8 files changed

+22
-62
lines changed

8 files changed

+22
-62
lines changed

DataExchange/SchemaBuilder.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -404,16 +404,14 @@ public static bool TryCreateNodeFromSchema(SchemaNode schemaNode, ClassNode pare
404404
{
405405
var schemaReferenceNode = schemaNode as SchemaReferenceNode;
406406

407-
try
407+
if (referenceNode.PerformCycleCheck && !ClassManager.IsCycleFree(parentNode, classes[schemaReferenceNode.InnerNode], classes.Values))
408408
{
409-
referenceNode.ChangeInnerNode(classes[schemaReferenceNode.InnerNode]);
410-
}
411-
catch (ClassCycleException)
412-
{
413-
logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {node.Name}");
409+
logger.Log(LogLevel.Error, $"Skipping node with cycle reference: {schemaReferenceNode.InnerNode.Name}->{node.Name}");
414410

415411
return false;
416412
}
413+
414+
referenceNode.ChangeInnerNode(classes[schemaReferenceNode.InnerNode]);
417415
}
418416

419417
var vtableNode = node as VTableNode;

Nodes/BaseArrayNode.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@ public abstract class BaseArrayNode : BaseReferenceNode
1010
public int CurrentIndex { get; set; }
1111
public int Count { get; set; } = 1;
1212

13-
public BaseArrayNode(bool performCycleCheck)
14-
: base(performCycleCheck)
15-
{
16-
17-
}
18-
1913
protected int Draw(ViewInfo view, int x, int y, string type, HotSpotType exchange)
2014
{
2115
Contract.Requires(view != null);
@@ -130,11 +124,6 @@ public override void Update(HotSpot spot)
130124
[ContractClassFor(typeof(BaseArrayNode))]
131125
internal abstract class BaseArrayNodeContract : BaseArrayNode
132126
{
133-
public BaseArrayNodeContract(bool performCycleCheck)
134-
: base(performCycleCheck)
135-
{
136-
}
137-
138127
protected override int DrawChild(ViewInfo view, int x, int y)
139128
{
140129
Contract.Requires(view != null);

Nodes/BaseReferenceNode.cs

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,24 @@ public abstract class BaseReferenceNode : BaseNode
1414
/// <summary>Gets signaled if the inner node was changed.</summary>
1515
public event NodeEventHandler InnerNodeChanged;
1616

17-
/// <summary>Constructor.</summary>
18-
/// <param name="performCycleCheck">True to perform class cycle checks when changing the inner node.</param>
19-
public BaseReferenceNode(bool performCycleCheck)
20-
{
21-
this.performCycleCheck = performCycleCheck;
22-
}
17+
/// <summary>True to perform class cycle checks when changing the inner node.</summary>
18+
public abstract bool PerformCycleCheck { get; }
2319

2420
/// <summary>Changes the inner node.</summary>
21+
/// <exception cref="ClassCycleException">Thrown when a class cycle is present.</exception>
2522
/// <param name="node">The new node.</param>
2623
public void ChangeInnerNode(ClassNode node)
2724
{
2825
Contract.Requires(node != null);
2926

3027
if (InnerNode != node)
3128
{
32-
if (performCycleCheck)
29+
if (PerformCycleCheck && ParentNode != null)
3330
{
34-
PerformCycleCheck(node);
31+
if (!ClassManager.IsCycleFree(ParentNode as ClassNode, node))
32+
{
33+
throw new ClassCycleException();
34+
}
3535
}
3636

3737
InnerNode = node;
@@ -41,23 +41,10 @@ public void ChangeInnerNode(ClassNode node)
4141
ParentNode?.ChildHasChanged(this);
4242
}
4343
}
44-
45-
/// <summary>Performs a class cycle check for the given class.</summary>
46-
/// <exception cref="ClassCycleException">Thrown when a class cycle is present.</exception>
47-
/// <param name="node">The class to check.</param>
48-
public void PerformCycleCheck(ClassNode node)
49-
{
50-
Contract.Requires(node != null);
51-
52-
if (!ClassManager.IsCycleFree(ParentNode as ClassNode, node))
53-
{
54-
throw new ClassCycleException();
55-
}
56-
}
5744
}
5845

5946

60-
/// <summary>Exception for signalling class cycle errors.</summary>
47+
/// <summary>Exception for signaling class cycle errors.</summary>
6148
public class ClassCycleException : Exception
6249
{
6350

Nodes/ClassInstanceArrayNode.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ public class ClassInstanceArrayNode : BaseArrayNode
99
/// <summary>Size of the node in bytes.</summary>
1010
public override int MemorySize => InnerNode.MemorySize * Count;
1111

12-
public ClassInstanceArrayNode()
13-
: base(true)
14-
{
15-
16-
}
12+
public override bool PerformCycleCheck => true;
1713

1814
public override void Intialize()
1915
{

Nodes/ClassInstanceNode.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using ReClassNET.UI;
1+
using System;
2+
using ReClassNET.UI;
23
using ReClassNET.Util;
34

45
namespace ReClassNET.Nodes
@@ -8,11 +9,7 @@ public class ClassInstanceNode : BaseReferenceNode
89
/// <summary>Size of the node in bytes.</summary>
910
public override int MemorySize => InnerNode.MemorySize;
1011

11-
public ClassInstanceNode()
12-
: base(true)
13-
{
14-
15-
}
12+
public override bool PerformCycleCheck => true;
1613

1714
public override void Intialize()
1815
{

Nodes/ClassNode.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,10 @@ public override void InsertNode(int index, BaseNode node)
159159
return;
160160
}
161161

162-
if (node is BaseReferenceNode)
162+
var referenceNode = node as BaseReferenceNode;
163+
if (referenceNode != null)
163164
{
164-
if (!ClassManager.IsCycleFree(this, ((BaseReferenceNode)node).InnerNode))
165+
if (referenceNode.PerformCycleCheck && !ClassManager.IsCycleFree(this, referenceNode.InnerNode))
165166
{
166167
throw new ClassCycleException();
167168
}

Nodes/ClassPtrArrayNode.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ public class ClassPtrArrayNode : BaseArrayNode
1212
/// <summary>Size of the node in bytes.</summary>
1313
public override int MemorySize => IntPtr.Size * Count;
1414

15-
public ClassPtrArrayNode()
16-
: base(false)
17-
{
18-
19-
}
15+
public override bool PerformCycleCheck => true;
2016

2117
public override void Intialize()
2218
{

Nodes/ClassPtrNode.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ public class ClassPtrNode : BaseReferenceNode
1212
/// <summary>Size of the node in bytes.</summary>
1313
public override int MemorySize => IntPtr.Size;
1414

15-
public ClassPtrNode()
16-
: base(false)
17-
{
18-
19-
}
15+
public override bool PerformCycleCheck => false;
2016

2117
public override void Intialize()
2218
{

0 commit comments

Comments
 (0)