Skip to content

Commit 13b14ab

Browse files
committed
adding test cases; fix BCodeHelpers BCodeSkelBuilder
1 parent 5f715d9 commit 13b14ab

File tree

10 files changed

+414
-13
lines changed

10 files changed

+414
-13
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ trait BCodeHelpers extends BCodeIdiomatic {
228228
case dotty.tools.dotc.transform.TypeB.M(index) => new TypeHints.TypeB(TypeHints.TypeB.M_KIND, index)
229229
case dotty.tools.dotc.transform.TypeB.K(outer, index) => new TypeHints.TypeB(TypeHints.TypeB.K_KIND, outer, index)
230230
case dotty.tools.dotc.transform.TypeB.Array(dotty.tools.dotc.transform.TypeB.K(outer, index)) => new TypeHints.TypeB(TypeHints.TypeB.ARR_K_KIND, outer, index)
231-
case dotty.tools.dotc.transform.TypeB.Array(dotty.tools.dotc.transform.TypeB.M(index)) => new TypeHints.TypeB(TypeHints.TypeB.ARR_M_KIND, index)
231+
case dotty.tools.dotc.transform.TypeB.Array(dotty.tools.dotc.transform.TypeB.M(index)) => new TypeHints.TypeB(TypeHints.TypeB.ARR_M_KIND, index)
232+
case dotty.tools.dotc.transform.TypeB.Array(dotty.tools.dotc.transform.TypeB.None) => TypeHints.TypeB.NO_HINT
232233
case _ =>
233234
report.error("unexpected type in to Java TypeB: " + tpe)
234235
TypeHints.TypeB.NO_HINT // fallback, should not happen

compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import dotty.tools.dotc.core.Contexts.*
2121
import dotty.tools.dotc.util.Spans.*
2222
import dotty.tools.dotc.report
2323
import dotty.tools.dotc.transform.ErasedInfo
24+
import dotty.tools.dotc.transform.MethodParameterReturnType
2425

2526

2627
/*
@@ -712,22 +713,12 @@ trait BCodeSkelBuilder extends BCodeHelpers {
712713
/*
713714
* must-single-thread
714715
*/
715-
def initJMethod(flags: Int, params: List[Symbol]): Unit = {
716+
def initJMethod(flags: Int, params: List[Symbol], cnt: Int, paramType: List[dotty.tools.dotc.transform.TypeB], retType : dotty.tools.dotc.transform.TypeB): Unit = {
716717

717718
val jgensig = getGenericSignature(methSymbol, claszSymbol)
718719
val (excs, others) = methSymbol.annotations.partition(_.symbol eq defn.ThrowsAnnot)
719720
val thrownExceptions: List[String] = getExceptions(excs)
720721

721-
// information for: MethodTypeParameterCount, MethodParameterType, MethodReturnType
722-
val methodDeclarationAttrs = methSymbol.getAnnotation(defn.ErasurePreservationAnnot)
723-
val (cnt, paramType, retType) = methodDeclarationAttrs match {
724-
case Some(e : ErasedInfo) => (e.paramCount, e.paramType, e.returnType)
725-
case _ => (0, List.empty[dotty.tools.dotc.transform.TypeB], dotty.tools.dotc.transform.TypeB.None)
726-
}
727-
//val typeBs =
728-
// println(s"GenBCode.genDefDef.initJMethod: ${methSymbol.show} ${methodDeclarationAttrs} " +
729-
// s"${cnt} ${paramType} ${retType}")
730-
731722
val bytecodeName =
732723
if (isMethSymStaticCtor) CLASS_CONSTRUCTOR_NAME
733724
else jMethodName
@@ -865,7 +856,16 @@ trait BCodeSkelBuilder extends BCodeHelpers {
865856

866857
// TODO needed? for(ann <- m.symbol.annotations) { ann.symbol.initialize }
867858
val paramSyms = params.map(_.symbol)
868-
initJMethod(flags, paramSyms)
859+
val methodDeclarationAttrs = dd.getAttachment(MethodParameterReturnType)
860+
// information for: MethodTypeParameterCount, MethodParameterType, MethodReturnType
861+
// val methodDeclarationAttrs = methSymbol.getAnnotation(defn.ErasurePreservationAnnot)
862+
val (cnt: Int, paramType: List[dotty.tools.dotc.transform.TypeB], retType : dotty.tools.dotc.transform.TypeB) = methodDeclarationAttrs match {
863+
case Some((paramCount, paramType, returnType)) => (paramCount, paramType, returnType)
864+
case _ => (0, List.empty[dotty.tools.dotc.transform.TypeB], dotty.tools.dotc.transform.TypeB.None)
865+
}
866+
if (cnt != 0) println(s"GenBCode.genDefDef.initJMethod: ${methSymbol.show} ${methodDeclarationAttrs} " +
867+
s"${cnt} ${paramType} ${retType}")
868+
initJMethod(flags, paramSyms, cnt, paramType, retType)
869869

870870

871871
if (!isAbstractMethod && !isNative) {
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
package bcGen.Arrays
2+
3+
import bcGen.Arrays.ArrayTestLib
4+
5+
object testArray{
6+
val size = 1000
7+
val maxInt = 10000
8+
val rng = new scala.util.Random(1234)
9+
val intArr : Array[Int] = Array.fill[Int](size)(rng.nextInt(maxInt))
10+
val objArr : Array[Any] = Array.fill[Any](size)(new bcGen.Foo(rng.nextInt(maxInt)))
11+
val doubleArr : Array[Double] = Array.fill[Double](size)(rng.nextDouble())
12+
val intDoubleArr : Array[Any] = Array.tabulate(size * 2) { i =>
13+
if (rng.nextInt % 2 == 0) rng.nextInt(maxInt) else rng.nextDouble()
14+
}
15+
val shortArrInt = Array.fill[Int](10)(rng.nextInt(maxInt))
16+
val shortArrDouble = Array.fill[Double](10)(rng.nextDouble())
17+
val shortArrObj = Array.fill[Any](10)(new bcGen.Foo(rng.nextInt(maxInt)))
18+
val shorArrIntCp = new Array[Int](10)
19+
val shorArrDoubleCp = new Array[Double](10)
20+
val shorArrObjCp = new Array[Any](10)
21+
val intArrCp = new Array[Int](size)
22+
val anyArrCp = new Array[Any](size)
23+
val doubleArrCp = new Array[Double](size)
24+
val intDoubleArrCp = new Array[Any](size * 2)
25+
26+
var hashState: Long = 0
27+
val hashMod: Long = 998244353
28+
@main def mainArr1(): Unit =
29+
ArrayTestLib.copy[Int](intArr, intArrCp)
30+
for (e <- intArrCp) {
31+
hashState = (hashState * 23 + e) % hashMod
32+
}
33+
34+
@main def mainArr2(): Unit =
35+
ArrayTestLib.copy[Any](objArr, anyArrCp)
36+
for (e <- anyArrCp) {
37+
hashState = (hashState * 23 + e.asInstanceOf[bcGen.Foo].id) % hashMod
38+
}
39+
40+
@main def mainArr3(): Unit =
41+
ArrayTestLib.copy[Double](doubleArr, doubleArrCp)
42+
for (e <- doubleArrCp) {
43+
hashState = (hashState * 23 + java.lang.Double.doubleToRawLongBits(e) % hashMod) % hashMod
44+
}
45+
46+
@main def mainArr4(): Unit =
47+
ArrayTestLib.copy[Any](intDoubleArr, intDoubleArrCp)
48+
for (e <- intDoubleArrCp) {
49+
e match {
50+
case i: Int => hashState = (hashState * 23 + i) % hashMod
51+
case d: Double => hashState = (hashState * 23 + java.lang.Double.doubleToRawLongBits(d) % hashMod) % hashMod
52+
case _ => {}
53+
}
54+
}
55+
56+
def genericCopy[T](src: Array[T], dst: Array[T]): Unit = {
57+
ArrayTestLib.copy(src, dst)
58+
}
59+
60+
@main def mainArr5(): Unit =
61+
genericCopy[Int](intArr, intArrCp)
62+
for (e <- intArrCp) {
63+
hashState = (hashState * 23 + e) % hashMod
64+
}
65+
66+
@main def mainArr6(): Unit =
67+
genericCopy[Any](objArr, anyArrCp)
68+
for (e <- anyArrCp) {
69+
hashState = (hashState * 23 + e.asInstanceOf[bcGen.Foo].id) % hashMod
70+
}
71+
72+
@main def mainArr7(): Unit =
73+
genericCopy[Double](doubleArr, doubleArrCp)
74+
for (e <- doubleArrCp) {
75+
hashState = (hashState * 23 + java.lang.Double.doubleToRawLongBits(e) % hashMod) % hashMod
76+
}
77+
78+
@main def mainArr8(): Unit =
79+
genericCopy[Any](intDoubleArr, intDoubleArrCp)
80+
for (e <- intDoubleArrCp) {
81+
e match {
82+
case i: Int => hashState = (hashState * 23 + i) % hashMod
83+
case d: Double => hashState = (hashState * 23 + java.lang.Double.doubleToRawLongBits(d) % hashMod) % hashMod
84+
case _ => {}
85+
}
86+
}
87+
88+
@main def runChecksumInt(): Unit =
89+
val repeat = 10000
90+
var i = 1
91+
var sum: Long = 0
92+
while i <= repeat do
93+
sum += ArrayTestLib.checksum[Int](intArr)
94+
i += 1
95+
println(sum)
96+
97+
@main def runChecksumInt2(): Unit =
98+
var i = 0
99+
while (i < shortArrInt.length) do {
100+
println(shortArrInt(i) + " : " + shortArrInt(i).##)
101+
i += 1
102+
}
103+
val sum = ArrayTestLib.checksum[Int](shortArrInt)
104+
println(sum)
105+
val sum2 = ArrayTestLib.checksum[Int](shortArrInt)
106+
println(sum2)
107+
108+
@main def runAllArr(): Unit =
109+
val repeat = 1000
110+
var i = 1
111+
while i <= repeat do{
112+
mainArr1()
113+
i += 1
114+
}
115+
i = 1
116+
while i <= repeat do {
117+
mainArr2()
118+
i += 1
119+
}
120+
i = 1
121+
while i <= repeat do {
122+
mainArr3()
123+
i += 1
124+
}
125+
i = 1
126+
while i <= repeat do {
127+
mainArr4()
128+
i += 1
129+
}
130+
i = 1
131+
while i <= repeat do {
132+
mainArr5()
133+
i += 1
134+
}
135+
i = 1
136+
while i <= repeat do {
137+
mainArr6()
138+
i += 1
139+
}
140+
i = 1
141+
while i <= repeat do {
142+
mainArr7()
143+
i += 1
144+
}
145+
i = 1
146+
while i <= repeat do {
147+
mainArr8()
148+
i += 1
149+
}
150+
println(hashState)
151+
152+
@main def runInt(): Unit =
153+
val repeat = 10000
154+
var i = 1
155+
while i <= repeat do
156+
ArrayTestLib.copy[Int](intArr, intArrCp)
157+
i += 1
158+
159+
@main def runMixed(): Unit =
160+
val repeat = 20000
161+
var i = 1
162+
var is = 0
163+
var anys = 0
164+
var ds = 0
165+
var elses = 0
166+
while i <= repeat do
167+
val n = rng.nextInt(4)
168+
if (n == 0) {
169+
ArrayTestLib.copy[Int](intArr, intArrCp)
170+
is += 1
171+
} else if (n == 1) {
172+
ArrayTestLib.copy[Any](objArr, anyArrCp)
173+
anys += 1
174+
} else if (n == 2) {
175+
ArrayTestLib.copy[Double](doubleArr, doubleArrCp)
176+
ds += 1
177+
} else {
178+
ArrayTestLib.copy[Any](intDoubleArr, intDoubleArrCp)
179+
elses +=1
180+
}
181+
i += 1
182+
println(System.nanoTime())
183+
i = 1
184+
is = 0
185+
anys = 0
186+
ds = 0
187+
elses = 0
188+
while i <= repeat do
189+
val n = rng.nextInt(4)
190+
if (n == 0) {
191+
ArrayTestLib.copy[Int](intArr, intArrCp)
192+
is += 1
193+
} else if (n == 1) {
194+
ArrayTestLib.copy[Any](objArr, anyArrCp)
195+
anys += 1
196+
} else if (n == 2) {
197+
ArrayTestLib.copy[Double](doubleArr, doubleArrCp)
198+
ds += 1
199+
} else {
200+
ArrayTestLib.copy[Any](intDoubleArr, intDoubleArrCp)
201+
elses +=1
202+
}
203+
i += 1
204+
println(is)
205+
println(anys)
206+
println(ds)
207+
println(elses)
208+
println(System.nanoTime())
209+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package bcGen.Arrays
2+
3+
object ArrayTestLib {
4+
def copy[T](src: Array[T], dst: Array[T]): Unit = {
5+
var idx = 0
6+
while (idx < src.length) {
7+
dst(idx) = src(idx)
8+
idx += 1
9+
}
10+
()
11+
}
12+
13+
def checksum[T](array: Array[T]): Int = {
14+
var sum = 0
15+
var i = 0
16+
while (i < array.length) {
17+
sum += array(i).##
18+
i += 1
19+
}
20+
sum
21+
}
22+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package bcGen.Classes
2+
3+
case class MapEntry[K, V](k: K, v: V, var next: MapEntry[K, V]):
4+
???
5+
6+
class Map[K, V]:
7+
var head: MapEntry[K, V] = null
8+
9+
def insert(k: K, v: V): Unit =
10+
???
11+
12+
def get(k: K): V =
13+
???
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package bcGen.Classes
2+
3+
class Outer1[T](initOuterT: T) {
4+
val outer1T : T = initOuterT
5+
class Inner1[U](initInner1U: U, initInner1T: T) {
6+
val inner1U : U = initInner1U
7+
val inner1T : T = initInner1T
8+
class Inner2_0[V](initInner2V: V) extends Pair[T, U](outer1T, inner1U) {
9+
val inner2_0V : V = initInner2V
10+
def foo(x: T, y: U, z: V): String = s"Outer1: $x, Inner1: $y, Inner2: $z"
11+
def bar(): String = s"Outer1: $outer1T, Inner1: $inner1U, Inner2: $inner2_0V"
12+
}
13+
class Inner2_1[V] {
14+
def foo(x: T, y: U, z: V): String = s"Outer1: $x, Inner1: $y, Inner2: $z"
15+
}
16+
}
17+
class Inner1_1[U] {
18+
class Inner2_0[V] {
19+
def foo(x: T, y: U, z: V): String = s"Outer1: $x, Inner1_1: $y, Inner2: $z"
20+
}
21+
class Inner2_1[V] {
22+
def foo(x: T, y: U, z: V): String = s"Outer1: $x, Inner1_1: $y, Inner2: $z"
23+
}
24+
}
25+
}
26+
27+
object testOuters {
28+
val intOuter1 = new Outer1[Int](42)
29+
val refInner1 = new intOuter1.Inner1[String]("Hello", intOuter1.outer1T)
30+
val doubleInner2_0 = new refInner1.Inner2_0[Double](3.14)
31+
@main def testOuter1(): Unit = {
32+
println(doubleInner2_0.foo(41, "World", 2.71))
33+
}
34+
35+
@main def testOuter2(): Unit = {
36+
println(doubleInner2_0.bar())
37+
}
38+
}

0 commit comments

Comments
 (0)