summaryrefslogtreecommitdiff
path: root/src/forkjoin
diff options
context:
space:
mode:
authorViktor Klang <viktor.klang@gmail.com>2013-01-03 14:04:20 +0100
committerViktor Klang <viktor.klang@gmail.com>2013-01-14 17:40:52 +0100
commit57ae1f30b2c6e8f705eea796cd3b36932049b5aa (patch)
tree95363466815e452fd5975db041f14317ae594dd7 /src/forkjoin
parentca98602e8243062c8e1e86afe954c48edc09cbad (diff)
downloadscala-57ae1f30b2c6e8f705eea796cd3b36932049b5aa.tar.gz
scala-57ae1f30b2c6e8f705eea796cd3b36932049b5aa.tar.bz2
scala-57ae1f30b2c6e8f705eea796cd3b36932049b5aa.zip
SI-6905 - Switch to sneakyThrows instead of Unsafe.throwException as per new jsr166y to avoid issues with Android
Diffstat (limited to 'src/forkjoin')
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/ForkJoinPool.java2
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java30
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;
}