From d22447c4d82c5e975770c299ced589339c0ef809 Mon Sep 17 00:00:00 2001 From: Ronald Brill Date: Sun, 19 Feb 2023 13:32:19 +0100 Subject: [PATCH] setter function (from property descriptor) has to convert the args (see https://github.com/HtmlUnit/htmlunit-rhino-fork/pull/7) also --- src/org/mozilla/javascript/MemberBox.java | 9 +++- .../ObjectGetOwnPropertyDescriptorTest.java | 49 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/org/mozilla/javascript/MemberBox.java b/src/org/mozilla/javascript/MemberBox.java index 6cde62586b..a24d47435d 100644 --- a/src/org/mozilla/javascript/MemberBox.java +++ b/src/org/mozilla/javascript/MemberBox.java @@ -168,7 +168,14 @@ public Object call( Object setterThis; Object[] args; Object value = - originalArgs.length > 0 ? originalArgs[0] : Undefined.instance; + originalArgs.length > 0 + ? FunctionObject.convertArg( + cx, + thisObj, + originalArgs[0], + FunctionObject.getTypeTag( + nativeSetter.argTypes[0])) + : Undefined.instance; if (nativeSetter.delegateTo == null) { setterThis = thisObj; args = new Object[] {value}; diff --git a/testsrc/org/mozilla/javascript/tests/es5/ObjectGetOwnPropertyDescriptorTest.java b/testsrc/org/mozilla/javascript/tests/es5/ObjectGetOwnPropertyDescriptorTest.java index efdc099eb8..39adab14f7 100644 --- a/testsrc/org/mozilla/javascript/tests/es5/ObjectGetOwnPropertyDescriptorTest.java +++ b/testsrc/org/mozilla/javascript/tests/es5/ObjectGetOwnPropertyDescriptorTest.java @@ -11,8 +11,13 @@ import static org.mozilla.javascript.tests.Evaluator.eval; import org.junit.Test; +import org.mozilla.javascript.Context; import org.mozilla.javascript.NativeObject; +import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; +import org.mozilla.javascript.annotations.JSConstructor; +import org.mozilla.javascript.annotations.JSGetter; +import org.mozilla.javascript.annotations.JSSetter; public class ObjectGetOwnPropertyDescriptorTest { @@ -40,4 +45,48 @@ public void testContentsOfPropertyDescriptorShouldReflectAttributesOfProperty() assertEquals(false, descriptor.get("writable")); assertEquals(false, descriptor.get("configurable")); } + + @Test + public void callPropertyDescriptorSetterWithConsString() throws Exception { + try (Context cx = Context.enter()) { + Scriptable scope = cx.initStandardObjects(); + ScriptableObject.defineClass(scope, AnnotatedHostObject.class); + + final String script = + "var hostObj = new AnnotatedHostObject();\n" + + "var valueProperty = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(hostObj), 'myProp');\n" + + "var consString = 'a';\n" + + "consString = consString + 'bc';\n" + + "valueProperty.set.call(hostObj, consString);\n" + + "var result = '' + valueProperty.get.call(hostObj);\n" + + "result;\n"; + String result = (String) cx.evaluateString(scope, script, "", 0, null); + assertEquals("abc", result); + } + } + + public static class AnnotatedHostObject extends ScriptableObject { + + String myProp; + + public AnnotatedHostObject() {} + + @Override + public String getClassName() { + return "AnnotatedHostObject"; + } + + @JSConstructor + public void jsConstructorMethod() {} + + @JSGetter + public String getMyProp() { + return myProp; + } + + @JSSetter + public void setMyProp(String prop) { + myProp = prop; + } + } }