summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* `deserializeLambda` should not use encoded class nameLukas Rytz2015-07-011-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `javaBinaryName` returns the internal name of a class. Also used in BTypesFromsymbols.classBTypeFromSymbol. Weirdly, this was discovered due to a bizarre osgi bnd error: ``` [bnd] # addAll '/Users/luc/scala/scala/build/pack/lib/scala-library.jar' with :, [bnd] # addAll '/Users/luc/scala/scala/build/osgi/scala-library.bnd' with , [bnd] 1 ERRORS [bnd] The default package '.' is not permitted by the Import-Package syntax. [bnd] This can be caused by compile errors in Eclipse because Eclipse creates [bnd] valid class files regardless of compile errors. [bnd] The following package(s) import from the default package [scala.collection.generic, scala.sys.process, scala.collection.parallel.mutable, scala.util, scala.collection.parallel.immutable, scala.reflect, scala.concurrent.impl, scala.util.hashing, scala.collection.parallel, scala.collection.convert, scala.io, scala, scala.collection.concurrent, scala.util.control, scala.beans, scala.concurrent.duration, scala.collection, scala.runtime, scala.math, scala.collection.mutable, scala.concurrent, scala.sys, scala.collection.immutable, scala.ref, scala.util.matching] [bnd] /Users/luc/scala/scala/build/osgi/scala-library.bnd: bnd failed ``` Lukas diagnosed it as a problem of the generated `$deserializeLambda$` function: One example is `scala/App$class`. Its bytecode contains this: ``` private static synthetic $deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object; GETSTATIC scala$divApp$class.$deserializeLambdaCache$ : Ljava/util/Map; [...] ``` so it's a static field read of a top-level class. `$div` should obviously be `/` (which this commit rectifies)
* Java parser: default methods in interfaces are not `DEFERRED`Lukas Rytz2015-07-012-4/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Java parser should not set the `DEFERRED` flag for default methods or static methods in interfaces. Their bytecode doesn't have it either. Also tightens parsing of Java abstract methods to disallow a method body. Here's the log of how Lukas diagnosed this: ``` quick.bin: ... BUILD FAILED /Users/luc/scala/scala/build.xml:69: The following error occurred while executing this line: ... /Users/luc/scala/scala/build-ant-macros.xml:350: Could not create type mk-bin due to java.lang.BootstrapMethodError: call site initialization exception at java.lang.invoke.CallSite.makeSite(CallSite.java:341) at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307) at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297) at scala.sys.BooleanProp$.keyExists(BooleanProp.scala:72) at scala.sys.SystemProperties$.bool(SystemProperties.scala:78) at scala.sys.SystemProperties$.noTraceSupression$lzycompute(SystemProperties.scala:89) at scala.sys.SystemProperties$.noTraceSupression(SystemProperties.scala:89) at scala.util.control.NoStackTrace$.<init>(NoStackTrace.scala:31) at scala.util.control.NoStackTrace$.<clinit>(NoStackTrace.scala) at scala.util.control.NoStackTrace$class.fillInStackTrace(NoStackTrace.scala:22) at scala.util.control.BreakControl.fillInStackTrace(Breaks.scala:94) at java.lang.Throwable.<init>(Throwable.java:250) at scala.util.control.BreakControl.<init>(Breaks.scala:94) at scala.util.control.Breaks.<init>(Breaks.scala:29) at scala.collection.Traversable$.<init>(Traversable.scala:95) at scala.collection.Traversable$.<clinit>(Traversable.scala) at scala.package$.<init>(package.scala:40) at scala.package$.<clinit>(package.scala) at scala.Predef$.<init>(Predef.scala:89) at scala.Predef$.<clinit>(Predef.scala) at scala.tools.ant.ScalaTool.<init>(ScalaTool.scala:58) [...] Caused by: java.lang.invoke.LambdaConversionException: Incorrect number of parameters for static method invokeStatic scala.sys.BooleanProp$.scala$sys$BooleanProp$$$anonfun$2$adapted:(String)Object; 0 captured parameters, 0 functional interface method parameters, 1 implementation parameters at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:193) at java.lang.invoke.LambdaMetafactory.altMetafactory(LambdaMetafactory.java:473) at java.lang.invoke.CallSite.makeSite(CallSite.java:325) ``` [source code](https://github.com/scala/scala/blob/2.11.x/src/library/scala/sys/BooleanProp.scala#L72): ``` s => s == "" || s.equalsIgnoreCase("true") ``` bytecode: ``` INVOKEDYNAMIC $init$()Lscala/compat/java8/JFunction1; [ // handle kind 0x6 : INVOKESTATIC java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; // arguments: ()V, // handle kind 0x6 : INVOKESTATIC scala/sys/BooleanProp$.scala$sys$BooleanProp$$$anonfun$2$adapted(Ljava/lang/String;)Ljava/lang/Object;, (Ljava/lang/String;)Ljava/lang/Object;, 3, 1, Lscala/Serializable;.class, 0 ] CHECKCAST scala/Function1 ``` The mistake seems to be that the Scala compiler incorrectly selects `$init$` ([which is a default method](https://github.com/scala/scala/blob/640ffe7fceb5d573b2c12a7c7da09bfd751036a0/src/library/scala/compat/java8/JFunction1.java#L10)) as the abstract method of `JFunction1`, whereas it should be `apply` (inherited from `Function1`). Since we're doing mixed compilation, this is almost certainly a problem of the Java parser.
* Merge pull request #4585 from ruippeixotog/fix-mutable-treemap-clearSeth Tisue2015-06-303-4/+6
|\ | | | | Fix size update on `mutable.TreeMap#clear()`
| * Fix size update on `mutable.TreeMap#clear()`Rui Gonçalves2015-06-263-4/+6
| | | | | | | | | | | | The previous implementation has a major bug - although `clear()` sets the root node to `null`, the `size` attribute of the `Tree` was not updated. This effectively meant that even after a `map.clear()`, a call to `map.size` would still yield the old size of the map. The scalacheck test suite was updated to contemplate this issue.
* | Update README with required ant version on Java 8Adriaan Moors2015-06-291-1/+1
| |
* | Merge pull request #4592 from xuwei-k/patch-2Adriaan Moors2015-06-291-1/+1
|\ \ | | | | | | fix README. 2.12.x branch require Java 8
| * | fix README. 2.12.x branch require Java 8kenji yoshida2015-06-301-1/+1
|/ /
* | Merge pull request #4584 from lrytz/merge-2.11-to-2.12-june-26Adriaan Moors2015-06-2922-137/+1282
|\ \ | |/ |/| Merge 2.11 to 2.12 june 26
| * Merge commit '5b80736' into merge-2.11-to-2.12-june-26Lukas Rytz2015-06-262-8/+11
| |\
| | * Merge pull request #4582 from SethTisue/contributors-guide-tweaksAdriaan Moors2015-06-251-5/+8
| | |\ | | | | | | | | Contributors guide tweaks
| | | * add note to contributor's guide about branchesSeth Tisue2015-06-251-0/+2
| | | |
| | | * minor tweaks to contributor's guideSeth Tisue2015-06-251-5/+6
| | |/
| * | Merge commit '590436f' into merge-2.11-to-2.12-june-26Lukas Rytz2015-06-260-0/+0
| |\|
| | * Merge pull request #4581 from SethTisue/2.11.8-is-nextSeth Tisue2015-06-242-3/+3
| | |\ | | | | | | | | Bump versions after 2.11.7 release
| | | * Bump versions after 2.11.7 releaseSeth Tisue2015-06-242-3/+3
| | | |
| * | | Merge commit 'bb102e7' into merge-2.11-to-2.12-june-26Lukas Rytz2015-06-2621-132/+1274
|/| | | | |/ /
| * | Merge pull request #4570 from marconilanna/patch-1Seth Tisue2015-06-241-1/+1
| |\ \ | | |/ | |/| Traits mistakenly set as 'Case Classes' subsection
| | * Traits mistakenly set as 'Case Classes' subsectionMarconi Lanna2015-06-211-1/+1
| | | | | | | | | | | | | | | Instead of being its own section, a minor formatting issue causes 'Traits' to be rendered and numbered as a subsection of the section 'Case Classes'. This patch changes the numbering on both 'Traits' and 'Object Definitions' sections.
| * | Merge pull request #4577 from janekdb/2.11.x-typos-j-lSeth Tisue2015-06-245-8/+8
| |\ \ | | | | | | | | Fix 8 typos (j-l)
| | * | Fix 8 typos (j-l)Janek Bogucki2015-06-235-8/+8
| | | |
| * | | Merge pull request #4552 from lrytz/opt/closureInliningJason Zaugg2015-06-2417-126/+1268
| |\ \ \ | | |/ / | |/| | Closure elimination for new backend
| | * | Cast arguments where necessary before rewriting closure invocationsLukas Rytz2015-06-231-15/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The parameter types of a closure invocation can be supertypes of the parameter types in the implementation method. The closure automatically casts arguments to the right type. We need to do the same when rewriting closure invocations. Example: val fun: String => String = l => l val l = List("") fun(l.head) The closure object calls `apply(Object)Object`. The body method takes an argument of type `String`.
| | * | Rewrite closure invocations to the lambda body methodLukas Rytz2015-06-2210-108/+489
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When an indylambda closure is allocated and invoked within the same method, rewrite the invocation to the implementation method. This works for any indylambda / SAM type, not only Scala functions. However, the Scala compiler (under -Xexperimental) currently desugars function literals for non-FunctionN types to an anonymous class during typer. No testing yet, waiting for FunctionN to become SAMs first. The feature requires scala-java8-compat to be on the classpath and a number of compiler flags: -Ydelambdafy:method -Ybackend:GenBCode -Yopt:closure-elimination -target:jvm-1.8 ➜ scala git:(opt/closureInlining) ant -Dscala-java8-compat.package=1 -Dlocker.skip=1 ➜ scala git:(opt/closureInlining) cd sandbox ➜ sandbox git:(opt/closureInlining) cat Fun.java public interface Fun<T> { T apply(T x); } ➜ sandbox git:(opt/closureInlining) javac Fun.java ➜ sandbox git:(opt/closureInlining) cat Test.scala class C { val z = "too" def f = { val kap = "me! me!" val f: Tuple2[String, String] => String = (o => z + kap + o.toString) f(("a", "b")) } def g = { val f: Int => String = x => x.toString f(10) } def h = { val f: Fun[Int] = x => x + 100 // Java SAM, requires -Xexperimental, will create an anonymous class in typer f(10) } def i = { val l = 10l val f: (Long, String) => String = (x, s) => s + l + z + x f(20l, "n") } def j = { val f: Int => Int = x => x + 101 // specialized f(33) } } ➜ sandbox git:(opt/closureInlining) ../build/quick/bin/scalac -target:jvm-1.8 -Yopt:closure-elimination -Ydelambdafy:method -Ybackend:GenBCode -Xexperimental -cp ../build/quick/scala-java8-compat:. Test.scala ➜ sandbox git:(opt/closureInlining) asm -a C.class ➜ sandbox git:(opt/closureInlining) cat C.asm [...] public g()Ljava/lang/String; L0 INVOKEDYNAMIC apply()Lscala/compat/java8/JFunction1; [ // handle kind 0x6 : INVOKESTATIC java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; // arguments: (Ljava/lang/Object;)Ljava/lang/Object;, // handle kind 0x6 : INVOKESTATIC C.C$$$anonfun$2$adapted(Ljava/lang/Object;)Ljava/lang/String;, (Ljava/lang/Object;)Ljava/lang/String;, 3, 1, Lscala/Serializable;.class, 0 ] CHECKCAST scala/Function1 L1 ASTORE 1 L2 ALOAD 1 BIPUSH 10 INVOKESTATIC scala/runtime/BoxesRunTime.boxToInteger (I)Ljava/lang/Integer; ASTORE 2 POP ALOAD 2 INVOKESTATIC C.C$$$anonfun$2$adapted (Ljava/lang/Object;)Ljava/lang/String; CHECKCAST java/lang/String L3 ARETURN [...]
| | * | Producers / Consumers AnalysisLukas Rytz2015-06-227-18/+724
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ASM has a built-in `SourceValue` analysis which computes for each value a set of instructions that may possibly have constructed it. The ProdConsAnalyzer class provides additional queries over the result of the SourceValue analysis: - consumers of values - tracking producers / consumers through copying operations (load, store, etc) A fix to (and therefore a new version of) ASM was required. See here: https://github.com/scala/scala-asm/commit/94106a5472
* | | | Merge pull request #4580 from lrytz/defaultsLukas Rytz2015-06-2623-203/+153
|\ \ \ \ | | | | | | | | | | Default to delambdafy:method and backend:GenBCode
| * | | | SI-6613 fixed in GenBCodeLukas Rytz2015-06-265-1/+2
| | | | | | | | | | | | | | | | | | | | It was fixed in GenASM in 44807a7852.
| * | | | Default to delambdafy:method and backend:GenBCodeLukas Rytz2015-06-2626-202/+151
|/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Switch the defaults of `-Ydelambdafy` and `-Ybackend`. Rewrite t6288b-jump-position test - no more icode Don't crash GenBCode beyond JVM code size limits A similar patch is in GenASM, see 3fa2c97 Fix check files for GenBCode / delambdafy:method defaults Force copy propagation test to ASM, see SI-9364 Force inline-ex-handlers test to GenASM, see SI-9364 Move t6613 test to pending - still broken in GenBCode Adding a `flags` file with `-Ybackend:GenASM` doesn't seem to have the desired effect. SI-6613 is re-opened. Force a few tests to GenASM, see SI-9364
* | | | Merge pull request #4460 from som-snytt/topic/javap-decomJason Zaugg2015-06-2611-583/+132
|\ \ \ \ | | | | | | | | | | SI-9277 Downgrade marginal javap features
| * | | | SI-9277 Downgrade marginal javap featuresSom Snytt2015-06-2511-583/+132
| | | | | | | | | | | | | | | | | | | | Drop Java 6 support, -fun, -app, and -raw options.
* | | | | Merge pull request #4504 from ruippeixotog/mutable-treemapAdriaan Moors2015-06-257-3/+1129
|\ \ \ \ \ | | | | | | | | | | | | SI-4147 Add an implementation of `mutable.TreeMap`
| * | | | | SI-4147 Add an implementation of `mutable.TreeMap`Rui Gonçalves2015-05-307-3/+1129
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit contains an implementation of a mutable red-black tree with focus on performance. It also contains a new `mutable.TreeMap` Scala collection that is backed by the aforementioned tree. The common generic factories and traits related to mutable sorted maps didn't exist yet, so this commit also adds them. Regarding performance, `TreeMap` overrides (from `MapLike` and `SortedMapLike`) all of the most common methods for maps and also those whose default implementations are asymptotically worse than direct red-black tree algorithms (e.g. `last`, `clear`). The `rangeImpl` method of `TreeMap` returns an instance of `TreeMapView`, an inner class of `TreeMap`. This view is backed by the same `RedBlackTree.Tree` instance, and therefore changes to the original map are reflected in the view and vice-versa. The semantics of mutating a view by adding and removing keys outside the view's range are the same of the current `mutable.TreeSet`. A bit less focus was given on the performance of views - in particular, getting the `size` of a `TreeMapView` is O(n) on the number of elements inside the view bounds. That can be improved in the future. In a future commit, `mutable.TreeSet` can be changed to be backed by this red-black tree implementation.
* | | | | | Merge pull request #4514 from martijnhoekstra/patch-2Adriaan Moors2015-06-252-29/+64
|\ \ \ \ \ \ | |_|/ / / / |/| | | | | Documentation for split [ci: last-only]
| * | | | | StringLike.split fixed for surrogates and docmartijnhoekstra2015-05-282-29/+64
| |/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | Reverts to calling String.split(re: String), but change escape to always put us on the JDK7 fast-path if possible, which is for everything but Chars representing surrogate codeunits
* | | | | Merge pull request #4578 from retronym/merge/2.11.x-to-2.12.x-20150624Adriaan Moors2015-06-24242-1645/+3885
|\ \ \ \ \ | | | | | | | | | | | | Merge 2.11.x to 2.12.x
| * \ \ \ \ Merge branch '2.11.x' into merge/2.11.x-to-2.12.x-20150624Jason Zaugg2015-06-24242-1645/+3885
| |\ \ \ \ \ | | |/ / / / | |/| / / / | | |/ / /
| | * | | Merge pull request #4574 from janekdb/2.11.x-typos-g-iJason Zaugg2015-06-2325-25/+25
| | |\ \ \ | | | | | | | | | | | | Fix 25 typos (g-i)
| | | * | | Fix 25 typos (g-i)Janek Bogucki2015-06-2225-25/+25
| | | |/ /
| | * | | Merge pull request #4564 from som-snytt/issue/promptv2.11.7Adriaan Moors2015-06-2230-268/+315
| | |\ \ \ | | | | | | | | | | | | SI-9206 Fix REPL code indentation
| | | * | | SI-9206 Local refactor to save eyesightSom Snytt2015-06-212-42/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We talk about bit rot but not about how dust accumulates on code that hasn't been swept since the last time the furniture was moved around.
| | | * | | SI-9206 Accept paste with custom promptSom Snytt2015-06-214-24/+41
| | | | | | | | | | | | | | | | | | | | | | | | But sans test.
| | | * | | SI-9206 Verbose REPL prompt for info modeSom Snytt2015-06-191-6/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Only for exactly `-Dscala.repl.info`, include the complete version number string in the REPL prompt. One could imagine this is the mode for posting snippets to stackoverflow.
| | | * | | SI-9206 Fix REPL code indentationSom Snytt2015-06-1927-200/+223
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To make code in error messages line up with the original line of code, templated code is indented by the width of the prompt. Use the raw prompt (without ANSI escapes or newlines) to determine the indentation. Also, indent only once per line.
| | | * | | SI-9206 REPL prompt is more easily configuredSom Snytt2015-06-192-12/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The scala shell prompt can be provided as either a system property or in compiler.properties. The prompt string is taken as a format string with one argument that is the version string. ``` $ scala -Dscala.repl.prompt="%nScala %s> " Welcome to Scala version 2.11.7-20150616-093756-43a56fb5a1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45). Type in expressions to have them evaluated. Type :help for more information. Scala 2.11.7-20150616-093756-43a56fb5a1> 42 res0: Int = 42 Scala 2.11.7-20150616-093756-43a56fb5a1> :quit ```
| | | * | | SI-9206 BooleanProp if set and not untrueSom Snytt2015-06-181-3/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, handy `sys.BooleanProp.keyExists` ignored the property value. While trying not to make any real estate puns, this commit will let it go false if a value is supplied that is not true in the usual Java sense. But what is truth? Allows `scala -Dscala.color=off`, for example.
| | * | | | Merge pull request #4572 from soc/topic/spec-historyAdriaan Moors2015-06-222-132/+154
| | |\ \ \ \ | | | | | | | | | | | | | | Spec: Add lost references, cleanup
| | | * | | | Spec: Add lost references, cleanupSimon Ochsenreither2015-06-222-132/+154
| | | | |_|/ | | | |/| |
| | * | | | Merge pull request #4566 from lrytz/t9359Adriaan Moors2015-06-2215-66/+175
| | |\ \ \ \ | | | | | | | | | | | | | | SI-9359 Fix InnerClass entry flags for nested Java enums
| | | * | | | Fix spurious test failure under -Ybackend:GenBCodeLukas Rytz2015-06-204-10/+6
| | | | | | |
| | | * | | | SI-9359 Fix InnerClass entry flags for nested Java enumsLukas Rytz2015-06-1911-56/+169
| | | | |/ / | | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The access flags in InnerClass entries for nested Java enums were basically completely off. A first step is to use the recently introduced backend method `javaClassfileFlags`, which is now moved to BCodeAsmCommon. See its doc for an explanation. Then the flags of the enum class symbol were off. An enum is - final if none of its values has a class body - abstract if it has an abstract method (https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9) When using the ClassfileParser: - ENUM was never added. I guess that's just an oversight. - ABSTRACT (together with SEALED) was always added. This is to enable exhaustiveness checking, see 3f7b8b5. This is a hack and we have to go through the class members in the backend to find out if the enum actually has the `ACC_ABSTRACT` flag or not. When using the JavaParser: - FINAL was never added. - ABSTRACT was never added. This commit fixes all of the above and tests cases (Java enum read from the classfile and from source).
| | * | | | Merge pull request #4573 from backuitist/ticket/9253Seth Tisue2015-06-221-1/+1
| | |\ \ \ \ | | | |_|_|/ | | |/| | | SI-9253 avoid IndexOutOfBoundsException in TypeMaps.correspondingTypeArgument