From b3d4d5030e23fa8570aa518dba6a0e40d0568b11 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Mon, 28 Mar 2016 14:43:41 -0700 Subject: [PATCH 01/13] WIP --- build.sbt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 849dc07f..53229e27 100644 --- a/build.sbt +++ b/build.sbt @@ -17,7 +17,7 @@ def isScala210x(scalaVersion: String) = scalaVersion match { val sharedSettings = Project.defaultSettings ++ mimaDefaultSettings ++ scalariformSettings ++ Seq( organization := "com.twitter", scalaVersion := "2.10.5", - crossScalaVersions := Seq("2.10.5", "2.11.7"), + crossScalaVersions := Seq("2.10.5", "2.11.7", "2.12.0-M3"), scalacOptions ++= Seq("-unchecked", "-deprecation"), ScalariformKeys.preferences := formattingPreferences, @@ -25,13 +25,15 @@ val sharedSettings = Project.defaultSettings ++ mimaDefaultSettings ++ scalarifo javacOptions ++= Seq("-target", "1.6", "-source", "1.6", "-Xlint:-options"), javacOptions in doc := Seq("-source", "1.6"), + testOptions in Test += Tests.Argument("-oF"), + resolvers ++= Seq( Opts.resolver.sonatypeSnapshots, Opts.resolver.sonatypeReleases ), libraryDependencies ++= Seq( - "org.scalacheck" %% "scalacheck" % "1.11.5" % "test", - "org.scalatest" %% "scalatest" % "2.2.2" % "test", + "org.scalacheck" %% "scalacheck" % "1.11.6" % "test", + "org.scalatest" %% "scalatest" % "2.2.5-M3" % "test", "com.esotericsoftware" % "kryo-shaded" % kryoVersion ), From 99e51a09a2c1bf7385239c45e47dc61f09f44ec6 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Fri, 8 Apr 2016 13:34:04 -0700 Subject: [PATCH 02/13] Use Kryo 3.1.0-SNAPSHOT; register ClosureSerializer --- build.sbt | 6 +++--- .../scala/com/twitter/chill/ScalaKryoInstantiator.scala | 4 ++++ chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/build.sbt b/build.sbt index 53229e27..3a72e4c7 100644 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ import com.typesafe.tools.mima.plugin.MimaPlugin.mimaDefaultSettings import scala.collection.JavaConverters._ import scalariform.formatter.preferences._ -val kryoVersion = "3.0.3" +val kryoVersion = "3.1.0-SNAPSHOT" val bijectionVersion = "0.9.0" val algebirdVersion = "0.12.0" @@ -17,7 +17,7 @@ def isScala210x(scalaVersion: String) = scalaVersion match { val sharedSettings = Project.defaultSettings ++ mimaDefaultSettings ++ scalariformSettings ++ Seq( organization := "com.twitter", scalaVersion := "2.10.5", - crossScalaVersions := Seq("2.10.5", "2.11.7", "2.12.0-M3"), + crossScalaVersions := Seq("2.10.5", "2.11.7", "2.12.0-M4"), scalacOptions ++= Seq("-unchecked", "-deprecation"), ScalariformKeys.preferences := formattingPreferences, @@ -33,7 +33,7 @@ val sharedSettings = Project.defaultSettings ++ mimaDefaultSettings ++ scalarifo ), libraryDependencies ++= Seq( "org.scalacheck" %% "scalacheck" % "1.11.6" % "test", - "org.scalatest" %% "scalatest" % "2.2.5-M3" % "test", + "org.scalatest" %% "scalatest" % "2.2.6" % "test", "com.esotericsoftware" % "kryo-shaded" % kryoVersion ), diff --git a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala index dbbc7818..9eea62af 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala @@ -43,6 +43,7 @@ import scala.collection.mutable.{ import scala.util.matching.Regex +import com.esotericsoftware.kryo.serializers.ClosureSerializer import com.twitter.chill.java.PackageRegistrar import _root_.java.io.Serializable @@ -201,5 +202,8 @@ class AllScalaRegistrar extends IKryoRegistrar { val boxedUnit = scala.Unit.box(()) k.register(boxedUnit.getClass, new SingletonSerializer(boxedUnit)) PackageRegistrar.all()(k) + + // Enable Java 8 lambda serialization + k.register(classOf[ClosureSerializer.Closure], new ClosureSerializer()) } } diff --git a/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala b/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala index 457f3bca..06fd5664 100644 --- a/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala +++ b/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala @@ -299,7 +299,7 @@ class KryoSpec extends WordSpec with Matchers with BaseProperties { toList(rt(qr)) should equal(qrlist) } "Ranges should be fixed size" in { - val MAX_RANGE_SIZE = 188 // what seems to be needed. + val MAX_RANGE_SIZE = 447 // what seems to be needed. serialize((1 to 10000)).size should be < (MAX_RANGE_SIZE) // some fixed size serialize((1 to 10000 by 2)).size should be < (MAX_RANGE_SIZE) // some fixed size serialize((1 until 10000)).size should be < (MAX_RANGE_SIZE) // some fixed size From c98f80e30946f84b940066d4c1f1b6c67bdb1e14 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Fri, 8 Apr 2016 13:49:14 -0700 Subject: [PATCH 03/13] Update ClosureCleaner to use ASM 5 APIs: References: http://movingfulcrum.tumblr.com/post/80826553604/asm-framework-50-the-missing-migration-guide https://github.com/apache/spark/pull/9512 --- .../scala/com/twitter/chill/ClosureCleaner.scala | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/chill-scala/src/main/scala/com/twitter/chill/ClosureCleaner.scala b/chill-scala/src/main/scala/com/twitter/chill/ClosureCleaner.scala index 2d1f5332..1de34a47 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ClosureCleaner.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ClosureCleaner.scala @@ -216,10 +216,10 @@ object ClosureCleaner { .asInstanceOf[AnyRef] } -class FieldAccessFinder(output: MMap[Class[_], MSet[String]]) extends ClassVisitor(ASM4) { +class FieldAccessFinder(output: MMap[Class[_], MSet[String]]) extends ClassVisitor(ASM5) { override def visitMethod(access: Int, name: String, desc: String, sig: String, exceptions: Array[String]): MethodVisitor = { - return new MethodVisitor(ASM4) { + return new MethodVisitor(ASM5) { override def visitFieldInsn(op: Int, owner: String, name: String, desc: String) { if (op == GETFIELD) @@ -228,7 +228,7 @@ class FieldAccessFinder(output: MMap[Class[_], MSet[String]]) extends ClassVisit } override def visitMethodInsn(op: Int, owner: String, name: String, - desc: String) { + desc: String, itf: Boolean) { // Check for calls a getter method for a variable in an interpreter wrapper object. // This means that the corresponding field will be accessed, so we should save it. if (op == INVOKEVIRTUAL && owner.endsWith("$iwC") && !name.endsWith("$outer")) @@ -239,7 +239,7 @@ class FieldAccessFinder(output: MMap[Class[_], MSet[String]]) extends ClassVisit } } -class InnerClosureFinder(output: MSet[Class[_]]) extends ClassVisitor(ASM4) { +class InnerClosureFinder(output: MSet[Class[_]]) extends ClassVisitor(ASM5) { var myName: String = null override def visit(version: Int, access: Int, name: String, sig: String, @@ -249,9 +249,9 @@ class InnerClosureFinder(output: MSet[Class[_]]) extends ClassVisitor(ASM4) { override def visitMethod(access: Int, name: String, desc: String, sig: String, exceptions: Array[String]): MethodVisitor = { - return new MethodVisitor(ASM4) { + return new MethodVisitor(ASM5) { override def visitMethodInsn(op: Int, owner: String, name: String, - desc: String) { + desc: String, itf: Boolean) { val argTypes = Type.getArgumentTypes(desc) if (op == INVOKESPECIAL && name == "" && argTypes.length > 0 && argTypes(0).toString.startsWith("L") // is it an object? From 97573d3a09e122d050eb8221056dee60b17fec38 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Fri, 8 Apr 2016 15:29:28 -0700 Subject: [PATCH 04/13] Use sbt-doge to exclude certain subprojects from the 2.12 build. --- .travis.yml | 7 +++++++ build.sbt | 7 ++++++- project/plugins.sbt | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 93d89fdd..cea98d27 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,16 @@ sudo: false scala: - 2.10.5 - 2.11.7 + - 2.12.0-M4 jdk: - openjdk6 - oraclejdk7 - oraclejdk8 +matrix: + exclude: + - scala: 2.12.0-M4 + jdk: openjdk6 + - scala: 2.12.0-M4 + jdk: oraclejdk7 script: ./sbt ++$TRAVIS_SCALA_VERSION clean test doc diff --git a/build.sbt b/build.sbt index 3a72e4c7..b9f06a64 100644 --- a/build.sbt +++ b/build.sbt @@ -88,7 +88,7 @@ lazy val chillAll = Project( id = "chill-all", base = file("."), settings = sharedSettings -).settings( +).enablePlugins(CrossPerProjectPlugin).settings( test := { }, publish := { }, publishLocal := { } @@ -154,6 +154,7 @@ lazy val chill = Project( lazy val chillAkka = module("akka").settings( resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/", + crossScalaVersions := crossScalaVersions.value.filterNot(_.startsWith("2.12")), libraryDependencies ++= Seq( "com.typesafe" % "config" % "1.2.1", "com.typesafe.akka" %% "akka-actor" % "2.3.6" % "provided" @@ -161,6 +162,7 @@ lazy val chillAkka = module("akka").settings( ).dependsOn(chill % "test->test;compile->compile") lazy val chillBijection = module("bijection").settings( + crossScalaVersions := crossScalaVersions.value.filterNot(_.startsWith("2.12")), libraryDependencies ++= Seq( "com.twitter" %% "bijection-core" % bijectionVersion ) @@ -204,6 +206,7 @@ lazy val chillThrift = module("thrift").settings( ) lazy val chillScrooge = module("scrooge").settings( + crossScalaVersions := crossScalaVersions.value.filterNot(_.startsWith("2.12")), libraryDependencies ++= Seq( "org.apache.thrift" % "libthrift" % "0.6.1" exclude("junit", "junit"), "com.twitter" %% "scrooge-serializer" % "3.20.0" @@ -220,6 +223,7 @@ lazy val chillProtobuf = module("protobuf").settings( ).dependsOn(chillJava) lazy val chillAvro = module("avro").settings( + crossScalaVersions := crossScalaVersions.value.filterNot(_.startsWith("2.12")), libraryDependencies ++= Seq( "com.twitter" %% "bijection-avro" % bijectionVersion, "junit" % "junit" % "4.5" % "test" @@ -227,6 +231,7 @@ lazy val chillAvro = module("avro").settings( ).dependsOn(chill,chillJava, chillBijection) lazy val chillAlgebird = module("algebird").settings( + crossScalaVersions := crossScalaVersions.value.filterNot(_.startsWith("2.12")), libraryDependencies ++= Seq( "com.twitter" %% "algebird-core" % algebirdVersion ) diff --git a/project/plugins.sbt b/project/plugins.sbt index 612d1671..f82b81de 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -7,3 +7,4 @@ addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.5.2") addSbtPlugin("com.typesafe.sbt" % "sbt-osgi" % "0.7.0") addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.0") +addSbtPlugin("com.eed3si9n" % "sbt-doge" % "0.1.5") From 26e8bd0ff602afd07639a0ad2ef82a96683c6972 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Fri, 8 Apr 2016 15:51:33 -0700 Subject: [PATCH 05/13] Remove testOptions change. --- build.sbt | 2 -- 1 file changed, 2 deletions(-) diff --git a/build.sbt b/build.sbt index b9f06a64..b20fc537 100644 --- a/build.sbt +++ b/build.sbt @@ -25,8 +25,6 @@ val sharedSettings = Project.defaultSettings ++ mimaDefaultSettings ++ scalarifo javacOptions ++= Seq("-target", "1.6", "-source", "1.6", "-Xlint:-options"), javacOptions in doc := Seq("-source", "1.6"), - testOptions in Test += Tests.Argument("-oF"), - resolvers ++= Seq( Opts.resolver.sonatypeSnapshots, Opts.resolver.sonatypeReleases From c11010f56d284c61a49f0456c9dec6ff0f2dc386 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Fri, 8 Apr 2016 16:15:13 -0700 Subject: [PATCH 06/13] Only register ClosureSerializer when running on Java 8 JDK. --- .../scala/com/twitter/chill/ScalaKryoInstantiator.scala | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala index 9eea62af..6c66139e 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala @@ -203,7 +203,12 @@ class AllScalaRegistrar extends IKryoRegistrar { k.register(boxedUnit.getClass, new SingletonSerializer(boxedUnit)) PackageRegistrar.all()(k) - // Enable Java 8 lambda serialization - k.register(classOf[ClosureSerializer.Closure], new ClosureSerializer()) + // Enable Java 8 lambda serialization only if we are running on a Java 8 JRE: + try { + Class.forName("java.lang.invoke.SerializedLambda") + k.register(classOf[ClosureSerializer.Closure], new ClosureSerializer()) + } catch { + case e: ClassNotFoundException => // not running on Java 8 + } } } From a17fd8ebfa860445eecaa3a2588a87852edf261e Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Sat, 9 Apr 2016 18:15:31 -0700 Subject: [PATCH 07/13] Update to use sbt-doge's +++ "strict aggregation" operator. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cea98d27..2d086b03 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,5 +14,5 @@ matrix: jdk: openjdk6 - scala: 2.12.0-M4 jdk: oraclejdk7 -script: ./sbt ++$TRAVIS_SCALA_VERSION clean test doc +script: ./sbt "+++$TRAVIS_SCALA_VERSION clean" "+++$TRAVIS_SCALA_VERSION test" "+++$TRAVIS_SCALA_VERSION doc" From 3376e7bb9bd79232e8765d83dfa531f09ef4b68e Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Sat, 9 Apr 2016 18:40:43 -0700 Subject: [PATCH 08/13] Workaround to fix PriorityQueueTest (there's probably a better way to do this). --- .../scala/com/twitter/chill/java/PriorityQueueTest.scala | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala b/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala index a97ecd2b..56a8ceb6 100644 --- a/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala +++ b/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala @@ -21,6 +21,7 @@ import org.scalatest._ import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Output +import com.esotericsoftware.kryo.serializers.ClosureSerializer import org.objenesis.strategy.StdInstantiatorStrategy @@ -40,6 +41,13 @@ class PriorityQueueSpec extends WordSpec with Matchers { val kryo = new Kryo() kryo.setInstantiatorStrategy(new StdInstantiatorStrategy) PriorityQueueSerializer.registrar()(kryo) + // Enable Java 8 lambda serialization only if we are running on a Java 8 JRE: + try { + Class.forName("java.lang.invoke.SerializedLambda") + kryo.register(classOf[ClosureSerializer.Closure], new ClosureSerializer()) + } catch { + case e: ClassNotFoundException => // not running on Java 8 + } val ord = Ordering.fromLessThan[(Int, Int)] { (l, r) => l._1 < r._1 } val q = new java.util.PriorityQueue[(Int, Int)](3, ord) q.add((2, 3)) From 3636f1c38c8c1844c3a8364671813c81d4e4c547 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Fri, 15 Apr 2016 00:02:19 -0700 Subject: [PATCH 09/13] Replace Unit.box() call by scala.runtime.BoxedUnit.UNIT See https://issues.scala-lang.org/browse/SI-6710 for context. This is necessary for Scala 2.12.0-M5. --- .../main/scala/com/twitter/chill/ScalaKryoInstantiator.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala index 6c66139e..0a6e4508 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala @@ -199,7 +199,7 @@ class AllScalaRegistrar extends IKryoRegistrar { .forSubclass[scala.Enumeration#Value](new EnumerationSerializer) // use the singleton serializer for boxed Unit - val boxedUnit = scala.Unit.box(()) + val boxedUnit = scala.runtime.BoxedUnit.UNIT k.register(boxedUnit.getClass, new SingletonSerializer(boxedUnit)) PackageRegistrar.all()(k) From 25e982b548ee6635f6d6314e7e651344ab489b71 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Fri, 4 Nov 2016 14:13:18 -0700 Subject: [PATCH 10/13] Update to 2.12.0 final. --- .travis.yml | 6 +++--- build.sbt | 4 ++-- chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2d086b03..28e8074a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,16 +3,16 @@ sudo: false scala: - 2.10.5 - 2.11.7 - - 2.12.0-M4 + - 2.12.0 jdk: - openjdk6 - oraclejdk7 - oraclejdk8 matrix: exclude: - - scala: 2.12.0-M4 + - scala: 2.12.0 jdk: openjdk6 - - scala: 2.12.0-M4 + - scala: 2.12.0 jdk: oraclejdk7 script: ./sbt "+++$TRAVIS_SCALA_VERSION clean" "+++$TRAVIS_SCALA_VERSION test" "+++$TRAVIS_SCALA_VERSION doc" diff --git a/build.sbt b/build.sbt index b20fc537..a387e1d3 100644 --- a/build.sbt +++ b/build.sbt @@ -17,7 +17,7 @@ def isScala210x(scalaVersion: String) = scalaVersion match { val sharedSettings = Project.defaultSettings ++ mimaDefaultSettings ++ scalariformSettings ++ Seq( organization := "com.twitter", scalaVersion := "2.10.5", - crossScalaVersions := Seq("2.10.5", "2.11.7", "2.12.0-M4"), + crossScalaVersions := Seq("2.10.5", "2.11.7", "2.12.0"), scalacOptions ++= Seq("-unchecked", "-deprecation"), ScalariformKeys.preferences := formattingPreferences, @@ -31,7 +31,7 @@ val sharedSettings = Project.defaultSettings ++ mimaDefaultSettings ++ scalarifo ), libraryDependencies ++= Seq( "org.scalacheck" %% "scalacheck" % "1.11.6" % "test", - "org.scalatest" %% "scalatest" % "2.2.6" % "test", + "org.scalatest" %% "scalatest" % "3.0.0" % "test", "com.esotericsoftware" % "kryo-shaded" % kryoVersion ), diff --git a/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala b/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala index 06fd5664..ad47205a 100644 --- a/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala +++ b/chill-scala/src/test/scala/com/twitter/chill/KryoSpec.scala @@ -299,7 +299,7 @@ class KryoSpec extends WordSpec with Matchers with BaseProperties { toList(rt(qr)) should equal(qrlist) } "Ranges should be fixed size" in { - val MAX_RANGE_SIZE = 447 // what seems to be needed. + val MAX_RANGE_SIZE = 453 // what seems to be needed. serialize((1 to 10000)).size should be < (MAX_RANGE_SIZE) // some fixed size serialize((1 to 10000 by 2)).size should be < (MAX_RANGE_SIZE) // some fixed size serialize((1 until 10000)).size should be < (MAX_RANGE_SIZE) // some fixed size From 753f03cdb694b28967335596997b938464d67a64 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Sun, 6 Nov 2016 17:15:08 -0800 Subject: [PATCH 11/13] Undo BoxedUnit workaround since it's no longer necessary. --- .../main/scala/com/twitter/chill/ScalaKryoInstantiator.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala index 33bb7d10..9323e563 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala @@ -200,7 +200,7 @@ class AllScalaRegistrar extends IKryoRegistrar { .forSubclass[scala.Enumeration#Value](new EnumerationSerializer) // use the singleton serializer for boxed Unit - val boxedUnit = scala.runtime.BoxedUnit.UNIT + val boxedUnit = scala.Unit.box(()) k.register(boxedUnit.getClass, new SingletonSerializer(boxedUnit)) PackageRegistrar.all()(k) From 074dc8d43b4fd219f7c3f4520300fe32d154e6a6 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Sun, 6 Nov 2016 17:33:03 -0800 Subject: [PATCH 12/13] Create Java8ClosureRegistrar --- .../chill/java/Java8ClosureRegistrar.java | 20 +++++++++++++++++++ .../chill/java/PriorityQueueTest.scala | 9 +-------- .../twitter/chill/ScalaKryoInstantiator.scala | 12 ++--------- 3 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java diff --git a/chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java b/chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java new file mode 100644 index 00000000..bc3f08ba --- /dev/null +++ b/chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java @@ -0,0 +1,20 @@ +package com.twitter.chill.java; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.serializers.ClosureSerializer; +import com.twitter.chill.IKryoRegistrar; + +/** + * Enables Java 8 lambda serialization if running on Java 8; no-op otherwise. + */ +public class Java8ClosureRegistrar implements IKryoRegistrar { + @Override + public void apply(Kryo k) { + try { + Class.forName("java.lang.invoke.SerializedLambda"); + } catch (ClassNotFoundException e) { + return; + } + k.register(ClosureSerializer.class, new ClosureSerializer()); + } +} diff --git a/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala b/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala index 56a8ceb6..d7466d3b 100644 --- a/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala +++ b/chill-java/src/test/scala/com/twitter/chill/java/PriorityQueueTest.scala @@ -21,7 +21,6 @@ import org.scalatest._ import com.esotericsoftware.kryo.Kryo import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Output -import com.esotericsoftware.kryo.serializers.ClosureSerializer import org.objenesis.strategy.StdInstantiatorStrategy @@ -41,13 +40,7 @@ class PriorityQueueSpec extends WordSpec with Matchers { val kryo = new Kryo() kryo.setInstantiatorStrategy(new StdInstantiatorStrategy) PriorityQueueSerializer.registrar()(kryo) - // Enable Java 8 lambda serialization only if we are running on a Java 8 JRE: - try { - Class.forName("java.lang.invoke.SerializedLambda") - kryo.register(classOf[ClosureSerializer.Closure], new ClosureSerializer()) - } catch { - case e: ClassNotFoundException => // not running on Java 8 - } + new Java8ClosureRegistrar()(kryo) val ord = Ordering.fromLessThan[(Int, Int)] { (l, r) => l._1 < r._1 } val q = new java.util.PriorityQueue[(Int, Int)](3, ord) q.add((2, 3)) diff --git a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala index 9323e563..fa1183ef 100644 --- a/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala +++ b/chill-scala/src/main/scala/com/twitter/chill/ScalaKryoInstantiator.scala @@ -43,8 +43,7 @@ import scala.collection.mutable.{ import scala.util.matching.Regex -import com.esotericsoftware.kryo.serializers.ClosureSerializer -import com.twitter.chill.java.PackageRegistrar +import com.twitter.chill.java.{Java8ClosureRegistrar, PackageRegistrar} import _root_.java.io.Serializable import scala.collection.JavaConverters._ @@ -203,13 +202,6 @@ class AllScalaRegistrar extends IKryoRegistrar { val boxedUnit = scala.Unit.box(()) k.register(boxedUnit.getClass, new SingletonSerializer(boxedUnit)) PackageRegistrar.all()(k) - - // Enable Java 8 lambda serialization only if we are running on a Java 8 JRE: - try { - Class.forName("java.lang.invoke.SerializedLambda") - k.register(classOf[ClosureSerializer.Closure], new ClosureSerializer()) - } catch { - case e: ClassNotFoundException => // not running on Java 8 - } + new Java8ClosureRegistrar()(k) } } From b2ec04e6522eaa0babc4c34a865be1af627e77f0 Mon Sep 17 00:00:00 2001 From: Josh Rosen Date: Mon, 7 Nov 2016 09:40:19 -0800 Subject: [PATCH 13/13] Fix Java8ClosureRegistrar; standardize formatting. --- .../chill/java/Java8ClosureRegistrar.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java b/chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java index bc3f08ba..dea99914 100644 --- a/chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java +++ b/chill-java/src/main/java/com/twitter/chill/java/Java8ClosureRegistrar.java @@ -8,13 +8,15 @@ * Enables Java 8 lambda serialization if running on Java 8; no-op otherwise. */ public class Java8ClosureRegistrar implements IKryoRegistrar { - @Override - public void apply(Kryo k) { - try { - Class.forName("java.lang.invoke.SerializedLambda"); - } catch (ClassNotFoundException e) { - return; + + @Override + public void apply(Kryo k) { + try { + Class.forName("java.lang.invoke.SerializedLambda"); + } catch (ClassNotFoundException e) { + // Not running on Java 8. + return; + } + k.register(ClosureSerializer.Closure.class, new ClosureSerializer()); } - k.register(ClosureSerializer.class, new ClosureSerializer()); - } }