src/jdk/nashorn/internal/objects/NativeFunction.java

Print this page

        

*** 27,36 **** --- 27,37 ---- import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; import java.util.List; + import jdk.nashorn.api.scripting.ScriptObjectMirror; import jdk.nashorn.internal.objects.annotations.Attribute; import jdk.nashorn.internal.objects.annotations.Constructor; import jdk.nashorn.internal.objects.annotations.Function; import jdk.nashorn.internal.objects.annotations.ScriptClass; import jdk.nashorn.internal.parser.Parser;
*** 100,109 **** --- 101,120 ---- } else if (array instanceof List) { final List<?> list = (List<?>)array; list.toArray(args = new Object[list.size()]); } else if (array == null || array == UNDEFINED) { args = ScriptRuntime.EMPTY_ARRAY; + } else if (array instanceof ScriptObjectMirror) { + // look for array-like ScriptObjectMirror object + final ScriptObjectMirror mirror = (ScriptObjectMirror)array; + final Object len = mirror.containsKey("length")? mirror.getMember("length") : Integer.valueOf(0); + final int n = (int)JSType.toUint32(len); + + args = new Object[n]; + for (int i = 0; i < args.length; i++) { + args[i] = mirror.containsKey(i)? mirror.getSlot(i) : UNDEFINED; + } } else { throw typeError("function.apply.expects.array"); } return ScriptRuntime.apply((ScriptFunction)self, thiz, args);