Fri, 16 Aug 2013 15:04:36 +0530
8020355: bind on built-in constructors don't use bound argument values
Reviewed-by: lagergren, hannesw
src/jdk/nashorn/internal/runtime/ScriptFunctionData.java | file | annotate | diff | comparison | revisions | |
test/script/basic/JDK-8020355.js | file | annotate | diff | comparison | revisions |
1.1 --- a/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java Wed Aug 14 20:51:53 2013 +0530 1.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java Fri Aug 16 15:04:36 2013 +0530 1.3 @@ -250,9 +250,18 @@ 1.4 final int length = args == null ? 0 : args.length; 1.5 1.6 CompiledFunctions boundList = new CompiledFunctions(); 1.7 - for (final CompiledFunction inv : code) { 1.8 + if (code.size() == 1) { 1.9 + // only one variant - bind that 1.10 + boundList.add(bind(code.first(), fn, self, allArgs)); 1.11 + } else { 1.12 + // There are specialized versions. Get the most generic one. 1.13 + // This is to avoid ambiguous overloaded versions of bound and 1.14 + // specialized variants and choosing wrong overload. 1.15 + final MethodHandle genInvoker = getGenericInvoker(); 1.16 + final CompiledFunction inv = new CompiledFunction(genInvoker.type(), genInvoker, getGenericConstructor()); 1.17 boundList.add(bind(inv, fn, self, allArgs)); 1.18 } 1.19 + 1.20 ScriptFunctionData boundData = new FinalScriptFunctionData(name, arity == -1 ? -1 : Math.max(0, arity - length), boundList, isStrict(), isBuiltin(), isConstructor()); 1.21 return boundData; 1.22 }
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/test/script/basic/JDK-8020355.js Fri Aug 16 15:04:36 2013 +0530 2.3 @@ -0,0 +1,63 @@ 2.4 +/* 2.5 + * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 2.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.7 + * 2.8 + * This code is free software; you can redistribute it and/or modify it 2.9 + * under the terms of the GNU General Public License version 2 only, as 2.10 + * published by the Free Software Foundation. 2.11 + * 2.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 2.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 2.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2.15 + * version 2 for more details (a copy is included in the LICENSE file that 2.16 + * accompanied this code). 2.17 + * 2.18 + * You should have received a copy of the GNU General Public License version 2.19 + * 2 along with this work; if not, write to the Free Software Foundation, 2.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2.21 + * 2.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2.23 + * or visit www.oracle.com if you need additional information or have any 2.24 + * questions. 2.25 + */ 2.26 + 2.27 +/** 2.28 + * JDK-8020355: bind on built-in constructors don't use bound argument values 2.29 + * 2.30 + * @test 2.31 + * @run 2.32 + */ 2.33 + 2.34 +if (Array.bind(null, 2)().length != 2) { 2.35 + fail("Expected Array.bind(null, 2)().length to be 2"); 2.36 +} 2.37 + 2.38 +if (RegExp.bind(null, "a")().source.length != 1) { 2.39 + fail("Expected RegExp.bind(null, 'a')().source.length to be 1"); 2.40 +} 2.41 + 2.42 +// check user defined functions as well 2.43 + 2.44 +var res = (function(x, y) { return x*y }).bind(null, 20, 30)(); 2.45 +if (res != 600) { 2.46 + fail("Expected 600, but got " + res); 2.47 +} 2.48 + 2.49 +var obj = new ((function(x, y) { this.foo = x*y }).bind({}, 20, 30))(); 2.50 +if (obj.foo != 600) { 2.51 + fail("Expected this.foo = 600, but got " + res); 2.52 +} 2.53 + 2.54 +// try variadic function as well 2.55 + 2.56 +var res = (function() { return arguments[0]*arguments[1] }).bind(null, 20, 30)(); 2.57 +if (res != 600) { 2.58 + fail("Expected 600, but got " + res); 2.59 +} 2.60 + 2.61 +var obj = new ((function(x, y) { this.foo = arguments[0]*arguments[1] }).bind({}, 20, 30))(); 2.62 +if (obj.foo != 600) { 2.63 + fail("Expected this.foo = 600, but got " + res); 2.64 +} 2.65 + 2.66 +