summaryrefslogtreecommitdiff
path: root/src/reflect
Commit message (Collapse)AuthorAgeFilesLines
* SI-7475 Refactor findMember computation into a classJason Zaugg2014-02-102-4/+240
| | | | | | | | | | | | | | | | | | | This affords us: - a better chance to share code with `findMembers` again - the ability to break up the logic into smaller methods for scrutability and JIT-tability. The cost is the use of the heap rather than the stack for the working area of the computation. But I didn't notice a difference between `locker.lib` and `quick.lib` after this change. I've left the old implementation in place with an assertion to verify identical results. In the next commit, this stepping stone will be removed, and we'll update `findMembers` to share the code. Some problem areas have been highlighted and will be addressed after the refactoring phase is complete.
* Merge pull request #3497 from adriaanm/rebase-3464Adriaan Moors2014-02-101-3/+10
|\ | | | | Make Object#== override Any#==
| * SI-8129 Make Object#== override Any#==Jason Zaugg2014-02-101-3/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | And the same for != If we tried to declare these signatures in non-fictional classes, we would be chastised about collapsing into the "same signature after erasure". This will have an influence of typing, as the typechecking of arguments is sensitive to overloading: if multiple variants are feasible, the argument will be typechecked with a wildcard expected type. So people inspecting the types of the arguments to `==` before this change might have seen an interesting type for `if (true) x else y`, but now the `If` will have type `Any`, as we don't need to calculate the LUB. I've left a TODO to note that we should really make `Any#{==, !=}` non-final and include a final override in `AnyVal`. But I don't think that is particularly urgent.
* | Merge pull request #3502 from retronym/ticket/8258Grzegorz Kossakowski2014-02-101-3/+19
|\ \ | |/ |/| Fix regression for using Scala IDE on scala-library
| * SI-8258 Revert "SI-7335 Remove special case for import of Predef._Jason Zaugg2014-02-101-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 66904556ef34dc81cbb7c09257b013b3ddb76f78. Conflicts: src/reflect/scala/reflect/internal/TreeInfo.scala As evidenced by the highlights of the stack trace in Scala IDE, my assertion in the 66904556e wasn't universally true. The change was only motivated by removing a special case, not in order to fix some other problem. So the revert is the most straight forward course of action for now. I haven't pinned this down with a test outside of Eclipse, and given the lateness of the hour wrt 2.11.0, I'll have to submit without one. 2013-03-10 08:38:04,690 ERROR [main] - org.scala-ide.sdt.core - org.scala-ide.sdt.core - org.scala-ide.sdt.core - 0 - Error during askOption scala.reflect.internal.Symbols$CyclicReference: illegal cyclic reference involving object Predef ... at scala.reflect.internal.Symbols$Symbol.lock(Symbols.scala:482) at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1216) at scala.reflect.internal.Symbols$Symbol.tpe(Symbols.scala:1200) at scala.reflect.internal.Symbols$Symbol.tpeHK(Symbols.scala:1201) at scala.reflect.internal.Types$Type.computeMemberType(Types.scala:784) at scala.reflect.internal.Types$Type.memberType(Types.scala:781) at scala.reflect.internal.TreeGen.mkAttributedSelect(TreeGen.scala:203) ... at scala.reflect.internal.TreeGen.mkAttributedStableRef(TreeGen.scala:162) at scala.tools.nsc.ast.TreeGen.mkWildcardImport(TreeGen.scala:39) at scala.tools.nsc.typechecker.Contexts$Context.makeNewImport(Contexts.scala:308) at scala.tools.nsc.typechecker.Contexts$class.rootContext(Contexts.scala:69) at scala.tools.nsc.Global$$anon$1.rootContext(Global.scala:492) at scala.tools.nsc.typechecker.Contexts$class.rootContext(Contexts.scala:64) at scala.tools.nsc.Global$$anon$1.rootContext(Global.scala:492) at scala.tools.nsc.typechecker.Analyzer$namerFactory$$anon$1.apply(Analyzer.scala:43) at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:463) ... at scala.tools.nsc.Global$Run.compileLate(Global.scala:1681) at scala.tools.nsc.Global$Run.compileLate(Global.scala:1671) at scala.tools.nsc.symtab.SymbolLoaders$SourcefileLoader.doComplete(SymbolLoaders.scala:284) at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.complete(SymbolLoaders.scala:187) at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1229) at scala.reflect.internal.Symbols$Symbol.tpe(Symbols.scala:1200) at scala.reflect.internal.Symbols$Symbol.tpeHK(Symbols.scala:1201) at scala.reflect.internal.Types$Type.computeMemberType(Types.scala:784) at scala.reflect.internal.Types$Type.memberType(Types.scala:781) at scala.reflect.internal.TreeGen.mkAttributedSelect(TreeGen.scala:203) at scala.reflect.internal.TreeGen.mkAttributedRef(TreeGen.scala:124) at scala.reflect.internal.TreeGen.mkAttributedRef(TreeGen.scala:130) at scala.reflect.internal.TreeGen.mkAttributedStableRef(TreeGen.scala:162) at scala.tools.nsc.ast.TreeGen.mkWildcardImport(TreeGen.scala:39) ... at scala.tools.nsc.Global$$anon$1.rootContext(Global.scala:492) at scala.tools.nsc.typechecker.Analyzer$namerFactory$$anon$1.apply(Analyzer.scala:43) at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:463) ... at scala.tools.nsc.Global$Run.compileLate(Global.scala:1671) at scala.tools.nsc.symtab.SymbolLoaders$SourcefileLoader.doComplete(SymbolLoaders.scala:284) at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.complete(SymbolLoaders.scala:187) at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1229) at scala.reflect.internal.Symbols$Symbol.initialize(Symbols.scala:1365) ... at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:153) at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:306) at scala.tools.eclipse.javaelements.ScalaJavaMapper$class.initializeRequiredSymbols(ScalaJavaMapper.scala:29) ... at scala.tools.nsc.util.InterruptReq.execute(InterruptReq.scala:26) at scala.tools.nsc.interactive.Global.pollForWork(Global.scala:340)
* | Merge pull request #3496 from adriaanm/t6169Grzegorz Kossakowski2014-02-101-0/+2
|\ \ | | | | | | SI-6169 TODO: consolidate with fix for SI-1786 (#2518)
| * | SI-6169 TODO: consolidate with fix for SI-1786 (#2518)Adriaan Moors2014-02-091-0/+2
| | |
* | | Merge pull request #3494 from retronym/topic/opt-any-ref-mapGrzegorz Kossakowski2014-02-101-0/+2
|\ \ \ | | | | | | | | Optimization: use AnyRef map for Namer -> Typer tree handoff
| * | | Optimation: use AnyRefMap in GenASM javaName cachesJason Zaugg2014-02-091-0/+2
| | | | | | | | | | | | | | | | These are a hotspot in the backend.
* | | | Merge pull request #3409 from xeno-by/ticket/6411Jason Zaugg2014-02-106-92/+185
|\ \ \ \ | | | | | | | | | | SI-6411 SI-7328 value class fixes for runtime reflection
| * | | | SI-7328 FieldMirrors now support value classesEugene Burmako2014-01-251-41/+66
| | | | |
| * | | | unifies method and constructor handling in JavaMirrorsEugene Burmako2014-01-251-40/+51
| | | | | | | | | | | | | | | | | | | | | | | | | This automatically brings performance fixes and correct handling of values class / by-name params into the constructor land.
| * | | | SI-6411 reflection is now aware of posterasureEugene Burmako2014-01-246-11/+68
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The `transformedType` method, which is used to bring Scala types to Java world, was written in pre-valueclass times. Therefore, this method only called transforms from erasure, uncurry and refChecks. Now runtime reflection becomes aware of posterasure and as a consequence methods, which have value classes in their signatures, can be called without having to wrap them in catch-a-crash clause. Another facet to this fix was the realization that value classes need to be unwrapped, e.g. C(2) needs to be transformed to just 2, when they are used naked in method signatures (i.e. `c` in `def foo(c: C)` needs to be unwrapped, whereas `cs: List[C]`, `cs: C*` and even `cs: Array[C]` do not).
* | | | | Merge pull request #3487 from andy128k/masterAdriaan Moors2014-02-091-1/+1
|\ \ \ \ \ | |_|_|/ / |/| | | | fix typo
| * | | | fix typoAndrey Kutejko2014-02-071-1/+1
| | | | |
* | | | | Merge pull request #3471 from adriaanm/t6169Adriaan Moors2014-02-091-2/+49
|\ \ \ \ \ | | | | | | | | | | | | SI-6169 Refine java wildcard bounds using corresponding tparam
| * | | | | SI-6169 initialize before .typeParams -- just in caseAdriaan Moors2014-02-051-1/+1
| | | | | |
| * | | | | SI-6169 more accurate check for raw java type encoded as existentialAdriaan Moors2014-02-051-1/+7
| | | | | |
| * | | | | SI-6169 Refine java wildcard bounds using corresponding tparamAdriaan Moors2014-02-051-2/+43
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Also fixes part of SI-8197. Necessary complement to SI-1786 (#2518), because we now infer tighter bounds for RHSs to conform to. When opening an existential, Java puts constraints in the typing environment that are derived from the bounds on the type parameters of the existentially quantified type, so let's do the same for existentials over java-defined classes in skolemizeExistential... Example from test case: ``` public class Exist<T extends String> { // java helpfully re-interprets Exist<?> as Exist<? extends String> public Exist<?> foo() { throw new RuntimeException(); } } ``` In Scala syntax, given a java-defined `class C[T <: String]`, the existential type `C[_]` is improved to `C[_ <: String]` before skolemization, which models what Java does (track the bounds as type constraints in the typing environment) (Also tried doing this once during class file parsing or when creating the existential type, but that causes cyclic errors because it happens too early.)
* | | | | | Merge pull request #3484 from retronym/ticket/8237Adriaan Moors2014-02-092-5/+27
|\ \ \ \ \ \ | | | | | | | | | | | | | | SI-8237 Avoid cyclic constraints when inferring hk type args
| * | | | | | SI-8237 Avoid cyclic constraints when inferring hk type argsJason Zaugg2014-02-092-5/+27
| | |/ / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | An `AppliedTypeVars` spawned from `HKTypeVar#applyArgs` (necessarily) shares the same `TypeConstraints`. But, we can have multiple ATVs based on a single HKTV floating around during inference, and they can appear on both sides of type relations. An example of this is traced out in the enclosed test. This commit avoids registering upper/lower bound constraints when this is detected. In the enclosed test, we end up with an empty set of constraints for `?E`, which results in inference of Nothing, which is what we expect. I have also improved the printing of ATVs (to include the args) and sharpened the log message when `solve` leaves type variables instantiated to `NoType`, rather than some other type that doesn't conform to the bounds. Both of these changes helped me to get to the bottom of this ticket. The improved `ATV#toString` shows up in some updated checkfiles. The reported test has quite a checkered history: - in 2.10.0 it worked, but more by good luck than good planning - after the fix for SI-7226 / 221f52757aa6, it started crashing - from 3bd897ba0054f (a merge from 2.10.x just before 2.11.0-M1) we started getting a type inference failure, rather than a crash. "no type parameters for method exists [...] because cyclic instantiation". - It still crashes in `isGround` in 2.10.3.
* | | | | | Merge pull request #3485 from xeno-by/topic/reset-all-attrsJason Zaugg2014-02-095-13/+8
|\ \ \ \ \ \ | |_|_|_|/ / |/| | | | | kills resetAllAttrs
| * | | | | renames resetLocalAttrs to resetAttrsEugene Burmako2014-02-071-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now when resetAllAttrs is gone, we can use a shorter name for the one and only resetLocalAttrs.
| * | | | | further limits discoverability of resetAttrsEugene Burmako2014-02-075-13/+8
| |/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit removes resetAllAttrs from the public reflection API. This method was previously deprecated, but on a second thought that doesn't do it justice. People should be aware that resetAllAttrs is just wrong, and if they have code that uses it, this code should be rewritten immediately without beating around the bush with deprecations. There's a source-compatible way of achieving that (resetLocalAttrs), so that shouldn't bring much trouble. Secondly, resetAllAttrs in compiler internals becomes deprecated. In subsequent commits I'm going to rewrite the only two locations in the compiler that uses it, and then I think we can remove it from the compiler as well.
* | | | | Merge pull request #3391 from xeno-by/ticket/8131Jason Zaugg2014-02-0812-143/+249
|\ \ \ \ \ | | | | | | | | | | | | SI-8131 fixes residual race condition in runtime reflection
| * | | | | turns off the gilSynchronizedIfNotInited optimizationEugene Burmako2014-02-011-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | According to Jason (https://github.com/scala/scala/pull/3391#issuecomment-32904460), this one is still causing trouble, so we have to turn it off until we have time to debug it.
| * | | | | SI-8131 fixes residual race condition in runtime reflectionEugene Burmako2014-01-2110-118/+224
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Apparently some completers can call setInfo while they’re not yet done, which resets the LOCKED flag, and makes anything that uses LOCKED to track completion unreliable. Unfortunately, that’s exactly the mechanism that was used by runtime reflection to elide locking for symbols that are known to be initialized. This commit fixes the problematic lock elision strategy by introducing an explicit communication channel between SynchronizedSymbol’s and their completers. Now instead of trying hard to infer whether it’s already initialized or not, every symbol gets a volatile field that can be queried to provide necessary information.
| * | | | | FromJavaClassCompleter is now flag-agnosticEugene Burmako2014-01-201-8/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A minor evolution of the notion of completion + also a small performance optimization.
| * | | | | Revert "synchronizes pendingVolatiles"Eugene Burmako2014-01-205-18/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 000c18a8fac60065747652368dadcd7850532f3f, because Symbol.isStable is independent from Type.isVolatile since fada1ef6b315326ac0329d9e78951cfc95ad0eb0.
| * | | | | a note about Symbol.typeSignatureEugene Burmako2014-01-201-0/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | No changes to behavior, just documenting internal workings of reflection a bit more thoroughly, one step at a time.
* | | | | | Add support for a more straightforward alternative to import selectorsDenys Shabalin2014-02-074-21/+170
| | | | | |
* | | | | | Use more specific return type for SyntacticFunctionDenys Shabalin2014-02-072-7/+4
| | | | | |
* | | | | | Better comment for SyntacticEmptyTypeTreeDenys Shabalin2014-02-071-3/+6
| | | | | |
* | | | | | Represent tq"" as SyntacticEmptyTypeTree rather than TypeTree()Denys Shabalin2014-02-073-2/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Such representation codifies the fact that type tree that doesn't have embedded syntactic equivalent must have been inferred or otherwise provided by the compiler rather than specified by the end user. Additionally it also ensures that we can still match trees without explicit types (e.g. vals without type) after typechecking. Otherwise the same quote couldn't be used in situations like: val q"val x = 42" = typecheck(q"val x = 42")
* | | | | | Rename EmptyTypTree into SyntacticEmptyTypeTreeDenys Shabalin2014-02-071-11/+7
| |/ / / / |/| | | | | | | | | | | | | | | | | | | | | | | | 1. Change the name as Eugene believes previous name was misleading 2. Remove EmptyTree case as it's not needed any longer
* | | | | Merge pull request #3458 from densh/si/8173Eugene Burmako2014-02-061-25/+26
|\ \ \ \ \ | |_|_|_|/ |/| | | | SI-8173 add support for patterns like init :+ last to quasiquotes
| * | | | SI-8173 add support for patterns like init :+ last to quasiquotesDenys Shabalin2014-02-021-25/+26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 #3449 from retronym/topic/opt11Grzegorz Kossakowski2014-02-052-11/+26
|\ \ \ \ \ | | | | | | | | | | | | Another grab bag of compiler optimizations
| * | | | | Avoid needless Name creationJason Zaugg2014-01-312-11/+26
| |/ / / / | | | | | | | | | | | | | | | | | | | | - Don't create names just to perform prefix/suffix checks - Don't create names, decode, *and* intern strings in ICode
* | | | | Merge pull request #3400 from retronym/ticket/8170Adriaan Moors2014-02-051-5/+32
|\ \ \ \ \ | | | | | | | | | | | | 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-221-5/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* | | | | | 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 #3445 from retronym/topic/opt7Grzegorz Kossakowski2014-02-023-11/+16
|\ \ \ \ \ | | | | | | | | | | | | Grab bag of compiler optimizations
| * | | | | Optimize lookup of tree/symbol attachment search.Jason Zaugg2014-02-011-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | Use `hasAttachment` rather than `getAttachment.exists`
| * | | | | Optimization in InstantiateDependentMapJason Zaugg2014-02-011-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Avoid creating a throwaway array in existentialsNeeded.
| * | | | | Optimize TreeInfo#isMacroApplication.Jason Zaugg2014-01-311-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It's called rather frequently. Tree#symbol is a megamorphic call, which featured in profiles.
| * | | | | Optimize isSelfSuperCallJason Zaugg2014-01-311-7/+7
| | |/ / / | |/| | | | | | | | | | | | | | | | | | | | | | | Avoid the Applied extractor altogether, as that eagerly creates `argss` which we don't need and which is quite expensive.
* / | | | Avoid generic collections operations hot pathsJason Zaugg2014-01-315-19/+50
|/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - 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 #3357 from retronym/ticket/8143Adriaan Moors2014-01-311-1/+1
|\ \ \ \ | | | | | | | | | | SI-8143 Regressions with override checks, private members