/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.compiler;
import com.github.anba.es6draft.ast.Node;
import com.github.anba.es6draft.compiler.assembler.MethodName;
import com.github.anba.es6draft.compiler.assembler.Type;
import com.github.anba.es6draft.compiler.assembler.Variable;
import com.github.anba.es6draft.runtime.internal.ScriptIterator;
/**
*
*/
abstract class IterationGenerator<NODE extends Node> extends AbstractIterationGenerator<NODE, ScriptIterator<?>> {
private static final class Methods {
// class: ScriptIterator
static final MethodName ScriptIterator_close = MethodName.findInterface(Types.ScriptIterator, "close",
Type.methodType(Type.VOID_TYPE));
static final MethodName ScriptIterator_close_exception = MethodName.findInterface(Types.ScriptIterator, "close",
Type.methodType(Type.VOID_TYPE, Types.Throwable));
}
IterationGenerator(CodeGenerator codegen) {
super(codegen);
}
@Override
protected final void IteratorClose(NODE node, Variable<ScriptIterator<?>> iterator,
Variable<? extends Throwable> throwable, CodeVisitor mv) {
mv.load(iterator);
mv.load(throwable);
mv.lineInfo(node);
mv.invoke(Methods.ScriptIterator_close_exception);
}
@Override
protected final void IteratorClose(NODE node, Variable<ScriptIterator<?>> iterator, CodeVisitor mv) {
mv.load(iterator);
mv.lineInfo(node);
mv.invoke(Methods.ScriptIterator_close);
}
}