aboutsummaryrefslogtreecommitdiff
path: root/stage1
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-10-13 01:29:48 +0000
committerChristopher Vogt <oss.nsp@cvogt.org>2016-10-13 23:21:04 -0400
commitcf94008b6fded5f58cea764d48beb0dcbbd4bb97 (patch)
tree5a26f2e2c50e7d5776a56c86dba62a5f129ed45f /stage1
parente7dab60a0a38f40b75b919a91b73052b510f1711 (diff)
downloadcbt-cf94008b6fded5f58cea764d48beb0dcbbd4bb97.tar.gz
cbt-cf94008b6fded5f58cea764d48beb0dcbbd4bb97.tar.bz2
cbt-cf94008b6fded5f58cea764d48beb0dcbbd4bb97.zip
swap out System.out and System.err in a way that affects JDK and Scala
Before it only affected jdk, because scala.Console captures our and err before the swap. This is needed when running main classes like Scaladoc or the compiler and wanting to redirect output to standard error
Diffstat (limited to 'stage1')
-rw-r--r--stage1/Stage1Lib.scala35
1 files changed, 29 insertions, 6 deletions
diff --git a/stage1/Stage1Lib.scala b/stage1/Stage1Lib.scala
index 68648fe..273b9af 100644
--- a/stage1/Stage1Lib.scala
+++ b/stage1/Stage1Lib.scala
@@ -302,13 +302,36 @@ class Stage1Lib( val logger: Logger ) extends BaseLib{
}
}
def redirectOutToErr[T](code: => T): T = {
- val oldOut = System.out
- try{
- System.setOut(System.err)
- code
- } finally{
- System.setOut(oldOut)
+ val ( out, err ) = try{
+ // trying nailgun's System.our/err wrapper
+ val field = System.out.getClass.getDeclaredField("streams")
+ assert(System.out.getClass.getName == "com.martiansoftware.nailgun.ThreadLocalPrintStream")
+ assert(System.err.getClass.getName == "com.martiansoftware.nailgun.ThreadLocalPrintStream")
+ field.setAccessible(true)
+ val out = field.get(System.out).asInstanceOf[ThreadLocal[PrintStream]]
+ val err = field.get(System.err).asInstanceOf[ThreadLocal[PrintStream]]
+ ( out, err )
+ } catch {
+ case e: NoSuchFieldException =>
+ // trying cbt's System.our/err wrapper
+ val field = classOf[FilterOutputStream].getDeclaredField("out")
+ field.setAccessible(true)
+ val outStream = field.get(System.out)
+ val errStream = field.get(System.err)
+ assert(outStream.getClass.getName == "cbt.ThreadLocalOutputStream")
+ assert(errStream.getClass.getName == "cbt.ThreadLocalOutputStream")
+ val field2 = outStream.getClass.getDeclaredField("threadLocal")
+ field2.setAccessible(true)
+ val out = field2.get(outStream).asInstanceOf[ThreadLocal[PrintStream]]
+ val err = field2.get(errStream).asInstanceOf[ThreadLocal[PrintStream]]
+ ( out, err )
}
+
+ val oldOut: PrintStream = out.get
+ out.set( err.get: PrintStream )
+ val res = code
+ out.set( oldOut )
+ res
}
def trapExitCode( code: => ExitCode ): ExitCode = {