summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #4536 from danieldietrich/2.11.xJason Zaugg2015-06-071-4/+5
|\ | | | | Applying inverse index instead of reversing a List
| * Better names for length valuesDaniel Dietrich2015-06-051-5/+5
| |
| * Applying inverse index instead of reversing a ListDaniel Dietrich2015-06-021-1/+2
| |
* | Merge pull request #4519 from lrytz/opt/nullness-2.11Jason Zaugg2015-06-078-22/+1113
|\ \ | | | | | | Nullness Analysis for GenBCode
| * | Fix aliasing / nullness of CHECKCASTLukas Rytz2015-06-042-3/+4
| | |
| * | Compiler option for disabling nullness analysisLukas Rytz2015-06-044-9/+23
| | |
| * | Address review feedbackLukas Rytz2015-05-253-60/+100
| | | | | | | | | | | | | | | | | | Address feedback in #4516 / 57b8da4cd8. Save allocations of NullnessValue - there's only 4 possible instances. Also save tuple allocations in InstructionStackEffect.
| * | Fix wrong result in InstructionStackEffect for ATHROW, RETURNLukas Rytz2015-05-251-3/+3
| | |
| * | Fix wrong indexing in FrameExtensions.peekStackLukas Rytz2015-05-251-1/+1
| | |
| * | Enable nullness analysis in the inlinerLukas Rytz2015-05-252-12/+24
| | | | | | | | | | | | | | | | | | | | | When inlining an instance call, the inliner has to ensure that a NPE is still thrown if the receiver object is null. By using the nullness analysis, we can avoid emitting this code in case the receiver object is known to be not-null.
| * | Nullness AnalysisLukas Rytz2015-05-226-7/+1031
| | | | | | | | | | | | | | | | | | | | | | | | Tracks nullness of values using an ASM analyzer. Tracking nullness requires alias tracking for local variables and stack values. For example, after an instance call, local variables that point to the same object as the receiver are treated not-null.
* | | SI-9343 Xlint less strict on pattern sequencesSom Snytt2015-06-031-2/+4
| |/ |/| | | | | | | | | | | | | | | | | | | | | | | | | -Xlint:stars-align warns only if elementarity > 0, that is, if an extracted sequence is not matched entirely by a pattern sequence, that is, in SLS 8.1.9 on pattern sequences, n = 1 and that pattern is a pattern sequence. This is still only triggered if productarity > 0, that is, a non-pattern-sequence pattern is required for the match. This is a sensitive area because it borders on exhaustiveness checking: it would be preferable to verify just that the match is exhaustive, and to emit this warning only if it is not.
* | Merge pull request #4511 from sriggin/SI-9322Lukas Rytz2015-05-282-3/+3
|\ \ | | | | | | SI-9322 Elapsed times in compiler calculated with System.currentTimeMillis and System.nanoTime
| * | SI-9322 Elapsed times in compiler calculated withSean Riggin2015-05-262-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | System.currentTimeMillis and System.nanoTime Reverted elapsedTime calculation in compiler to use System.currentTimeMillis, consistent with the start time.
* | | Merge pull request #4530 from som-snytt/issue/9332Lukas Rytz2015-05-281-20/+12
|\ \ \ | | | | | | | | SI-9332 Iterator.span exhausts leading iterator
| * | | SI-9332 Iterator.span simplifiedSom Snytt2015-05-271-15/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The queue is only used when the prefix is drained by finish. Since a finished flag has been introduced, distinguish between the drained state and using the underlying (buffered) iterator.
| * | | SI-9332 Iterator.span exhausts leading iteratorSom Snytt2015-05-271-17/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since the leading and trailing iterators returned by span share the underlying iterator, the leading iterator must flag when it is exhausted (when the span predicate fails) since the trailing iterator will advance the underlying iterator. It would also be possible to leave the failing element in the leading lookahead buffer, where it would forever fail the predicate, but that entails evaluating the predicate twice, on both enqueue and dequeue.
* | | | Merge pull request #4531 from kzys/8210-inherited-doc-211Lukas Rytz2015-05-281-3/+3
|\ \ \ \ | | | | | | | | | | SI-8210 Scaladoc: Fix the false negative @inheritdoc warning on accessors
| * | | | SI-8210 Scaladoc: Fix the false negative @inheritdoc warning on accessorsKato Kazuyoshi2015-05-271-3/+3
| |/ / / | | | | | | | | | | | | | | | | This fix is just for the false negative warning. Probably we can skip setters entirely, but I'm not 100% sure.
* / / / SI-9144 Scaladoc: Make generated HTML files POSIX-compatible text filesKato Kazuyoshi2015-05-271-0/+1
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | According POSIX, every text file contains characters organized into zero or more lines [1], and every line must be terminated by "\n" [2]. This change makes Scaladoc's HTML files POSIX-compatible text files. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_397 [2] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206
* | / Fix small grammar error in `Warnings`Simon Schäfer2015-05-221-1/+1
| |/ |/|
* | Merge pull request #4477 from retronym/ticket/9286Adriaan Moors2015-05-211-2/+1
|\ \ | | | | | | SI-9286 Check subclass privates for "same type after erasure"
| * | SI-9286 Check subclass privates for "same type after erasure"Jason Zaugg2015-05-181-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The overriding pairs cursor used to detect erased signature clashes was turning a blind eye to any pair that contained a private method. However, this could lead to a `VerifyError` or `IllegalAccessError`. Checking against javac's behaviour in both directions: ``` % cat sandbox/Test.java public abstract class Test { class C { int foo() { return 0; } } class D extends C { private <A> int foo() { return 1; } } } % javac sandbox/Test.java sandbox/Test.java:3: error: name clash: <A>foo() in Test.D and foo() in Test.C have the same erasure, yet neither overrides the other class D extends C { private <A> int foo() { return 1; } } ^ where A is a type-variable: A extends Object declared in method <A>foo() 1 error ``` ``` % cat sandbox/Test.java public abstract class Test { class C { private int foo() { return 0; } } class D extends C { <A> int foo() { return 1; } } } % javac sandbox/Test.java % ``` This commit only the exludes private symbols from the superclass from the checks by moving the test from `excludes` to `matches`.
* | | Merge pull request #4501 from retronym/topic/indylambda-serializationAdriaan Moors2015-05-219-22/+104
|\ \ \ | |_|/ |/| | [indylambda] Support lambda {de}serialization
| * | [indylambda] Enable caching for lambda deserializationJason Zaugg2015-05-185-8/+42
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We add a static field to each class that defines lambdas that will hold a `ju.Map[String, MethodHandle]` to cache references to the constructors of the classes originally created by `LambdaMetafactory`. The cache is initially null, and created on the first deserialization. In case of a race between two threads deserializing the first lambda hosted by a class, the last one to finish will clobber the one-element cache of the first. This lack of strong guarantees mirrors the current policy in `LambdaDeserializer`. We should consider whether to strengthen the combinaed guarantee here. A useful benchmark would be those of the invokedynamic instruction, which allows multiple threads to call the boostrap method in parallel, but guarantees that if that happens, the results of all but one will be discarded: > If several threads simultaneously execute the bootstrap method for > the same dynamic call site, the Java Virtual Machine must choose > one returned call site object and install it visibly to all threads. We could meet this guarantee easily, albeit excessively, by synchronizing `$deserializeLambda$`. But a more fine grained approach is possible and desirable. A test is included that shows we are able to garbage collect classloaders of classes that have hosted lambda deserialization.
| * | [indylambda] Support lambda {de}serializationJason Zaugg2015-05-178-22/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To support serialization, we use the alternative lambda metafactory that lets us specify that our anonymous functions should extend the marker interface `scala.Serializable`. They will also have a `writeObject` method added that implements the serialization proxy pattern using `j.l.invoke.SerializedLamba`. To support deserialization, we synthesize a `$deserializeLamba$` method in each class with lambdas. This will be called reflectively by `SerializedLambda#readResolve`. This method in turn delegates to `LambdaDeserializer`, currently defined [1] in `scala-java8-compat`, that uses `LambdaMetafactory` to spin up the anonymous class and instantiate it with the deserialized environment. Note: `LambdaDeserializer` can reuses the anonymous class on subsequent deserializations of a given lambda, in the same spirit as an invokedynamic call site only spins up the class on the first time it is run. But first we'll need to host a cache in a static field of each lambda hosting class. This is noted as a TODO and a failing test, and will be updated in the next commit. `LambdaDeserializer` will be moved into our standard library in the 2.12.x branch, where we can introduce dependencies on the Java 8 standard library. The enclosed test cases must be manually run with indylambda enabled. Once we enable indylambda by default on 2.12.x, the test will actually test the new feature. ``` % echo $INDYLAMBDA -Ydelambdafy:method -Ybackend:GenBCode -target:jvm-1.8 -classpath .:scala-java8-compat_2.11-0.5.0-SNAPSHOT.jar % qscala $INDYLAMBDA -e "println((() => 42).getClass)" class Main$$anon$1$$Lambda$1/1183231938 % qscala $INDYLAMBDA -e "assert(classOf[scala.Serializable].isInstance(() => 42))" % qscalac $INDYLAMBDA test/files/run/lambda-serialization.scala && qscala $INDYLAMBDA Test ``` This commit contains a few minor refactorings to the code that generates the invokedynamic instruction to use more meaningful names and to reuse Java signature generation code in ASM rather than the DIY approach. [1] https://github.com/scala/scala-java8-compat/pull/37
* | | Merge pull request #4508 from retronym/topic/uncurry-specializedLukas Rytz2015-05-201-1/+1
|\ \ \ | | | | | | | | Avoid inefficient specialied lambdas w. delambdafy jvm-1.8, GenASM
| * | | Avoid inefficient specialied lambdas w. delambdafy jvm-1.8, GenASMJason Zaugg2015-05-201-1/+1
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A previous change disabled -Ydelambdafy:method for specialized lambdas, as `DelambdafyTransformer` made no attempt to emit the requisite machinery to avoid boxing. This was loosened to allow them under `-target:jvm-1.8`, in the knowledge that `indylambda` would do the right thing. However, this wasn't quite right: indylambda is only supported in `GenBCode`, so we should consider that setting as well.
* / | Document -target:jvm-1.8 in the man pageJason Zaugg2015-05-201-2/+3
|/ / | | | | | | We neglected to do this earlier.
* | Merge pull request #4497 from retronym/topic/indylambda-diy-boxingJason Zaugg2015-05-163-31/+118
|\| | | | | [indylambda] Relieve LambdaMetafactory of boxing duties [ci: last-only]
| * [indylambda] Relieve LambdaMetafactory of boxing dutiesJason Zaugg2015-05-153-31/+118
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `LambdaMetafactory` generates code to perform a limited number of type adaptations when delegating from its implementation of the functional interface method to the lambda target method. These adaptations are: numeric widening, casting, boxing and unboxing. However, the semantics of unboxing numerics in Java differs to Scala: they treat `UNBOX(null)` as cause to raise a `NullPointerException`, Scala (in `BoxesRuntime.unboxTo{Byte,Short,...}`) reinterprets the null as zero. Furthermore, Java has no idea how to adapt between a value class and its wrapped type, nor from a void return to `BoxedUnit`. This commit detects when the lambda target method would require such adaptation. If it does, an extra method, `$anonfun$1$adapted` is created to perform the adaptation, and this is used as the target of the lambda. This obviates the use of `JProcedureN` for `Unit` returning lambdas, we know use `JFunctionN` as the functional interface and bind this to an `$adapted` method that summons the instance of `BoxedUnit` after calling the `void` returning lambda target. The enclosed test cases fail without boxing changes. They don't execute with indylambda enabled under regular partest runs yet, you need to add scala-java8-compat to scala-library and pass the SCALAC_OPTS to partest manually to try this out, as described in https://github.com/scala/scala/pull/4463. Once we enable indylambda by default, however, this test will exercise the code in this patch all the time. It is also possible to run the tests with: ``` % curl https://oss.sonatype.org/content/repositories/releases/org/scala-lang/modules/scala-java8-compat_2.11/0.4.0/scala-java8-compat_2.11-0.4.0.jar > scala-java8-compat_2.11-0.4.0.jar % export INDYLAMBDA="-Ydelambdafy:method -Ybackend:GenBCode -target:jvm-1.8 -classpath .:scala-java8-compat_2.11-0.4.0.jar" qscalac $INDYLAMBDA test/files/run/indylambda-boxing/*.scala && qscala $INDYLAMBDA Test ```
* | Merge pull request #4502 from cneijenhuis/documentation/try-example-deprecatedAdriaan Moors2015-05-151-2/+3
|\ \ | | | | | | Fixed deprecation warning in scaladoc example of Try
| * | Fixed deprecation warning in scaladoc example of TryChristoph Neijenhuis2015-05-151-2/+3
| |/
* | Merge pull request #4499 from lrytz/removeAsmLukas Rytz2015-05-1291-31812/+15
|\ \ | |/ |/| Move ASM out of the repository [ci: last-only]
| * Remove ASM sourcesLukas Rytz2015-05-1184-31804/+0
| |
| * intellij project files for ASM removalLukas Rytz2015-05-117-8/+15
| | | | | | | | ij fix
* | Add @throws annotation to GenSeqLike.updatedCody Allen2015-05-071-0/+1
|/ | | | | | | | Similarly to GenSeqLike.apply, GenSeqLike.updated can throw IndexOutOfBoundsException. For example, the following throws IndexOutOfBoundsException: Vector.empty[String].updated(0, "foo")
* SI-9302 -Xdisable-assertions raises elide levelSom Snytt2015-05-053-7/+6
| | | | | | | | | | Previously, the flag caused any elidable to be elided. This commit simply sets -Xelide-below to ASSERTION + 1. The flag is useful because there's no mnemonic for specifying the magic constant as an option argument. `-Xelide-below ASSERTION` means asserts are enabled.
* SI-9298 Fix erasure of value classes in JavaJason Zaugg2015-05-051-0/+2
| | | | | | | | | | | | Value classes that appear in signatures of Java defined methods should not be erased to the underlying type. Before this change, we'd get a `ClassCastException`, as the Scala call site would unbox the value class despite the fact the Java recipient would expect the boxed representation. I've tested this for primitive and object wrapped types in parameter and return position.
* Merge pull request #4475 from smarter/fix/old-spec-linksLukas Rytz2015-05-042-2/+2
|\ | | | | Remove references to the old PDF version of the specification
| * Remove references to the old PDF version of the specificationGuillaume Martres2015-04-302-2/+2
| |
* | Merge pull request #4486 from mpociecha/ticket/8679Lukas Rytz2015-05-044-5/+20
|\ \ | | | | | | SI-8679 Add support for ScalaLongSignature attribute in scalap
| * | SI-8679 Add support for ScalaLongSignature attribute in scalapMichał Pociecha2015-05-034-5/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | scalap didn't support really big class files. It was returning an empty String for such files. The reason was that there were only ScalaSignatures taken into account. This commit adds support for ScalaLongSignature. We try to get such an attribute when we didn't find ScalaSignature. Also there's added an additional case to the logic retrieving bytes for a signature. Since ScalaLongSignature can contain many parts, we have to merge their byte arrays. Changes are tested by a new partest-based test. These two files are really big, but it was required (t8679.scala is a reduced version of BigScalaClass - an example attached to JIRA). There are also added TODOs with a JIRA ticket: We have three places, where we process Scala signatures. In the future it would be better to reuse some common logic, if it's possible.
* | | Merge pull request #4467 from nafg/patch-1Lukas Rytz2015-05-041-2/+2
|\ \ \ | | | | | | | | Fix scaladoc of Try#failed
| * | | Fix scaladoc of Try#failednafg2015-04-241-2/+2
| | | | | | | | | | | | | | | | | | | | The documentation stated that it returns a Success[Throwable] regardless, either containing the failure or an UnsupportedOperationException. However only Failure#failed returns a success; Success#failed returns a Failure. Also the phrasing of "Completes this `Try`" and "that `Try` failed with" sounds like it was copy-pasted from Future? Trys don't complete, nor fail, they are immutable.
* | | | Merge pull request #4463 from retronym/topic/indylambda-emit-indyLukas Rytz2015-05-047-23/+147
|\ \ \ \ | | | | | | | | | | Use LambdaMetafactory where possible for lambda creation.
| * | | | Small refactorings and additional comments in DelambdafyJason Zaugg2015-04-221-46/+54
| | | | |
| * | | | Update internal documentation in Delambdafy phaseJason Zaugg2015-04-221-5/+12
| | | | |
| * | | | Support specialized method-handle based lambdasJason Zaugg2015-04-213-7/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ``` scala> (x: Int) => {??? : Int} res2: Int => Int = $$Lambda$1371/1961176822@6ed3ccb2 scala> res2(42) scala.NotImplementedError: an implementation is missing at scala.Predef$.$qmark$qmark$qmark(Predef.scala:225) at .$anonfun$1(<console>:8) at $$Lambda$1371/1961176822.apply$mcII$sp(Unknown Source) ... 33 elided scala> (x: Int, y: Long) => {??? : Int} res4: (Int, Long) => Int = $$Lambda$1382/1796047085@6f8e8894 scala> res4(0, 0L) scala.NotImplementedError: an implementation is missing at scala.Predef$.$qmark$qmark$qmark(Predef.scala:225) at .$anonfun$1(<console>:8) at $$Lambda$1382/1796047085.apply$mcIIJ$sp(Unknown Source) ... 33 elided ```
| * | | | SI-8359 Emit invokedynamic for lambdasJason Zaugg2015-04-215-12/+101
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Suitable lambdas are identified in Delambdafy and marked with such with a tree annotation that includes the data needed by the backend to emit an invokedynamic instruction. GenBCode to rewrite instantiation of such anonymous function classes with an invokedynamic instruction. At this stage, I don't plan to merge the support for this into GenASM. Between these points, the lambda capture is represented as an application of a dummy factory symbol: ``` <dummy>(captures...) : FunctionN ``` Demo: ``` % wget http://central.maven.org/maven2/org/scala-lang/modules/scala-java8-compat_2.11/0.3.0/scala-java8-compat_2.11-0.3.0.jar % qscala -classpath scala-java8-compat_2.11-0.3.0.jar -Ydelambdafy:method -target:jvm-1.8 -Ybackend:GenBCode Welcome to Scala version 2.11.6-20150309-144147-c91c978c81 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25). Type in expressions to have them evaluated. Type :help for more information. scala> (() => "").getClass res0: Class[_ <: () => String] = class $$Lambda$1/871790326 ``` I have also corrected an error in a previous commit. The newly added symbol test, `isDelambdafyTarget`, needs to check for the `ARTIFACT` flag, as that is what is added to the method by `Uncurry`.