JS: provide overflow behaviour for int binary operations (see KT-7733)

This commit is contained in:
Alexey Andreev
2016-09-19 15:13:28 +03:00
parent 24d5bdd62c
commit 446c4c0a33
11 changed files with 73 additions and 14 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
package foo
// CHECK_CONTAINS_NO_CALLS: multiplyInline
// CHECK_CONTAINS_NO_CALLS: multiplyInline except=imul
// CHECK_NOT_CALLED: runNoinline
internal inline fun multiply(a: Int, b: Int) = a * b
+1 -1
View File
@@ -1,6 +1,6 @@
package foo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo except=imul
internal inline fun inline1(a: Int): Int {
return a
@@ -1,6 +1,6 @@
package foo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo except=imul
internal inline fun inline1(a: Int): Int {
return a
+1 -1
View File
@@ -1,6 +1,6 @@
package foo
// CHECK_CONTAINS_NO_CALLS: multiplyNoInline
// CHECK_CONTAINS_NO_CALLS: multiplyNoInline except=imul
internal inline fun multiply(a: Int, b: Int): Int {
return a * b
@@ -1,6 +1,6 @@
package foo
// CHECK_CONTAINS_NO_CALLS: maxBySquare
// CHECK_CONTAINS_NO_CALLS: maxBySquare except=imul
internal data class Result(var value: Int = 0, var invocationCount: Int = 0)
@@ -1,6 +1,6 @@
package foo
// CHECK_CONTAINS_NO_CALLS: test
// CHECK_CONTAINS_NO_CALLS: test except=imul
// CHECK_VARS_COUNT: function=test count=0
// A copy of stdlib run function.
+21
View File
@@ -0,0 +1,21 @@
package foo
fun bigValue() = 0x7FFFFFFC
fun mediumValue() = 0x12345
fun box(): String {
var v = bigValue() + 1
if (v != 0x7FFFFFFD) return "fail1: $v"
v = bigValue() + 8
if (v != -0x7FFFFFFC) return "fail2: $v"
v = mediumValue() * 0x23456
if (v != -2112496338) return "fail3: $v"
v = bigValue() * bigValue()
if (v != 16) return "fail4: $v"
return "OK"
}
+7
View File
@@ -313,4 +313,11 @@
Kotlin.kotlinModuleMetadata = function (abiVersion, moduleName, data) {
};
Kotlin.imul = Math.imul || function (a, b) {
var ah = (a >>> 16) & 0xffff;
var al = a & 0xffff;
var bh = (b >>> 16) & 0xffff;
var bl = b & 0xffff;
return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) | 0);
};
})();