From d3ff0e28b79ea270171f5e29510f1d2d8d23b5fd Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 16 Feb 2019 16:59:35 +0100 Subject: Fix recursive use of computeIfAbsent --- .../transformation/cft2ft/EventMaterializer.xtend | 16 ++++++++++-- .../cft2ft/.Cft2FtTransformation.xtendbin | Bin 2825 -> 2825 bytes .../cft2ft/.EventMaterializer.xtendbin | Bin 11749 -> 11808 bytes .../transformation/cft2ft/EventMaterializer.java | 29 ++++++++++++++------- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.xtend b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.xtend index 85396e4d..c9aefe51 100644 --- a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.xtend +++ b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.xtend @@ -43,7 +43,13 @@ class EventMaterializer { val eventKey = new EventKey(component, eventDeclaration) pushEventKey(eventKey) try { - materializationCache.computeIfAbsent(eventKey)[materialize(it.component, it.event)] + // computeIfAbsent cannot be used recursively, so we must manually cache the event. + var event = materializationCache.get(eventKey) + if (event === null) { + event = materialize(component, eventDeclaration) + materializationCache.put(eventKey, event) + } + event } finally { popEventKey(eventKey) } @@ -147,7 +153,13 @@ class EventMaterializer { val inputKey = new EventKey(component, inputEvent) pushEventKey(inputKey) try { - multipleInputCache.computeIfAbsent(inputKey)[materializeConnectedEvents(it.component, it.event)] + // computeIfAbsent cannot be used recursively, so we must manually cache the event. + var eventCollection = multipleInputCache.get(inputKey) + if (eventCollection === null) { + eventCollection = materializeConnectedEvents(component, inputEvent) + multipleInputCache.put(inputKey, eventCollection) + } + eventCollection } finally { popEventKey(inputKey) } diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin index 20f1f4a7..226e6227 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.Cft2FtTransformation.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin index 271c9cc0..175ae3f1 100644 Binary files a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin and b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/.EventMaterializer.xtendbin differ diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.java b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.java index 70481341..ac1fc209 100644 --- a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.java +++ b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/xtend-gen/hu/bme/mit/inf/dslreasoner/faulttree/transformation/cft2ft/EventMaterializer.java @@ -25,7 +25,6 @@ import hu.bme.mit.inf.dslreasoner.faulttree.model.ft.RandomEvent; import hu.bme.mit.inf.dslreasoner.faulttree.transformation.cft2ft.EventCollection; import java.util.LinkedHashSet; import java.util.Map; -import java.util.function.Function; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtend.lib.annotations.Data; @@ -145,10 +144,16 @@ public class EventMaterializer { this.pushEventKey(eventKey); Event _xtrycatchfinallyexpression = null; try { - final Function, Event> _function = (EventMaterializer.EventKey it) -> { - return this.materialize(it.component, it.event); - }; - _xtrycatchfinallyexpression = this.materializationCache.computeIfAbsent(eventKey, _function); + Event _xblockexpression_1 = null; + { + Event event = this.materializationCache.get(eventKey); + if ((event == null)) { + event = this.materialize(component, eventDeclaration); + this.materializationCache.put(eventKey, event); + } + _xblockexpression_1 = event; + } + _xtrycatchfinallyexpression = _xblockexpression_1; } finally { this.popEventKey(eventKey); } @@ -386,10 +391,16 @@ public class EventMaterializer { this.pushEventKey(inputKey); EventCollection _xtrycatchfinallyexpression = null; try { - final Function, EventCollection> _function = (EventMaterializer.EventKey it) -> { - return this.materializeConnectedEvents(it.component, it.event); - }; - _xtrycatchfinallyexpression = this.multipleInputCache.computeIfAbsent(inputKey, _function); + EventCollection _xblockexpression_1 = null; + { + EventCollection eventCollection = this.multipleInputCache.get(inputKey); + if ((eventCollection == null)) { + eventCollection = this.materializeConnectedEvents(component, inputEvent); + this.multipleInputCache.put(inputKey, eventCollection); + } + _xblockexpression_1 = eventCollection; + } + _xtrycatchfinallyexpression = _xblockexpression_1; } finally { this.popEventKey(inputKey); } -- cgit v1.2.3-70-g09d2