From b7ab472ed7cd6530c586e15d0f1616ee87927490 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 15 Jul 2019 16:35:31 +1000 Subject: [PATCH 1/3] Fix logic error in StateSet --- src/main/scala/scala/async/internal/StateSet.scala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/scala/scala/async/internal/StateSet.scala b/src/main/scala/scala/async/internal/StateSet.scala index a13e9f16..1e8205aa 100644 --- a/src/main/scala/scala/async/internal/StateSet.scala +++ b/src/main/scala/scala/async/internal/StateSet.scala @@ -21,8 +21,11 @@ import scala.collection.JavaConverters.{asScalaIteratorConverter, iterableAsScal final class StateSet { private var bitSet = new java.util.BitSet() private var caseSet = new util.HashSet[Integer]() - def +=(stateId: Int): Unit = if (stateId > 0) bitSet.set(stateId) else caseSet.add(stateId) - def contains(stateId: Int): Boolean = if (stateId > 0 && stateId < 1024) bitSet.get(stateId) else caseSet.contains(stateId) + def +=(stateId: Int): Unit = if (storeInBitSet(stateId)) bitSet.set(stateId) else caseSet.add(stateId) + def contains(stateId: Int): Boolean = if (storeInBitSet(stateId)) bitSet.get(stateId) else caseSet.contains(stateId) + private def storeInBitSet(stateId: Int) = { + stateId > 0 && stateId < 1024 + } def iterator: Iterator[Integer] = { bitSet.stream().iterator().asScala ++ caseSet.asScala.iterator } From 7b307353978fee7f1e7804ffb912cec91d845164 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 15 Jul 2019 16:35:48 +1000 Subject: [PATCH 2/3] Reduce boxing in live variables analysis --- src/main/scala/scala/async/internal/LiveVariables.scala | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/scala/scala/async/internal/LiveVariables.scala b/src/main/scala/scala/async/internal/LiveVariables.scala index 71fd0aca..2f7ecc29 100644 --- a/src/main/scala/scala/async/internal/LiveVariables.scala +++ b/src/main/scala/scala/async/internal/LiveVariables.scala @@ -143,7 +143,7 @@ trait LiveVariables { * A state `i` is contained in the list that is the value to which * key `j` maps iff control can flow from state `j` to state `i`. */ - val cfg: Map[Int, Array[Int]] = { + val cfg: IntMap[Array[Int]] = { var res = IntMap.empty[Array[Int]] for (as <- asyncStates) res = res.updated(as.state, as.nextStates) @@ -158,8 +158,9 @@ trait LiveVariables { def isPred0(state1: Int, state2: Int): Boolean = if(state1 == state2) false else if (seen.contains(state1)) false // breaks cycles in the CFG - else cfg get state1 match { - case Some(nextStates) => + else cfg getOrElse(state1, null) match { + case null => false + case nextStates => seen += state1 var i = 0 while (i < nextStates.length) { @@ -167,8 +168,6 @@ trait LiveVariables { i += 1 } false - case None => - false } isPred0(state1, state2) From 764f93a786807c7233b5c5f7a3b77762c119f0ad Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 15 Jul 2019 16:36:36 +1000 Subject: [PATCH 3/3] Remove needless vars from StateSet --- src/main/scala/scala/async/internal/StateSet.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/scala/async/internal/StateSet.scala b/src/main/scala/scala/async/internal/StateSet.scala index 1e8205aa..7b7c8124 100644 --- a/src/main/scala/scala/async/internal/StateSet.scala +++ b/src/main/scala/scala/async/internal/StateSet.scala @@ -19,8 +19,8 @@ import scala.collection.JavaConverters.{asScalaIteratorConverter, iterableAsScal // Set for StateIds, which are either small positive integers or -symbolID. final class StateSet { - private var bitSet = new java.util.BitSet() - private var caseSet = new util.HashSet[Integer]() + private val bitSet = new java.util.BitSet() + private val caseSet = new util.HashSet[Integer]() def +=(stateId: Int): Unit = if (storeInBitSet(stateId)) bitSet.set(stateId) else caseSet.add(stateId) def contains(stateId: Int): Boolean = if (storeInBitSet(stateId)) bitSet.get(stateId) else caseSet.contains(stateId) private def storeInBitSet(stateId: Int) = {