diff --git a/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java b/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java index 724f27b5b2c..f7c59103a7d 100644 --- a/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java +++ b/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java @@ -340,10 +340,10 @@ static int getConversionWeight(Object fromObj, TypeInfo to) { return 1; } else if (to.isInstance(fromObj)) { return 2; + } else if (to.isCharacter()) { + return 3; } else if (to.isPrimitive()) { - if (to.isCharacter()) { - return 3; - } else if (!to.isBoolean()) { + if (!to.isBoolean()) { return 4; } } diff --git a/tests/src/test/java/org/mozilla/javascript/tests/type_info/GenericAccessTest.java b/tests/src/test/java/org/mozilla/javascript/tests/type_info/GenericAccessTest.java index c8a7711f855..9c8a1961f82 100644 --- a/tests/src/test/java/org/mozilla/javascript/tests/type_info/GenericAccessTest.java +++ b/tests/src/test/java/org/mozilla/javascript/tests/type_info/GenericAccessTest.java @@ -186,6 +186,27 @@ public void testIntLongMap() { expect(js, "Integer 4 Long 2 Long 2"); } + @Test + public void testCharacters() { + String js = "bean.primitiveChar = 'a';\nbean.primitiveChar"; + FieldBasedBean fieldBasedBean = new FieldBasedBean(); + MethodBasedBean methodBasedBean = new MethodBasedBean(); + expect(js, "97", Map.of("bean", fieldBasedBean)); + Assertions.assertEquals('a', fieldBasedBean.primitiveChar); + expect(js, "97", Map.of("bean", methodBasedBean)); + Assertions.assertEquals('a', methodBasedBean.getPrimitiveChar()); + + js = "bean.complexChar = 'b';\nbean.complexChar"; + expect(js, "b", Map.of("bean", fieldBasedBean)); + Assertions.assertEquals('b', fieldBasedBean.complexChar); + expect(js, "b", Map.of("bean", methodBasedBean)); + Assertions.assertEquals('b', methodBasedBean.getComplexChar()); + + js = "bean.setComplexChar('c');\nbean.complexChar"; + expect(js, "c", Map.of("bean", methodBasedBean)); + Assertions.assertEquals('c', methodBasedBean.getComplexChar()); + } + private static void expect(String script, String expected) { var bindings = new HashMap(); bindings.put("intList", IntegerArrayList.createTestObject()); diff --git a/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/FieldBasedBean.java b/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/FieldBasedBean.java index e61f7d0b934..b406e1dd491 100644 --- a/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/FieldBasedBean.java +++ b/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/FieldBasedBean.java @@ -15,6 +15,9 @@ public class FieldBasedBean implements Serializable { private static final long serialVersionUID = 1L; + public char primitiveChar = 0; + public Character complexChar = null; + public List integers = new ArrayList<>(); private List doubles = new ArrayList<>(); diff --git a/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/MethodBasedBean.java b/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/MethodBasedBean.java index ce7e29ba82c..f336f16b038 100644 --- a/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/MethodBasedBean.java +++ b/tests/src/test/java/org/mozilla/javascript/tests/type_info/test_object/MethodBasedBean.java @@ -15,6 +15,9 @@ public class MethodBasedBean implements Serializable { private static final long serialVersionUID = 1L; + private char primitiveChar = 0; + private Character complexChar = null; + private List integers = new ArrayList<>(); private List doubles = new ArrayList<>(); private List numbers = new ArrayList<>(); @@ -29,6 +32,22 @@ public class MethodBasedBean implements Serializable { private GenericBean intBean2 = new IntegerGenericBean(); private GenericBean dblBean2 = new DoubleGenericBean(); + public char getPrimitiveChar() { + return primitiveChar; + } + + public void setPrimitiveChar(char primitiveChar) { + this.primitiveChar = primitiveChar; + } + + public Character getComplexChar() { + return complexChar; + } + + public void setComplexChar(Character complexChar) { + this.complexChar = complexChar; + } + public List getDoubles() { return doubles; }