summaryrefslogtreecommitdiff
path: root/src/reflect
Commit message (Collapse)AuthorAgeFilesLines
* Eliminate a bunch of -Xlint warnings.Paul Phillips2013-03-122-3/+3
| | | | | | Mostly unused private code, unused imports, and points where an extra pair of parentheses is necessary for scalac to have confidence in our intentions.
* Close after slurping (fixes SI-7244)Som Snytt2013-03-111-1/+4
| | | | | | | | Since slurp by definition is the noise made by the straw when the cup is empty and all milk shake is consumed, we can safely close after slurping. Use case was deleting a test artifact on Windows.
* Merge pull request #2201 from retronym/topic/types-break-down-squashAdriaan Moors2013-03-107-2649/+2732
|\ | | | | Carve up Types.scala
| * Carve up Types.scalaJason Zaugg2013-03-057-2649/+2732
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Step one of a plan to bring some order and thread safety to this neck of the woods. More info: https://gist.github.com/retronym/5081754 https://groups.google.com/forum/?fromgroups=#!topic/scala-internals/MOvmcnbyb_g Note that the sub package is named 'tpe' and not 'Types' to avoid potential problems on case insensitive file systems, given the existing trait 'Types.'
* | Eliminated all forInteractive/forScaladoc uses.Paul Phillips2013-03-093-22/+12
| | | | | | | | | | | | | | | | This is the commit which brings it all together. The booleans forInteractive and forScaladoc are now deprecated and are not inspected for any purpose. All behavioral changes formerly accomplished via tests of those flags are embodied in the globals built specifically for those tasks.
* | Enabling commit for interactive/scaladoc modules.Paul Phillips2013-03-091-7/+15
| | | | | | | | | | | | This is a non-behaviorally-changing setup commit which re-routes bits of code through avenues which can more easily be influenced by subclasses of Global.
| |
| \
| \
| \
| \
| \
*-----. \ Merge 2.10.x into master.Adriaan Moors2013-03-052-6/+16
|\ \ \ \ \ | |_|_|_|/ |/| | | | | | | | | Fix check file for run/t7185.
| | | | * SI-7214 outer check based on dealiased pattern type.Jason Zaugg2013-03-051-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A Typed Pattern (_: T) is more than `.isInstanceOf`: if `T` is a path dependent type, the scrutinee's $outer reference is also compared against the prefix of `T`. The code that synthesises this is split into two places. `needsOuterCheck` determines whether to add this check, based on the type `T`, and the type of the scrutinee. If it gives the go-ahead, `treeCondStrategy.outerCheck` synthesizes the check. The new test case demonstrates the problems caused by the failure to dealias in `needsOuterCheck`: it could either wrongly lead to synthesis of an outer test (which would crash), or wrongly omit the outer test (meaning overly liberal matching.) A simple `dealias` remedies this. `dealiasWiden` is *not* appropriate here; we need to keep hold of singleton types. I'll also note that there is already a little slack between these methods, as commented: > ExplicitOuter replaces `Select(q, outerSym) OBJ_EQ expectedPrefix` > by `Select(q, > outerAccessor(outerSym.owner)) OBJ_EQ expectedPrefix` > if there's an outer accessor, otherwise the condition becomes `true` > TODO: can we improve needsOuterTest so there's always an outerAccessor? So this is probably a fragile area that warrants a careful review with a view to design improvements.
| | | * | SI-7126 Eliminate a source of malformed types.Jason Zaugg2013-02-261-4/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The kind-polymorphic nature of Nothing and Any in concert with type argument inference could lead to types like `T[T]` (where `type T=Any`). Compensatory action is taken later on to recover; see the usages of `TypeRef#typeParamsMatchArgs`. But this these types have a nasty property, they can dealias to themselves. Callers recursing through types who fail to account for this hit an infinite recursion, as was reported in SI-7126. This commit simply dealiases `T` when registering the type bound in `unifySimple`. We should try to weed out additional sources of these types.
| | * | | SI-7185 Avoid NPE in TreeInfo.isExprSafeToInlineJason Zaugg2013-03-021-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We got there typechecking code with a redundant layer of Block. We can't express that in source code, so we test this with manual tree construction and with XML literals, which as reported produce such trees.
| * | | | Merge pull request #2184 from adriaanm/revert-pr-2083Adriaan Moors2013-03-0119-1439/+308
| |\ \ \ \ | | | | | | | | | | | | Revert SI-6240 synchronization for runtime reflection
| | * | | | Revert SI-6240 synchronization for runtime reflectionAdriaan Moors2013-03-0119-1439/+308
| | | |_|/ | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit reverts #2083: - 387b2590db runtime reflection: death from thousand threads - 73d079fb38 removes the assertion in missingHook - f4dd56ca5d synchronizes names - dd148de5a8 synchronizes pendingVolatiles - 4cbb9357c5 synchronizes toolboxes - 07bcb6176a SI-7045 reflection now auto-initializes selfType - bebd62d566 optimizes Scala reflection GIL - 735634f1d6 initializes lazy vals and inner objects in advance - 5b37cfb19a introduces GIL to Scala reflection - 981da8edfc cleans up initialization of runtime reflection - b2c2493b22 reflection no longer uses atPhase and friends - a9dca512d8 synchronizes symbols - 0262941b3c removes the crazy extraneous log - 21d5d3820b moves Symbol#SymbolKind to Symbols
| * | | | Merge pull request #2179 from adriaanm/merge-2.10.1Adriaan Moors2013-03-014-37/+28
| |\ \ \ \ | | |/ / / | |/| | | Merge 2.10.1 into 2.10.x
| | * | | Merge 2.10.1 into 2.10.x.Adriaan Moors2013-02-274-37/+28
| | |\ \ \ | | | |/ / | | |/| / | | | |/
| | | * [nomaster] Revert "SI-6548 reflection now correctly enters jinners"Adriaan Moors2013-02-101-8/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 54a84a36d5b435a787d93ca48d45399136c7e162. This is necessary to maintain binary compatibility with 2.10.0. run/t6989.check had to be updated as it also (indirectly) tested SI-6548 Conflicts: test/files/lib/javac-artifacts.jar.desired.sha1 test/files/run/t6548.check test/files/run/t6548/Test_2.scala
| | | * [nomaster] inline importPrivateWithinFromJavaFlags into SymbolTableAdriaan Moors2013-02-092-24/+15
| | | | | | | | | | | | | | | | | | | | | | | | This reworks 02ed5fb so that we don't change JavaUniverse's super classes. This is necessary to maintain binary compatibility with 2.10.0.
| | | * [nomaster] Revert "cosmetic renamings in runtime reflection"Adriaan Moors2013-02-092-6/+6
| | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 0429f0fd9224499cd8b606490d04b1a8dcffbca8. This is necessary to maintain binary compatibility with 2.10.0.
| * | | Merge pull request #2083 from scalamacros/ticket/6240Adriaan Moors2013-02-2719-308/+1439
| |\ \ \ | | |/ / | |/| | SI-6240 synchronization for runtime reflection
| | * | removes the assertion in missingHookEugene Burmako2013-02-111-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the current synchronization scheme multiple threads can enter the missingHook trying to materialize a package, which hasn't been created. That's fine, because makeScalaPackage, which creates and enters package symbols is synchronized and checks whether the creation is necessary before commencing. Therefore even if makeScalaPackage is called multiple times in rapid succession, the calls will be serialized and all calls except the first one won't do anything.
| | * | synchronizes namesEugene Burmako2013-02-112-27/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously we didn't have all possible name creation facilities covered with locks, so some of them silently misbehaved and caused much grief: http://groups.google.com/group/scala-internals/browse_thread/thread/ec1d3e2c4bcb000a. This patch gets all the name factories under control. Unfortunately it comes at a performance cost, which has to be evaluated.
| | * | synchronizes pendingVolatilesEugene Burmako2013-02-112-4/+2
| | | | | | | | | | | | | | | | | | | | Called from isVolatile, which is called from isStable, which is a part of the public reflection API.
| | * | SI-7045 reflection now auto-initializes selfTypeEugene Burmako2013-02-111-1/+5
| | | | | | | | | | | | | | | | | | | | | | | | selfType joins the happy family of flags, annotations and privateWithin, which automatically trigger initialization, when used within runtime reflection.
| | * | optimizes Scala reflection GILEugene Burmako2013-02-114-64/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | First of all, GIL should only apply to runtime reflection, because noone is going to run toolboxes in multiple threads: a) that's impossible, b/c the compiler isn't thread safe, b) ToolBox api prevents that. Secondly, the only things in symbols which require synchronization are: 1) info/validTo (completers aren't thread-safe), 2) rawInfo and its dependencies (it shares a mutable field with info) 3) non-trivial caches like in typeAsMemberOfLock If you think about it, other things like sourceModule or associatedFile don't need synchronization, because they are either set up when a symbol is created or cloned or when it's completed. The former is obviously safe, while the latter is safe as well, because before acquiring init-dependent state of symbols, the compiler calls `initialize`, which is synchronized. We can say that symbols can be in four possible states: 1) being created, 2) created, but not yet initialized, 3) initializing, 4) initialized. in runtime reflection can undergo is init. #3 is dangerous and needs protection
| | * | initializes lazy vals and inner objects in advanceEugene Burmako2013-02-115-5/+1041
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As discussed at http://groups.google.com/group/scala-internals/browse_thread/thread/97840ba4fd37b52e, `synchronized(this)` employed by lazy val and inner object initialization is an excellent way to deadlock yourself in the foot. Imagine a thread, which grabs a reflection GIL and then calls one of those lazy vals / objects that reflection exposes (e.g. a companion module of an innocently looking SingleType case class). Then imagine another thread, which calls something else in SymbolTable, grabbing symbol table's monitor, and then tries to get a reflection GIL to do something non-trivial. Hello, we've just arrived at a deadlock. Since, as discussed in the aforementioned thread, there's no easy way to change lazy vals / inner objects in reflection to use GIL instead of synchronizing on this, I bit the bullet and manually initialized all things with deferred initialization defined in reflect.runtime.SymbolTable. The list of all things `$lzycompute` has been mined by a simple Python script, then I copy/pasted that list into `JavaUniverse.scala` and went ahead forcing objects and lazy vals mentioned there. Notably, I've been able to force all lazy vals in Definitions.scala. There are some todos left, but I suggest we move forward without securing them, because the 2.10.1-RC1 release date is very close, so we'd better have a 95% solution instead of keeping reflection thread-unsafe. Though here's the list of todo lazy vals for the reference: * BaseTypeSeq.maxDepth * WeakTypeTag.tpe * AnnotationInfo.forcedInfo For each of those lazy vals we need to make sure that their initializers never call back into themselves. Otherwise, there's a danger of a deadlock.
| | * | introduces GIL to Scala reflectionEugene Burmako2013-02-1110-178/+235
| | | | | | | | | | | | | | | | | | | | | | | | | | | | On a serious note, I feel really uncomfortable about having to juggle this slew of locks. Despite that I can't immediately find a deadlock, I'm 100% sure there is one hiding in the shadows. Hence, I'm abandoning all runtime reflection locks in favor of a single per-universe one.
| | * | cleans up initialization of runtime reflectionEugene Burmako2013-02-117-29/+59
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | At first I just tried to remove syntheticCoreClasses from missingHook and put them into the initializer of freshly created mirrors in order to reduce the non-determinism in mutations of the global symbol table. And then it didn't work, crashing on me claiming that AnyRef is missing. Apparently we still need AnyRefClass in missingHook, just because it's impossible to initialize (i.e. unpickle) ScalaPackageClass without it. And then it still didn't work, whining about multiple overloaded defs of some synthetic symbols. That was really tricky, but I figured it out as well by initializing ScalaPackageClass first before forcing any synthetic symbols (see the details in comments).
| | * | reflection no longer uses atPhase and friendsEugene Burmako2013-02-114-28/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Mentioned methods mutate the global `atPhaseStack` variable, which can easily lead to imbalances and, ultimately, to the empty stack error. Luckily for us, there's only one dummy phase, SomePhase, which is used by runtime reflection, so there is absolutely zero need to invoke atPhase in non-compiler reflexive universes. The cleanest solution would be to override `atPhase` for runtime reflection, but it's @inline final, so I didn't want to pay performance penalties for something that's used three times in runtime reflection (during unpickling, in reflection-specific completers and in `Symbol.typeParams/unsafeTypeParams`). Therefore I added overrideable analogues of `atPhase` and `atPhaseNotLaterThan` which are called from the aforementioned code shared between the compiler and runtime reflection. I also had to duplicate the code of `Symbol.XXXtypeParams`, again due to them being very performance-sensitive.
| | * | synchronizes symbolsEugene Burmako2013-02-113-16/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Synchronization via decoration would be neat if it actually worked. Unfortunately, root symbols never got decorated, therefore their children also never got decorated and all the way down to the very turtles. This commit fixes this sad issue by turning root symbols from objects to lazy vals. Yes, this is going to induce a performance penalty, which will hopefully not be high enough to invalidate this cornerstone of our synchronization strategy. Now when root symbols are lazy vals, they can be overridden in the runtime reflexive universe and decorated with SynchronizedSymbol, which makes their children sync and sound.
| | * | removes the crazy extraneous logEugene Burmako2013-02-111-1/+1
| | | |
| | * | moves Symbol#SymbolKind to SymbolsEugene Burmako2013-02-111-1/+2
| | |/ | | | | | | | | | | | | | | | | | | Too bad I didn't notice that before. That will free up quite a bit of memory, removing an extraneous field in every single Symbol, namely the: private volatile Symbols.Symbol.SymbolKind$ SymbolKind$module
* | | Name boolean arguments in src/reflect.Jason Zaugg2013-03-0511-31/+31
| | |
* | | Merge pull request #2197 from paulp/pr/integrate-range-positionsJames Iry2013-03-057-52/+334
|\ \ \ | | | | | | | | Integrate range positions.
| * | | Eliminated separate RangePositions trait.Paul Phillips2013-03-043-294/+259
| | | | | | | | | | | | | | | | | | | | | | | | | | | | One of those eternal headaches which probably sounded better on paper. Even before range positions are the default, there's no reason we can't have the range position code available in all globals enabled via settings, just like everything else.
| * | | Disentangled RangePositions from interactive.Paul Phillips2013-03-047-45/+362
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a stepping stone to having range positions all the time, as well as to modularizing the presentation compiler. It does not enable range positions by default, only places them smoewhere where they can be.
* | | | Cleanup in isHKSubType0.Paul Phillips2013-03-041-38/+35
| | | | | | | | | | | | | | | | | | | | Making the mechanisms more apparent. Renamed to isHKSubType, because there is no other.
* | | | Added methods debuglogResult and devWarningResult.Paul Phillips2013-03-041-0/+10
|/ / / | | | | | | | | | | | | Lowering the barriers to sensible logging - these methods are key in avoiding the "too much trouble" syndrome.
* | | Establishes what's up with widening in asSeenFrom.Paul Phillips2013-03-031-6/+10
| | | | | | | | | | | | Added explanatory comment.
* | | Simplified correspondingTypeArgument based on reviewer feedback.Paul Phillips2013-03-021-15/+10
| | |
* | | Refactors AsSeenFromMap to expose extension point.Paul Phillips2013-03-012-131/+201
| | | | | | | | | | | | | | | | | | | | | The extension point was the initial motivation but I also tried to bring some clarity to the internals. This is a setup commit for scaladoc and interactive modularization, and also will be followed by a fix for abstract types losing their prefixes (SI-6161.)
* | | Reconcile definitions of stability.Paul Phillips2013-02-261-1/+2
| | |
* | | Address some ScaladocrotJason Zaugg2013-02-253-6/+6
| | | | | | | | | | | | | | | | | | - @param tags whose name drifted from the corresponding parameter - Remove or complete a few stray stub comments (@param foo ...) - Use @tparam where appropriate.
* | | Modernize legacy backquotes in comments.Jason Zaugg2013-02-255-19/+19
| | | | | | | | | | | | | | | Was: ``blah'' Now: `blah`
* | | Remove redundant explicit returns.Jason Zaugg2013-02-252-2/+2
| | |
* | | Don't wrap an array just to get its length.Jason Zaugg2013-02-251-1/+1
| | | | | | | | | | | | Use .length directly, avoiding the allocation of the WrappedArray.
* | | Remove redundant 'val' from case class params.Jason Zaugg2013-02-255-6/+6
| | |
* | | More explicit empty paren lists in method calls.Jason Zaugg2013-02-249-28/+30
| | |
* | | Banish needless semicolons.Jason Zaugg2013-02-2412-30/+32
| | |
* | | Merge pull request #2125 from retronym/ticket/7120Paul Phillips2013-02-231-1/+1
|\ \ \ | | | | | | | | SI-7120 Erasure must honor typeref prefixes
| * | | SI-7120 Erasure must honor typeref prefixesJason Zaugg2013-02-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Erasure was discarding these, which led to unnecessarily wide types in quite particular circumstances. This showed up as a double definition error in the reported bug when the bridge method clashed with the erased signature.
* | | | Merge remote-tracking branch 'origin/2.10.x' into masterPaul Phillips2013-02-233-3/+3
|\ \ \ \ | | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * origin/2.10.x: SI-7171 Consider prefix when assessing type finality. please ant with filenames, add comments Fixed error in reflection API docs about linearization order on method baseClasses Shadowed Implict typo (fixes no issue) remove unused imports Conflicts: src/reflect/scala/reflect/internal/Types.scala