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);