private void GenerateResumeGenerator(ClassFileWriter cfw)
{
bool hasGenerators = false;
for (int i = 0; i < scriptOrFnNodes.Length; i++)
{
if (IsGenerator(scriptOrFnNodes[i]))
{
hasGenerators = true;
}
}
// if there are no generators defined, we don't implement a
// resumeGenerator(). The base class provides a default implementation.
if (!hasGenerators)
{
return;
}
cfw.StartMethod("resumeGenerator", "(Lorg/mozilla/javascript/Context;" + "Lorg/mozilla/javascript/Scriptable;" + "ILjava/lang/Object;" + "Ljava/lang/Object;)Ljava/lang/Object;", (short)(ClassFileWriter.ACC_PUBLIC | ClassFileWriter.ACC_FINAL));
// load arguments for dispatch to the corresponding *_gen method
cfw.AddALoad(0);
cfw.AddALoad(1);
cfw.AddALoad(2);
cfw.AddALoad(4);
cfw.AddALoad(5);
cfw.AddILoad(3);
cfw.AddLoadThis();
cfw.Add(ByteCode.GETFIELD, cfw.GetClassName(), ID_FIELD_NAME, "I");
int startSwitch = cfw.AddTableSwitch(0, scriptOrFnNodes.Length - 1);
cfw.MarkTableSwitchDefault(startSwitch);
int endlabel = cfw.AcquireLabel();
for (int i_1 = 0; i_1 < scriptOrFnNodes.Length; i_1++)
{
ScriptNode n = scriptOrFnNodes[i_1];
cfw.MarkTableSwitchCase(startSwitch, i_1, (short)6);
if (IsGenerator(n))
{
string type = "(" + mainClassSignature + "Lorg/mozilla/javascript/Context;" + "Lorg/mozilla/javascript/Scriptable;" + "Ljava/lang/Object;" + "Ljava/lang/Object;I)Ljava/lang/Object;";
cfw.AddInvoke(ByteCode.INVOKESTATIC, mainClassName, GetBodyMethodName(n) + "_gen", type);
cfw.Add(ByteCode.ARETURN);
}
else
{
cfw.Add(ByteCode.GOTO, endlabel);
}
}
cfw.MarkLabel(endlabel);
PushUndefined(cfw);
cfw.Add(ByteCode.ARETURN);
// this method uses as many locals as there are arguments (hence 6)
cfw.StopMethod((short)6);
}