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)); }