From 7431ec6f43d494e85a5da0939bfb2f2797f278b5 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 23 Nov 2022 00:36:08 +0100 Subject: [PATCH] Solved an ownership issue in DRC which popped up after universal DRC nodes got deleted. --- src/drc/drc/built-in-macros/_drc_complex_ops.rb | 12 ++++++------ .../drc/built-in-macros/_drc_cop_integration.rb | 14 ++++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/drc/drc/built-in-macros/_drc_complex_ops.rb b/src/drc/drc/built-in-macros/_drc_complex_ops.rb index e83f71d60..5014cf5ef 100644 --- a/src/drc/drc/built-in-macros/_drc_complex_ops.rb +++ b/src/drc/drc/built-in-macros/_drc_complex_ops.rb @@ -232,15 +232,15 @@ class DRCOpNode attr_accessor :description attr_accessor :engine - def initialize(engine, node = nil) - @node = node + def initialize(engine, &factory) + @factory = factory self.engine = engine self.description = "Basic" end def create_node(cache) n = cache[self.object_id] - if !n + if !n || n.destroyed? n = self.do_create_node(cache) cache[self.object_id] = n end @@ -248,7 +248,7 @@ class DRCOpNode end def do_create_node(cache) - @node + @factory.call end def dump(indent) @@ -362,8 +362,8 @@ CODE return self.inverted else # TODO: what if the expression isn't region? - empty = RBA::CompoundRegionOperationNode::new_empty(RBA::CompoundRegionOperationNode::ResultType::Region) - DRCOpNodeCase::new(@engine, [ self, DRCOpNode::new(@engine, empty), @engine.primary ]) + empty = DRCOpNode::new(@engine) { RBA::CompoundRegionOperationNode::new_empty(RBA::CompoundRegionOperationNode::ResultType::Region) } + DRCOpNodeCase::new(@engine, [ self, empty, @engine.primary ]) end end end diff --git a/src/drc/drc/built-in-macros/_drc_cop_integration.rb b/src/drc/drc/built-in-macros/_drc_cop_integration.rb index e299350f7..2f47e052f 100644 --- a/src/drc/drc/built-in-macros/_drc_cop_integration.rb +++ b/src/drc/drc/built-in-macros/_drc_cop_integration.rb @@ -476,7 +476,7 @@ module DRC layer.requires_region - res = DRCOpNode::new(self, RBA::CompoundRegionOperationNode::new_secondary(layer.data)) + res = DRCOpNode::new(self) { RBA::CompoundRegionOperationNode::new_secondary(layer.data) } res.description = "secondary" return res @@ -493,7 +493,7 @@ module DRC # is called on. def primary - res = DRCOpNode::new(self, RBA::CompoundRegionOperationNode::new_primary) + res = DRCOpNode::new(self) { RBA::CompoundRegionOperationNode::new_primary } res.description = "primary" return res end @@ -520,7 +520,7 @@ module DRC # @/code def foreign - res = DRCOpNode::new(self, RBA::CompoundRegionOperationNode::new_foreign) + res = DRCOpNode::new(self) { RBA::CompoundRegionOperationNode::new_foreign } res.description = "foreign" return res end @@ -1555,10 +1555,12 @@ CODE def _make_node(arg) if arg.is_a?(DRCLayer) - arg = DRCOpNode::new(self, RBA::CompoundRegionOperationNode::new_secondary(arg.data)) - arg.description = "secondary" + node = DRCOpNode::new(self) { RBA::CompoundRegionOperationNode::new_secondary(arg.data) } + node.description = "secondary" + return node + else + return arg end - arg end end