Merge pull request #884 from Hixie/cycles
Check for cycles in our various tree structures.
This commit is contained in:
commit
7c8c8c1e4c
@ -52,6 +52,13 @@ abstract class Layer {
|
|||||||
newLayer._previousSibling = _previousSibling;
|
newLayer._previousSibling = _previousSibling;
|
||||||
if (_previousSibling != null)
|
if (_previousSibling != null)
|
||||||
newLayer._previousSibling._nextSibling = newLayer;
|
newLayer._previousSibling._nextSibling = newLayer;
|
||||||
|
assert(() {
|
||||||
|
Layer node = this;
|
||||||
|
while (node.parent != null)
|
||||||
|
node = node.parent;
|
||||||
|
assert(node != newLayer); // indicates we are about to create a cycle
|
||||||
|
return true;
|
||||||
|
});
|
||||||
newLayer._parent = _parent;
|
newLayer._parent = _parent;
|
||||||
if (_parent._firstChild == this)
|
if (_parent._firstChild == this)
|
||||||
_parent._firstChild = newLayer;
|
_parent._firstChild = newLayer;
|
||||||
@ -182,6 +189,13 @@ class ContainerLayer extends Layer {
|
|||||||
assert(child._parent == null);
|
assert(child._parent == null);
|
||||||
assert(child._nextSibling == null);
|
assert(child._nextSibling == null);
|
||||||
assert(child._previousSibling == null);
|
assert(child._previousSibling == null);
|
||||||
|
assert(() {
|
||||||
|
Layer node = this;
|
||||||
|
while (node.parent != null)
|
||||||
|
node = node.parent;
|
||||||
|
assert(node != child); // indicates we are about to create a cycle
|
||||||
|
return true;
|
||||||
|
});
|
||||||
child._parent = this;
|
child._parent = this;
|
||||||
child._previousSibling = _lastChild;
|
child._previousSibling = _lastChild;
|
||||||
if (_lastChild != null)
|
if (_lastChild != null)
|
||||||
|
@ -90,6 +90,13 @@ class AbstractNode {
|
|||||||
void adoptChild(AbstractNode child) {
|
void adoptChild(AbstractNode child) {
|
||||||
assert(child != null);
|
assert(child != null);
|
||||||
assert(child._parent == null);
|
assert(child._parent == null);
|
||||||
|
assert(() {
|
||||||
|
AbstractNode node = this;
|
||||||
|
while (node.parent != null)
|
||||||
|
node = node.parent;
|
||||||
|
assert(node != child); // indicates we are about to create a cycle
|
||||||
|
return true;
|
||||||
|
});
|
||||||
child._parent = this;
|
child._parent = this;
|
||||||
if (attached)
|
if (attached)
|
||||||
child.attach();
|
child.attach();
|
||||||
|
@ -773,6 +773,7 @@ abstract class Element<T extends Widget> implements BuildContext {
|
|||||||
Element newChild = _findAndActivateElement(key, newWidget);
|
Element newChild = _findAndActivateElement(key, newWidget);
|
||||||
if (newChild != null) {
|
if (newChild != null) {
|
||||||
assert(newChild._parent == null);
|
assert(newChild._parent == null);
|
||||||
|
assert(() { _debugCheckForCycles(newChild); return true; });
|
||||||
newChild._parent = this;
|
newChild._parent = this;
|
||||||
newChild._updateDepth();
|
newChild._updateDepth();
|
||||||
newChild.attachRenderObject(newSlot);
|
newChild.attachRenderObject(newSlot);
|
||||||
@ -782,11 +783,23 @@ abstract class Element<T extends Widget> implements BuildContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Element newChild = newWidget.createElement();
|
Element newChild = newWidget.createElement();
|
||||||
|
assert(() { _debugCheckForCycles(newChild); return true; });
|
||||||
newChild.mount(this, newSlot);
|
newChild.mount(this, newSlot);
|
||||||
assert(newChild._debugLifecycleState == _ElementLifecycle.active);
|
assert(newChild._debugLifecycleState == _ElementLifecycle.active);
|
||||||
return newChild;
|
return newChild;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _debugCheckForCycles(Element newChild) {
|
||||||
|
assert(newChild._parent == null);
|
||||||
|
assert(() {
|
||||||
|
Element node = this;
|
||||||
|
while (node._parent != null)
|
||||||
|
node = node._parent;
|
||||||
|
assert(node != newChild); // indicates we are about to create a cycle
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void _deactivateChild(Element child) {
|
void _deactivateChild(Element child) {
|
||||||
assert(child != null);
|
assert(child != null);
|
||||||
assert(child._parent == this);
|
assert(child._parent == this);
|
||||||
|
@ -403,6 +403,14 @@ class Node {
|
|||||||
assert(child._parent == null);
|
assert(child._parent == null);
|
||||||
assert(!(child is PhysicsGroup) || this is PhysicsGroup || this is PhysicsWorld);
|
assert(!(child is PhysicsGroup) || this is PhysicsGroup || this is PhysicsWorld);
|
||||||
|
|
||||||
|
assert(() {
|
||||||
|
Node node = this;
|
||||||
|
while (node.parent != null)
|
||||||
|
node = node.parent;
|
||||||
|
assert(node != child); // indicates we are about to create a cycle
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
_childrenNeedSorting = true;
|
_childrenNeedSorting = true;
|
||||||
_children.add(child);
|
_children.add(child);
|
||||||
child._parent = this;
|
child._parent = this;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user