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