| Commit message (Collapse) | Author | Age | Files | Lines |
|\ |
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
this corner case in Duplicators is hit when compiling
the new AbstractPartialFunction (which is specialized) under -Yvirtpatmat
TODO: why do we need to guard against cx.scope eq null in typers?
review by @vladureche
|
| |
| |
| |
| |
| |
| | |
avoid casting default call in applyOrElse:
the result type of the match is always B1,
not the result type inferred from typing the cases
|
| |
| |
| |
| |
| |
| | |
minimal fixes for typedMatchAnonFun so it compiles
TODO: support for AbstractTotalFunction (when match is exhaustive)
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
runtime.AbstractPartialFunction provides a default implementation
for the new-style partial function. In principle this class is only
subclassed by compiler-generated partial functions arising from matches.
Either
- the apply method (old-style partialfun) or
- the applyOrElse method (current scheme)
must be overridden, and the isDefinedAt method implemented.
The applyOrElse method implementation is provided to ease the
transition from the old scheme, since starr still generates
old-style PartialFunctions, but locker's library has the
new AbstractPartialFunction.
Thus, this implementation is intended as a drop-in replacement for the
old partial function, and does not require changes to the compiler.
(compiler patches, both for old and new-style pattern matching, follow)
- runtime.AbstractPartialFunction is based on PartialFunction.WithDefault
Original version of FunctionWithDefault by Odersky
(http://article.gmane.org/gmane.comp.lang.scala.internals/4032)
- better performance for OrElse#applyOrElse, OrElse#lift, PF.cond
- new combinator methods: PF#run, PF#runWith, PF.apply
authored by @pavelpavlov, refactored by @adriaanm, review by @paulp
|
| |
| |
| |
| | |
A classic "off by two" error. Closes SI-4545, SI-5633.
|
| |
| |
| |
| | |
It's -Ycheck:jvm, not -Ycheck:genjvm. There is no genjvm.
|
| | | |
| \ | |
|\ \ \
| |_|/
|/| |
| | | |
'axel22/feature/future-compat' into develop
|
| | | |
|
| | |
| | |
| | |
| | |
| | | |
Removed some methods from execution contexts.
Changed Awaitable interface.
|
| | |
| | |
| | |
| | | |
Now that there's an extensive parallel collections overview on http://docs.scala-lang.org, API comments should link to it ("see also" field). This commit also fixes a couple of broken links on some sequential collection types.
|
|/ / |
|
|/
|
|
|
|
| |
Closes SI-3569, SI-3770.
Also threw in experimental -Yoverride-vars. It's not robust.
|
|\ |
|
| | |
|
|\ \ |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Introduced the collection.concurrent package and introduced the
concurrent.Map trait there. Deprecated the mutable.ConcurrentMap trait.
Pending work - introduce the appropriate changes to JavaConversions
and JavaConverters.
|
| | |
| | |
| | |
| | |
| | |
| | | |
Not actually a fix, but when we see a package where a module is
expected, it's not a great stretch to try the package object.
References SI-5604.
|
| | | | |
| \ \ | |
| \ \ | |
| \ \ | |
| \ \ | |
| \ \ | |
| \ \ | |
| \ \ | |
|\ \ \ \ \ \ \
| |_|_|_|_|_|/
|/| | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
'non/si-5609', 'adriaanm/topic/virtpatmat' and 'VladUreche/issue/5373' into develop
Conflicts:
test/scaladoc/scala/model/CommentFactoryTest.scala
|
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
And adds basic support for scaladoc model tests (class
partest.ScaladocModelTest)
|
| | | | | | | |
|
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
didn't realize this was done for the old pattern matcher, so now we have "feature"-parity
we still infer bad type arguments for type patterns -- see e.g., pos/t602.scala --
also, inference changes when you turn a case class into
the corresponding class&companion object, with the same unapply as the synthetic one
TODO: can we merge inferConstructorInstance & inferTypedPattern,
or at least make them behave consistently?
|
| | | | |\ \ \ |
|
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
for selector-less matches that should yield a function
|
| | | | | |/ /
| | | | |/| |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | | |
... but not before, to avoid having skolems in typedMatchAnonFun
cast result of missingCase (avoid skolem mismatch)
relevant test cases: pos/existentials-harmful.scala, pos/gadt-gilles.scala, pos/t2683.scala, pos/virtpatmat_exist4.scala
|
| | | |/ / /
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | | |
This commit removes the (unused and unnecessary) elems* parameter
from the 'empty' method. It also adds 'ofDim' which allows the
user to allocate a FlatArray of a given size without providing
actual elements.
This fixes SI-5609.
|
| | |/ / / |
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
The issue is closed as won't fix, but there are a few test cases
with respect to the model relevant to the issue. Also, correct
some typos.
|
| | | | | |
|
| |_|/ /
|/| | | |
|
| |/ /
|/| | |
|
| | |
| | |
| | |
| | | |
I swear this change didn't work last time I was in this neighborhood.
|
|/ /
| |
| |
| |
| |
| |
| |
| |
| |
| | |
For snapshots, it points to the exact commit, for releases it points to
the tag ("v" + maven version). The link now opens in a different tab,
as opening in the same frame is not compatible with github (the page
doesn't load for some reason).
Left the repo url in test/review untouched because it points to the
root of all LAMP repos. But... is anyone still using that script?!?
|
| |
| |
| |
| |
| |
| | |
Possibly the ugliest function in the compiler. Unfortunately
also effectively obscuring serious bugs like SI-3452. Still won't
be winning homecoming queen, but might be able to leave the house.
|
|\ \ |
|
| | | |
|
| | | |
|
| | |
| | |
| | |
| | |
| | | |
sharing trees is bad
also, substing in untyped trees into typed outer trees is not good for your health
|
| | |
| | |
| | |
| | |
| | |
| | | |
we still do it in ifs when the packed types are equal,
but packing types in cases breaks a lot of stuff
(and I can't remember what it fixed -- we'll find out in the next test run)
|
| | | |
|
| | |
| | |
| | |
| | | |
can't pass the scrutinee since its type has been widened
|
| | |
| | |
| | |
| | |
| | | |
type-switch-based catches must not contain type tests on traits for some reason, so fall back to full-blown pattern match
TODO: can we improve this? this simply mimics the old pattern matcher's behavior
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
this came to light with the virtual pattern matcher, which
emits jumps like `matchEnd3(_test(Test.this, false))`, where _test is a tailcall
the nested jumping caused double-closing (the second time in ignore mode)
thus. when closing a closed block in ignore mode, simply do nothing
from genLoad for label-jumps:
note: when one of the args to genLoadLabelArguments is a jump to a label,
it will call back into genLoad and arrive at this case, which will then set ctx1.bb.ignore to true,
this is okay, since we're jumping unconditionally, so the loads and jumps emitted by the outer
call to genLoad (by calling genLoadLabelArguments and emitOnly) can safely be ignored,
however, as emitOnly will close the block, which reverses its instructions (when it's still open),
we better not reverse when the block has already been closed but is in ignore mode
(if it's not in ignore mode, double-closing is an error)
@dragos figured it out, all I did was write the comment and the `if`
test case to repro basic blocks crasher
the tailcall in the forward jump `matchEnd3(_test(Test.this, false))`
in the following program crashes the back-end (error below)
@scala.annotation.tailrec final def test(meh: Boolean): Boolean = {
<synthetic> val _$this: Test.type = Test.this;
_test(_$this,meh){
case <synthetic> val x1: Some[String] = new Some[String]("a");
case3(){
matchEnd2({
case <synthetic> val x1: Some[String] = x1;
case4(){
if (x1.ne(null))
matchEnd3(if (meh)
_test(Test.this, false)
else
false)
else
case5()
};
case5(){
matchEnd3(_test(Test.this, false))
};
matchEnd3(x){
x
}
})
};
matchEnd2(x){
x
}
}
};
The last instruction (of basic block 11) is not a control flow instruction: CONSTANT(false)
// methods
def test(meh: Boolean (BOOL)): Boolean {
locals: value meh, value _$this, value x1, value x, value x, value x1
startBlock: 1
blocks: [1,2,3,4,5,6,7,8,9,10,11,12,13]
1:
4 JUMP 2
2:
5 NEW REF(class Some)
5 DUP(REF(class Some))
5 CONSTANT("a")
5 CALL_METHOD scala.Some.<init> (static-instance)
5 STORE_LOCAL(value x1)
5 SCOPE_ENTER value x1
5 JUMP 3
3:
5 LOAD_LOCAL(value x1)
7 STORE_LOCAL(value x1)
7 SCOPE_ENTER value x1
7 JUMP 4
4:
7 LOAD_LOCAL(value x1)
7 CZJUMP (REF(class Object))NE ? 5 : 6
5:
8 LOAD_LOCAL(value meh)
8 CZJUMP (BOOL)NE ? 8 : 9
6:
? JUMP 11
7:
7 DROP BOOL
7 JUMP 11
8:
8 CONSTANT(false)
8 STORE_LOCAL(value meh)
8 JUMP 2
9:
8 CONSTANT(false)
8 JUMP 10
10:
8 STORE_LOCAL(value x)
8 JUMP 12
11:
9 JUMP 2
9 STORE_LOCAL(value meh)
9 CONSTANT(false)
12:
7 LOAD_LOCAL(value x)
7 SCOPE_EXIT value x1
7 STORE_LOCAL(value x)
7 JUMP 13
13:
5 LOAD_LOCAL(value x)
5 SCOPE_EXIT value x1
5 RETURN(BOOL)
|
| | |
| | |
| | |
| | |
| | | |
the following commit deals with the fall-out in basicblocks
(double closing of blocks in ignore mode)
|
| | | |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
need to set up symbols with approximated info for the method and its owner
before typing the method's body; when the body has been typed,
we know what its result type will be, so update info of class and method to reflect that
better detection of synthesized matches: annotate selector rather than relying on symbol info
encapsulate CASE | SYNTHETIC flags (setting and querying)
|
|\ \ \ |
|
| | | |
| | | |
| | | |
| | | |
| | | | |
type-switch-based catches must not contain type tests on traits for some reason, so fall back to full-blown pattern match
TODO: can we improve this? this simply mimics the old pattern matcher's behavior
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
this came to light with the virtual pattern matcher, which
emits jumps like `matchEnd3(_test(Test.this, false))`, where _test is a tailcall
the nested jumping caused double-closing (the second time in ignore mode)
thus. when closing a closed block in ignore mode, simply do nothing
from genLoad for label-jumps:
note: when one of the args to genLoadLabelArguments is a jump to a label,
it will call back into genLoad and arrive at this case, which will then set ctx1.bb.ignore to true,
this is okay, since we're jumping unconditionally, so the loads and jumps emitted by the outer
call to genLoad (by calling genLoadLabelArguments and emitOnly) can safely be ignored,
however, as emitOnly will close the block, which reverses its instructions (when it's still open),
we better not reverse when the block has already been closed but is in ignore mode
(if it's not in ignore mode, double-closing is an error)
@dragos figured it out, all I did was write the comment and the `if`
test case to repro basic blocks crasher
the tailcall in the forward jump `matchEnd3(_test(Test.this, false))`
in the following program crashes the back-end (error below)
@scala.annotation.tailrec final def test(meh: Boolean): Boolean = {
<synthetic> val _$this: Test.type = Test.this;
_test(_$this,meh){
case <synthetic> val x1: Some[String] = new Some[String]("a");
case3(){
matchEnd2({
case <synthetic> val x1: Some[String] = x1;
case4(){
if (x1.ne(null))
matchEnd3(if (meh)
_test(Test.this, false)
else
false)
else
case5()
};
case5(){
matchEnd3(_test(Test.this, false))
};
matchEnd3(x){
x
}
})
};
matchEnd2(x){
x
}
}
};
The last instruction (of basic block 11) is not a control flow instruction: CONSTANT(false)
// methods
def test(meh: Boolean (BOOL)): Boolean {
locals: value meh, value _$this, value x1, value x, value x, value x1
startBlock: 1
blocks: [1,2,3,4,5,6,7,8,9,10,11,12,13]
1:
4 JUMP 2
2:
5 NEW REF(class Some)
5 DUP(REF(class Some))
5 CONSTANT("a")
5 CALL_METHOD scala.Some.<init> (static-instance)
5 STORE_LOCAL(value x1)
5 SCOPE_ENTER value x1
5 JUMP 3
3:
5 LOAD_LOCAL(value x1)
7 STORE_LOCAL(value x1)
7 SCOPE_ENTER value x1
7 JUMP 4
4:
7 LOAD_LOCAL(value x1)
7 CZJUMP (REF(class Object))NE ? 5 : 6
5:
8 LOAD_LOCAL(value meh)
8 CZJUMP (BOOL)NE ? 8 : 9
6:
? JUMP 11
7:
7 DROP BOOL
7 JUMP 11
8:
8 CONSTANT(false)
8 STORE_LOCAL(value meh)
8 JUMP 2
9:
8 CONSTANT(false)
8 JUMP 10
10:
8 STORE_LOCAL(value x)
8 JUMP 12
11:
9 JUMP 2
9 STORE_LOCAL(value meh)
9 CONSTANT(false)
12:
7 LOAD_LOCAL(value x)
7 SCOPE_EXIT value x1
7 STORE_LOCAL(value x)
7 JUMP 13
13:
5 LOAD_LOCAL(value x)
5 SCOPE_EXIT value x1
5 RETURN(BOOL)
|
| | | |
| | | |
| | | |
| | | |
| | | | |
the following commit deals with the fall-out in basicblocks
(double closing of blocks in ignore mode)
|