Avoid creating SimpleType instances for default type

This commit is contained in:
Denis Zharkov
2017-05-24 13:54:31 +03:00
parent 8576054788
commit 59f2ba98a6
8 changed files with 95 additions and 81 deletions
+15 -15
View File
@@ -6,14 +6,14 @@ fun test() {
} while (s == "") } while (s == "")
} }
--------------------- ---------------------
"" <v0>: String NEW: r("") -> <v0> "" <v0>: String NEW: r("") -> <v0>
s = "" !<v1>: * s = "" !<v1>: *
{ val s: String s = "" } !<v1>: * COPY { val s: String s = "" } !<v1>: * COPY
s <v2>: OR{*, *} NEW: r(s) -> <v2> s <v2>: * NEW: r(s) -> <v2>
"" <v3>: * NEW: r("") -> <v3> "" <v3>: * NEW: r("") -> <v3>
s == "" <v4>: Boolean NEW: call(s == "", equals|<v2>, <v3>) -> <v4> s == "" <v4>: Boolean NEW: call(s == "", equals|<v2>, <v3>) -> <v4>
do { val s: String s = "" } while (s == "") !<v5>: * do { val s: String s = "" } while (s == "") !<v5>: *
{ do { val s: String s = "" } while (s == "") } !<v5>: * COPY { do { val s: String s = "" } while (s == "") } !<v5>: * COPY
===================== =====================
== test2 == == test2 ==
fun test2() { fun test2() {
@@ -24,15 +24,15 @@ fun test2() {
} }
} }
--------------------- ---------------------
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1> <v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
true <v0>: Boolean NEW: r(true) -> <v0> true <v0>: Boolean NEW: r(true) -> <v0>
"" <v2>: String NEW: r("") -> <v2> "" <v2>: String NEW: r("") -> <v2>
s <v3>: OR{*, *} NEW: r(s) -> <v3> s <v3>: * NEW: r(s) -> <v3>
"" <v4>: * NEW: r("") -> <v4> "" <v4>: * NEW: r("") -> <v4>
s != "" <v5>: Boolean NEW: call(s != "", equals|<v3>, <v4>) -> <v5> s != "" <v5>: Boolean NEW: call(s != "", equals|<v3>, <v4>) -> <v5>
break !<v6>: * break !<v6>: *
if (s != "") break <v7>: * NEW: merge(if (s != "") break|!<v6>) -> <v7> if (s != "") break <v7>: * NEW: merge(if (s != "") break|!<v6>) -> <v7>
{ val s: String s = "" if (s != "") break } <v7>: * COPY { val s: String s = "" if (s != "") break } <v7>: * COPY
while (true) { val s: String s = "" if (s != "") break } !<v8>: * while (true) { val s: String s = "" if (s != "") break } !<v8>: *
{ while (true) { val s: String s = "" if (s != "") break } } !<v8>: * COPY { while (true) { val s: String s = "" if (s != "") break } } !<v8>: * COPY
===================== =====================
+9 -9
View File
@@ -10,15 +10,15 @@ fun test5() {
a.hashCode() a.hashCode()
} }
--------------------- ---------------------
3 <v0>: Int NEW: r(3) -> <v0> 3 <v0>: Int NEW: r(3) -> <v0>
a = 3 !<v1>: * a = 3 !<v1>: *
{ a = 3 } !<v1>: * COPY { a = 3 } !<v1>: * COPY
5 <v2>: Int NEW: r(5) -> <v2> 5 <v2>: Int NEW: r(5) -> <v2>
a = 5 !<v3>: * a = 5 !<v3>: *
{ a = 5 } !<v3>: * COPY { a = 5 } !<v3>: * COPY
try { a = 3 } finally { a = 5 } <v4>: * NEW: merge(try { a = 3 } finally { a = 5 }|!<v1>) -> <v4> try { a = 3 } finally { a = 5 } <v4>: * NEW: merge(try { a = 3 } finally { a = 5 }|!<v1>) -> <v4>
a <v5>: OR{{<: Any}, {<: Any}} NEW: r(a) -> <v5> a <v5>: {<: Any} NEW: r(a) -> <v5>
hashCode() <v6>: * NEW: call(hashCode(), hashCode|<v5>) -> <v6> hashCode() <v6>: * NEW: call(hashCode(), hashCode|<v5>) -> <v6>
a.hashCode() <v6>: * COPY a.hashCode() <v6>: * COPY
{ var a: Int try { a = 3 } finally { a = 5 } a.hashCode() } <v6>: * COPY { var a: Int try { a = 3 } finally { a = 5 } a.hashCode() } <v6>: * COPY
===================== =====================
+31 -31
View File
@@ -17,47 +17,47 @@ fun f(a : Boolean) : Unit {
} }
--------------------- ---------------------
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](a : Boolean) -> <v0> <v0>: Boolean NEW: magic[FAKE_INITIALIZER](a : Boolean) -> <v0>
1 <v1>: * NEW: r(1) -> <v1> 1 <v1>: * NEW: r(1) -> <v1>
a <v2>: * NEW: r(a) -> <v2> a <v2>: * NEW: r(a) -> <v2>
2 <v3>: {<: Number} NEW: r(2) -> <v3> 2 <v3>: {<: Number} NEW: r(2) -> <v3>
toLong() <v4>: * NEW: call(toLong(), toLong|<v3>) -> <v4> toLong() <v4>: * NEW: call(toLong(), toLong|<v3>) -> <v4>
2.toLong() <v4>: * COPY 2.toLong() <v4>: * COPY
a <v5>: Boolean NEW: r(a) -> <v5> a <v5>: Boolean NEW: r(a) -> <v5>
3 <v6>: Int NEW: r(3) -> <v6> 3 <v6>: Int NEW: r(3) -> <v6>
foo(a, 3) <v7>: * NEW: call(foo(a, 3), foo|<v5>, <v6>) -> <v7> foo(a, 3) <v7>: * NEW: call(foo(a, 3), foo|<v5>, <v6>) -> <v7>
genfun<Any>() <v8>: * NEW: call(genfun<Any>(), genfun) -> <v8> genfun<Any>() <v8>: * NEW: call(genfun<Any>(), genfun) -> <v8>
{1} <v9>: {<: () -> Any} NEW: r({1}) -> <v9> {1} <v9>: {<: () -> Any} NEW: r({1}) -> <v9>
flfun {1} <v10>: * NEW: call(flfun {1}, flfun|<v9>) -> <v10> flfun {1} <v10>: * NEW: call(flfun {1}, flfun|<v9>) -> <v10>
3 <v11>: OR{{<: Any}, {<: Any}} NEW: r(3) -> <v11> 3 <v11>: {<: Any} NEW: r(3) -> <v11>
4 <v12>: * NEW: r(4) -> <v12> 4 <v12>: * NEW: r(4) -> <v12>
equals(4) <v13>: * NEW: call(equals(4), equals|<v11>, <v12>) -> <v13> equals(4) <v13>: * NEW: call(equals(4), equals|<v11>, <v12>) -> <v13>
3.equals(4) <v13>: * COPY 3.equals(4) <v13>: * COPY
3 <v14>: OR{{<: Any}, {<: Any}} NEW: r(3) -> <v14> 3 <v14>: {<: Any} NEW: r(3) -> <v14>
4 <v15>: * NEW: r(4) -> <v15> 4 <v15>: * NEW: r(4) -> <v15>
3 equals 4 <v16>: * NEW: call(3 equals 4, equals|<v14>, <v15>) -> <v16> 3 equals 4 <v16>: * NEW: call(3 equals 4, equals|<v14>, <v15>) -> <v16>
1 <v17>: Int NEW: r(1) -> <v17> 1 <v17>: Int NEW: r(1) -> <v17>
2 <v18>: Int NEW: r(2) -> <v18> 2 <v18>: Int NEW: r(2) -> <v18>
1 + 2 <v19>: * NEW: call(1 + 2, plus|<v17>, <v18>) -> <v19> 1 + 2 <v19>: * NEW: call(1 + 2, plus|<v17>, <v18>) -> <v19>
a <v20>: Boolean NEW: r(a) -> <v20> a <v20>: Boolean NEW: r(a) -> <v20>
true <v21>: Boolean NEW: r(true) -> <v21> true <v21>: Boolean NEW: r(true) -> <v21>
a && true <v22>: * NEW: magic[AND](a && true|<v20>, <v21>) -> <v22> a && true <v22>: * NEW: magic[AND](a && true|<v20>, <v21>) -> <v22>
a <v23>: Boolean NEW: r(a) -> <v23> a <v23>: Boolean NEW: r(a) -> <v23>
false <v24>: Boolean NEW: r(false) -> <v24> false <v24>: Boolean NEW: r(false) -> <v24>
a || false <v25>: * NEW: magic[OR](a || false|<v23>, <v24>) -> <v25> a || false <v25>: * NEW: magic[OR](a || false|<v23>, <v24>) -> <v25>
{ 1 a 2.toLong() foo(a, 3) genfun<Any>() flfun {1} 3.equals(4) 3 equals 4 1 + 2 a && true a || false } <v25>: * COPY { 1 a 2.toLong() foo(a, 3) genfun<Any>() flfun {1} 3.equals(4) 3 equals 4 1 + 2 a && true a || false } <v25>: * COPY
===================== =====================
== anonymous_0 == == anonymous_0 ==
{1} {1}
--------------------- ---------------------
1 <v0>: Int NEW: r(1) -> <v0> 1 <v0>: Int NEW: r(1) -> <v0>
1 <v0>: Int COPY 1 <v0>: Int COPY
===================== =====================
== foo == == foo ==
fun foo(a : Boolean, b : Int) : Unit {} fun foo(a : Boolean, b : Int) : Unit {}
--------------------- ---------------------
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](a : Boolean) -> <v0> <v0>: Boolean NEW: magic[FAKE_INITIALIZER](a : Boolean) -> <v0>
<v1>: Int NEW: magic[FAKE_INITIALIZER](b : Int) -> <v1> <v1>: Int NEW: magic[FAKE_INITIALIZER](b : Int) -> <v1>
===================== =====================
== genfun == == genfun ==
fun <T> genfun() : Unit {} fun <T> genfun() : Unit {}
+7 -7
View File
@@ -4,12 +4,12 @@ fun foo(a: Int, b: Int) {
} }
} }
--------------------- ---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0> <v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0>
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1> <v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
a <v2>: OR{*, *} NEW: r(a) -> <v2> a <v2>: * NEW: r(a) -> <v2>
b <v3>: * NEW: r(b) -> <v3> b <v3>: * NEW: r(b) -> <v3>
a == b <v4>: Boolean NEW: call(a == b, equals|<v2>, <v3>) -> <v4> a == b <v4>: Boolean NEW: call(a == b, equals|<v2>, <v3>) -> <v4>
{ } !<v5>: * { } !<v5>: *
if (a == b) { } <v6>: * NEW: merge(if (a == b) { }|!<v5>) -> <v6> if (a == b) { } <v6>: * NEW: merge(if (a == b) { }|!<v5>) -> <v6>
{ if (a == b) { } } <v6>: * COPY { if (a == b) { } } <v6>: * COPY
===================== =====================
+7 -7
View File
@@ -3,12 +3,12 @@ fun neq(a: Int, b: Int) {
if (a != b) {} if (a != b) {}
} }
--------------------- ---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0> <v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0>
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1> <v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
a <v2>: OR{*, *} NEW: r(a) -> <v2> a <v2>: * NEW: r(a) -> <v2>
b <v3>: * NEW: r(b) -> <v3> b <v3>: * NEW: r(b) -> <v3>
a != b <v4>: Boolean NEW: call(a != b, equals|<v2>, <v3>) -> <v4> a != b <v4>: Boolean NEW: call(a != b, equals|<v2>, <v3>) -> <v4>
{} !<v5>: * {} !<v5>: *
if (a != b) {} <v6>: * NEW: merge(if (a != b) {}|!<v5>) -> <v6> if (a != b) {} <v6>: * NEW: merge(if (a != b) {}|!<v5>) -> <v6>
{ if (a != b) {} } <v6>: * COPY { if (a != b) {} } <v6>: * COPY
===================== =====================
+10 -10
View File
@@ -20,16 +20,16 @@ constructor() {
x = 1 x = 1
} }
--------------------- ---------------------
<v0>: * NEW: call(, <init>) -> <v0> <v0>: * NEW: call(, <init>) -> <v0>
1 <v1>: OR{*, *} NEW: r(1) -> <v1> 1 <v1>: * NEW: r(1) -> <v1>
1 <v2>: * NEW: r(1) -> <v2> 1 <v2>: * NEW: r(1) -> <v2>
1 == 1 <v3>: Boolean NEW: call(1 == 1, equals|<v1>, <v2>) -> <v3> 1 == 1 <v3>: Boolean NEW: call(1 == 1, equals|<v1>, <v2>) -> <v3>
return !<v4>: * return !<v4>: *
{ return } !<v4>: * COPY { return } !<v4>: * COPY
null <v5>: * NEW: r(null) -> <v5> null <v5>: * NEW: r(null) -> <v5>
null!! <v6>: * NEW: magic[NOT_NULL_ASSERTION](null!!|<v5>) -> <v6> null!! <v6>: * NEW: magic[NOT_NULL_ASSERTION](null!!|<v5>) -> <v6>
if (1 == 1) { return } else null!! <v7>: * NEW: merge(if (1 == 1) { return } else null!!|!<v4>, <v6>) -> <v7> if (1 == 1) { return } else null!! <v7>: * NEW: merge(if (1 == 1) { return } else null!!|!<v4>, <v6>) -> <v7>
1 <v9>: Int NEW: r(1) -> <v9> 1 <v9>: Int NEW: r(1) -> <v9>
x = 1 !<v10>: * x = 1 !<v10>: *
{ if (1 == 1) { return } else null!! x = 1 } !<v10>: * COPY { if (1 == 1) { return } else null!! x = 1 } !<v10>: * COPY
===================== =====================
+1 -1
View File
@@ -6,7 +6,7 @@ tailrec fun sum(x: Long, sum: Long): Long {
--------------------- ---------------------
<v0>: Long NEW: magic[FAKE_INITIALIZER](x: Long) -> <v0> <v0>: Long NEW: magic[FAKE_INITIALIZER](x: Long) -> <v0>
<v1>: Long NEW: magic[FAKE_INITIALIZER](sum: Long) -> <v1> <v1>: Long NEW: magic[FAKE_INITIALIZER](sum: Long) -> <v1>
x <v2>: OR{*, *} NEW: r(x) -> <v2> x <v2>: * NEW: r(x) -> <v2>
0 <v3>: {<: Number} NEW: r(0) -> <v3> 0 <v3>: {<: Number} NEW: r(0) -> <v3>
toLong() <v4>: * NEW: call(toLong(), toLong|<v3>) -> <v4> toLong() <v4>: * NEW: call(toLong(), toLong|<v3>) -> <v4>
0.toLong() <v4>: * COPY 0.toLong() <v4>: * COPY
@@ -34,13 +34,27 @@ object KotlinTypeFactory {
} }
} }
@JvmStatic
fun simpleType(
annotations: Annotations,
constructor: TypeConstructor,
arguments: List<TypeProjection>,
nullable: Boolean
): SimpleType {
if (annotations.isEmpty() && arguments.isEmpty() && !nullable && constructor.declarationDescriptor != null) {
return constructor.declarationDescriptor!!.defaultType
}
return SimpleTypeImpl(annotations, constructor, arguments, nullable, computeMemberScope(constructor, arguments))
}
@JvmStatic @JvmStatic
fun simpleType( fun simpleType(
annotations: Annotations, annotations: Annotations,
constructor: TypeConstructor, constructor: TypeConstructor,
arguments: List<TypeProjection>, arguments: List<TypeProjection>,
nullable: Boolean, nullable: Boolean,
memberScope: MemberScope = computeMemberScope(constructor, arguments) memberScope: MemberScope
): SimpleType = SimpleTypeImpl(annotations, constructor, arguments, nullable, memberScope) ): SimpleType = SimpleTypeImpl(annotations, constructor, arguments, nullable, memberScope)
@JvmStatic @JvmStatic