summaryrefslogtreecommitdiff
path: root/src/compiler
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #3449 from retronym/topic/opt11Grzegorz Kossakowski2014-02-054-11/+23
|\ | | | | 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-311-4/+4
| | | | | | | | | | - 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-051-0/+1
|\ \ | | | | | | SI-8228 Avoid infinite loop with erroneous code, overloading
| * | SI-8228 Avoid infinite loop with erroneous code, overloadingJason Zaugg2014-02-021-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `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 #3462 from retronym/ticket/8233Adriaan Moors2014-02-051-2/+12
|\ \ \ | | | | | | | | SI-8233 Fix regression in backend with boxed nulls
| * | | SI-8233 Fix regression in backend with boxed nullsJason Zaugg2014-02-051-2/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* | | | Fix typo in compiler's error message: anoynmous => anonymousPavel Pavlov2014-02-051-1/+1
|/ / /
* | | 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-025-15/+19
|\ \ \ | | | | | | | | 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-012-4/+4
| | | | | | | | | | | | | | | | Use `hasAttachment` rather than `getAttachment.exists`
| * | | Implicits: Move shadowing checks after plausibility checksJason Zaugg2014-02-011-2/+2
| | | | | | | | | | | | | | | | | | | | Shadowing is rarer than implausbility; this seems to be the most efficient way to order these filters.
| * | | Optimize typedDefDef: disable some checks post typerJason Zaugg2014-01-311-7/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | isPossibleRefinement reported as 1% of my profile, about half of that was reported from the `EraserTyper`. This commit restricts `checkMethodStructuralCompatible` to the typer phase, and also moves in the feature warning for implicits which was nearby. I've also made a minor optimization to `overriddenSymbol` by avoiding computing the method schema repeatedly.
| * | | Typers#stabilize is a noop in erasure's typer.Jason Zaugg2014-01-312-1/+4
| |/ / | | | | | | | | | Anything we can do to make erasure faster.
* | | Merge pull request #3424 from som-snytt/issue/7322Adriaan Moors2014-02-011-1/+1
|\ \ \ | | | | | | | | SI-7322 Interpolator idents must be encoded
| * | | SI-7322 Interpolator idents must be encodedSom Snytt2014-01-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Otherwise, they are not found. This matters for term names with a differential encoding. Footnote, normally ident() encodes, but INTERPOLATIONID is !isIdent, so that is not used here. Maybe that would be the better improvement.
* | | | Merge pull request #3444 from retronym/topic/opt6Adriaan Moors2014-02-013-7/+7
|\ \ \ \ | | | | | | | | | | Avoid generic collections operations hot paths
| * | | | Avoid generic collections operations hot pathsJason Zaugg2014-01-313-7/+7
| | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Use a specialized version of List#{map, collectFirst} These special case mapping over an empty list and avoid allocating. - Avoid nonEmpty in favor of `ne Nil` I see in the order of 2% speedup. Perhaps more useful is that these methods no longer dominate the YourKit profiles, even though profiler bias due to safepoints at allocation of the ListBuffer might have been overstating their significance.
* | | | Merge pull request #3447 from retronym/topic/opt9Adriaan Moors2014-01-312-15/+25
|\ \ \ \ | | | | | | | | | | Optimize the pickler phase
| * | | | Optimize the pickler phaseJason Zaugg2014-01-312-15/+25
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | - move "erroneous type" diagnostic into a crash recovery handler, rather than running it proactively - move the "unexpanded macros" check into refchecks. Cuts this phase in half, from about 1% of compile time to 0.5%.
* | | | Merge pull request #3425 from retronym/ticket/7700Jason Zaugg2014-01-311-9/+19
|\ \ \ \ | |/ / / |/| | | SI-7700 @unspecialized, Part Deux: Now Working.
| * | | SI-7700 @unspecialized, Part Deux: Now Working.Jason Zaugg2014-01-311-9/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This annotation was introduced to allow us to mark methods within a specialized trait as immune from specialization. In particular, this is desirable for `Function1.{andThen, compose}`. However, it seems we need to check for this in two places in the specialization code base. The feature is now backed with a test.
* | | | Merge pull request #3357 from retronym/ticket/8143Adriaan Moors2014-01-313-9/+11
|\ \ \ \ | |_|_|/ |/| | | SI-8143 Regressions with override checks, private members
| * | | SI-8143 Regressions with override checks, private membersJason Zaugg2014-01-143-9/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | These regressed in e609f1f20b, which excluded all private methods from overriding checks. We should only exclude private[this] members on the low end of a pair, as was done before that commit, and, we must also exclude private members on the high side. Why? Warning: reverse engineered intuition follows. We need to report an error when if a private method in a subclass has matches a less-private method in the super class and report an error, lest the user be fooled into thinking it might be invoked virtually. On the other hand, adding a private method to a super class shouldn't invalidate the choice names of public members in its superclasses. I've removed the test case added by that commit and will lodge a reworked version of it that Paul provided as a new issue. That shows a bug with qualified private + inheritance. In addition, the expectation of `neg/accesses.check` is reverted to its 2.10.3 version, which I believe is correct. When it was changed in e609f1f20b it sprouted a variation, `neg/accesses-2`, which has now changed behaviour. The intent of that test will be captured in the aforementioned issue covering qualified private inheritance.
* | | | Merge pull request #3416 from retronym/topic/any-val-implicitAdriaan Moors2014-01-301-9/+12
|\ \ \ \ | | | | | | | | | | Prohibit views targeting AnyVal
| * | | | Prohibit views targeting AnyValJason Zaugg2014-01-271-9/+12
| | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Library changes in Scala 2.10 mean that we are left with the unfortunate situation of admitting: scala> "": AnyVal res0: AnyVal = We already have explicit checks in place to prevent views targeting `AnyRef`. This commit balances this out by prohibiting `AnyVal`, as well. The enclosed test shows that this case is now prevented. If multiple implicits views are applicable, the ambiguity error is still raised; these check comes right at the end. Maybe that ought to be changed, but I don't think it matters too much. I've also disabled this prohibition under -Xsource:2.10.
* | | | Merge pull request #3374 from densh/si/6844-8076Jason Zaugg2014-01-294-57/+80
|\ \ \ \ | | | | | | | | | | SI-6844 SI-8076 improve handling of function parameters in quasiquotes
| * | | | SI-8076 improve support for implicit argument listDenys Shabalin2014-01-161-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds support for construction and deconstruction of implicit argument list which was originally suggested by @cvogt. 1. Splicing vale into implicit argument list automatically adds implicit flag to them: val x = q"val x: Int" q"def foo(implicit $x)" // <=> q"def foo(implicit x: Int)" 2. One might extract implicit argument list separately from other argument lists: val q”def foo(...$argss)(implicit ..$impl)" = q"def foo(implicit x: Int) // argss is Nil, impl contains valdef for x But this doesn't require you to always extract it separatly: val q”def foo(...$argss)" = q"def foo(implicit x: Int) // argss contains valdef for x
| * | | | SI-6844 restrict splicing in parameter positionDenys Shabalin2014-01-164-56/+75
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously were a bit too permissive on how splicing in function parameter position worked. This made confusing things like possible: val x = TermName(“x”) q”def foo($x)” Now you can either splice trees in that position (ValDefs) or you have to provide type if you splice a name.
* | | | | Merge pull request #3402 from densh/si/7275Eugene Burmako2014-01-294-40/+85
|\ \ \ \ \ | | | | | | | | | | | | SI-7275 allow flattening of blocks with ..$
| * | | | | Addresses feedback from JasonDenys Shabalin2014-01-274-36/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1. Adds tests for new synthetic unit stripping. 2. Marks implementation-specific parts of Holes as private. 3. Trims description of iterated method a bit. 4. Provides a bit more clear wrapper for q interpolator. 5. Refactors SyntacticBlock, adds documentation. 6. Makes q"{ ..$Nil }" return q"" to be consist with extractor.
| * | | | | Reify all blocks as syntactic blocksDenys Shabalin2014-01-241-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previous version of the pattern wasn't precise enough due to the fact that synthetic units are now erased by syntactic block and this could cause incorrect reification for cases like: val x = { val y = 1 } Here syntactic block would extract one element but we still need to reify it through syntactic block endpoint. So we can't filter based on the number of elements extracted but rather filter on type of a tree.
| * | | | | Address pull request feedbackDenys Shabalin2014-01-231-1/+1
| | | | | |
| * | | | | SI-7275 allow flattening of blocks with ..$Denys Shabalin2014-01-231-2/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit extends current splicing rules to allow flattening of trees into other trees. Without such support it is impossible to correctly create vals with patterns and use it in other location as they could expand into multiple-statement blocks: scala> q"val (a, b) = (1, 2)" res0: reflect.runtime.universe.Tree = { <synthetic> <artifact> private[this] val x$1 = scala.Tuple2(1, 2): @scala.unchecked match { case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b) }; val a = x$1._1; val b = x$1._2; () } scala> q"..$res0; println(a + b)" res1: reflect.runtime.universe.Tree = { <synthetic> <artifact> private[this] val x$1 = scala.Tuple2(1, 2): @scala.unchecked match { case scala.Tuple2((a @ _), (b @ _)) => scala.Tuple2(a, b) }; val a = x$1._1; val b = x$1._2; println(a.$plus(b)) }
| * | | | | Refactor reification of high-cardinality holesDenys Shabalin2014-01-231-16/+51
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | New approach makes iterated function much more clear through aggressive code reuse, recursion and large descriptive comment on top of it.
| * | | | | Tag synthetic unit with attachmentDenys Shabalin2014-01-231-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This makes it easy to differentiate unit inserted by a compiler vs unit written by the user. Useful for quasiquotes and pretty printing. Additionally SyntacticBlock extractor is changed to treat EmptyTree as zero-element block.
* | | | | | SI-8182 Avert crash due to type args in patternSom Snytt2014-01-272-3/+9
| |_|_|_|/ |/| | | | | | | | | | | | | | | | | | | Error out type args on binary op after emitting error. Let the parse limp into the whirring blades.
* | | | | Merge pull request #3411 from som-snytt/issue/7919-si-nlJason Zaugg2014-01-251-2/+5
|\ \ \ \ \ | | | | | | | | | | | | Newline after empty string interp
| * | | | | SI-7919 Newline after empty string interpSom Snytt2014-01-241-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Consume the newline non-raw for safe handling after single-line interpolation.
* | | | | | SI-8171 make tq"" an alias for empty type treeDenys Shabalin2014-01-241-1/+6
|/ / / / /
* | | | | Merge pull request #3401 from xeno-by/topic/freshEugene Burmako2014-01-221-6/+22
|\ \ \ \ \ | |/ / / / |/| | | | SI-6879 improves Context.freshName
| * | | | SI-6879 improves Context.freshNameEugene Burmako2014-01-221-6/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of per-compilation unit unique counters, the freshName API now uses a per-Global counter. Fresh names now also contain dollars to exclude clashes with supported user-defined names (the ones without dollar signs). This doesn’t fix the bug, because per-Global counters get created anew every time a new Global is instantiated, and that provides some potential for name clashes even for def macros, but at least it completely excludes clashes in typical situations.
* | | | | an optimization for c.evalEugene Burmako2014-01-221-2/+7
|/ / / / | | | | | | | | | | | | | | | | | | | | People are very frequently using c.eval in order to obtain underlying values of literals. Spinning up a new compiler for that modest purpose is a gross waste of fossil fuels.
* | | | Merge pull request #3392 from xeno-by/topic/untypecheckEugene Burmako2014-01-216-11/+17
|\ \ \ \ | | | | | | | | | | deprecates resetAllAttrs and resetLocalAttrs in favor of the new API