diff options
author | Felix Mulder <felix.mulder@gmail.com> | 2016-10-26 16:19:35 +0200 |
---|---|---|
committer | Guillaume Martres <smarter@ubuntu.com> | 2016-11-22 01:35:06 +0100 |
commit | 06a3d47ea9fd1b67b3acba9d115a16d18549e377 (patch) | |
tree | 36311873f40e1410154c50d00abb03715619e8cc /sjs/backend/sjs/ScopedVar.scala | |
parent | 0da788c52121e44de6be0cdc7a0c4c6e1b125ff9 (diff) | |
download | dotty-06a3d47ea9fd1b67b3acba9d115a16d18549e377.tar.gz dotty-06a3d47ea9fd1b67b3acba9d115a16d18549e377.tar.bz2 dotty-06a3d47ea9fd1b67b3acba9d115a16d18549e377.zip |
Move sjs, make sure that partest compiles everything in dirs
Diffstat (limited to 'sjs/backend/sjs/ScopedVar.scala')
-rw-r--r-- | sjs/backend/sjs/ScopedVar.scala | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/sjs/backend/sjs/ScopedVar.scala b/sjs/backend/sjs/ScopedVar.scala new file mode 100644 index 000000000..0e47f7b79 --- /dev/null +++ b/sjs/backend/sjs/ScopedVar.scala @@ -0,0 +1,38 @@ +package dotty.tools.backend.sjs + +import language.implicitConversions + +class ScopedVar[A](init: A) { + import ScopedVar.Assignment + + private var value = init + + def this()(implicit ev: Null <:< A) = this(ev(null)) + + def get: A = value + def :=(newValue: A): Assignment[A] = new Assignment(this, newValue) +} + +object ScopedVar { + class Assignment[T](scVar: ScopedVar[T], value: T) { + private[ScopedVar] def push(): AssignmentStackElement[T] = { + val stack = new AssignmentStackElement(scVar, scVar.value) + scVar.value = value + stack + } + } + + private class AssignmentStackElement[T](scVar: ScopedVar[T], oldValue: T) { + private[ScopedVar] def pop(): Unit = { + scVar.value = oldValue + } + } + + implicit def toValue[T](scVar: ScopedVar[T]): T = scVar.get + + def withScopedVars[T](ass: Assignment[_]*)(body: => T): T = { + val stack = ass.map(_.push()) + try body + finally stack.reverse.foreach(_.pop()) + } +} |