diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-01-14 15:25:50 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-01-14 15:25:50 -0800 |
commit | f32463f0ba199778d369de603be1e890863f4d4d (patch) | |
tree | 5dea8514bdd9a10194424961f2c0355811d36642 /src | |
parent | 28da03d9ee120211bbce734ea626f4ce0404701c (diff) | |
parent | 57ae1f30b2c6e8f705eea796cd3b36932049b5aa (diff) | |
download | scala-f32463f0ba199778d369de603be1e890863f4d4d.tar.gz scala-f32463f0ba199778d369de603be1e890863f4d4d.tar.bz2 scala-f32463f0ba199778d369de603be1e890863f4d4d.zip |
Merge pull request #1838 from viktorklang/wip-6905-√
SI-6594 - Switch to sneakyThrows instead of Unsafe.throwException as per...
Diffstat (limited to 'src')
-rw-r--r-- | src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java | 2 | ||||
-rw-r--r-- | src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java | 30 |
2 files changed, 28 insertions, 4 deletions
diff --git a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java index 65654be69b..8dbca6da4b 100644 --- a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java +++ b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java @@ -1372,7 +1372,7 @@ public class ForkJoinPool extends AbstractExecutorService { } if (ex != null) // rethrow - U.throwException(ex); + ForkJoinTask.rethrow(ex); } diff --git a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java index 15c60118b3..839fd26b39 100644 --- a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java +++ b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java @@ -595,6 +595,30 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { } } } + + /** + * A version of "sneaky throw" to relay exceptions + */ + static void rethrow(final Throwable ex) { + if (ex != null) { + if (ex instanceof Error) + throw (Error)ex; + if (ex instanceof RuntimeException) + throw (RuntimeException)ex; + ForkJoinTask.<RuntimeException>uncheckedThrow(ex); + } + } + + /** + * The sneaky part of sneaky throw, relying on generics + * limitations to evade compiler complaints about rethrowing + * unchecked exceptions + */ + @SuppressWarnings("unchecked") static <T extends Throwable> + void uncheckedThrow(Throwable t) throws T { + if (t != null) + throw (T)t; // rely on vacuous cast + } /** * Throws exception, if any, associated with the given status. @@ -604,7 +628,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { (s == EXCEPTIONAL) ? getThrowableException() : null); if (ex != null) - U.throwException(ex); + ForkJoinTask.rethrow(ex); } // public methods @@ -742,7 +766,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { } } if (ex != null) - U.throwException(ex); + ForkJoinTask.rethrow(ex); } /** @@ -799,7 +823,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { } } if (ex != null) - U.throwException(ex); + ForkJoinTask.rethrow(ex); return tasks; } |