< prev index next >

src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/AbstractIterator.java

Print this page

        

*** 108,117 **** --- 108,152 ---- */ protected IteratorResult makeResult(final Object value, final Boolean done, final Global global) { return new IteratorResult(value, done, global); } + static MethodHandle getIteratorInvoker(final Global global) { + return global.getDynamicInvoker(ITERATOR_INVOKER_KEY, + () -> Bootstrap.createDynamicCallInvoker(Object.class, Object.class, Object.class)); + } + + /** + * Get the invoker for the ES6 iterator {@code next} method. + * @param global the global object + * @return the next invoker + */ + public static InvokeByName getNextInvoker(final Global global) { + return global.getInvokeByName(AbstractIterator.NEXT_INVOKER_KEY, + () -> new InvokeByName("next", Object.class, Object.class, Object.class)); + } + + /** + * Get the invoker for the ES6 iterator result {@code done} property. + * @param global the global object + * @return the done invoker + */ + public static MethodHandle getDoneInvoker(final Global global) { + return global.getDynamicInvoker(AbstractIterator.DONE_INVOKER_KEY, + () -> Bootstrap.createDynamicInvoker("done", NashornCallSiteDescriptor.GET_PROPERTY, Object.class, Object.class)); + } + + /** + * Get the invoker for the ES6 iterator result {@code value} property. + * @param global the global object + * @return the value invoker + */ + public static MethodHandle getValueInvoker(final Global global) { + return global.getDynamicInvoker(AbstractIterator.VALUE_INVOKER_KEY, + () -> Bootstrap.createDynamicInvoker("value", NashornCallSiteDescriptor.GET_PROPERTY, Object.class, Object.class)); + } + /** * ES6 7.4.1 GetIterator abstract operation * * @param iterable an object * @param global the global object
*** 124,135 **** // TODO we need to implement fast property access for Symbol keys in order to use InvokeByName here. final Object getter = ((ScriptObject) object).get(NativeSymbol.iterator); if (Bootstrap.isCallable(getter)) { try { ! final MethodHandle invoker = global.getDynamicInvoker(ITERATOR_INVOKER_KEY, ! () -> Bootstrap.createDynamicCallInvoker(Object.class, Object.class, Object.class)); final Object value = invoker.invokeExact(getter, iterable); if (JSType.isPrimitive(value)) { throw typeError("not.an.object", ScriptRuntime.safeToString(value)); } --- 159,169 ---- // TODO we need to implement fast property access for Symbol keys in order to use InvokeByName here. final Object getter = ((ScriptObject) object).get(NativeSymbol.iterator); if (Bootstrap.isCallable(getter)) { try { ! final MethodHandle invoker = getIteratorInvoker(global); final Object value = invoker.invokeExact(getter, iterable); if (JSType.isPrimitive(value)) { throw typeError("not.an.object", ScriptRuntime.safeToString(value)); }
*** 154,169 **** */ public static void iterate(final Object iterable, final Global global, final Consumer<Object> consumer) { final Object iterator = AbstractIterator.getIterator(Global.toObject(iterable), global); ! final InvokeByName nextInvoker = global.getInvokeByName(AbstractIterator.NEXT_INVOKER_KEY, ! () -> new InvokeByName("next", Object.class, Object.class, Object.class)); ! final MethodHandle doneInvoker = global.getDynamicInvoker(AbstractIterator.DONE_INVOKER_KEY, ! () -> Bootstrap.createDynamicInvoker("done", NashornCallSiteDescriptor.GET_PROPERTY, Object.class, Object.class)); ! final MethodHandle valueInvoker = global.getDynamicInvoker(AbstractIterator.VALUE_INVOKER_KEY, ! () -> Bootstrap.createDynamicInvoker("value", NashornCallSiteDescriptor.GET_PROPERTY, Object.class, Object.class)); try { do { final Object next = nextInvoker.getGetter().invokeExact(iterator); if (!Bootstrap.isCallable(next)) { --- 188,200 ---- */ public static void iterate(final Object iterable, final Global global, final Consumer<Object> consumer) { final Object iterator = AbstractIterator.getIterator(Global.toObject(iterable), global); ! final InvokeByName nextInvoker = getNextInvoker(global); ! final MethodHandle doneInvoker = getDoneInvoker(global); ! final MethodHandle valueInvoker = getValueInvoker(global); try { do { final Object next = nextInvoker.getGetter().invokeExact(iterator); if (!Bootstrap.isCallable(next)) {
< prev index next >