From 021c2cbfdd5e04e01293b83d81c97e72d01df1b4 Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Fri, 28 Oct 2016 13:00:34 +0200 Subject: [PATCH] Scala 2.12 does not name mangle private fields (#21742) When we can emit a private field, no need to mangle its name https://github.com/scala/community-builds/pull/317\#issuecomment-254931492 --- .../main/scala/akka/typed/internal/ActorRefImpl.scala | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/akka-typed/src/main/scala/akka/typed/internal/ActorRefImpl.scala b/akka-typed/src/main/scala/akka/typed/internal/ActorRefImpl.scala index a3d49c88b5..e0130118a9 100644 --- a/akka-typed/src/main/scala/akka/typed/internal/ActorRefImpl.scala +++ b/akka-typed/src/main/scala/akka/typed/internal/ActorRefImpl.scala @@ -139,6 +139,7 @@ private[typed] object WatchableRef { private[typed] class FutureRef[-T](_p: a.ActorPath, bufferSize: Int, f: Future[ActorRef[T]]) extends WatchableRef[T](_p) { import FutureRef._ + // Keep in synch with `targetOffset` in companion (could also change on mixing in a trait). @volatile private[this] var _target: Either[ArrayList[T], ActorRef[T]] = Left(new ArrayList[T]) f.onComplete { @@ -190,5 +191,12 @@ private[typed] class FutureRef[-T](_p: a.ActorPath, bufferSize: Int, f: Future[A } private[typed] object FutureRef { - val targetOffset = unsafe.objectFieldOffset(classOf[FutureRef[_]].getDeclaredField("akka$typed$internal$FutureRef$$_target")) + val targetOffset = { + val fields = classOf[FutureRef[_]].getDeclaredFields.toList + // On Scala 2.12, the field's name is exactly "_target" (and it's private), earlier Scala versions compile the val to a public field that's name mangled to "akka$typed$internal$FutureRef$$_target" + val targetField = fields.find(_.getName.endsWith("_target")) + assert(targetField.nonEmpty, s"Could not find _target field in FutureRef class among fields $fields.") + + unsafe.objectFieldOffset(targetField.get) + } }