JS IR: Long
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
index 592fc5b..2d7deb9 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIntrinsics.kt
@@ -14,7 +14,9 @@
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
import org.jetbrains.kotlin.js.resolve.JsPlatform.builtIns
+import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
+import org.jetbrains.kotlin.psi2ir.findSingleFunction
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.KotlinTypeFactory
import org.jetbrains.kotlin.types.Variance
@@ -96,8 +98,10 @@
val jsNumberToDouble = getInternalFunction("numberToDouble")
val jsNumberToInt = getInternalFunction("numberToInt")
val jsNumberToShort = getInternalFunction("numberToShort")
+ val jsNumberToLong = getInternalFunction("numberToLong")
val jsToByte = getInternalFunction("toByte")
val jsToShort = getInternalFunction("toShort")
+ val jsToLong = getInternalFunction("toLong")
// Other:
@@ -112,6 +116,9 @@
val jsEquals = getInternalFunction("equals")
+ val longConstructor= context.symbolTable.referenceConstructor(context.getClass(FqName("kotlin.Long")).constructors.single())
+ val longToDouble= context.symbolTable.referenceSimpleFunction(context.getClass(FqName("kotlin.Long")).unsubstitutedMemberScope.findSingleFunction(Name.identifier("toDouble")))
+ val longToFloat= context.symbolTable.referenceSimpleFunction(context.getClass(FqName("kotlin.Long")).unsubstitutedMemberScope.findSingleFunction(Name.identifier("toFloat")))
// Helpers:
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt
index e206d69..9316950 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/IntrinsicifyCallsLowering.kt
@@ -17,9 +17,7 @@
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
-import org.jetbrains.kotlin.ir.expressions.IrCall
-import org.jetbrains.kotlin.ir.expressions.IrExpression
-import org.jetbrains.kotlin.ir.expressions.copyTypeArgumentsFrom
+import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
@@ -83,7 +81,7 @@
}
// Conversion rules are ported from NumberAndCharConversionFIF
- // TODO: Add Char, Long and Number conversions
+ // TODO: Add Char and Number conversions
irBuiltIns.byteType.let {
op(it, ConversionNames.TO_BYTE, intrinsics.jsAsIs)
@@ -91,6 +89,7 @@
op(it, ConversionNames.TO_FLOAT, intrinsics.jsAsIs)
op(it, ConversionNames.TO_INT, intrinsics.jsAsIs)
op(it, ConversionNames.TO_SHORT, intrinsics.jsAsIs)
+ op(it, ConversionNames.TO_LONG, intrinsics.jsToLong)
}
for (type in listOf(irBuiltIns.floatType, irBuiltIns.doubleType)) {
@@ -99,6 +98,7 @@
op(type, ConversionNames.TO_FLOAT, intrinsics.jsAsIs)
op(type, ConversionNames.TO_INT, intrinsics.jsNumberToInt)
op(type, ConversionNames.TO_SHORT, intrinsics.jsNumberToShort)
+ op(type, ConversionNames.TO_LONG, intrinsics.jsNumberToLong)
}
irBuiltIns.intType.let {
@@ -107,6 +107,7 @@
op(it, ConversionNames.TO_FLOAT, intrinsics.jsAsIs)
op(it, ConversionNames.TO_INT, intrinsics.jsAsIs)
op(it, ConversionNames.TO_SHORT, intrinsics.jsToShort)
+ op(it, ConversionNames.TO_LONG, intrinsics.jsToLong)
}
irBuiltIns.shortType.let {
@@ -115,13 +116,14 @@
op(it, ConversionNames.TO_FLOAT, intrinsics.jsAsIs)
op(it, ConversionNames.TO_INT, intrinsics.jsAsIs)
op(it, ConversionNames.TO_SHORT, intrinsics.jsAsIs)
+ op(it, ConversionNames.TO_LONG, intrinsics.jsToLong)
}
}
symbolToIrFunction.run {
add(irBuiltIns.eqeqeqSymbol, intrinsics.jsEqeqeq)
// TODO: implement it a right way
- add(irBuiltIns.eqeqSymbol, intrinsics.jsEqeq)
+ add(irBuiltIns.eqeqSymbol, intrinsics.jsEquals.owner)
// TODO: implement it a right way
add(irBuiltIns.ieee754equalsFunByOperandType, intrinsics.jsEqeqeq)
@@ -189,12 +191,40 @@
override fun lower(irFile: IrFile) {
irFile.transform(object : IrElementTransformerVoid() {
+ override fun <T> visitConst(expression: IrConst<T>): IrExpression {
+ if (expression.kind is IrConstKind.Long) {
+ val value = IrConstKind.Long.valueOf(expression)
+ val high = (value shr 32).toInt()
+ val low = value.toInt()
+ return IrCallImpl(
+ expression.startOffset,
+ expression.endOffset,
+ context.intrinsics.longConstructor
+ ).apply {
+ putValueArgument(0, JsIrBuilder.buildInt(context.irBuiltIns.int, low))
+ putValueArgument(1, JsIrBuilder.buildInt(context.irBuiltIns.int, high))
+ }
+ }
+ return super.visitConst(expression)
+ }
+
override fun visitCall(expression: IrCall): IrExpression {
val call = super.visitCall(expression)
if (call is IrCall) {
val symbol = call.symbol
+ if (symbol == irBuiltIns.eqeqSymbol) {
+ val lhs = call.getValueArgument(0)!!
+ val rhs = call.getValueArgument(1)!!
+
+ return when (translateEquals(lhs.type, rhs.type)) {
+ is IdentityOperator -> irCall(call, intrinsics.jsEqeqeq.symbol)
+ is EqualityOperator -> irCall(call, intrinsics.jsEqeq.symbol)
+ else -> irCall(call, intrinsics.jsEquals)
+ }
+ }
+
symbolToIrFunction[symbol]?.let {
return irCall(call, it.symbol)
}
@@ -210,6 +240,43 @@
return call.dispatchReceiver!!
}
// TODO: don't apply intrinsics when type of receiver or argument is Long
+ if (call.valueArgumentsCount == 1) {
+ call.getValueArgument(0)?.let { arg ->
+ if (arg.type.isLong()) {
+ call.dispatchReceiver?.type?.let {
+ if (it.isDouble()) {
+ call.putValueArgument(0, IrCallImpl(
+ call.startOffset,
+ call.endOffset,
+ context.intrinsics.longToDouble
+ ).apply {
+ dispatchReceiver = arg
+ })
+ } else if (it.isFloat()) {
+ call.putValueArgument(0, IrCallImpl(
+ call.startOffset,
+ call.endOffset,
+ context.intrinsics.longToFloat
+ ).apply {
+ dispatchReceiver = arg
+ })
+ }
+ }
+ }
+ }
+ }
+
+
+ if (call.valueArgumentsCount == 1 && call.getValueArgument(0)!!.type.isLong()) {
+ call.dispatchReceiver = IrCallImpl(
+ call.startOffset,
+ call.endOffset,
+ intrinsics.jsNumberToLong
+ ).apply {
+ putValueArgument(0, call.dispatchReceiver)
+ }
+ return call
+ }
return irCall(call, it, dispatchReceiverAsFirstArgument = true)
}
@@ -309,6 +376,7 @@
class RuntimeOrMethodCall : EqualityLoweringType()
fun translateEquals(lhs: IrType, rhs: IrType): EqualityLoweringType = when {
+ lhs.isNullableNothing() || lhs.isDynamic() -> EqualityOperator()
lhs.isJsNumber() -> translateEqualsForJsNumber(rhs)
lhs.isNullableJsNumber() -> translateEqualsForNullableJsNumber(rhs)
lhs.isLong() -> translateEqualsForLong(rhs)
@@ -434,7 +502,11 @@
put(from, to)
}
-private fun <K> MutableMap<K, (IrCall) -> IrExpression>.addWithPredicate(from: K, predicate: (IrCall) -> Boolean, action: (IrCall) -> IrExpression) {
+private fun <K> MutableMap<K, (IrCall) -> IrExpression>.addWithPredicate(
+ from: K,
+ predicate: (IrCall) -> Boolean,
+ action: (IrCall) -> IrExpression
+) {
put(from) { call: IrCall -> select({ predicate(call) }, { action(call) }, { call }) }
}
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt
index a1e27e9..dbf9566 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrElementToJsExpressionTransformer.kt
@@ -82,8 +82,8 @@
is IrConstKind.Byte -> JsIntLiteral(kind.valueOf(expression).toInt())
is IrConstKind.Short -> JsIntLiteral(kind.valueOf(expression).toInt())
is IrConstKind.Int -> JsIntLiteral(kind.valueOf(expression))
- is IrConstKind.Long,
- is IrConstKind.Char -> super.visitConst(expression, context)
+ is IrConstKind.Long -> TODO("Long const")
+ is IrConstKind.Char -> TODO("Char const")
is IrConstKind.Float -> JsDoubleLiteral(kind.valueOf(expression).toDouble())
is IrConstKind.Double -> JsDoubleLiteral(kind.valueOf(expression))
}
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/OperatorNames.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/OperatorNames.kt
index 7248a0c..a17e103 100644
--- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/OperatorNames.kt
+++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/OperatorNames.kt
@@ -26,7 +26,7 @@
val SHL = Name.identifier("shl")
val SHR = Name.identifier("shr")
- val SHRU = Name.identifier("shru")
+ val SHRU = Name.identifier("ushr")
val NOT = OperatorNameConventions.NOT
diff --git a/compiler/testData/codegen/box/argumentOrder/captured.kt b/compiler/testData/codegen/box/argumentOrder/captured.kt
index c5e1d0b..0dfb6b5 100644
--- a/compiler/testData/codegen/box/argumentOrder/captured.kt
+++ b/compiler/testData/codegen/box/argumentOrder/captured.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
fun box(): String {
var invokeOrder = "";
val expectedResult = "0_1_9"
diff --git a/compiler/testData/codegen/box/argumentOrder/capturedInExtension.kt b/compiler/testData/codegen/box/argumentOrder/capturedInExtension.kt
index 642a70f..ce31df7 100644
--- a/compiler/testData/codegen/box/argumentOrder/capturedInExtension.kt
+++ b/compiler/testData/codegen/box/argumentOrder/capturedInExtension.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
fun box(): String {
var invokeOrder = "";
val expectedResult = "1_0_1_9"
diff --git a/compiler/testData/codegen/box/argumentOrder/extension.kt b/compiler/testData/codegen/box/argumentOrder/extension.kt
index 454da92..c38a817 100644
--- a/compiler/testData/codegen/box/argumentOrder/extension.kt
+++ b/compiler/testData/codegen/box/argumentOrder/extension.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
fun box(): String {
var invokeOrder = "";
val expectedResult = "1_0_1_L"
diff --git a/compiler/testData/codegen/box/argumentOrder/extensionInClass.kt b/compiler/testData/codegen/box/argumentOrder/extensionInClass.kt
index 25397bc..ba4ec46 100644
--- a/compiler/testData/codegen/box/argumentOrder/extensionInClass.kt
+++ b/compiler/testData/codegen/box/argumentOrder/extensionInClass.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
fun box(): String {
return Z().test()
}
diff --git a/compiler/testData/codegen/box/boxingOptimization/boxedPrimitivesAreEqual.kt b/compiler/testData/codegen/box/boxingOptimization/boxedPrimitivesAreEqual.kt
index 3f6d867..2bd8eda 100644
--- a/compiler/testData/codegen/box/boxingOptimization/boxedPrimitivesAreEqual.kt
+++ b/compiler/testData/codegen/box/boxingOptimization/boxedPrimitivesAreEqual.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
inline fun eq(a: Any, b: Any) = a == b
inline fun ne(a: Any, b: Any) = a != b
diff --git a/compiler/testData/codegen/box/callableReference/property/simpleMutableTopLevel.kt b/compiler/testData/codegen/box/callableReference/property/simpleMutableTopLevel.kt
index bd180e2..25d5147 100644
--- a/compiler/testData/codegen/box/callableReference/property/simpleMutableTopLevel.kt
+++ b/compiler/testData/codegen/box/callableReference/property/simpleMutableTopLevel.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
data class Box(val value: String)
var pr = Box("first")
diff --git a/compiler/testData/codegen/box/callableReference/property/simpleTopLevel.kt b/compiler/testData/codegen/box/callableReference/property/simpleTopLevel.kt
index 6c1f378..a2ef382 100644
--- a/compiler/testData/codegen/box/callableReference/property/simpleTopLevel.kt
+++ b/compiler/testData/codegen/box/callableReference/property/simpleTopLevel.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
data class Box(val value: String)
val foo = Box("lol")
diff --git a/compiler/testData/codegen/box/casts/isNullablePrimitive.kt b/compiler/testData/codegen/box/casts/isNullablePrimitive.kt
index f8baca9..f2b407c 100644
--- a/compiler/testData/codegen/box/casts/isNullablePrimitive.kt
+++ b/compiler/testData/codegen/box/casts/isNullablePrimitive.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
fun box(): String {
val n: Any? = null
diff --git a/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/parenthesizedExpressionCast.kt b/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/parenthesizedExpressionCast.kt
index 361c7db..a70372d 100644
--- a/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/parenthesizedExpressionCast.kt
+++ b/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/parenthesizedExpressionCast.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class Box<T>(val value: T)
fun box() : String {
diff --git a/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/superConstructor.kt b/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/superConstructor.kt
index b5a83ff..f896fd0 100644
--- a/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/superConstructor.kt
+++ b/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/superConstructor.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
open class Base<T>(val value: T)
class Box(): Base<Long>(-1)
diff --git a/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/unaryExpressionCast.kt b/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/unaryExpressionCast.kt
index 9729307..6f253b6 100644
--- a/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/unaryExpressionCast.kt
+++ b/compiler/testData/codegen/box/casts/literalExpressionAsGenericArgument/unaryExpressionCast.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class Box<T>(val value: T)
fun box() : String {
diff --git a/compiler/testData/codegen/box/classes/kt6816.kt b/compiler/testData/codegen/box/classes/kt6816.kt
index bc587e5..ed081c6 100644
--- a/compiler/testData/codegen/box/classes/kt6816.kt
+++ b/compiler/testData/codegen/box/classes/kt6816.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
public class CalculatorConstants(
val id: Long = 0,
val detour: Double = 0.0,
diff --git a/compiler/testData/codegen/box/closures/capturedVarsOptimization/kt17200.kt b/compiler/testData/codegen/box/closures/capturedVarsOptimization/kt17200.kt
index f503a34..0d223fc 100644
--- a/compiler/testData/codegen/box/closures/capturedVarsOptimization/kt17200.kt
+++ b/compiler/testData/codegen/box/closures/capturedVarsOptimization/kt17200.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
inline fun inlineCall(action: () -> Unit) {
action()
}
diff --git a/compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt b/compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt
index 0ee17ba..d95ddb8 100644
--- a/compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt
+++ b/compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// LANGUAGE_VERSION: 1.0
data class Foo(val s: String)
diff --git a/compiler/testData/codegen/box/constants/long.kt b/compiler/testData/codegen/box/constants/long.kt
index 62b962d..7fa2eaf 100644
--- a/compiler/testData/codegen/box/constants/long.kt
+++ b/compiler/testData/codegen/box/constants/long.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
if (1L != 1.toLong()) return "fail 1"
if (0x1L != 0x1.toLong()) return "fail 2"
diff --git a/compiler/testData/codegen/box/controlStructures/breakContinueInExpressions/popSizes.kt b/compiler/testData/codegen/box/controlStructures/breakContinueInExpressions/popSizes.kt
index 97af15a..8c736e5 100644
--- a/compiler/testData/codegen/box/controlStructures/breakContinueInExpressions/popSizes.kt
+++ b/compiler/testData/codegen/box/controlStructures/breakContinueInExpressions/popSizes.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun foo(x: Long, y: Int, z: Double, s: String) {}
fun box(): String {
diff --git a/compiler/testData/codegen/box/controlStructures/kt1441.kt b/compiler/testData/codegen/box/controlStructures/kt1441.kt
index 27c70f6..7e50990 100644
--- a/compiler/testData/codegen/box/controlStructures/kt1441.kt
+++ b/compiler/testData/codegen/box/controlStructures/kt1441.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class Foo {
var rnd = 10
diff --git a/compiler/testData/codegen/box/controlStructures/kt17590_long.kt b/compiler/testData/codegen/box/controlStructures/kt17590_long.kt
index 8cd7e1b..521c7fd 100644
--- a/compiler/testData/codegen/box/controlStructures/kt17590_long.kt
+++ b/compiler/testData/codegen/box/controlStructures/kt17590_long.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun foo(x: Any?, y: Any?) = 0L
inline fun test(value: Any?): Long {
diff --git a/compiler/testData/codegen/box/dataClasses/genericParam.kt b/compiler/testData/codegen/box/dataClasses/genericParam.kt
index aabcb57..5bf58f5 100644
--- a/compiler/testData/codegen/box/dataClasses/genericParam.kt
+++ b/compiler/testData/codegen/box/dataClasses/genericParam.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
data class A<T>(val x: T)
fun box(): String {
diff --git a/compiler/testData/codegen/box/dataClasses/hashCode/long.kt b/compiler/testData/codegen/box/dataClasses/hashCode/long.kt
index d55bdcc..067593c 100644
--- a/compiler/testData/codegen/box/dataClasses/hashCode/long.kt
+++ b/compiler/testData/codegen/box/dataClasses/hashCode/long.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
data class A(val a: Long)
fun box() : String {
diff --git a/compiler/testData/codegen/box/dataClasses/toString/genericParam.kt b/compiler/testData/codegen/box/dataClasses/toString/genericParam.kt
index b238f20..794bad5 100644
--- a/compiler/testData/codegen/box/dataClasses/toString/genericParam.kt
+++ b/compiler/testData/codegen/box/dataClasses/toString/genericParam.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
data class A<T>(val x: T)
fun box(): String {
diff --git a/compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt b/compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt
index 443114d..7b3aebe 100644
--- a/compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt
+++ b/compiler/testData/codegen/box/defaultArguments/function/mixingNamedAndPositioned.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun foo(a: String = "Companion", b: Int = 1, c: Long = 2): String {
return "$a $b $c"
}
diff --git a/compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt b/compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt
index 7afae41..f047ec4 100644
--- a/compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt
+++ b/compiler/testData/codegen/box/delegatedProperty/genericSetValueViaSyntheticAccessor.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: Var.kt
package pvar
diff --git a/compiler/testData/codegen/box/elvis/primitive.kt b/compiler/testData/codegen/box/elvis/primitive.kt
index 946ed09..bd3edd1 100644
--- a/compiler/testData/codegen/box/elvis/primitive.kt
+++ b/compiler/testData/codegen/box/elvis/primitive.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
if ((42 ?: 239) != 42) return "Fail Int"
if ((42.toLong() ?: 239.toLong()) != 42.toLong()) return "Fail Long"
diff --git a/compiler/testData/codegen/box/exclExcl/primitive.kt b/compiler/testData/codegen/box/exclExcl/primitive.kt
index fd4397a..d781575 100644
--- a/compiler/testData/codegen/box/exclExcl/primitive.kt
+++ b/compiler/testData/codegen/box/exclExcl/primitive.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
42!!
42.toLong()!!
diff --git a/compiler/testData/codegen/box/extensionFunctions/kt5467.kt b/compiler/testData/codegen/box/extensionFunctions/kt5467.kt
index 9cadba8..5d5ab04 100644
--- a/compiler/testData/codegen/box/extensionFunctions/kt5467.kt
+++ b/compiler/testData/codegen/box/extensionFunctions/kt5467.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun String.foo() : String {
fun Int.bar() : String {
fun Long.baz() : String {
diff --git a/compiler/testData/codegen/box/extensionProperties/inClassLongTypeInReceiver.kt b/compiler/testData/codegen/box/extensionProperties/inClassLongTypeInReceiver.kt
index 401ffb9..f4a3c12 100644
--- a/compiler/testData/codegen/box/extensionProperties/inClassLongTypeInReceiver.kt
+++ b/compiler/testData/codegen/box/extensionProperties/inClassLongTypeInReceiver.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class Test {
var doubleStorage = "fail"
var longStorage = "fail"
diff --git a/compiler/testData/codegen/box/extensionProperties/topLevelLongTypeInReceiver.kt b/compiler/testData/codegen/box/extensionProperties/topLevelLongTypeInReceiver.kt
index 96b266e..b002884 100644
--- a/compiler/testData/codegen/box/extensionProperties/topLevelLongTypeInReceiver.kt
+++ b/compiler/testData/codegen/box/extensionProperties/topLevelLongTypeInReceiver.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
var fooStorage = "Fail"
var barStorage = "Fail"
diff --git a/compiler/testData/codegen/box/functions/defaultargs2.kt b/compiler/testData/codegen/box/functions/defaultargs2.kt
index 2f69654..710cc12 100644
--- a/compiler/testData/codegen/box/functions/defaultargs2.kt
+++ b/compiler/testData/codegen/box/functions/defaultargs2.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class T4(
val c1: Boolean,
val c2: Boolean,
diff --git a/compiler/testData/codegen/box/functions/kt873.kt b/compiler/testData/codegen/box/functions/kt873.kt
index 06f14e0..21c3dcd 100644
--- a/compiler/testData/codegen/box/functions/kt873.kt
+++ b/compiler/testData/codegen/box/functions/kt873.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box() : String {
val fps : Double = 1.toDouble()
var mspf : Long
diff --git a/compiler/testData/codegen/box/ieee754/smartCastToDifferentTypesWithNumericPromotion_properIeeeComparisons.kt b/compiler/testData/codegen/box/ieee754/smartCastToDifferentTypesWithNumericPromotion_properIeeeComparisons.kt
index ff92b37..5f0ad6a 100644
--- a/compiler/testData/codegen/box/ieee754/smartCastToDifferentTypesWithNumericPromotion_properIeeeComparisons.kt
+++ b/compiler/testData/codegen/box/ieee754/smartCastToDifferentTypesWithNumericPromotion_properIeeeComparisons.kt
@@ -1,5 +1,4 @@
// !LANGUAGE: +ProperIeee754Comparisons
-// IGNORE_BACKEND: JS_IR
fun eqDI(x: Any?, y: Any?) = x is Double? && y is Int? && x == y
fun eqDL(x: Any?, y: Any?) = x is Double? && y is Long? && x == y
diff --git a/compiler/testData/codegen/box/ieee754/smartCastToDoubleAndComparableToDouble.kt b/compiler/testData/codegen/box/ieee754/smartCastToDoubleAndComparableToDouble.kt
index 45f641b..f6ad5a1 100644
--- a/compiler/testData/codegen/box/ieee754/smartCastToDoubleAndComparableToDouble.kt
+++ b/compiler/testData/codegen/box/ieee754/smartCastToDoubleAndComparableToDouble.kt
@@ -1,5 +1,4 @@
// !LANGUAGE: +ProperIeee754Comparisons
-// IGNORE_BACKEND: JS_IR
val minus: Any = -0.0
diff --git a/compiler/testData/codegen/box/increment/classWithGetSet.kt b/compiler/testData/codegen/box/increment/classWithGetSet.kt
index 58e07eb..97d2925 100644
--- a/compiler/testData/codegen/box/increment/classWithGetSet.kt
+++ b/compiler/testData/codegen/box/increment/classWithGetSet.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class AByte(var value: Byte) {
operator fun get(i: Int) = value
diff --git a/compiler/testData/codegen/box/increment/extOnLong.kt b/compiler/testData/codegen/box/increment/extOnLong.kt
index 7550ebf..9dce4e9 100644
--- a/compiler/testData/codegen/box/increment/extOnLong.kt
+++ b/compiler/testData/codegen/box/increment/extOnLong.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
operator fun Long.get(i: Int) = this
operator fun Long.set(i: Int, newValue: Long) {}
diff --git a/compiler/testData/codegen/box/increment/genericClassWithGetSet.kt b/compiler/testData/codegen/box/increment/genericClassWithGetSet.kt
index 16eb662..04825a3 100644
--- a/compiler/testData/codegen/box/increment/genericClassWithGetSet.kt
+++ b/compiler/testData/codegen/box/increment/genericClassWithGetSet.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class A<T>(var value: T) {
operator fun get(i: Int) = value
diff --git a/compiler/testData/codegen/box/increment/nullable.kt b/compiler/testData/codegen/box/increment/nullable.kt
index c4f8e62..4802b8a 100644
--- a/compiler/testData/codegen/box/increment/nullable.kt
+++ b/compiler/testData/codegen/box/increment/nullable.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
var aByte: Byte? = 0
var bByte: Byte = 0
diff --git a/compiler/testData/codegen/box/inlineClasses/checkLambdaWithInlineClassesInFunctionalType.kt b/compiler/testData/codegen/box/inlineClasses/checkLambdaWithInlineClassesInFunctionalType.kt
index 6748ef4..73dd0b2 100644
--- a/compiler/testData/codegen/box/inlineClasses/checkLambdaWithInlineClassesInFunctionalType.kt
+++ b/compiler/testData/codegen/box/inlineClasses/checkLambdaWithInlineClassesInFunctionalType.kt
@@ -1,6 +1,5 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
inline class UInt(val value: Int)
inline class ULong(val value: Long)
diff --git a/compiler/testData/codegen/box/innerNested/createNestedClass.kt b/compiler/testData/codegen/box/innerNested/createNestedClass.kt
index 405581b..b5cd0e7 100644
--- a/compiler/testData/codegen/box/innerNested/createNestedClass.kt
+++ b/compiler/testData/codegen/box/innerNested/createNestedClass.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class A {
class B1
class B2(val x: Int)
diff --git a/compiler/testData/codegen/box/innerNested/superConstructorCall/deepInnerHierarchy.kt b/compiler/testData/codegen/box/innerNested/superConstructorCall/deepInnerHierarchy.kt
index b8c2345..03c2959 100644
--- a/compiler/testData/codegen/box/innerNested/superConstructorCall/deepInnerHierarchy.kt
+++ b/compiler/testData/codegen/box/innerNested/superConstructorCall/deepInnerHierarchy.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
open class A(val s: String) {
open inner class B(s: String): A(s)
diff --git a/compiler/testData/codegen/box/instructions/swap/swapRefToSharedVarLong.kt b/compiler/testData/codegen/box/instructions/swap/swapRefToSharedVarLong.kt
index 668c3a4..7340eb1 100644
--- a/compiler/testData/codegen/box/instructions/swap/swapRefToSharedVarLong.kt
+++ b/compiler/testData/codegen/box/instructions/swap/swapRefToSharedVarLong.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
//KT-3042 Attempt to split long or double on the stack excepion
fun box(): String {
diff --git a/compiler/testData/codegen/box/localClasses/localClassCaptureExtensionReceiver.kt b/compiler/testData/codegen/box/localClasses/localClassCaptureExtensionReceiver.kt
index 7ddc3ec..732a25e 100644
--- a/compiler/testData/codegen/box/localClasses/localClassCaptureExtensionReceiver.kt
+++ b/compiler/testData/codegen/box/localClasses/localClassCaptureExtensionReceiver.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
class Outer {
fun String.id(): String {
class Local(unused: Long) {
diff --git a/compiler/testData/codegen/box/multiDecl/forRange/explicitRangeToWithDot/long/MultiDeclForComponentExtensions.kt b/compiler/testData/codegen/box/multiDecl/forRange/explicitRangeToWithDot/long/MultiDeclForComponentExtensions.kt
index c8bc4ce..aed0268 100644
--- a/compiler/testData/codegen/box/multiDecl/forRange/explicitRangeToWithDot/long/MultiDeclForComponentExtensions.kt
+++ b/compiler/testData/codegen/box/multiDecl/forRange/explicitRangeToWithDot/long/MultiDeclForComponentExtensions.kt
@@ -1,3 +1,5 @@
+// IGNORE_BACKEND: JS_IR
+
fun f(l : Long) {
l.rangeTo(l)
}
diff --git a/compiler/testData/codegen/box/operatorConventions/compareTo/comparable.kt b/compiler/testData/codegen/box/operatorConventions/compareTo/comparable.kt
index cc88476..957816c 100644
--- a/compiler/testData/codegen/box/operatorConventions/compareTo/comparable.kt
+++ b/compiler/testData/codegen/box/operatorConventions/compareTo/comparable.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
interface A : Comparable<A>
class B(val x: Int) : A {
diff --git a/compiler/testData/codegen/box/operatorConventions/compareTo/longDouble.kt b/compiler/testData/codegen/box/operatorConventions/compareTo/longDouble.kt
index 4130e81..90e43d4 100644
--- a/compiler/testData/codegen/box/operatorConventions/compareTo/longDouble.kt
+++ b/compiler/testData/codegen/box/operatorConventions/compareTo/longDouble.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun checkLess(x: Long, y: Double) = when {
x >= y -> "Fail $x >= $y"
!(x < y) -> "Fail !($x < $y)"
diff --git a/compiler/testData/codegen/box/operatorConventions/compareTo/longInt.kt b/compiler/testData/codegen/box/operatorConventions/compareTo/longInt.kt
index d066c825f..623a3a4 100644
--- a/compiler/testData/codegen/box/operatorConventions/compareTo/longInt.kt
+++ b/compiler/testData/codegen/box/operatorConventions/compareTo/longInt.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun checkLess(x: Long, y: Int) = when {
x >= y -> "Fail $x >= $y"
!(x < y) -> "Fail !($x < $y)"
diff --git a/compiler/testData/codegen/box/operatorConventions/incDecOnObject.kt b/compiler/testData/codegen/box/operatorConventions/incDecOnObject.kt
index 0599819..0717061 100644
--- a/compiler/testData/codegen/box/operatorConventions/incDecOnObject.kt
+++ b/compiler/testData/codegen/box/operatorConventions/incDecOnObject.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class X(var value: Long)
operator fun X.inc(): X {
diff --git a/compiler/testData/codegen/box/operatorConventions/kt20387.kt b/compiler/testData/codegen/box/operatorConventions/kt20387.kt
index edfaef8..95fcaa7 100644
--- a/compiler/testData/codegen/box/operatorConventions/kt20387.kt
+++ b/compiler/testData/codegen/box/operatorConventions/kt20387.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// FILE: test.kt
import base.*
diff --git a/compiler/testData/codegen/box/package/boxPrimitiveTypeInClinit.kt b/compiler/testData/codegen/box/package/boxPrimitiveTypeInClinit.kt
index 128e66d..8b8377d 100644
--- a/compiler/testData/codegen/box/package/boxPrimitiveTypeInClinit.kt
+++ b/compiler/testData/codegen/box/package/boxPrimitiveTypeInClinit.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
var xi = 0
var xin : Int? = 0
var xinn : Int? = null
diff --git a/compiler/testData/codegen/box/package/checkCast.kt b/compiler/testData/codegen/box/package/checkCast.kt
index c522a1c..ffdfa30 100644
--- a/compiler/testData/codegen/box/package/checkCast.kt
+++ b/compiler/testData/codegen/box/package/checkCast.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class C(val x: Int) {
override fun equals(rhs: Any?): Boolean {
if (rhs is C) {
diff --git a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/boxedLongEqualsLong.kt b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/boxedLongEqualsLong.kt
index ff26c9abd..9f589c7 100644
--- a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/boxedLongEqualsLong.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/boxedLongEqualsLong.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
val x: Long = 0L
fun box(): String {
diff --git a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/boxedEqPrimitiveLong.kt b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/boxedEqPrimitiveLong.kt
index 629a22f..57253df 100644
--- a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/boxedEqPrimitiveLong.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/boxedEqPrimitiveLong.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// Auto-generated by GeneratePrimitiveVsObjectEqualityTestData. Do not edit!
val nx: Long? = 0L
diff --git a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqBoxedLong.kt b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqBoxedLong.kt
index 3def092..e2eccb0 100644
--- a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqBoxedLong.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqBoxedLong.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// Auto-generated by GeneratePrimitiveVsObjectEqualityTestData. Do not edit!
val nx: Long? = 0L
diff --git a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqObjectLong.kt b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqObjectLong.kt
index 1d4e0d8..ddfdcad 100644
--- a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqObjectLong.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/generated/primitiveEqObjectLong.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// Auto-generated by GeneratePrimitiveVsObjectEqualityTestData. Do not edit!
val nx: Any? = 0L
diff --git a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/objectWithAsymmetricEqualsEqPrimitive.kt b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/objectWithAsymmetricEqualsEqPrimitive.kt
index f9e2ca5..c042662 100644
--- a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/objectWithAsymmetricEqualsEqPrimitive.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/objectWithAsymmetricEqualsEqPrimitive.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// Strictly speaking, asymmetric equals violates contract for 'Object#equals'.
// However, we don't rely on this contract so far.
class FakeInt(val value: Int) {
diff --git a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/whenNullableBoxed.kt b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/whenNullableBoxed.kt
index b358a56..ff03f15 100644
--- a/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/whenNullableBoxed.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/equalityWithObject/whenNullableBoxed.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class CInt(val value: Int)
val nCInt3: CInt? = CInt(3)
diff --git a/compiler/testData/codegen/box/primitiveTypes/kt6590_identityEquals.kt b/compiler/testData/codegen/box/primitiveTypes/kt6590_identityEquals.kt
index f5e6e56..f21a8f1 100644
--- a/compiler/testData/codegen/box/primitiveTypes/kt6590_identityEquals.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/kt6590_identityEquals.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
val i: Int = 10000
if (!(i === i)) return "Fail int ==="
diff --git a/compiler/testData/codegen/box/primitiveTypes/kt665.kt b/compiler/testData/codegen/box/primitiveTypes/kt665.kt
index b1bbbf9..b8bd69b 100644
--- a/compiler/testData/codegen/box/primitiveTypes/kt665.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/kt665.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun f(x: Long, zzz: Long = 1): Long
{
return if (x <= 1) zzz
diff --git a/compiler/testData/codegen/box/primitiveTypes/kt887.kt b/compiler/testData/codegen/box/primitiveTypes/kt887.kt
index 52709a1..c03be7c 100644
--- a/compiler/testData/codegen/box/primitiveTypes/kt887.kt
+++ b/compiler/testData/codegen/box/primitiveTypes/kt887.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class Book(val name: String) : Comparable<Book> {
override fun compareTo(other: Book) = name.compareTo(other.name)
}
diff --git a/compiler/testData/codegen/box/properties/kt1165.kt b/compiler/testData/codegen/box/properties/kt1165.kt
index 7aec2c6..0a32a58 100644
--- a/compiler/testData/codegen/box/properties/kt1165.kt
+++ b/compiler/testData/codegen/box/properties/kt1165.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
public abstract class VirtualFile() {
public abstract val size : Long
}
diff --git a/compiler/testData/codegen/box/properties/kt613.kt b/compiler/testData/codegen/box/properties/kt613.kt
index 5140bf9..4f55c04 100644
--- a/compiler/testData/codegen/box/properties/kt613.kt
+++ b/compiler/testData/codegen/box/properties/kt613.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
package name
class Test() {
diff --git a/compiler/testData/codegen/box/regressions/kt14447.kt b/compiler/testData/codegen/box/regressions/kt14447.kt
index 195630a..7aab4c5 100644
--- a/compiler/testData/codegen/box/regressions/kt14447.kt
+++ b/compiler/testData/codegen/box/regressions/kt14447.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class ImpulsMigration
{
fun migrate(oldVersion: Long)
diff --git a/compiler/testData/codegen/box/regressions/kt7401.kt b/compiler/testData/codegen/box/regressions/kt7401.kt
index 1f1c879..16294c5 100644
--- a/compiler/testData/codegen/box/regressions/kt7401.kt
+++ b/compiler/testData/codegen/box/regressions/kt7401.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun foo(): Long {
var n = 2L
if (n > 0L) {
diff --git a/compiler/testData/codegen/box/safeCall/primitive.kt b/compiler/testData/codegen/box/safeCall/primitive.kt
index 2541481..64decc4 100644
--- a/compiler/testData/codegen/box/safeCall/primitive.kt
+++ b/compiler/testData/codegen/box/safeCall/primitive.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun Int.foo() = 239
fun Long.bar() = 239.toLong()
diff --git a/compiler/testData/codegen/box/safeCall/safeCallOnLong.kt b/compiler/testData/codegen/box/safeCall/safeCallOnLong.kt
index e3a082ce0..0236f0a 100644
--- a/compiler/testData/codegen/box/safeCall/safeCallOnLong.kt
+++ b/compiler/testData/codegen/box/safeCall/safeCallOnLong.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
fun f(b : Long.(Long)->Long) = 1L?.b(2L)
fun box(): String {
diff --git a/compiler/testData/codegen/box/secondaryConstructors/defaultArgs.kt b/compiler/testData/codegen/box/secondaryConstructors/defaultArgs.kt
index 10b0be1..3c9d312 100644
--- a/compiler/testData/codegen/box/secondaryConstructors/defaultArgs.kt
+++ b/compiler/testData/codegen/box/secondaryConstructors/defaultArgs.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
val global = "OK"
class A {
val prop: String
diff --git a/compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt b/compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt
index 18b91c5..999d944 100644
--- a/compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt
+++ b/compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
var log = ""
open class Base(val s: String)
diff --git a/compiler/testData/codegen/box/super/superConstructor/kt18356.kt b/compiler/testData/codegen/box/super/superConstructor/kt18356.kt
index 0c0d371..5372f4fa 100644
--- a/compiler/testData/codegen/box/super/superConstructor/kt18356.kt
+++ b/compiler/testData/codegen/box/super/superConstructor/kt18356.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
open class Base(val addr: Long, val name: String)
fun box(): String {
diff --git a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt
index 93dfad2..9a97980 100644
--- a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt
+++ b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericConstructor.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
A.Nested().nestedA()
A.Nested().Inner().innerA()
diff --git a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt
index 9ce1001..a6ef85a 100644
--- a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt
+++ b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethod.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: test.kt
import b.B
diff --git a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt
index 5391183..a70010d 100644
--- a/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt
+++ b/compiler/testData/codegen/box/syntheticAccessors/accessorForGenericMethodWithDefaults.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: test.kt
import b.B
diff --git a/compiler/testData/codegen/box/unaryOp/intrinsic.kt b/compiler/testData/codegen/box/unaryOp/intrinsic.kt
index 28cbb08..30bd7d9 100644
--- a/compiler/testData/codegen/box/unaryOp/intrinsic.kt
+++ b/compiler/testData/codegen/box/unaryOp/intrinsic.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
val a1: Byte = -1
val a2: Short = -1
diff --git a/compiler/testData/codegen/box/unaryOp/intrinsicNullable.kt b/compiler/testData/codegen/box/unaryOp/intrinsicNullable.kt
index f17dc2e..0463bcd 100644
--- a/compiler/testData/codegen/box/unaryOp/intrinsicNullable.kt
+++ b/compiler/testData/codegen/box/unaryOp/intrinsicNullable.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
fun box(): String {
val a1: Byte? = -1
val a2: Short? = -1
diff --git a/compiler/testData/codegen/box/when/longInRange.kt b/compiler/testData/codegen/box/when/longInRange.kt
index 2332367..c73169f 100644
--- a/compiler/testData/codegen/box/when/longInRange.kt
+++ b/compiler/testData/codegen/box/when/longInRange.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
class LongR {
operator fun contains(l : Long): Boolean = l == 5.toLong()
}
diff --git a/compiler/testData/codegen/boxInline/callableReference/bound/kt18728_4.kt b/compiler/testData/codegen/boxInline/callableReference/bound/kt18728_4.kt
index 02c8cd4..c86c79d 100644
--- a/compiler/testData/codegen/boxInline/callableReference/bound/kt18728_4.kt
+++ b/compiler/testData/codegen/boxInline/callableReference/bound/kt18728_4.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: 1.kt
package test
diff --git a/compiler/testData/codegen/boxInline/defaultValues/kt14564.kt b/compiler/testData/codegen/boxInline/defaultValues/kt14564.kt
index 22d6d66..5b4b857 100644
--- a/compiler/testData/codegen/boxInline/defaultValues/kt14564.kt
+++ b/compiler/testData/codegen/boxInline/defaultValues/kt14564.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: 1.kt
//NO_CHECK_LAMBDA_INLINING
diff --git a/compiler/testData/codegen/boxInline/defaultValues/kt14564_2.kt b/compiler/testData/codegen/boxInline/defaultValues/kt14564_2.kt
index c256a13..5f17862 100644
--- a/compiler/testData/codegen/boxInline/defaultValues/kt14564_2.kt
+++ b/compiler/testData/codegen/boxInline/defaultValues/kt14564_2.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: 1.kt
package test
diff --git a/compiler/testData/codegen/boxInline/defaultValues/kt18689_4.kt b/compiler/testData/codegen/boxInline/defaultValues/kt18689_4.kt
index 8fb797a..a6e93dc 100644
--- a/compiler/testData/codegen/boxInline/defaultValues/kt18689_4.kt
+++ b/compiler/testData/codegen/boxInline/defaultValues/kt18689_4.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: 1.kt
package test
diff --git a/compiler/testData/codegen/boxInline/defaultValues/kt5685.kt b/compiler/testData/codegen/boxInline/defaultValues/kt5685.kt
index f594db7..af78d70 100644
--- a/compiler/testData/codegen/boxInline/defaultValues/kt5685.kt
+++ b/compiler/testData/codegen/boxInline/defaultValues/kt5685.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: 1.kt
package test
diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/callableReferences/boundPropertyReferenceOnLong.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/callableReferences/boundPropertyReferenceOnLong.kt
index c777a4a..ddbff9c 100644
--- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/callableReferences/boundPropertyReferenceOnLong.kt
+++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/callableReferences/boundPropertyReferenceOnLong.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: 1.kt
// LANGUAGE_VERSION: 1.2
// SKIP_INLINE_CHECK_IN: inlineFun$default
diff --git a/compiler/testData/codegen/boxInline/nonLocalReturns/tryFinally/declSite/longReturn.kt b/compiler/testData/codegen/boxInline/nonLocalReturns/tryFinally/declSite/longReturn.kt
index 4bf5605..b19bad3cb 100644
--- a/compiler/testData/codegen/boxInline/nonLocalReturns/tryFinally/declSite/longReturn.kt
+++ b/compiler/testData/codegen/boxInline/nonLocalReturns/tryFinally/declSite/longReturn.kt
@@ -1,5 +1,4 @@
// IGNORE_BACKEND: JVM_IR
-// IGNORE_BACKEND: JS_IR
// FILE: 1.kt
package test
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt
index 950a955..b9c50421 100644
--- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt
+++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicIrBoxTest.kt
@@ -46,13 +46,17 @@
val runtime = listOf(
"libraries/stdlib/js/src/kotlin/core.kt",
"libraries/stdlib/js/irRuntime/core.kt",
+ "libraries/stdlib/js/irRuntime/long.kt",
+ "libraries/stdlib/js/irRuntime/longjs.kt",
"libraries/stdlib/js/irRuntime/numberConversion.kt",
"libraries/stdlib/js/irRuntime/compareTo.kt",
"libraries/stdlib/js/irRuntime/annotations.kt",
"libraries/stdlib/js/irRuntime/DefaultConstructorMarker.kt",
"libraries/stdlib/js/irRuntime/exceptions.kt",
"libraries/stdlib/js/irRuntime/internalAnnotations.kt",
- "libraries/stdlib/js/irRuntime/typeCheckUtils.kt"
+ "libraries/stdlib/js/irRuntime/typeCheckUtils.kt",
+ "core/builtins/native/kotlin/Number.kt",
+ "core/builtins/native/kotlin/Comparable.kt"
).map { createPsiFile(it) }
val filesToIgnore = listOf(
diff --git a/js/js.translator/testData/box/callableReference/property/simpleMutableTopLevel.kt b/js/js.translator/testData/box/callableReference/property/simpleMutableTopLevel.kt
index 86a1171..7652ee7 100644
--- a/js/js.translator/testData/box/callableReference/property/simpleMutableTopLevel.kt
+++ b/js/js.translator/testData/box/callableReference/property/simpleMutableTopLevel.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1121
// This test was adapted from compiler/testData/codegen/box/callableReference/property/.
package foo
diff --git a/js/js.translator/testData/box/callableReference/property/simpleTopLevel.kt b/js/js.translator/testData/box/callableReference/property/simpleTopLevel.kt
index 6d9a572..a2a4161 100644
--- a/js/js.translator/testData/box/callableReference/property/simpleTopLevel.kt
+++ b/js/js.translator/testData/box/callableReference/property/simpleTopLevel.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1121
// This test was adapted from compiler/testData/codegen/box/callableReference/property/.
package foo
diff --git a/js/js.translator/testData/box/dataClass/equals.kt b/js/js.translator/testData/box/dataClass/equals.kt
index 803e2ed..9871251 100644
--- a/js/js.translator/testData/box/dataClass/equals.kt
+++ b/js/js.translator/testData/box/dataClass/equals.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1144
package foo
diff --git a/js/js.translator/testData/box/dataClass/override.kt b/js/js.translator/testData/box/dataClass/override.kt
index 5a6fc9b..38ce45e 100644
--- a/js/js.translator/testData/box/dataClass/override.kt
+++ b/js/js.translator/testData/box/dataClass/override.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1123
package foo
diff --git a/js/js.translator/testData/box/defaultArguments/constructorCallWithDefArg2.kt b/js/js.translator/testData/box/defaultArguments/constructorCallWithDefArg2.kt
index 77ca4dd..b722e7e 100644
--- a/js/js.translator/testData/box/defaultArguments/constructorCallWithDefArg2.kt
+++ b/js/js.translator/testData/box/defaultArguments/constructorCallWithDefArg2.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1113
package foo
diff --git a/js/js.translator/testData/box/expression/cast/primitiveToClass.kt b/js/js.translator/testData/box/expression/cast/primitiveToClass.kt
index 962105c..6238cfd 100644
--- a/js/js.translator/testData/box/expression/cast/primitiveToClass.kt
+++ b/js/js.translator/testData/box/expression/cast/primitiveToClass.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1118
package foo
diff --git a/js/js.translator/testData/box/expression/equals/customEqualsMethod.kt b/js/js.translator/testData/box/expression/equals/customEqualsMethod.kt
index 589165c..fa4159c 100644
--- a/js/js.translator/testData/box/expression/equals/customEqualsMethod.kt
+++ b/js/js.translator/testData/box/expression/equals/customEqualsMethod.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1113
package foo
diff --git a/js/js.translator/testData/box/expression/equals/customEqualsMethodOnAny.kt b/js/js.translator/testData/box/expression/equals/customEqualsMethodOnAny.kt
index aa1b949..e2ef668 100644
--- a/js/js.translator/testData/box/expression/equals/customEqualsMethodOnAny.kt
+++ b/js/js.translator/testData/box/expression/equals/customEqualsMethodOnAny.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1113
package foo
diff --git a/js/js.translator/testData/box/expression/stringClass/stringNotEqualToNumber.kt b/js/js.translator/testData/box/expression/stringClass/stringNotEqualToNumber.kt
index 6f30713..861551c 100644
--- a/js/js.translator/testData/box/expression/stringClass/stringNotEqualToNumber.kt
+++ b/js/js.translator/testData/box/expression/stringClass/stringNotEqualToNumber.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1108
package foo
diff --git a/js/js.translator/testData/box/inline/inlineMethod.kt b/js/js.translator/testData/box/inline/inlineMethod.kt
index 598360f..169c3d6 100644
--- a/js/js.translator/testData/box/inline/inlineMethod.kt
+++ b/js/js.translator/testData/box/inline/inlineMethod.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1127
package foo
diff --git a/js/js.translator/testData/box/inline/lambdaReassignmentWithCapture.kt b/js/js.translator/testData/box/inline/lambdaReassignmentWithCapture.kt
index 7152233..34c9fd9 100644
--- a/js/js.translator/testData/box/inline/lambdaReassignmentWithCapture.kt
+++ b/js/js.translator/testData/box/inline/lambdaReassignmentWithCapture.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1125
package foo
diff --git a/js/js.translator/testData/box/number/hexadecimalConstant.kt b/js/js.translator/testData/box/number/hexadecimalConstant.kt
index 03b416b..4e9c1dd 100644
--- a/js/js.translator/testData/box/number/hexadecimalConstant.kt
+++ b/js/js.translator/testData/box/number/hexadecimalConstant.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1108
package foo
diff --git a/js/js.translator/testData/box/number/longBitOperations.kt b/js/js.translator/testData/box/number/longBitOperations.kt
index 08e923d..0644b09 100644
--- a/js/js.translator/testData/box/number/longBitOperations.kt
+++ b/js/js.translator/testData/box/number/longBitOperations.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1112
package foo
diff --git a/js/js.translator/testData/box/number/longCompareToIntrinsic.kt b/js/js.translator/testData/box/number/longCompareToIntrinsic.kt
index 81a235f9..351c34a 100644
--- a/js/js.translator/testData/box/number/longCompareToIntrinsic.kt
+++ b/js/js.translator/testData/box/number/longCompareToIntrinsic.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1114
package foo
diff --git a/js/js.translator/testData/box/number/longEqualsIntrinsic.kt b/js/js.translator/testData/box/number/longEqualsIntrinsic.kt
index 5e6aafb..10df9d3 100644
--- a/js/js.translator/testData/box/number/longEqualsIntrinsic.kt
+++ b/js/js.translator/testData/box/number/longEqualsIntrinsic.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1112
package foo
diff --git a/js/js.translator/testData/box/number/longHashCode.kt b/js/js.translator/testData/box/number/longHashCode.kt
index abe8323..8926575 100644
--- a/js/js.translator/testData/box/number/longHashCode.kt
+++ b/js/js.translator/testData/box/number/longHashCode.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1112
package foo
diff --git a/js/js.translator/testData/box/number/longUnaryOperations.kt b/js/js.translator/testData/box/number/longUnaryOperations.kt
index 62976a4..1098dbf 100644
--- a/js/js.translator/testData/box/number/longUnaryOperations.kt
+++ b/js/js.translator/testData/box/number/longUnaryOperations.kt
@@ -1,4 +1,3 @@
-// IGNORE_BACKEND: JS_IR
// EXPECTED_REACHABLE_NODES: 1112
package foo
diff --git a/libraries/stdlib/js/irRuntime/core.kt b/libraries/stdlib/js/irRuntime/core.kt
index a899b79..70dff9c 100644
--- a/libraries/stdlib/js/irRuntime/core.kt
+++ b/libraries/stdlib/js/irRuntime/core.kt
@@ -6,17 +6,18 @@
package kotlin.js
fun equals(obj1: dynamic, obj2: dynamic): Boolean {
- if (obj1 == null) {
- return obj2 == null
- }
+ if (obj1 == null) {
+ return obj2 == null;
+ }
if (obj2 == null) {
- return false
+ return false;
}
return js("""
- if (typeof obj1 === "object" && typeof obj1.equals === "function") {
- return obj1.equals(obj2);
+
+ if (typeof obj1 === "object" && typeof obj1.equals_Any_ === "function") {
+ return obj1.equals_Any_(obj2);
}
if (obj1 !== obj1) {
@@ -31,7 +32,7 @@
}
fun toString(o: dynamic): String = when {
- o == null -> "null"
+ o === null -> "null"
isArrayish(o) -> "[...]"
else -> js("o.toString()").unsafeCast<String>()
}
diff --git a/libraries/stdlib/js/irRuntime/long.kt b/libraries/stdlib/js/irRuntime/long.kt
new file mode 100644
index 0000000..f8766a4
--- /dev/null
+++ b/libraries/stdlib/js/irRuntime/long.kt
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+package kotlin
+
+/**
+ * Represents a 64-bit signed integer.
+ */
+public class Long internal constructor(
+ internal val low: Int,
+ internal val high: Int
+) : Number(), Comparable<Long> {
+
+ companion object {
+ /**
+ * A constant holding the minimum value an instance of Long can have.
+ */
+ public const val MIN_VALUE: Long = -9223372036854775807L - 1L
+
+ /**
+ * A constant holding the maximum value an instance of Long can have.
+ */
+ public const val MAX_VALUE: Long = 9223372036854775807L
+ }
+
+ /**
+ * Compares this value with the specified value for order.
+ * Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
+ * or a positive number if it's greater than other.
+ */
+ public inline operator fun compareTo(other: Byte): Int = compareTo(other.toLong())
+
+ /**
+ * Compares this value with the specified value for order.
+ * Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
+ * or a positive number if it's greater than other.
+ */
+ public inline operator fun compareTo(other: Short): Int = compareTo(other.toLong())
+
+ /**
+ * Compares this value with the specified value for order.
+ * Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
+ * or a positive number if it's greater than other.
+ */
+ public inline operator fun compareTo(other: Int): Int = compareTo(other.toLong())
+
+ /**
+ * Compares this value with the specified value for order.
+ * Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
+ * or a positive number if it's greater than other.
+ */
+ public override operator fun compareTo(other: Long): Int = compare(other)
+
+ /**
+ * Compares this value with the specified value for order.
+ * Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
+ * or a positive number if it's greater than other.
+ */
+ public inline operator fun compareTo(other: Float): Int = toFloat().compareTo(other)
+
+ /**
+ * Compares this value with the specified value for order.
+ * Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
+ * or a positive number if it's greater than other.
+ */
+ public inline operator fun compareTo(other: Double): Int = toDouble().compareTo(other)
+
+ /** Adds the other value to this value. */
+ public inline operator fun plus(other: Byte): Long = plus(other.toLong())
+
+ /** Adds the other value to this value. */
+ public inline operator fun plus(other: Short): Long = plus(other.toLong())
+
+ /** Adds the other value to this value. */
+ public inline operator fun plus(other: Int): Long = plus(other.toLong())
+
+ /** Adds the other value to this value. */
+ public operator fun plus(other: Long): Long = add(other)
+
+ /** Adds the other value to this value. */
+ public inline operator fun plus(other: Float): Float = toFloat() + other
+
+ /** Adds the other value to this value. */
+ public inline operator fun plus(other: Double): Double = toDouble() + other
+
+ /** Subtracts the other value from this value. */
+ public inline operator fun minus(other: Byte): Long = minus(other.toLong())
+
+ /** Subtracts the other value from this value. */
+ public inline operator fun minus(other: Short): Long = minus(other.toLong())
+
+ /** Subtracts the other value from this value. */
+ public inline operator fun minus(other: Int): Long = minus(other.toLong())
+
+ /** Subtracts the other value from this value. */
+ public operator fun minus(other: Long): Long = subtract(other)
+
+ /** Subtracts the other value from this value. */
+ public inline operator fun minus(other: Float): Float = toFloat() - other
+
+ /** Subtracts the other value from this value. */
+ public inline operator fun minus(other: Double): Double = toDouble() - other
+
+ /** Multiplies this value by the other value. */
+ public inline operator fun times(other: Byte): Long = times(other.toLong())
+
+ /** Multiplies this value by the other value. */
+ public inline operator fun times(other: Short): Long = times(other.toLong())
+
+ /** Multiplies this value by the other value. */
+ public inline operator fun times(other: Int): Long = times(other.toLong())
+
+ /** Multiplies this value by the other value. */
+ public operator fun times(other: Long): Long = multiply(other)
+
+ /** Multiplies this value by the other value. */
+ public inline operator fun times(other: Float): Float = toFloat() * other
+
+ /** Multiplies this value by the other value. */
+ public inline operator fun times(other: Double): Double = toDouble() * other
+
+ /** Divides this value by the other value. */
+ public inline operator fun div(other: Byte): Long = div(other.toLong())
+
+ /** Divides this value by the other value. */
+ public inline operator fun div(other: Short): Long = div(other.toLong())
+
+ /** Divides this value by the other value. */
+ public inline operator fun div(other: Int): Long = div(other.toLong())
+
+ /** Divides this value by the other value. */
+ public operator fun div(other: Long): Long = divide(other)
+
+ /** Divides this value by the other value. */
+ public inline operator fun div(other: Float): Float = toFloat() / other
+
+ /** Divides this value by the other value. */
+ public inline operator fun div(other: Double): Double = toDouble() / other
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
+ public inline operator fun mod(other: Byte): Long = rem(other)
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
+ public inline operator fun mod(other: Short): Long = rem(other)
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
+ public inline operator fun mod(other: Int): Long = rem(other)
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
+ public inline operator fun mod(other: Long): Long = rem(other)
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
+ public inline operator fun mod(other: Float): Float = rem(other)
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @Deprecated("Use rem(other) instead", ReplaceWith("rem(other)"), DeprecationLevel.WARNING)
+ public inline operator fun mod(other: Double): Double = rem(other)
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @SinceKotlin("1.1")
+ public inline operator fun rem(other: Byte): Long = rem(other.toLong())
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @SinceKotlin("1.1")
+ public inline operator fun rem(other: Short): Long = rem(other.toLong())
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @SinceKotlin("1.1")
+ public inline operator fun rem(other: Int): Long = rem(other.toLong())
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @SinceKotlin("1.1")
+ public operator fun rem(other: Long): Long = modulo(other)
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @SinceKotlin("1.1")
+ public inline operator fun rem(other: Float): Float = toFloat() % other
+
+ /** Calculates the remainder of dividing this value by the other value. */
+ @SinceKotlin("1.1")
+ public inline operator fun rem(other: Double): Double = toDouble() % other
+
+ /** Increments this value. */
+ public operator fun inc(): Long = this + 1L
+
+ /** Decrements this value. */
+ public operator fun dec(): Long = this - 1L
+
+ /** Returns this value. */
+ public inline operator fun unaryPlus(): Long = this
+
+ /** Returns the negative of this value. */
+ public operator fun unaryMinus(): Long = inv() + 1L
+
+/* TODO
+ /** Creates a range from this value to the specified [other] value. */
+ public operator fun rangeTo(other: Byte): LongRange
+
+ /** Creates a range from this value to the specified [other] value. */
+ public operator fun rangeTo(other: Short): LongRange
+
+ /** Creates a range from this value to the specified [other] value. */
+ public operator fun rangeTo(other: Int): LongRange
+
+ /** Creates a range from this value to the specified [other] value. */
+ public operator fun rangeTo(other: Long): LongRange
+*/
+
+ /** Shifts this value left by the [bitCount] number of bits. */
+ public infix fun shl(bitCount: Int): Long = shiftLeft(bitCount)
+
+ /** Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with copies of the sign bit. */
+ public infix fun shr(bitCount: Int): Long = shiftRight(bitCount)
+
+ /** Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with zeros. */
+ public infix fun ushr(bitCount: Int): Long = shiftRightUnsigned(bitCount)
+
+ /** Performs a bitwise AND operation between the two values. */
+ public infix fun and(other: Long): Long = Long(low and other.low, high and other.high)
+
+ /** Performs a bitwise OR operation between the two values. */
+ public infix fun or(other: Long): Long = Long(low or other.low, high or other.high)
+
+ /** Performs a bitwise XOR operation between the two values. */
+ public infix fun xor(other: Long): Long = Long(low xor other.low, high xor other.high)
+
+ /** Inverts the bits in this value. */
+ public fun inv(): Long = Long(low.inv(), high.inv())
+
+ public override fun toByte(): Byte = low.toByte()
+ public override fun toChar(): Char = low.toChar()
+ public override fun toShort(): Short = low.toShort()
+ public override fun toInt(): Int = low
+ public override fun toLong(): Long = this
+ public override fun toFloat(): Float = toDouble().toFloat()
+ public override fun toDouble(): Double = toNumber()
+
+ // TODO: is it still needed?
+ private fun valueOf() = toDouble()
+
+ override fun equals(other: Any?): Boolean = other is Long && equalsLong(other)
+
+ override fun hashCode(): Int = hashCode(this)
+
+ override fun toString(): String = toString(10)
+}
\ No newline at end of file
diff --git a/libraries/stdlib/js/irRuntime/longjs.kt b/libraries/stdlib/js/irRuntime/longjs.kt
new file mode 100644
index 0000000..684cc31
--- /dev/null
+++ b/libraries/stdlib/js/irRuntime/longjs.kt
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+
+// Copyright 2009 The Closure Library Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS-IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+package kotlin
+
+internal fun Long.toNumber() = high * TWO_PWR_32_DBL_ + getLowBitsUnsigned()
+
+internal fun Long.getLowBitsUnsigned() = if (low >= 0) low.toDouble() else TWO_PWR_32_DBL_ + low
+
+internal fun hashCode(l: Long) = l.low xor l.high
+
+internal fun Long.toString(radix: Int): String {
+ if (radix < 2 || 36 < radix) {
+ throw Exception("radix out of range: $radix")
+ }
+
+ if (isZero()) {
+ return "0"
+ }
+
+ if (isNegative()) {
+ if (equalsLong(MIN_VALUE)) {
+ // We need to change the Long value before it can be negated, so we remove
+ // the bottom-most digit in this base and then recurse to do the rest.
+ val radixLong = fromInt(radix)
+ val div = div(radixLong)
+ val rem = div.multiply(radixLong).subtract(this).toInt();
+ return js("div.toString(radix) + rem.toString(radix)")
+ } else {
+ return "-${negate().toString()}"
+ }
+ }
+
+ // Do several (6) digits each time through the loop, so as to
+ // minimize the calls to the very expensive emulated div.
+ val radixToPower = fromNumber(js("Math.pow(radix, 6)").unsafeCast<Double>())
+
+ var rem = this
+ var result = ""
+ while (true) {
+ val remDiv = rem.div(radixToPower)
+ val intval = rem.subtract(remDiv.multiply(radixToPower)).toInt()
+ var digits = js("intval.toString(radix)").unsafeCast<String>()
+
+ rem = remDiv
+ if (rem.isZero()) {
+ return digits + result
+ } else {
+ while (digits.length < 6) {
+ digits = "0" + digits
+ }
+ result = digits + result
+ }
+ }
+}
+
+internal fun Long.negate() = unaryMinus()
+
+internal fun Long.isZero() = high == 0 && low == 0
+
+internal fun Long.isNegative() = high < 0
+
+internal fun Long.isOdd() = low and 1 == 1
+
+internal fun Long.equalsLong(other: Long) = high == other.high && low == other.low
+
+internal fun Long.lessThan(other: Long) = compare(other) < 0
+
+internal fun Long.lessThanOrEqual(other: Long) = compare(other) <= 0
+
+internal fun Long.greaterThan(other: Long) = compare(other) > 0
+
+internal fun Long.greaterThanOrEqual(other: Long) = compare(other) >= 0
+
+internal fun Long.compare(other: Long): Int {
+ if (equalsLong(other)) {
+ return 0;
+ }
+
+ val thisNeg = isNegative();
+ val otherNeg = other.isNegative();
+
+ return when {
+ thisNeg && !otherNeg -> -1
+ !thisNeg && otherNeg -> 1
+ // at this point, the signs are the same, so subtraction will not overflow
+ subtract(other).isNegative() -> -1
+ else -> 1
+ }
+}
+
+internal fun Long.add(other: Long): Long {
+ // Divide each number into 4 chunks of 16 bits, and then sum the chunks.
+
+ val a48 = high ushr 16
+ val a32 = high and 0xFFFF
+ val a16 = high ushr 16
+ val a00 = low and 0xFFFF
+
+ val b48 = other.high ushr 16
+ val b32 = other.high and 0xFFFF
+ val b16 = other.low ushr 16
+ val b00 = other.low and 0xFFFF
+
+ var c48 = 0
+ var c32 = 0
+ var c16 = 0
+ var c00 = 0
+ c00 += a00 + b00
+ c16 += c00 ushr 16
+ c00 = c00 and 0xFFFF
+ c16 += a16 + b16
+ c32 += c16 ushr 16
+ c16 = c16 and 0xFFFF
+ c32 += a32 + b32
+ c48 += c32 ushr 16
+ c32 = c32 and 0xFFFF
+ c48 += a48 + b48
+ c48 = c48 and 0xFFFF
+ return Long((c16 shl 16) or c00, (c48 shl 16) or c32)
+}
+
+internal fun Long.subtract(other: Long) = add(other.unaryMinus())
+
+internal fun Long.multiply(other: Long): Long {
+ if (isZero()) {
+ return ZERO
+ } else if (other.isZero()) {
+ return ZERO
+ }
+
+ if (equalsLong(MIN_VALUE)) {
+ return if (other.isOdd()) MIN_VALUE else ZERO
+ } else if (other.equalsLong(MIN_VALUE)) {
+ return if (isOdd()) MIN_VALUE else ZERO
+ }
+
+ if (isNegative()) {
+ return if (other.isNegative()) {
+ negate().multiply(other.negate())
+ } else {
+ negate().multiply(other).negate()
+ }
+ } else if (other.isNegative()) {
+ return multiply(other.negate()).negate()
+ }
+
+ // If both longs are small, use float multiplication
+ if (lessThan(TWO_PWR_24_) && other.lessThan(TWO_PWR_24_)) {
+ return fromNumber(toNumber() * other.toNumber())
+ }
+
+ // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
+ // We can skip products that would overflow.
+
+ val a48 = high ushr 16
+ val a32 = high and 0xFFFF
+ val a16 = low ushr 16
+ val a00 = low and 0xFFFF
+
+ val b48 = other.high ushr 16
+ val b32 = other.high and 0xFFFF
+ val b16 = other.low ushr 16
+ val b00 = other.low and 0xFFFF
+
+ var c48 = 0
+ var c32 = 0
+ var c16 = 0
+ var c00 = 0
+ c00 += a00 * b00
+ c16 += c00 ushr 16
+ c00 = c00 and 0xFFFF
+ c16 += a16 * b00
+ c32 += c16 ushr 16
+ c16 = c16 and 0xFFFF
+ c16 += a00 * b16
+ c32 += c16 ushr 16
+ c16 = c16 and 0xFFFF
+ c32 += a32 * b00
+ c48 += c32 ushr 16
+ c32 = c32 and 0xFFFF
+ c32 += a16 * b16
+ c48 += c32 ushr 16
+ c32 = c32 and 0xFFFF
+ c32 += a00 * b32
+ c48 += c32 ushr 16
+ c32 = c32 and 0xFFFF
+ c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48
+ c48 = c48 and 0xFFFF
+ return Long(c16 shl 16 or c00, c48 shl 16 or c32)
+}
+
+fun Long.divide(other: Long): Long {
+ if (other.isZero()) {
+ throw Exception("division by zero")
+ } else if (isZero()) {
+ return ZERO
+ }
+
+ if (equalsLong(MIN_VALUE)) {
+ if (other.equalsLong(ONE) || other.equalsLong(NEG_ONE)) {
+ return MIN_VALUE // recall that -MIN_VALUE == MIN_VALUE
+ } else if (other.equalsLong(MIN_VALUE)) {
+ return ONE
+ } else {
+ // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
+ val halfThis = shiftRight(1)
+ val approx = halfThis.div(other).shiftLeft(1)
+ if (approx.equalsLong(ZERO)) {
+ return if (other.isNegative()) ONE else NEG_ONE
+ } else {
+ val rem = subtract(other.multiply(approx))
+ return approx.add(rem.div(other))
+ }
+ }
+ } else if (other.equalsLong(MIN_VALUE)) {
+ return ZERO
+ }
+
+ if (isNegative()) {
+ return if (other.isNegative()) {
+ negate().div(other.negate())
+ } else {
+ negate().div(other).negate()
+ }
+ } else if (other.isNegative()) {
+ return div(other.negate()).negate()
+ }
+
+ // Repeat the following until the remainder is less than other: find a
+ // floating-point that approximates remainder / other *from below*, add this
+ // into the result, and subtract it from the remainder. It is critical that
+ // the approximate value is less than or equal to the real value so that the
+ // remainder never becomes negative.
+ var res = ZERO
+ var rem = this
+ while (rem.greaterThanOrEqual(other)) {
+ // Approximate the result of division. This may be a little greater or
+ // smaller than the actual value.
+ val approxDouble = rem.toNumber() / other.toNumber()
+ var approx = js("Math.max(1, Math.floor(approxDouble))").unsafeCast<Double>()
+
+ // We will tweak the approximate result by changing it in the 48-th digit or
+ // the smallest non-fractional digit, whichever is larger.
+ val log2 = js("Math.ceil(Math.log(approx) / Math.LN2)").unsafeCast<Int>()
+ val delta = if (log2 <= 48) 1.0 else js("Math.pow(2, log2 - 48)").unsafeCast<Double>()
+
+ // Decrease the approximation until it is smaller than the remainder. Note
+ // that if it is too large, the product overflows and is negative.
+ var approxRes = fromNumber(approx)
+ var approxRem = approxRes.multiply(other)
+ while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
+ approx -= delta
+ approxRes = fromNumber(approx)
+ approxRem = approxRes.multiply(other)
+ }
+
+ // We know the answer can't be zero... and actually, zero would cause
+ // infinite recursion since we would make no progress.
+ if (approxRes.isZero()) {
+ approxRes = ONE
+ }
+
+ res = res.add(approxRes)
+ rem = rem.subtract(approxRem)
+ }
+ return res
+}
+
+internal fun Long.modulo(other: Long) = subtract(div(other).multiply(other))
+
+internal fun Long.shiftLeft(numBits: Int): Long {
+ val numBits = numBits and 63
+ if (numBits == 0) {
+ return this
+ } else {
+ if (numBits < 32) {
+ return Long(low shl numBits, (high shl numBits) or (low ushr (32 - numBits)))
+ } else {
+ return Long(0, low shl (numBits - 32))
+ }
+ }
+}
+
+internal fun Long.shiftRight(numBits: Int): Long {
+ val numBits = numBits and 63
+ if (numBits == 0) {
+ return this
+ } else {
+ if (numBits < 32) {
+ return Long((low ushr numBits) or (high shl (32 - numBits)), high shr numBits)
+ } else {
+ return Long(high shr (numBits - 32), if (high >= 0) 0 else -1)
+ }
+ }
+}
+
+internal fun Long.shiftRightUnsigned(numBits: Int): Long {
+ val numBits = numBits and 63
+ if (numBits == 0) {
+ return this
+ } else {
+ if (numBits < 32) {
+ return Long((low ushr numBits) or (high shl (32 - numBits)), high ushr numBits)
+ } else return if (numBits == 32) {
+ Long(high, 0)
+ } else {
+ Long(high ushr (numBits - 32), 0)
+ }
+ }
+}
+
+/**
+ * Returns a Long representing the given (32-bit) integer value.
+ * @param {number} value The 32-bit integer in question.
+ * @return {!Kotlin.Long} The corresponding Long value.
+ */
+// TODO: cache
+internal fun fromInt(value: Int) = Long(value, if (value < 0) -1 else 0)
+
+/**
+ * Returns a Long representing the given value, provided that it is a finite
+ * number. Otherwise, zero is returned.
+ * @param {number} value The number in question.
+ * @return {!Kotlin.Long} The corresponding Long value.
+ */
+internal fun fromNumber(value: Double): Long {
+ if (js("isNaN(value)").unsafeCast<Boolean>() || !js("isFinite(value)").unsafeCast<Boolean>()) {
+ return ZERO;
+ } else if (value <= -TWO_PWR_63_DBL_) {
+ return MIN_VALUE;
+ } else if (value + 1 >= TWO_PWR_63_DBL_) {
+ return MAX_VALUE;
+ } else if (value < 0) {
+ return fromNumber(-value).negate();
+ } else {
+ val twoPwr32 = TWO_PWR_32_DBL_
+ return Long(
+ js("(value % twoPwr32) | 0").unsafeCast<Int>(),
+ js("(value / twoPwr32) | 0").unsafeCast<Int>()
+ )
+ }
+}
+
+private val TWO_PWR_16_DBL_ = (1 shl 16).toDouble()
+
+private val TWO_PWR_24_DBL_ = (1 shl 24).toDouble()
+
+private val TWO_PWR_32_DBL_ = TWO_PWR_16_DBL_ * TWO_PWR_16_DBL_
+
+private val TWO_PWR_64_DBL_ = TWO_PWR_32_DBL_ * TWO_PWR_32_DBL_
+
+private val TWO_PWR_63_DBL_ = TWO_PWR_64_DBL_ / 2
+
+private val ZERO = fromInt(0)
+
+private val ONE = fromInt(1)
+
+private val NEG_ONE = fromInt(-1)
+
+private val MAX_VALUE = Long(-1, -1 ushr 1)
+
+private val MIN_VALUE = Long(0, 1 shl 31)
+
+private val TWO_PWR_24_ = fromInt(1 shl 24)
diff --git a/libraries/stdlib/js/irRuntime/numberConversion.kt b/libraries/stdlib/js/irRuntime/numberConversion.kt
index 41c3d99..4c2fe41 100644
--- a/libraries/stdlib/js/irRuntime/numberConversion.kt
+++ b/libraries/stdlib/js/irRuntime/numberConversion.kt
@@ -19,6 +19,10 @@
fun toByte(a: dynamic): Byte = js("a << 24 >> 24").unsafeCast<Byte>()
fun toShort(a: dynamic): Short = js("a << 16 >> 16").unsafeCast<Short>()
+fun numberToLong(a: dynamic): Long = fromNumber(a)
+
+fun toLong(a: dynamic): Long = fromInt(a)
+
fun doubleToInt(a: dynamic) = js("""
if (a > 2147483647) return 2147483647;
if (a < -2147483648) return -2147483648;
diff --git a/libraries/stdlib/js/irRuntime/typeCheckUtils.kt b/libraries/stdlib/js/irRuntime/typeCheckUtils.kt
index dba0d06..f943bc0 100644
--- a/libraries/stdlib/js/irRuntime/typeCheckUtils.kt
+++ b/libraries/stdlib/js/irRuntime/typeCheckUtils.kt
@@ -6,7 +6,7 @@
package kotlin.js
@kotlin.internal.DynamicExtension
-public fun <T> dynamic.unsafeCast(): T = this
+public inline fun <T> dynamic.unsafeCast(): T = this
private fun isInterfaceImpl(ctor: dynamic, iface: dynamic): Boolean {
if (ctor === iface) return true;