From 049d8bfb6d354bf2d8044ccb96daccd6d4c8d9c5 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Tue, 14 Jun 2016 18:01:20 -0700 Subject: [PATCH 1/2] Add scala 2.12.0-M4 in build --- core/src/main/scala-2.12.0-M4 | 1 + .../binary/{Util.scala => UnsafeMemory.scala} | 14 +++++++++++--- .../scala/scala/pickling/generator/sourcegen.scala | 4 ++-- .../scala/scala/pickling/runtime/Runtime.scala | 5 +++-- project/Dependencies.scala | 2 +- project/Util.scala | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) create mode 120000 core/src/main/scala-2.12.0-M4 rename core/src/main/scala/scala/pickling/binary/{Util.scala => UnsafeMemory.scala} (71%) diff --git a/core/src/main/scala-2.12.0-M4 b/core/src/main/scala-2.12.0-M4 new file mode 120000 index 0000000000..9dc04540eb --- /dev/null +++ b/core/src/main/scala-2.12.0-M4 @@ -0,0 +1 @@ +scala-2.11 \ No newline at end of file diff --git a/core/src/main/scala/scala/pickling/binary/Util.scala b/core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala similarity index 71% rename from core/src/main/scala/scala/pickling/binary/Util.scala rename to core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala index b3970ae2a5..47723b85f7 100644 --- a/core/src/main/scala/scala/pickling/binary/Util.scala +++ b/core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala @@ -1,9 +1,17 @@ package scala.pickling.binary +import sun.misc.Unsafe + object UnsafeMemory { - import sun.misc.Unsafe - private[pickling] val unsafe: Unsafe = - scala.concurrent.util.Unsafe.instance + private[pickling] val unsafe: Unsafe = { + val fields = classOf[Unsafe].getDeclaredFields() + val unsafes = for (field <- fields; if field.getType == classOf[Unsafe]) yield { + field.setAccessible(true) + field.get(null).asInstanceOf[Unsafe] + } + unsafes.headOption.getOrElse( + throw new IllegalStateException("Can't find instance of sun.misc.Unsafe")) + } private[pickling] val byteArrayOffset: Long = unsafe.arrayBaseOffset(classOf[Array[Byte]]) private[pickling] val shortArrayOffset: Long = unsafe.arrayBaseOffset(classOf[Array[Short]]) private[pickling] val intArrayOffset: Long = unsafe.arrayBaseOffset(classOf[Array[Int]]) diff --git a/core/src/main/scala/scala/pickling/generator/sourcegen.scala b/core/src/main/scala/scala/pickling/generator/sourcegen.scala index 1b15ed7eeb..3e19dcc813 100644 --- a/core/src/main/scala/scala/pickling/generator/sourcegen.scala +++ b/core/src/main/scala/scala/pickling/generator/sourcegen.scala @@ -356,7 +356,7 @@ private[pickling] trait SourceGenerator extends Macro with tags.FastTypeTagMacro def genAllocateInstance(x: AllocateInstance): c.Tree = { val tpe = x.tpe.tpe[c.universe.type](c.universe) - q"""_root_.scala.concurrent.util.Unsafe.instance.allocateInstance(classOf[$tpe]).asInstanceOf[$tpe]""" + q"""_root_.scala.pickling.binary.UnsafeMemory.unsafe.allocateInstance(classOf[$tpe]).asInstanceOf[$tpe]""" } def generateUnpickleImplFromAst(unpicklerAst: UnpicklerAst): c.Tree = { @@ -484,7 +484,7 @@ private[pickling] trait SourceGenerator extends Macro with tags.FastTypeTagMacro val objectOutTpe = typeOf[scala.pickling.util.GenObjectOutput] val fieldName = "$ext" q""" - val $target = _root_.scala.concurrent.util.Unsafe.instance.allocateInstance(classOf[$tpe]).asInstanceOf[$tpe] + val $target = _root_.scala.pickling.binary.UnsafeMemory.unsafe.allocateInstance(classOf[$tpe]).asInstanceOf[$tpe] val $readerName = reader.readField($fieldName) val out = { val up = _root_.scala.Predef.implicitly[_root_.scala.pickling.Unpickler[$objectOutTpe]] diff --git a/core/src/main/scala/scala/pickling/runtime/Runtime.scala b/core/src/main/scala/scala/pickling/runtime/Runtime.scala index 52ae742b44..e8ac976a5c 100644 --- a/core/src/main/scala/scala/pickling/runtime/Runtime.scala +++ b/core/src/main/scala/scala/pickling/runtime/Runtime.scala @@ -3,6 +3,7 @@ package runtime import scala.pickling.PicklingErrors.BasePicklingException import scala.pickling.internal._ +import binary.UnsafeMemory import scala.reflect.runtime.universe.Mirror import ir._ @@ -233,7 +234,7 @@ class InterpretedUnpicklerRuntime(val mirror: Mirror, typeTag: String)(implicit // TODO: need to support modules and other special guys here // TODO: in principle, we could invoke a constructor here - val inst = scala.concurrent.util.Unsafe.instance.allocateInstance(clazz) + val inst = UnsafeMemory.unsafe.allocateInstance(clazz) if (shouldBotherAboutSharing(tpe)) registerUnpicklee(inst, preregisterUnpicklee()) val im = mirror.reflect(inst) @@ -332,7 +333,7 @@ class ShareNothingInterpretedUnpicklerRuntime(val mirror: Mirror, typeTag: Strin // TODO: need to support modules and other special guys here // TODO: in principle, we could invoke a constructor here - val inst = scala.concurrent.util.Unsafe.instance.allocateInstance(clazz) + val inst = UnsafeMemory.unsafe.allocateInstance(clazz) val im = mirror.reflect(inst) //debug(s"pendingFields: ${pendingFields.size}") diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 8cff1c64c0..3d814e0483 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -2,7 +2,7 @@ import sbt._ import Keys._ object Dependencies { - lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.0-M15" + lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.0-RC2" lazy val scalaCheck = "org.scalacheck" %% "scalacheck" % "1.11.6" lazy val parserCombinators = "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.2" lazy val macroParadise = "org.scalamacros" % "paradise" % "2.0.1" cross CrossVersion.full diff --git a/project/Util.scala b/project/Util.scala index 94ecf0ad54..4e0c2411c6 100644 --- a/project/Util.scala +++ b/project/Util.scala @@ -3,7 +3,7 @@ import Keys._ object Util { val buildScalaVersion = System.getProperty("scala.version", "2.11.7") - val buildScalaVersions = Seq("2.11.7", "2.10.4") + val buildScalaVersions = Seq("2.11.7", "2.10.4", "2.12.0-M4") val javaVersion = System.getProperty("java.version") def loadCredentials(): List[Credentials] = { From 983f976e332fc0156e93dcd2bf8b7f9eef423095 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Wed, 15 Jun 2016 13:52:55 -0700 Subject: [PATCH 2/2] Formatting --- core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala b/core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala index 47723b85f7..5c45a1d2c2 100644 --- a/core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala +++ b/core/src/main/scala/scala/pickling/binary/UnsafeMemory.scala @@ -21,9 +21,9 @@ object UnsafeMemory { private[pickling] val charArrayOffset: Long = unsafe.arrayBaseOffset(classOf[Array[Char]]) private[pickling] val booleanArrayOffset: Long = unsafe.arrayBaseOffset(classOf[Array[Boolean]]) def putInt(arr: Array[Byte], i: Int, value: Int): Unit = { - unsafe.putInt(arr, byteArrayOffset + i, value) + unsafe.putInt(arr, byteArrayOffset + i, value) } def getInt(arr: Array[Byte], i: Int): Int = { - unsafe.getInt(arr, byteArrayOffset + i) + unsafe.getInt(arr, byteArrayOffset + i) } }