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

Print this page

        

@@ -27,10 +27,11 @@
 
 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,10 +101,20 @@
         } 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);