| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|\ \ \ \
| | | | |
| | | | | |
SI-7299 Improve error message for eta-expanding 23+ param method
|
| | |_|/
| |/| |
| | | |
| | | | |
Before, we got `error: missing arguments for method f`.
|
|\ \ \ \
| | | | |
| | | | | |
Read version 51 (JDK 7) class files.
|
| | |/ /
| |/| |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
This commit makes the ClassFileReader/ICodeReader parse class files
from JDK 7 (class file version 51). It does that by skipping over
the method handle related entries in the constant pool and by doing
some dummy processing on invoke dynamic instructions. The inliner
is updated to not try to inline a method with an invoke dynamic
instruction. A place holder INVOKE_DYNAMIC instruction is added to ICode
but it is designed to create an error if there's ever any attempt to
analyze it. Because the inliner is the only phase that ever tries
to analyze ICode instructions not generated from Scala source and
because Scala source will never emit an INVOKE_DYNAMIC, the place
holder INVOKE_DYNAMIC should never cause any errors.
A test is included that generates a class file with INVOKE_DYNAMIC
and then compiles Scala code that depends on it.
|
|\ \ \ \
| | | | |
| | | | | |
SI-6580 Scaladoc: Should not close void elements
|
| | |/ /
| |/| |
| | | |
| | | |
| | | |
| | | |
| | | | |
Because it will generate a useless element like "</img>".
To made matters worse, Scaladoc used to generate the element with
attributes (like </img src="...">). That's why we had SI-6580.
|
|\ \ \ \
| |/ / /
|/| | | |
SI-6210 Test case for already-fixed pattern matcher bug
|
| | | |
| | | |
| | | |
| | | | |
The fix arrived in SI-6022 / #1100 / 2.10.0-M7.
|
|\ \ \ \
| | | | |
| | | | | |
Build cleanup 2.10
|
| |\| | |
| | | | |
| | | | |
| | | | |
| | | | | |
Conflicts:
build.xml
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
Reduced copy/pasting to the best of my antabilities.
The next person to duplicate anything without written
permission will be sentenced to a week in xmhell.
While I was at it, made sure that layering is respected.
The quick phase exclusively uses the locker compiler for building.
The jar task will fail when trying to create an empty jar.
Replaced the crazy if/unless/depends constructs by if/then/else.
Version suffix computation should now be comprehensible.
I threw in some validation to make sure the various suffixes are consistent.
Also, no more init/pre-foo tasks unless absolutely necessary.
Introduced a couple of macros to capture the essence of staged compilation.
Notes:
- remove lib.extra, standardize on aux.libs
- collapse *.javac.path and *.build.path
- rename starr.classpath to starr.compiler.path
- only repl needs jline, locker.compiler.path = locker.comp.build.path + forkjoin
- more uniform build.paths (compiler = reflect + library)
- uniformity means slightly bigger classpaths
(e.g. forkjoin is only used in library, but inherited by compiler)
- pruned: some spurious dependencies removed
- compilerpathref = compiler build path
- silence test.osgi, by hook or by crook
- centralized clean tasks
- reduce duplication in property usage
- fix pack.xml to pack scaladoc/partest instead of scaladoc/scala-partest
- TODO: -XDignore.symbol.file necessary for library? only needed for forkjoin?
- document usage from jenkins, fix typo: partest.scalac*_*opts
New targets:
- quick-opt
- strap-opt
- test.bc
- test.osgi
- test.osgi.comp
- test.osgi.init
- test.stability-opt
Removed/replaced targets:
- asm.clean asm.lib asm.start
- bc.run
- dist.latest dist.latest.unix dist.latest.win dist.start
- docs.all docs.manmaker docs.pre-comp docs.pre-continuations-plugin
- docs.pre-jline docs.pre-lib docs.pre-man docs.pre-partest docs.pre-scalap
- forkjoin.clean forkjoin.lib forkjoin.pack forkjoin.start
- graph.clean
- init.build.nopatch.release init.build.patch.release init.build.release
- init.build.snapshot init.build.suffix.done init.extra.tasks
- init.fail.bad.jdk init.hasbuildnum init.hasmavensuffix init.jars
- init.jars.check init.maven.jars init.maven.tasks init.osgi.suffix
- init.osgi.suffix.final init.osgi.suffix.snapshot init.testjava6
- init.version.done init.version.git init.version.release init.version.snapshot
- init.warn.jdk7 locker.pre-comp locker.pre-lib locker.pre-reflect
- locker.unlock.comp locker.unlock.lib locker.unlock.pre-comp
- locker.unlock.pre-lib locker.unlock.pre-reflect locker.unlock.reflect
- osgi.clean osgi.test osgi.test.comp osgi.test.init
- pack.clean pack.pre-bin pack.pre-comp pack.pre-lib pack.pre-partest
- pack.pre-plugins pack.pre-reflect pack.pre-scalap pack.start
- palo.comp palo.lib palo.pre-bin palo.pre-comp palo.pre-lib palo.pre-reflect
- palo.reflect palo.start quick.pre-bin
- quick.pre-comp quick.pre-interactive quick.pre-lib quick.pre-partest
- quick.pre-plugins quick.pre-reflect quick.pre-repl quick.pre-scalacheck
- quick.pre-scaladoc quick.pre-scalap
- sbt.clean sbt.compile sbt.done sbt.libs sbt.start
- starr.clean
- strap.clean strap.pre-comp strap.pre-lib strap.pre-reflect strap.start
- test.debug test.pre-run
|
|\ \ \ \ \
| |_|/ / /
|/| | | | |
SI-7251, compiler crash with $.
|
| | |/ /
| |/| |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
We don't need to assert our way out of tight spots, we can issue
an error. Or so I once thought.
It turns out lots of assertions have been disappearing before
being heard thanks to "case t: Throwable". Under such conditions,
a failed assertion is a no-op, but an error is an error.
The crash associated with SI-7251 is best avoided by removing the
assertion, which allows an error to be issued in the normal course
of events.
In the course of trying to figure out the above, I cleaned up
ClassfileParser somewhat.
|
|\ \ \ \
| |_|_|/
|/| | | |
SI-7253: respect binary compatibility constraints
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
From the JLS one can prove that moving a method to a superclass is a binary
compatible change, both forward and backward. That's because when compiling a
method call `c.foo()`, where c: C, the output descriptor *must* refer to `C` and
not to the class where `foo()` is actually defined.
This patch just ensures that, and adds a test comparing generated descriptors
against the Javac output.
The sample code is from Paul Philipps, the fix and the bytecode comparison code
from me.
From 2006 (9954eafffd5e60676238369ab0ed5797c92b4a7b, a fix for bug 455 in the
old bug tracker
http://www.scala-lang.org/sites/default/files/aladdin/displayItem.do%3Fid=455.html)
until 2.9, Scalac has followed this rule "often" (that is, when C is *not* an
interface).
This behavior was wrong, but the bug was hard to trigger. AFAICS, this can
create problems only when moving a method to a super interface in a library and
expecting forward binary compatibility - that is, compiling some Scala client
code against the new version of the library, and trying to run this code against
the old version of the library. This change grows an interface, so it is valid
only if clients are supposed to *not* implement the library. Apparently, this
is so rare that nobody noticed.
Since 2.10 (0bea2ab5f6b211a83bbf14ea46fe57b8163c6334), Scalac follows this rule
*only* when C is an interface (I assume by oversight, since the main change was
an accessibility check), so the bug was finally triggered.
The new code will have to emit INVOKEINTERFACE instead of INVOKEVIRTUAL a bit
more often, compared to 2.9 (but not to 2.10). I don't know whether
INVOKEINTERFACE is noticeably slower (it shouldn't be); but this is the safest
fix since this behavior is mandated by the JLS.
If somebody disagrees and believes the 2.9 is significantly faster, IMHO he
should send a separate pull request (although ProGuard is probably a better
place for the change).
|
|\ \ \
| | | |
| | | | |
SI-5699 correct java parser for annotation defs.
|
| |/ /
| | |
| | |
| | |
| | | |
Correct java source parser not to insert a constructor with the type
of its value method.
|
|\ \ \
| | | |
| | | | |
SI-7242 Fix crash when inner object mixes in its companion
|
| | |/
| |/|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Given:
class C {
trait T { C.this } // C$T$$$outer$ : C
object T extends T { C.this } // C$T$$$outer$ : C.this.type
}
object T ended up with a definitions for both of the accessors.
These cannot co-exist, as they have the same erased type. A crash
ensued almost immediately in explitouter.
Fortunately, the solution is straightforward: we can just omit
the mixin outer accessor altogether, the objects own outer accessor
is compatible with it.
scala> :javap C.T
Compiled from "<console>"
public interface C$T{
public abstract C C$T$$$outer();
}
scala> :javap C.T$
Compiled from "<console>"
public class C$T$ extends java.lang.Object implements C$T{
public C C$T$$$outer();
public C$T$(C);
}
I also added an assertion to give a better error message in
case we find ourselves here again.
Also includes tests from SI-3994, which I'll mark as a duplicate.
|
|\ \ \
| | | |
| | | | |
SI-7258 Don't assume order of reflection values in t6223
|
| | |/
| |/|
| | |
| | |
| | |
| | |
| | |
| | | |
test/files/run/t6223's check file expects a specific
ordering of the reflected values. The ordering is not
guaranteed by the runtime/reflection API and can change.
Therefore, sort the values before comparing them.
|
|\ \ \
| | | |
| | | | |
SI-7259 Fix detection of Java defined Selects
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The fix for SI-3120, 3ff7743, introduced a fallback within
`typedSelect` that accounted for the ambiguity of a Java
selection syntax. Does `A.B` refer to a member of the type `A`
or of the companion object `A`? (The companion object here is a
fiction used by scalac to group the static members of a Java
class.)
The fallback in `typedSelect` was predicated on
`context.owner.enclosingTopLevelClass.isJavaDefined`.
However, this was incorrectly including Select-s in top-level
annotations in Scala files, which are owned by the enclosing
package class, which is considered to be Java defined. This
led to nonsensical error messages ("type scala not found.")
Instead, this commit checks the compilation unit of the context,
which is more direct and correct. (As I learned recently,
`currentUnit.isJavaDefined` would *not* be correct, as a lazy type
might complete a Java signature while compiling some other compilation
unit!)
A bonus post factum test case is included for SI-3120.
|
|\ \ \
| | | |
| | | | |
SI-7249 Reign in overzealous Function0 optimization.
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The fix for SI-1247 went too far, and could result in
premature evaluation of the expression that yields the
Function0.
This commit checks that said expression is safe to inline.
If not, a wrapper `() => ....` is still required.
The optimization is still enabled in sitations like the
original test case, run/t1247.scala.
|
|\ \ \
| | | |
| | | | |
SI-6921 SI-7239 Tread lightly during exploratory typing
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
When deciding whether an Assign is a named argument or
and assignment expression, or when looking at arguments
that the current selection is applied to in order to
evaluate candidate implicit views, we risk polluting
the tree by setting error types. This happens even
if we are in 'silent' mode; that mode does silence the
error report, but not the side effect on the tree.
This commit adds strategic `duplicate` calls to
address the problem symptomatically.
Duplicating trees and retyping in general reach into
the domain of bugs umbrella-ed under SI-5464, but in
these places we should be safe because the tree is in
the argument position, not somewhere where, for example,
a case class-es synthetic companion object might be
twice entered into the same scope.
Longer term, we'd like to make type checking side effect
free, so we wouldn't need to play whack-a-mole like this.
That idea is tracked under SI-7176.
|
|\ \ \
| |/ /
|/| | |
SI-7232 Fix Java import vs defn. binding precendence
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Java Spec:
> A single-type-import declaration d in a compilation unit c
> of package p that imports a type named n shadows, throughout
> c, the declarations of:
> - any top level type named n declared in another compilation
> unit of p
> - any type named n imported by a type-import-on-demand
> declaration in c
> - any type named n imported by a static-import-on-demand
> declaration in c
Scala Spec:
> Bindings of different kinds have a precedence defined on them:
> 1. Definitions and declarations that are local, inherited, or made
> available by a package clause in the same compilation unit where
> the definition occurs have highest precedence.
> 2. Explicit imports have next highest precedence.
|
|\ \ \
| | | |
| | | | |
SI-7240 fixes language feature lookup
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
As I discovered today, Definitions.getMember have a fallback clause,
which accounts for the phases which have inner classes flattened.
This fallback uses nme.flattenedName to compute a flattened name, but
unfortunately nme.flattenedName produces a TermName, not a TypeName,
which means that the fallback will commence search in a wrong namespace
with predictable results.
The commit also changes another usage of nme.flattenedName in a type name
context. That one was correctly converting a TermName result to TypeName,
so this is not a bugfix, but just a refactoring for the sake of being
consistent.
|
|\ \ \ \
| | | | |
| | | | | |
SI-7233 Account for aliased imports in EtaExpansion / Erasure
|
| | | | |
| | | | |
| | | | |
| | | | | |
When we discard the fiction of `scala.Any`.
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
Buggy:
treeCopy.Select(sel, sel.qual, sel.name) setSymbol null
Select(sel, sel.qual, sel.name)
Okay:
treeCopy.Select(sel, sel.qual, sel.name)
Select(sel, sel.qual, sel.symbol.name) // but doesn't copyAttrs!
It is an easy mistake to make, I've found one more occurance:
def foo(a: Any) = { import a.{toString => toS}; toS }
error: uncaught exception during compilation: scala.reflect.internal.FatalError
scala.reflect.internal.FatalError: class Object does not have a member toS
at scala.reflect.internal.Definitions$DefinitionsClass.scala$reflect$internal$Definitions$DefinitionsClass$$fatalMissingSymbol(Definitions.scala:1028)
A followup commit will address that problem.
|
|\ \ \ \ \
| | | | | |
| | | | | | |
SI-6725 `f` interpolator now supports %n tokens
|
| | |/ / /
| |/| | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
Currently the `f` interpolator supports format specifiers which
specify conversions for formatted arguments. However Java formatting
is not limited to argument-related conversions as explained in:
http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html#detail.
Conversions which don't correspond to any arguments are `%` (used to
emit verbatim `'%'` characters) and `n` (used to emit platform-specific
line separators). Of those only the former is supported, and this patch
fixes the oversight.
|
|\ \ \ \ \
| |_|_|_|/
|/| | | | |
SI-7132 - don't discard Unit type in interpreter
|
| | | | | |
|
|\ \ \ \ \
| | | | | |
| | | | | | |
SI-7328 Bail out of names/defaults when args are error typed
|
| | |_|_|/
| |/| | |
| | | | |
| | | | |
| | | | | |
To avoid a crasher later on with a null type inside a
sequence argument.
|
|\ \ \ \ \
| | | | | |
| | | | | | |
SI-7234 Make named args play nice with dep. method types
|
| | |_|_|/
| |/| | |
| | | | |
| | | | |
| | | | |
| | | | | |
Some care is needed to avoid interaction with constant
types (e.g pos/z1730.scala) and with existentials
(e.g. t3507-old.scala).
|
|\ \ \ \ \
| | | | | |
| | | | | | |
SI-5710 has fixed itself
|
| | |_|_|/
| |/| | |
| | | | |
| | | | | |
My job here is only to submit tests.
|
|\ \ \ \ \
| | | | | |
| | | | | | |
reifier is now aware of SI-7235
|
| |/ / / /
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
SI-7235 is caused by a long-standing todo in typedRefinement, which leads
to originals of compound type trees swallowing their stats.
I'm not sure how exactly to fix SI-7235, but what I am sure about is that
we shouldn't silently discard stats during reification. This patch
introduces a new implementation restrictions, which now reports that
reify of compound type trees with non-empty stats isn't going to work.
|
| |_|/ /
|/| | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
TypeVars, being mutable creatures, mustn't have structural
equality/hashing, otherwise TypeRefs that differ only by
having distinct TypeVars as components get wrongly uniqued
together.
The reported bug showed the disaterous consequences: constraints
from the `C?[Int]` in the return type applied to the `?C[?A]` in
the parameter list.
This commit overrides `equals` and `hashCode` in `TypeVar`
to use reference equality. An alternative fix would be to drop
the `case`-ness of the class, as was the case before 0cde930b
when this regressed.
|
| |/ /
|/| |
| | |
| | |
| | |
| | |
| | | |
Don't focus positions assigned to the TypeTree of a parent of a Template
when the parent exists in the source. A focused position (instance
of `OffsetPosition`) makes it invisible to the presentation compiler
when it looks for the innermost enclosing tree of a given position
(breaking hyperlinking, for example).
|
|\ \ \
| | | |
| | | | |
SI-7214 outer check based on dealiased pattern type.
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
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.
|