From c82c914c5d4c481fb40770e79d2a287531f8bcf2 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 3 Sep 2015 21:57:06 +0300 Subject: [PATCH] Before comparing types of data class objects in dataClass.equals ensure that the other comparand is an object too, otherwise it may fail on Rhino. --- .../kotlin/js/translate/declaration/JsDataClassGenerator.java | 3 ++- js/js.translator/testData/dataClass/cases/equals.kt | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java index f2a8108fdf4..1e7c95ab95b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java @@ -155,6 +155,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator { JsExpression referenceEqual = JsAstUtils.equality(JsLiteral.THIS, new JsNameRef(paramName)); JsExpression isNotNull = JsAstUtils.inequality(new JsNameRef(paramName), JsLiteral.NULL); + JsExpression otherIsObject = JsAstUtils.typeof(paramName.makeRef(), context.program().getStringLiteral("object")); JsExpression prototypeEqual = JsAstUtils.equality(new JsInvocation(new JsNameRef("getPrototypeOf", new JsNameRef("Object")), JsLiteral.THIS), new JsInvocation(new JsNameRef("getPrototypeOf", new JsNameRef("Object")), new JsNameRef(paramName))); @@ -175,7 +176,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator { assert fieldChain != null; JsExpression returnExpression = - JsAstUtils.or(referenceEqual, JsAstUtils.and(isNotNull, JsAstUtils.and(prototypeEqual, fieldChain))); + JsAstUtils.or(referenceEqual, JsAstUtils.and(isNotNull, JsAstUtils.and(otherIsObject, JsAstUtils.and(prototypeEqual, fieldChain)))); functionObj.getBody().getStatements().add(new JsReturn(returnExpression)); } diff --git a/js/js.translator/testData/dataClass/cases/equals.kt b/js/js.translator/testData/dataClass/cases/equals.kt index 46421c58d67..8baf4efbdf7 100644 --- a/js/js.translator/testData/dataClass/cases/equals.kt +++ b/js/js.translator/testData/dataClass/cases/equals.kt @@ -37,5 +37,7 @@ fun box(): String { assertNotEquals(ho1, ho2) assertNotEquals(ho1, ho3) + assertTrue((d1 : Any) != "") + return "OK" } \ No newline at end of file