623 }
624
625 // finally, invoke the constructor and return
626 mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", makeSignature(types, true));
627 mv.visitInsn(ARETURN);
628 mv.visitMaxs(0, 0);
629 mv.visitEnd();
630
631 // emit copyWith()
632 mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "copyWith", makeSignature("", false), null, null);
633 mv.visitCode();
634 // make instance
635 mv.visitTypeInsn(NEW, className);
636 mv.visitInsn(DUP);
637 // load mt, lf
638 mv.visitVarInsn(ALOAD, 1);
639 mv.visitVarInsn(ALOAD, 2);
640 // put fields on the stack
641 emitPushFields(types, className, mv);
642 // finally, invoke the constructor and return
643 mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", makeSignature(types, true));
644 mv.visitInsn(ARETURN);
645 mv.visitMaxs(0, 0);
646 mv.visitEnd();
647
648 // for each type, emit copyWithExtendT()
649 for (BasicType type : BasicType.ARG_TYPES) {
650 int ord = type.ordinal();
651 char btChar = type.basicTypeChar();
652 mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "copyWithExtend" + btChar, makeSignature(String.valueOf(btChar), false), null, E_THROWABLE);
653 mv.visitCode();
654 // return SPECIES_DATA.extendWith(t).constructor[0].invokeBasic(mt, lf, argL0, ..., narg)
655 // obtain constructor
656 mv.visitFieldInsn(GETSTATIC, className, "SPECIES_DATA", SPECIES_DATA_SIG);
657 int iconstInsn = ICONST_0 + ord;
658 assert(iconstInsn <= ICONST_5);
659 mv.visitInsn(iconstInsn);
660 mv.visitMethodInsn(INVOKEVIRTUAL, SPECIES_DATA, "extendWith", BMHSPECIES_DATA_EWI_SIG);
661 mv.visitFieldInsn(GETFIELD, SPECIES_DATA, "constructor", "[" + MH_SIG);
662 mv.visitInsn(ICONST_0);
663 mv.visitInsn(AALOAD);
664 // load mt, lf
665 mv.visitVarInsn(ALOAD, 1);
666 mv.visitVarInsn(ALOAD, 2);
667 // put fields on the stack
668 emitPushFields(types, className, mv);
669 // put narg on stack
670 mv.visitVarInsn(typeLoadOp(btChar), 3);
671 // finally, invoke the constructor and return
672 mv.visitMethodInsn(INVOKEVIRTUAL, MH, "invokeBasic", makeSignature(types + btChar, false), false);
673 mv.visitInsn(ARETURN);
674 mv.visitMaxs(0, 0);
675 mv.visitEnd();
676 }
677
678 // emit class initializer
679 mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
680 mv.visitCode();
|
623 }
624
625 // finally, invoke the constructor and return
626 mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", makeSignature(types, true));
627 mv.visitInsn(ARETURN);
628 mv.visitMaxs(0, 0);
629 mv.visitEnd();
630
631 // emit copyWith()
632 mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "copyWith", makeSignature("", false), null, null);
633 mv.visitCode();
634 // make instance
635 mv.visitTypeInsn(NEW, className);
636 mv.visitInsn(DUP);
637 // load mt, lf
638 mv.visitVarInsn(ALOAD, 1);
639 mv.visitVarInsn(ALOAD, 2);
640 // put fields on the stack
641 emitPushFields(types, className, mv);
642 // finally, invoke the constructor and return
643 mv.visitMethodInsn(INVOKESPECIAL, className, "<init>", makeSignature(types, true), false);
644 mv.visitInsn(ARETURN);
645 mv.visitMaxs(0, 0);
646 mv.visitEnd();
647
648 // for each type, emit copyWithExtendT()
649 for (BasicType type : BasicType.ARG_TYPES) {
650 int ord = type.ordinal();
651 char btChar = type.basicTypeChar();
652 mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "copyWithExtend" + btChar, makeSignature(String.valueOf(btChar), false), null, E_THROWABLE);
653 mv.visitCode();
654 // return SPECIES_DATA.extendWith(t).constructor[0].invokeBasic(mt, lf, argL0, ..., narg)
655 // obtain constructor
656 mv.visitFieldInsn(GETSTATIC, className, "SPECIES_DATA", SPECIES_DATA_SIG);
657 int iconstInsn = ICONST_0 + ord;
658 assert(iconstInsn <= ICONST_5);
659 mv.visitInsn(iconstInsn);
660 mv.visitMethodInsn(INVOKEVIRTUAL, SPECIES_DATA, "extendWith", BMHSPECIES_DATA_EWI_SIG, false);
661 mv.visitFieldInsn(GETFIELD, SPECIES_DATA, "constructor", "[" + MH_SIG);
662 mv.visitInsn(ICONST_0);
663 mv.visitInsn(AALOAD);
664 // load mt, lf
665 mv.visitVarInsn(ALOAD, 1);
666 mv.visitVarInsn(ALOAD, 2);
667 // put fields on the stack
668 emitPushFields(types, className, mv);
669 // put narg on stack
670 mv.visitVarInsn(typeLoadOp(btChar), 3);
671 // finally, invoke the constructor and return
672 mv.visitMethodInsn(INVOKEVIRTUAL, MH, "invokeBasic", makeSignature(types + btChar, false), false);
673 mv.visitInsn(ARETURN);
674 mv.visitMaxs(0, 0);
675 mv.visitEnd();
676 }
677
678 // emit class initializer
679 mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
680 mv.visitCode();
|