summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* SI-3452 Correct Java generic signatures for mixins, static forwardersJason Zaugg2014-02-0931-13/+649
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | [Parts of this patch and some of the commentary are from @paulp] This took me so long to figure out I can't even tell you. Partly because there were two different bugs, one which only arose for trait forwarders and one for mirror class forwarders, and every time I'd make one set of tests work another set would start failing. The runtime failures associated with these bugs were fairly well hidden because you usually have to go through java to encounter them: scala doesn't pay that much attention to generic signatures, so they can be wrong and scala might still generate correct code. But java is not so lucky. Bug #1) During mixin composition, classes which extend traits receive forwarders to the implementations. An attempt was made to give these the correct info (in method "cloneBeforeErasure") but it was prone to giving the wrong answer, because: the key attribute which the forwarder must capture is what the underlying method will erase to *where the implementation is*, not how it appears to the class which contains it. That means the signature of the forwarder must be no more precise than the signature of the inherited implementation unless additional measures will be taken. This subtle difference will put on an unsubtle show for you in test run/t3452.scala. trait C[T] trait Search[M] { def search(input: M): C[Int] = null } object StringSearch extends Search[String] { } StringSearch.search("test"); // java // java.lang.NoSuchMethodError: StringSearch.search(Ljava/lang/String;)LC; The principled thing to do here would be to create a pair of methods in the host class: a mixin forwarder with the erased signature `(String)C[Int]`, and a bridge method with the same erased signature as the trait interface facet. But, this turns out to be pretty hard to retrofit onto the current setup of Mixin and Erasure, mostly due to the fact that mixin happens after erasure which has already taken care of bridging. For a future, release, we should try to move all bridging after mixin, and pursue this approach. But for now, what can we do about `LinkageError`s for Java clients? This commit simply checks if the pre-erasure method signature that we generate for the trait forward erases identically to that of the interface method. If so, we can be precise. If not, we emit the erased signature as the generic signature. Bug #2) The same principle is at work, at a different location. During genjvm, objects without declared companion classes are given static forwarders in the corresponding class, e.g. object Foo { def bar = 5 } which creates these classes (taking minor liberties): class Foo$ { static val MODULE$ = new Foo$ ; def bar = 5 } class Foo { static def bar = Foo$.MODULE$.bar } In generating these, genjvm circumvented the usual process whereby one creates a symbol and gives it an info, preferring to target the bytecode directly. However generic signatures are calculated from symbol info (in this case reusing the info from the module class.) Lacking even the attempt which was being made in mixin to "clone before erasure", we would have runtime failures of this kind: abstract class Foo { type T def f(x: T): List[T] = List() } object Bar extends Foo { type T = String } Bar.f(""); // java // java.lang.NoSuchMethodError: Bar.f(Ljava/lang/String;)Lscala/collection/immutable/List; Before/after this commit: < signature f (Ljava/lang/String;)Lscala/collection/immutable/List<Ljava/lang/String;>; --- > signature f (Ljava/lang/Object;)Lscala/collection/immutable/List<Ljava/lang/Object;>; This takes the warning count for compiling collections under `-Ycheck:jvm` from 1521 to 26.
* Merge pull request #3479 from adriaanm/eclipseAdriaan Moors2014-02-061-1/+1
|\ | | | | Fix partest-extras eclipse project dependencies
| * Fix partest-extras eclipse project dependenciesAdriaan Moors2014-02-051-1/+1
| |
* | Merge pull request #3475 from densh/topic/holemap-orderingEugene Burmako2014-02-063-20/+26
|\ \ | | | | | | Fix inconsistent binding in patterns with 10+ holes
| * | Fix inconsistent binding in patterns with 10+ holesDenys Shabalin2014-02-063-21/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously a map that was storing bindings of fresh hole variables with their contents (tree & cardinality) used to be a SortedMap which had issues with inconsistent key ordering: "$fresh$prefix$1" < "$fresh$prefix$2" ... "$fresh$prefix$8" < "$fresh$prefix$9" "$fresh$prefix$9" > "$fresh$prefix$10" This issue is solved by using a LinkedHashMap instead (keys are inserted in the proper order.)
* | | Merge pull request #3474 from soc/topic/osgi-feature-warningsEugene Burmako2014-02-062-3/+5
|\ \ \ | | | | | | | | Fix feature warnings in test.osgi.comp
| * | | Fix feature warnings in test.osgi.compSimon Ochsenreither2014-02-062-3/+5
| | |/ | |/| | | | | | | | | | Reduces the amount of noise from 22 lines down to the actually interesting 5 lines of information.
* | | Merge pull request #3458 from densh/si/8173Eugene Burmako2014-02-0610-87/+164
|\ \ \ | | | | | | | | SI-8173 add support for patterns like init :+ last to quasiquotes
| * | | SI-8173 add support for patterns like init :+ last to quasiquotesDenys Shabalin2014-02-0210-87/+164
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Adds support for patterns like: val q"{ ..$init; $last }" = q"{ a; b; c }" // init == List(q"a", q"b") // last == q"c" Which under the hood get compiled as `:+` patterns: SyntacticBlock(init :+ last)
* | | | Merge pull request #3395 from adriaanm/dist-cleanupJason Zaugg2014-02-0610-101/+2
|\ \ \ \ | | | | | | | | | | Dist cleanup
| * | | | Remove cruft from pom.Adriaan Moors2014-01-219-100/+1
| | | | | | | | | | | | | | | | | | | | | | | | | My understanding is distributionManagement is only needed to configure maven locally for publishing. Since we do that it ant, getting rid of it.
| * | | | Scaladoc jars should go to /api.Adriaan Moors2014-01-211-1/+1
| | | | |
* | | | | Merge pull request #3469 from adriaanm/t8239Jason Zaugg2014-02-061-2/+14
|\ \ \ \ \ | |_|_|/ / |/| | | | don't loop forever in ContextTrees.locateContextTree
| * | | | SI-8239 don't loop forever in ContextTrees.locateContextTreeAdriaan Moors2014-02-051-2/+14
| | | | | | | | | | | | | | | | | | | | Made loop invariant / recursion metric explicit.
* | | | | Merge pull request #3473 from gkossakowski/update-eclipse-filesAdriaan Moors2014-02-051-0/+1
|\ \ \ \ \ | | | | | | | | | | | | Add repl as dependency of test-junit Eclipse project.
| * | | | | Add repl as dependency of test-junit Eclipse project.Grzegorz Kossakowski2014-02-061-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since 8f20fa23dbb5b000f0889132b8c6e2acfff096b3 junit tests depend on repl. We need to reflect that dependency in our Eclipse project files.
* | | | | | Merge pull request #3449 from retronym/topic/opt11Grzegorz Kossakowski2014-02-056-22/+49
|\ \ \ \ \ \ | | | | | | | | | | | | | | Another grab bag of compiler optimizations
| * | | | | | Avoid work in GenICode#run when inactive.Jason Zaugg2014-01-311-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | scalaPrimitives.init() represented 1% of a small (1s) compilation run.
| * | | | | | Optimization in UncurryJason Zaugg2014-01-311-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Only perform HashMap lookup of a tree until after checking more cheaply if it refers to a symbol with by-name parameter type.
| * | | | | | Avoid needless Name creationJason Zaugg2014-01-313-15/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Don't create names just to perform prefix/suffix checks - Don't create names, decode, *and* intern strings in ICode
| * | | | | | Optimize generic signatures utility method `dotCleanup`Jason Zaugg2014-01-311-3/+14
| | | | | | |
* | | | | | | Merge pull request #3457 from retronym/ticket/8228Adriaan Moors2014-02-053-0/+12
|\ \ \ \ \ \ \ | |_|_|/ / / / |/| | | | | | SI-8228 Avoid infinite loop with erroneous code, overloading
| * | | | | | SI-8228 Avoid infinite loop with erroneous code, overloadingJason Zaugg2014-02-023-0/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `isApplicableBasedOnArity` couldn't get of the ferris wheel after as `followApply` kept insisting on another spin. scala> ErrorType nonPrivateMember nme.apply res0: $r.intp.global.Symbol = value apply scala> res0.info res1: $r.intp.global.Type = <error> This commit makes `followApply` consider that an `ErrorType` does not contain an `apply` member. I also considered whether to do a deep check on the type (`isErroneous`), but I can't motivate this with a test. I tend to think we *shouldn't* do that: `List[${ErrorType}]` still has an `apply` member that we should follow, right?
* | | | | | | Merge pull request #3432 from havocp/patch-1Adriaan Moors2014-02-051-2/+38
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | Improve ExecutionContext implicitNotFound and docs
| * | | | | | | Improve ExecutionContext implicitNotFound and docsHavoc Pennington2014-01-311-2/+38
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It is not good practice to import a specific ExecutionContext all over the place; we shouldn't recommend that. People should allow callers to specify the context in most cases and only import the context in some central location in their code. While we are at it, add some more comprehensive docs to ExecutionContext which will hopefully give people enough understanding to make decisions about it.
* | | | | | | | Merge pull request #3453 from Ichoran/issue/4997Adriaan Moors2014-02-052-1/+2
|\ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | SI-4997 deprecate StringLike.linesIterator for StringLike.lines
| * | | | | | | | SI-4997 deprecate StringLike.linesIterator for StringLike.linesRex Kerr2014-01-312-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Deprecated. lines is by far more consistent with the rest of the naming in the library.
* | | | | | | | | Merge pull request #3462 from retronym/ticket/8233Adriaan Moors2014-02-054-2/+49
|\ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | SI-8233 Fix regression in backend with boxed nulls
| * | | | | | | | | SI-8233 Fix regression in backend with boxed nullsJason Zaugg2014-02-054-2/+49
| | |_|_|_|/ / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Regressed in SI-7015 / 1b6661b8. We do need to "unbox" the null (ie, drop a stack from and load a null) in general. The only time we can avoid this is if the tree we are adapting is a `Constant(Literal(null))`. I've added a test for both backends. Only GenICode exhibited the problem.
* | | | | | | | | Merge pull request #3400 from retronym/ticket/8170Adriaan Moors2014-02-053-5/+84
|\ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | SI-8170 Fix regression in TypeRef#transform w. PolyTypes
| * | | | | | | | | SI-8170 Posing outstanding questions as TODOsJason Zaugg2014-02-051-0/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We'll get to the bottom of this as soon as we get one of those Round Tuits.
| * | | | | | | | | SI-8170 Fix regression in TypeRef#transform w. PolyTypesJason Zaugg2014-01-223-5/+68
| | |_|_|_|_|/ / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Regressed in SI-8046 / edc9edb7, by my hand. At the time, I noticed the problem: transform wasn't accounting for the potential Poly-Type-ness of its argument, and this would lead to under-substituted types. The commit comment of edc9edb7 shows an example. But the remedy wasn't the right one. The root problem is that a TypeMap over a PolyType can return one with cloned type parameter symbols, which means we've lose the ability to substitute the type arguments into the result. This commit detects up front whether the type-under-transform is a PolyType with the current TypeRef's type parameters, and just runs the `asSeenFrom` over its result type.
* | | | | | | | | Merge pull request #3465 from pavelpavlov/list-head-valAdriaan Moors2014-02-052-33/+32
|\ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | PR #3233 cleanup
| * | | | | | | | | PR #3233 cleanupPavel Pavlov2014-02-052-33/+32
| | |/ / / / / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - `::.head` became a `val`; excessive accessor removed - SerializationProxy moved to `object List`
* | | | | | | | | Merge pull request #3467 from retronym/ticket/8030-companionDen Shabalin2014-02-051-1/+1
|\ \ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | SI-8030 Restore thread safety to the parser
| * | | | | | | | | SI-8030 Restore thread safety to the parserJason Zaugg2014-02-051-1/+1
|/ / / / / / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In addition to the invariant "parsing doesn’t enter new symbols", which was respected and tested in 760df9843a910d6, we also must ensure that "parsing doesn't call Symbol#info". That happend indirectly if we call `companionModule`. This commit just converts the name of `class TupleN` to a term name, rather than getting the name of its companion. No test is included. This is tested upstream in: https://jenkins.scala-ide.org:8496/jenkins/view/Memory%20Leak%20Tests/job/scalac-memory-leaks-test-2.11.0/
* | | | | | | | | Merge pull request #3466 from pavelpavlov/typo-anoynmousJason Zaugg2014-02-052-4/+4
|\ \ \ \ \ \ \ \ \ | |/ / / / / / / / |/| | | | | | | | Fix typo in compiler's error message: anoynmous => anonymous
| * | | | | | | | Fix typo in compiler's error message: anoynmous => anonymousPavel Pavlov2014-02-052-4/+4
|/ / / / / / / /
* | | | | | | | Merge pull request #3439 from demobox/issue-8215Adriaan Moors2014-02-031-11/+28
|\ \ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | SI-8215: Document IllegalStateExceptions thrown by uninitialized MatchIterator from Regex (review by @heathermiller)
| * | | | | | | | SI-8215 Documenting the possibility of IllegalStateExceptions when using ↵Andrew Phillips2014-02-011-2/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | MatchIterator See https://groups.google.com/forum/#!topic/scala-language/2T2wKVQiyVg
| * | | | | | | | SI-8215 Removing ASCII art class diagram in Scaladoc for RegexAndrew Phillips2014-02-011-9/+1
| | |_|_|/ / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Content Hierarchy contains the same information, properly formatted. See https://groups.google.com/d/msg/scala-language/2T2wKVQiyVg/3-iu19XSTxwJ
* | | | | | | | Merge pull request #3438 from Feodorov/ticket/4014Adriaan Moors2014-02-036-4/+74
|\ \ \ \ \ \ \ \ | |_|_|_|_|_|_|/ |/| | | | | | | SI-4014 Scaladoc omits @author
| * | | | | | | SI-4014 Scaladoc omits @authorKonstantin Fedorov2014-02-026-4/+74
|/ / / / / / /
* | | | | | | Merge pull request #3448 from retronym/topic/opt10Grzegorz Kossakowski2014-02-021-4/+23
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | Optimizations in tail calls
| * | | | | | | Optimization in TailCallsJason Zaugg2014-01-311-2/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Only store the position and reason for a failure to tailcall transform a method if we ever need to report it, ie, if the method was annotated with @tailrec. Saves object hashing and map updates, profiling suggests that this reduces the tailcalls phase from about 2% of compilation time to about 1%. Also, clear the maps eagerly after each compilation unit, rather than letting them accumulate entries for the entire run. Working with smaller maps can't hurt.
| * | | | | | | Optimize tailcall eliminationJason Zaugg2014-01-311-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | From the "if a tree falls" department: don't bother create a finely distinguished error messages about why the transform is inapplicable if the current context doesn't demand it.
| * | | | | | | Don't try to eliminate tail calls in constructors.Jason Zaugg2014-01-311-1/+6
| | |_|_|_|/ / | |/| | | | |
* | | | | | | Merge pull request #3445 from retronym/topic/opt7Grzegorz Kossakowski2014-02-029-26/+81
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | Grab bag of compiler optimizations
| * | | | | | | Optimize use of methodTypeSchemaJason Zaugg2014-02-011-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Cache it, rather than recreating it for each candidate overriden method we encounter. We can't do this eagerly as we trip a cycle in neg/t5093.scala.
| * | | | | | | Optimize lookup of tree/symbol attachment search.Jason Zaugg2014-02-013-5/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use `hasAttachment` rather than `getAttachment.exists`