JS backend: tests for KT-6401 JS: wrong result for code with many spread operator
This commit is contained in:
@@ -2,15 +2,17 @@ package foo
|
|||||||
|
|
||||||
var global: String = ""
|
var global: String = ""
|
||||||
|
|
||||||
fun bar(s: String, value: Int): Int {
|
fun bar<T>(s: String, value: T): T {
|
||||||
global += s
|
global += s
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
fun baz(vararg args: Int): String {
|
fun baz<T>(vararg args: T): String {
|
||||||
return "baz: ${args.size}"
|
return "baz: ${args.size}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun idVarArg<T>(vararg a: T) = a
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
baz(bar("A", 10), try { global += "B"; 20} finally {})
|
baz(bar("A", 10), try { global += "B"; 20} finally {})
|
||||||
assertEquals("AB", global)
|
assertEquals("AB", global)
|
||||||
@@ -19,5 +21,9 @@ fun box(): String {
|
|||||||
baz(bar("A", 10), 30, if (true) { while(false){}; global+= "B"; 20 } else { 50 })
|
baz(bar("A", 10), 30, if (true) { while(false){}; global+= "B"; 20 } else { 50 })
|
||||||
assertEquals("AB", global)
|
assertEquals("AB", global)
|
||||||
|
|
||||||
|
global = ""
|
||||||
|
assertEquals("baz: 4", baz(bar("A", 1), *try {bar("B", array(2, 3))} catch(e: Exception) { bar("C", array(4, 5))}, bar("D", 6)))
|
||||||
|
assertEquals("ABD", global)
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
@@ -34,6 +34,18 @@ fun spreadInObjectMethodCall(size: Int, sum: Int, vararg args: Int) = obj.test(s
|
|||||||
|
|
||||||
fun testVarargWithFunLit(vararg args: Int, f: (a: IntArray) -> Boolean): Boolean = f(args)
|
fun testVarargWithFunLit(vararg args: Int, f: (a: IntArray) -> Boolean): Boolean = f(args)
|
||||||
|
|
||||||
|
fun idVarArgs<T>(vararg a: T) = a
|
||||||
|
|
||||||
|
fun idArrayVarArg<T>(vararg a: Array<T>) = a
|
||||||
|
|
||||||
|
fun sumFunValuesOnParameters(x: Int, y: Int, vararg a: Int, f: (Int) -> Int): Int {
|
||||||
|
var result = f(x) + f(y)
|
||||||
|
for(u in a) {
|
||||||
|
result += f(u)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
if (!testSize(0))
|
if (!testSize(0))
|
||||||
return "wrong vararg size when call function without args"
|
return "wrong vararg size when call function without args"
|
||||||
@@ -65,5 +77,31 @@ fun box(): String {
|
|||||||
if (!testVarargWithFunLit(1, 2, 3) { args -> args.size == 3 })
|
if (!testVarargWithFunLit(1, 2, 3) { args -> args.size == 3 })
|
||||||
return "failed when call function with vararg and fun literal"
|
return "failed when call function with vararg and fun literal"
|
||||||
|
|
||||||
|
val a = array(1, 2, 3)
|
||||||
|
val b = array(4, 5)
|
||||||
|
|
||||||
|
assertEquals(5, array(*a, *b).size)
|
||||||
|
assertEquals(8, array(10, *a, 20, *b, 30).size)
|
||||||
|
|
||||||
|
assertEquals(5, idVarArgs(*a, *b).size)
|
||||||
|
assertEquals(8, idVarArgs(10, *a, 20, *b, 30).size)
|
||||||
|
|
||||||
|
assertEquals(9, array(1, *a, *a, 1, 2).size)
|
||||||
|
assertEquals(9, idVarArgs(1, *a, *a, 1, 2).size)
|
||||||
|
|
||||||
|
assertEquals(9, array(1, *a, *array(1, 2, 3), 1, 2).size)
|
||||||
|
assertEquals(9, idVarArgs(1, *a, *array(1, 2, 3), 1, 2).size)
|
||||||
|
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, 5, 6, 7, 8, 9) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7, 8, 9)) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, *intArray(5, 6, 7, 8, 9)) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7), 8, 9) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5), *intArray(6, 7, 8, 9)) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4), 5, 6, *intArray(7, 8, 9)) { 2*it })
|
||||||
|
|
||||||
|
assertEquals(2, idArrayVarArg(array(1), *array(array(2, 3, 4))).size())
|
||||||
|
assertEquals(3, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6))).size())
|
||||||
|
assertEquals(6, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6)), array(7), *array(array(8, 9), array(10, 11))).size())
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,9 @@ fun paramCount(vararg a: Int): Int = noImpl
|
|||||||
native("paramCount")
|
native("paramCount")
|
||||||
fun anotherParamCount(vararg a: Int): Int = noImpl
|
fun anotherParamCount(vararg a: Int): Int = noImpl
|
||||||
|
|
||||||
|
native("paramCount")
|
||||||
|
fun genericParamCount<T>(vararg a: T): Int = noImpl
|
||||||
|
|
||||||
// test spread operator
|
// test spread operator
|
||||||
fun count(vararg a: Int) = paramCount(*a)
|
fun count(vararg a: Int) = paramCount(*a)
|
||||||
|
|
||||||
@@ -56,6 +59,15 @@ fun testCallOrder(vararg args: Int) =
|
|||||||
Bar(args.size, 0).test(1, 1, *args) && Bar(args.size, 2).test(3, 1, *args) &&
|
Bar(args.size, 0).test(1, 1, *args) && Bar(args.size, 2).test(3, 1, *args) &&
|
||||||
!Bar.hasOrderProblem
|
!Bar.hasOrderProblem
|
||||||
|
|
||||||
|
native
|
||||||
|
fun sumOfParameters(x: Int, y: Int, vararg a: Int): Int = noImpl
|
||||||
|
|
||||||
|
native
|
||||||
|
fun sumFunValuesOnParameters(x: Int, y: Int, vararg a: Int, f: (Int) -> Int): Int = noImpl
|
||||||
|
|
||||||
|
native
|
||||||
|
fun idArrayVarArg<T>(vararg a: Array<T>): Array<T> = noImpl
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
if (paramCount() != 0)
|
if (paramCount() != 0)
|
||||||
return "failed when call native function without args"
|
return "failed when call native function without args"
|
||||||
@@ -115,5 +127,23 @@ fun box(): String {
|
|||||||
if (!(baz!!)?.test(0, 1, 1))
|
if (!(baz!!)?.test(0, 1, 1))
|
||||||
return "failed when combined SureCall and SafeCall, maybe we lost cached expression"
|
return "failed when combined SureCall and SafeCall, maybe we lost cached expression"
|
||||||
|
|
||||||
|
val a = array(1, 2)
|
||||||
|
assertEquals(2, genericParamCount(*a))
|
||||||
|
assertEquals(7, genericParamCount(1, *a, *a, 1, 2))
|
||||||
|
|
||||||
|
assertEquals(45, sumOfParameters(1, 2, 3, 4, 5, 6, 7, 8, 9))
|
||||||
|
assertEquals(45, sumOfParameters(1, 2, *intArray(3, 4, 5, 6, 7, 8, 9)))
|
||||||
|
assertEquals(45, sumOfParameters(1, 2, 3, 4, *intArray(5, 6, 7, 8, 9)))
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, 5, 6, 7, 8, 9) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7, 8, 9)) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, *intArray(5, 6, 7, 8, 9)) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7), 8, 9) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5), *intArray(6, 7, 8, 9)) { 2*it })
|
||||||
|
assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4), 5, 6, *intArray(7, 8, 9)) { 2*it })
|
||||||
|
|
||||||
|
assertEquals(2, idArrayVarArg(array(1), *array(array(2, 3, 4))).size())
|
||||||
|
assertEquals(3, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6))).size())
|
||||||
|
assertEquals(6, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6)), array(7), *array(array(8, 9), array(10, 11))).size())
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,4 +41,29 @@ function testNativeVarargWithFunLit(/* args, f */) {
|
|||||||
var args = Array.prototype.slice.call(arguments, 0, arguments.length - 1);
|
var args = Array.prototype.slice.call(arguments, 0, arguments.length - 1);
|
||||||
var f = arguments[arguments.length - 1];
|
var f = arguments[arguments.length - 1];
|
||||||
return typeof f === "function" && f(args);
|
return typeof f === "function" && f(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sumOfParameters() {
|
||||||
|
var size = arguments.length;
|
||||||
|
var result = 0;
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
result += arguments[i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sumFunValuesOnParameters() {
|
||||||
|
var size = arguments.length - 1;
|
||||||
|
var f = arguments[arguments.length - 1];
|
||||||
|
var result = 0;
|
||||||
|
for (var i = 0; i < size; i++) {
|
||||||
|
var u = arguments[i];
|
||||||
|
result += f(u);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function idArrayVarArg() {
|
||||||
|
var args = Array.prototype.slice.call(arguments, 0, arguments.length);
|
||||||
|
return args;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user