private void EmitDirectConstructor(ClassFileWriter cfw, OptFunctionNode ofn)
{
cfw.StartMethod(GetDirectCtorName(ofn.fnode), GetBodyMethodSignature(ofn.fnode), (short)(ClassFileWriter.ACC_STATIC | ClassFileWriter.ACC_PRIVATE));
int argCount = ofn.fnode.GetParamCount();
int firstLocal = (4 + argCount * 3) + 1;
cfw.AddALoad(0);
// this
cfw.AddALoad(1);
// cx
cfw.AddALoad(2);
// scope
cfw.AddInvoke(ByteCode.INVOKEVIRTUAL, "org/mozilla/javascript/BaseFunction", "createObject", "(Lorg/mozilla/javascript/Context;" + "Lorg/mozilla/javascript/Scriptable;" + ")Lorg/mozilla/javascript/Scriptable;");
cfw.AddAStore(firstLocal);
cfw.AddALoad(0);
cfw.AddALoad(1);
cfw.AddALoad(2);
cfw.AddALoad(firstLocal);
for (int i = 0; i < argCount; i++)
{
cfw.AddALoad(4 + (i * 3));
cfw.AddDLoad(5 + (i * 3));
}
cfw.AddALoad(4 + argCount * 3);
cfw.AddInvoke(ByteCode.INVOKESTATIC, mainClassName, GetBodyMethodName(ofn.fnode), GetBodyMethodSignature(ofn.fnode));
int exitLabel = cfw.AcquireLabel();
cfw.Add(ByteCode.DUP);
// make a copy of direct call result
cfw.Add(ByteCode.INSTANCEOF, "org/mozilla/javascript/Scriptable");
cfw.Add(ByteCode.IFEQ, exitLabel);
// cast direct call result
cfw.Add(ByteCode.CHECKCAST, "org/mozilla/javascript/Scriptable");
cfw.Add(ByteCode.ARETURN);
cfw.MarkLabel(exitLabel);
cfw.AddALoad(firstLocal);
cfw.Add(ByteCode.ARETURN);
cfw.StopMethod((short)(firstLocal + 1));
}