1 23 24 25 package com.sun.jdo.api.persistence.enhancer.impl; 26 27 import java.util.HashMap ; 28 import java.util.ArrayList ; 29 import java.util.Iterator ; 30 import java.util.Enumeration ; 31 32 import com.sun.jdo.api.persistence.enhancer.classfile.*; 33 34 import com.sun.jdo.api.persistence.enhancer.util.Support; 35 import com.sun.jdo.api.persistence.enhancer.util.InternalError; 36 import com.sun.jdo.api.persistence.enhancer.util.ClassFileSource; 37 38 import com.sun.jdo.api.persistence.enhancer.meta.JDOMetaData; 40 41 42 69 70 74 class MethodBuilder 75 extends Support 76 implements VMConstants { 77 78 static private final boolean addSyntheticAttr = false; 113 static private final boolean addLineNumberTableAttr = true; 114 115 116 private final Environment env; 119 120 123 public MethodBuilder(Environment env) { 126 this.env = env; 127 } 128 129 135 ClassMethod makeNullMethod(final ClassAction ca, 137 final String methodName) { 138 final String methodSig = "()V"; env.message("adding " + ca.classControl().userClassName() + 142 "." + methodName + Descriptor.userMethodArgs(methodSig)); 144 145 final ConstantPool pool = ca.classFile().pool(); 146 final ConstClass thisClass = ca.classFile().className(); 147 148 final AttributeVector methodAttrs = new AttributeVector(); 149 final ClassMethod nullMethod 150 = new ClassMethod(ACCPublic, 151 pool.addUtf8(methodName), 152 pool.addUtf8(methodSig), 153 methodAttrs); 154 155 final InsnTarget begin = new InsnTarget(); 158 Insn insn = begin; 159 160 insn = insn.append(Insn.create(opc_return)); 162 163 final AttributeVector codeSpecificAttrs = new AttributeVector(); 164 165 if (addLineNumberTableAttr) { 167 codeSpecificAttrs.addElement( 168 new LineNumberTableAttribute( 169 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 170 new short[]{ 0 }, new InsnTarget[]{ begin })); 171 } 172 173 methodAttrs.addElement( 174 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 175 0, 1, begin, 178 new ExceptionTable(), 179 codeSpecificAttrs)); 180 181 if (addSyntheticAttr) { 183 methodAttrs.addElement( 184 new SyntheticAttribute( 185 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 186 } 187 188 return nullMethod; 189 } 190 191 194 295 296 299 374 375 378 460 461 464 495 496 503 ClassMethod makeJDOGetStateManager(final ClassAction ca, 505 final String methodName) { 506 final String methodSig = "()" + JDOMetaData.JDOStateManagerSig; env.message("adding " + ca.classControl().userClassName() + 510 "." + methodName + Descriptor.userMethodArgs(methodSig)); 512 513 final ConstantPool pool = ca.classFile().pool(); 514 final ConstClass theClass = ca.classFile().className(); 515 516 final AttributeVector methodAttrs = new AttributeVector(); 517 518 final ClassMethod jdoGetStateManagerMethod 520 = new ClassMethod(ACCPublic | ACCFinal, 521 pool.addUtf8(methodName), 522 pool.addUtf8(methodSig), 523 methodAttrs); 524 525 final InsnTarget begin = new InsnTarget(); 528 Insn insn = begin; 529 530 insn = insn.append(Insn.create(opc_aload_0)); 532 insn = insn.append( 533 Insn.create(opc_getfield, 534 pool.addFieldRef(theClass.asString(), 535 JDOMetaData.JDOStateManagerFieldName, 536 JDOMetaData.JDOStateManagerFieldSig))); 537 538 insn = insn.append(Insn.create(opc_areturn)); 540 541 final AttributeVector codeSpecificAttrs = new AttributeVector(); 542 543 if (addLineNumberTableAttr) { 545 codeSpecificAttrs.addElement( 546 new LineNumberTableAttribute( 547 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 548 new short[]{ 0 }, new InsnTarget[]{ begin })); 549 } 550 551 methodAttrs.addElement( 552 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 553 1, 1, begin, 556 new ExceptionTable(), 557 codeSpecificAttrs)); 558 559 if (addSyntheticAttr) { 561 methodAttrs.addElement( 562 new SyntheticAttribute( 563 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 564 } 565 566 return jdoGetStateManagerMethod; 567 } 568 569 576 ClassMethod makeJDOSetStateManager(final ClassAction ca, 578 final String methodName) { 579 final String methodSig = "(" + JDOMetaData.JDOStateManagerSig + ")V"; env.message("adding " + ca.classControl().userClassName() + 583 "." + methodName + Descriptor.userMethodArgs(methodSig)); 585 586 final ConstantPool pool = ca.classFile().pool(); 587 final ConstClass theClass = ca.classFile().className(); 588 589 final AttributeVector methodAttrs = new AttributeVector(); 590 591 final ClassMethod jdoSetStateManagerMethod 593 = new ClassMethod(ACCPublic | ACCFinal, 594 pool.addUtf8(methodName), 595 pool.addUtf8(methodSig), 596 methodAttrs); 597 598 final InsnTarget begin = new InsnTarget(); 601 Insn insn = begin; 602 603 insn = insn.append(Insn.create(opc_aload_0)); 605 insn = insn.append(Insn.create(opc_aload_1)); 606 insn = insn.append( 607 Insn.create(opc_putfield, 608 pool.addFieldRef(theClass.asString(), 609 JDOMetaData.JDOStateManagerFieldName, 610 JDOMetaData.JDOStateManagerFieldSig))); 611 612 insn = insn.append(Insn.create(opc_return)); 614 615 final AttributeVector codeSpecificAttrs = new AttributeVector(); 616 617 if (addLineNumberTableAttr) { 619 codeSpecificAttrs.addElement( 620 new LineNumberTableAttribute( 621 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 622 new short[]{ 0 }, new InsnTarget[]{ begin })); 623 } 624 625 methodAttrs.addElement( 626 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 627 2, 2, begin, 630 new ExceptionTable(), 631 codeSpecificAttrs)); 632 633 if (addSyntheticAttr) { 635 methodAttrs.addElement( 636 new SyntheticAttribute( 637 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 638 } 639 640 return jdoSetStateManagerMethod; 641 } 642 643 650 ClassMethod makeJDOGetFlags(final ClassAction ca, 652 final String methodName) { 653 final String methodSig = "()B"; env.message("adding " + ca.classControl().userClassName() + 657 "." + methodName + Descriptor.userMethodArgs(methodSig)); 659 660 final ConstantPool pool = ca.classFile().pool(); 661 final ConstClass theClass = ca.classFile().className(); 662 663 final AttributeVector methodAttrs = new AttributeVector(); 664 665 final ClassMethod jdoGetFlagsMethod 667 = new ClassMethod(ACCPublic | ACCFinal, 668 pool.addUtf8(methodName), 669 pool.addUtf8(methodSig), 670 methodAttrs); 671 672 final InsnTarget begin = new InsnTarget(); 675 Insn insn = begin; 676 677 insn = insn.append(Insn.create(opc_aload_0)); 679 insn = insn.append( 680 Insn.create(opc_getfield, 681 pool.addFieldRef(theClass.asString(), 682 JDOMetaData.JDOFlagsFieldName, 683 JDOMetaData.JDOFlagsFieldSig))); 684 685 insn = insn.append(Insn.create(opc_ireturn)); 687 688 final AttributeVector codeSpecificAttrs = new AttributeVector(); 689 690 if (addLineNumberTableAttr) { 692 codeSpecificAttrs.addElement( 693 new LineNumberTableAttribute( 694 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 695 new short[]{ 0 }, new InsnTarget[]{ begin })); 696 } 697 698 methodAttrs.addElement( 699 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 700 1, 1, begin, 703 new ExceptionTable(), 704 codeSpecificAttrs)); 705 706 if (addSyntheticAttr) { 708 methodAttrs.addElement( 709 new SyntheticAttribute( 710 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 711 } 712 713 return jdoGetFlagsMethod; 714 } 715 716 723 ClassMethod makeJDOSetFlags(final ClassAction ca, 725 final String methodName) { 726 final String methodSig = "(B)V"; env.message("adding " + ca.classControl().userClassName() + 730 "." + methodName + Descriptor.userMethodArgs(methodSig)); 732 733 final ConstantPool pool = ca.classFile().pool(); 734 final ConstClass theClass = ca.classFile().className(); 735 736 final AttributeVector methodAttrs = new AttributeVector(); 737 738 final ClassMethod jdoSetFlagsMethod 740 = new ClassMethod(ACCPublic | ACCFinal, 741 pool.addUtf8(methodName), 742 pool.addUtf8(methodSig), 743 methodAttrs); 744 745 final InsnTarget begin = new InsnTarget(); 748 Insn insn = begin; 749 750 insn = insn.append(Insn.create(opc_aload_0)); 752 insn = insn.append(Insn.create(opc_iload_1)); 753 insn = insn.append( 754 Insn.create(opc_putfield, 755 pool.addFieldRef(theClass.asString(), 756 JDOMetaData.JDOFlagsFieldName, 757 JDOMetaData.JDOFlagsFieldSig))); 758 759 insn = insn.append(Insn.create(opc_return)); 761 762 final AttributeVector codeSpecificAttrs = new AttributeVector(); 763 764 if (addLineNumberTableAttr) { 766 codeSpecificAttrs.addElement( 767 new LineNumberTableAttribute( 768 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 769 new short[]{ 0 }, new InsnTarget[]{ begin })); 770 } 771 772 methodAttrs.addElement( 773 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 774 2, 2, begin, 777 new ExceptionTable(), 778 codeSpecificAttrs)); 779 780 if (addSyntheticAttr) { 782 methodAttrs.addElement( 783 new SyntheticAttribute( 784 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 785 } 786 787 return jdoSetFlagsMethod; 788 } 789 790 799 ClassMethod makeJDOMakeDirtyMethod(final ClassAction ca, 801 final String methodName) { 802 final String methodSig = "(Ljava/lang/String;)V"; env.message("adding " + ca.classControl().userClassName() + 806 "." + methodName + Descriptor.userMethodArgs(methodSig)); 808 809 final ConstantPool pool = ca.classFile().pool(); 810 final ConstClass theClass = ca.classFile().className(); 811 812 final AttributeVector methodAttrs = new AttributeVector(); 813 814 final ClassMethod jdoMakeDirtyMethod 816 = new ClassMethod(ACCPublic | ACCFinal, 817 pool.addUtf8(methodName), 818 pool.addUtf8(methodSig), 819 methodAttrs); 820 821 final InsnTarget begin = new InsnTarget(); 824 Insn insn = begin; 825 826 insn = insn.append(Insn.create(opc_aload_0)); 828 insn = insn.append( 829 Insn.create( 830 opc_getfield, 831 pool.addFieldRef(theClass.asString(), 832 JDOMetaData.JDOStateManagerFieldName, 833 JDOMetaData.JDOStateManagerFieldSig))); 834 insn = insn.append(Insn.create(opc_astore_2)); 835 836 InsnTarget end = new InsnTarget(); 838 insn = insn.append(Insn.create(opc_aload_2)); 839 insn = insn.append(Insn.create(opc_ifnull, end)); 840 841 insn = insn.append(Insn.create(opc_aload_2)); 843 insn = insn.append(Insn.create(opc_aload_1)); 844 insn = insn.append( 845 new InsnInterfaceInvoke( 846 pool.addInterfaceMethodRef( 847 JDOMetaData.JDOStateManagerPath, 848 "makeDirty", "(Ljava/lang/String;)V"), 2)); 851 852 insn = insn.append(end); 854 insn = insn.append(Insn.create(opc_return)); 855 856 final AttributeVector codeSpecificAttrs = new AttributeVector(); 857 858 if (addLineNumberTableAttr) { 860 codeSpecificAttrs.addElement( 861 new LineNumberTableAttribute( 862 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 863 new short[]{ 0 }, new InsnTarget[]{ begin })); 864 } 865 866 methodAttrs.addElement( 867 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 868 2, 3, begin, 871 new ExceptionTable(), 872 codeSpecificAttrs)); 873 874 if (addSyntheticAttr) { 876 methodAttrs.addElement( 877 new SyntheticAttribute( 878 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 879 } 880 881 return jdoMakeDirtyMethod; 882 } 883 884 894 ClassMethod makeJDOInterrogativeMethod(final ClassAction ca, 896 final String methodName) { 897 final String methodSig = "()Z"; env.message("adding " + ca.classControl().userClassName() + 901 "." + methodName + Descriptor.userMethodArgs(methodSig)); 903 904 final ConstantPool pool = ca.classFile().pool(); 905 final ConstClass theClass = ca.classFile().className(); 906 907 final AttributeVector methodAttrs = new AttributeVector(); 908 909 final ClassMethod interrogativeMethod 911 = new ClassMethod(ACCPublic | ACCFinal, 912 pool.addUtf8(methodName), 913 pool.addUtf8(methodSig), 914 methodAttrs); 915 916 final InsnTarget begin = new InsnTarget(); 919 Insn insn = begin; 920 921 insn = insn.append(Insn.create(opc_aload_0)); 923 insn = insn.append( 924 Insn.create( 925 opc_getfield, 926 pool.addFieldRef(theClass.asString(), 927 JDOMetaData.JDOStateManagerFieldName, 928 JDOMetaData.JDOStateManagerFieldSig))); 929 insn = insn.append(Insn.create(opc_astore_1)); 930 931 InsnTarget call = new InsnTarget(); 933 insn = insn.append(Insn.create(opc_aload_1)); 934 insn = insn.append(Insn.create(opc_ifnonnull, call)); 935 insn = insn.append(Insn.create(opc_iconst_0)); 936 insn = insn.append(Insn.create(opc_ireturn)); 937 938 final String callName = "i" + methodName.substring(4); insn = insn.append(call); 941 insn = insn.append(Insn.create(opc_aload_1)); 942 insn = insn.append( 943 new InsnInterfaceInvoke( 944 pool.addInterfaceMethodRef( 945 JDOMetaData.JDOStateManagerPath, 946 callName, 947 "()Z"), 1)); 949 950 insn = insn.append(Insn.create(opc_ireturn)); 952 953 final AttributeVector codeSpecificAttrs = new AttributeVector(); 954 955 if (addLineNumberTableAttr) { 957 codeSpecificAttrs.addElement( 958 new LineNumberTableAttribute( 959 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 960 new short[]{ 0 }, new InsnTarget[]{ begin })); 961 } 962 963 methodAttrs.addElement( 964 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 965 1, 2, begin, 968 new ExceptionTable(), 969 codeSpecificAttrs)); 970 971 if (addSyntheticAttr) { 973 methodAttrs.addElement( 974 new SyntheticAttribute( 975 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 976 } 977 978 return interrogativeMethod; 979 } 980 981 991 ClassMethod makeJDOGetPersistenceManagerMethod(final ClassAction ca, 993 final String methodName) { 994 final String methodSig = "()" + JDOMetaData.JDOPersistenceManagerSig; env.message("adding " + ca.classControl().userClassName() + 998 "." + methodName + Descriptor.userMethodArgs(methodSig)); 1000 1001 final ConstantPool pool = ca.classFile().pool(); 1002 final ConstClass theClass = ca.classFile().className(); 1003 1004 final AttributeVector methodAttrs = new AttributeVector(); 1005 1006 final ClassMethod jdoGetPersistenceManagerMethod 1008 = new ClassMethod(ACCPublic | ACCFinal, 1009 pool.addUtf8(methodName), 1010 pool.addUtf8(methodSig), 1011 methodAttrs); 1012 1013 final InsnTarget begin = new InsnTarget(); 1016 Insn insn = begin; 1017 1018 insn = insn.append(Insn.create(opc_aload_0)); 1020 insn = insn.append( 1021 Insn.create( 1022 opc_getfield, 1023 pool.addFieldRef(theClass.asString(), 1024 JDOMetaData.JDOStateManagerFieldName, 1025 JDOMetaData.JDOStateManagerFieldSig))); 1026 insn = insn.append(Insn.create(opc_astore_1)); 1027 1028 InsnTarget call = new InsnTarget(); 1030 insn = insn.append(Insn.create(opc_aload_1)); 1031 insn = insn.append(Insn.create(opc_ifnonnull, call)); 1032 insn = insn.append(Insn.create(opc_aconst_null)); 1033 insn = insn.append(Insn.create(opc_areturn)); 1034 1035 insn = insn.append(call); 1037 insn = insn.append(Insn.create(opc_aload_1)); 1038 insn = insn.append( 1039 new InsnInterfaceInvoke( 1040 pool.addInterfaceMethodRef( 1041 JDOMetaData.JDOStateManagerPath, 1042 "getPersistenceManager", "()" + JDOMetaData.JDOPersistenceManagerSig), 1)); 1045 1046 insn = insn.append(Insn.create(opc_areturn)); 1048 1049 final AttributeVector codeSpecificAttrs = new AttributeVector(); 1050 1051 if (addLineNumberTableAttr) { 1053 codeSpecificAttrs.addElement( 1054 new LineNumberTableAttribute( 1055 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 1056 new short[]{ 0 }, new InsnTarget[]{ begin })); 1057 } 1058 1059 methodAttrs.addElement( 1060 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 1061 1, 2, begin, 1064 new ExceptionTable(), 1065 codeSpecificAttrs)); 1066 1067 if (addSyntheticAttr) { 1069 methodAttrs.addElement( 1070 new SyntheticAttribute( 1071 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 1072 } 1073 1074 return jdoGetPersistenceManagerMethod; 1075 } 1076 1077 1087 ClassMethod makeJDOGetObjectIdMethod(final ClassAction ca, 1089 final String methodName) { 1090 final String methodSig = "()Ljava/lang/Object;"; env.message("adding " + ca.classControl().userClassName() + 1094 "." + methodName + Descriptor.userMethodArgs(methodSig)); 1096 1097 final ConstantPool pool = ca.classFile().pool(); 1098 final ConstClass theClass = ca.classFile().className(); 1099 1100 final AttributeVector methodAttrs = new AttributeVector(); 1101 1102 final ClassMethod jdoGetObjectIdMethod 1104 = new ClassMethod(ACCPublic | ACCFinal, 1105 pool.addUtf8(methodName), 1106 pool.addUtf8(methodSig), 1107 methodAttrs); 1108 1109 final InsnTarget begin = new InsnTarget(); 1112 Insn insn = begin; 1113 1114 insn = insn.append(Insn.create(opc_aload_0)); 1116 insn = insn.append( 1117 Insn.create( 1118 opc_getfield, 1119 pool.addFieldRef(theClass.asString(), 1120 JDOMetaData.JDOStateManagerFieldName, 1121 JDOMetaData.JDOStateManagerFieldSig))); 1122 insn = insn.append(Insn.create(opc_astore_1)); 1123 1124 InsnTarget call = new InsnTarget(); 1126 insn = insn.append(Insn.create(opc_aload_1)); 1127 insn = insn.append(Insn.create(opc_ifnonnull, call)); 1128 insn = insn.append(Insn.create(opc_aconst_null)); 1129 insn = insn.append(Insn.create(opc_areturn)); 1130 1131 insn = insn.append(call); 1133 insn = insn.append(Insn.create(opc_aload_1)); 1134 insn = insn.append( 1135 new InsnInterfaceInvoke( 1136 pool.addInterfaceMethodRef( 1137 JDOMetaData.JDOStateManagerPath, 1138 "getObjectId", "()Ljava/lang/Object;"), 1)); 1141 1142 insn = insn.append(Insn.create(opc_areturn)); 1144 1145 final AttributeVector codeSpecificAttrs = new AttributeVector(); 1146 1147 if (addLineNumberTableAttr) { 1149 codeSpecificAttrs.addElement( 1150 new LineNumberTableAttribute( 1151 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 1152 new short[]{ 0 }, new InsnTarget[]{ begin })); 1153 } 1154 1155 methodAttrs.addElement( 1156 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 1157 1, 2, begin, 1160 new ExceptionTable(), 1161 codeSpecificAttrs)); 1162 1163 if (addSyntheticAttr) { 1165 methodAttrs.addElement( 1166 new SyntheticAttribute( 1167 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 1168 } 1169 1170 return jdoGetObjectIdMethod; 1171 } 1172 1173 1181 ClassMethod makeJDOConstructor(final ClassAction ca, 1183 final String methodName) { 1184 final String methodSig = "(" + JDOMetaData.JDOStateManagerSig + ")V"; env.message("adding " + ca.classControl().userClassName() + 1188 "." + methodName + Descriptor.userMethodArgs(methodSig)); 1190 1191 final ConstantPool pool = ca.classFile().pool(); 1192 final ConstClass theClass = ca.classFile().className(); 1193 1194 final AttributeVector methodAttrs = new AttributeVector(); 1195 final ClassMethod jdoGetJDOConstructor 1196 = new ClassMethod(ACCPublic, 1197 pool.addUtf8(methodName), 1198 pool.addUtf8(methodSig), 1199 methodAttrs); 1200 1201 final InsnTarget begin = new InsnTarget(); 1204 Insn insn = begin; 1205 1206 final ConstClass superClass = ca.classFile().superName(); 1208 insn = insn.append(Insn.create(opc_aload_0)); 1209 insn = insn.append( 1210 Insn.create(opc_invokespecial, 1211 pool.addMethodRef(superClass.asString(), 1212 "<init>", "()V"))); 1215 insn = insn.append(Insn.create(opc_aload_0)); 1217 insn = insn.append(Insn.create(opc_iconst_1)); 1218 insn = insn.append( 1219 Insn.create(opc_putfield, 1220 pool.addFieldRef(theClass.asString(), 1221 JDOMetaData.JDOFlagsFieldName, 1222 JDOMetaData.JDOFlagsFieldSig))); 1223 1224 insn = insn.append(Insn.create(opc_aload_0)); 1226 insn = insn.append(Insn.create(opc_aload_1)); 1227 insn = insn.append( 1228 Insn.create( 1229 opc_putfield, 1230 pool.addFieldRef(theClass.asString(), 1231 JDOMetaData.JDOStateManagerFieldName, 1232 JDOMetaData.JDOStateManagerFieldSig))); 1233 1234 insn = insn.append(Insn.create(opc_return)); 1236 1237 final AttributeVector codeSpecificAttrs = new AttributeVector(); 1238 1239 if (addLineNumberTableAttr) { 1241 codeSpecificAttrs.addElement( 1242 new LineNumberTableAttribute( 1243 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 1244 new short[]{ 0 }, new InsnTarget[]{ begin })); 1245 } 1246 1247 methodAttrs.addElement( 1248 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 1249 2, 2, begin, 1252 new ExceptionTable(), 1253 codeSpecificAttrs)); 1254 1255 if (addSyntheticAttr) { 1257 methodAttrs.addElement( 1258 new SyntheticAttribute( 1259 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 1260 } 1261 1262 return jdoGetJDOConstructor; 1263 } 1264 1265 1272 ClassMethod makeJDONewInstanceMethod(final ClassAction ca, 1274 final String methodName) { 1275 final String methodSig 1277 = "(" + JDOMetaData.JDOStateManagerSig + ")Ljava/lang/Object;"; env.message("adding " + ca.classControl().userClassName() + 1280 "." + methodName + Descriptor.userMethodArgs(methodSig)); 1282 1283 final ConstantPool pool = ca.classFile().pool(); 1284 final ConstClass theClass = ca.classFile().className(); 1285 1286 final AttributeVector methodAttrs = new AttributeVector(); 1287 final ClassMethod jdoNewInstanceMethod 1288 = new ClassMethod(ACCPublic, 1289 pool.addUtf8(methodName), 1290 pool.addUtf8(methodSig), 1291 methodAttrs); 1292 1293 final InsnTarget begin = new InsnTarget(); 1296 Insn insn = begin; 1297 1298 insn = insn.append(Insn.create(opc_new, theClass)); 1300 insn = insn.append(Insn.create(opc_dup)); 1301 insn = insn.append(Insn.create(opc_aload_1)); 1302 insn = insn.append( 1303 Insn.create( 1304 opc_invokespecial, 1305 pool.addMethodRef( 1306 theClass.asString(), 1307 "<init>", "(" + JDOMetaData.JDOStateManagerSig + ")V"))); 1310 insn = insn.append(Insn.create(opc_areturn)); 1312 1313 final AttributeVector codeSpecificAttrs = new AttributeVector(); 1314 1315 if (addLineNumberTableAttr) { 1317 codeSpecificAttrs.addElement( 1318 new LineNumberTableAttribute( 1319 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 1320 new short[]{ 0 }, new InsnTarget[]{ begin })); 1321 } 1322 1323 methodAttrs.addElement( 1324 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 1325 3, 2, begin, 1328 new ExceptionTable(), 1329 codeSpecificAttrs)); 1330 1331 if (addSyntheticAttr) { 1333 methodAttrs.addElement( 1334 new SyntheticAttribute( 1335 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 1336 } 1337 1338 return jdoNewInstanceMethod; 1339 } 1340 1341 1348 ClassMethod makeJDOClearMethod(final ClassAction ca, 1350 final String methodName) { 1351 final String methodSig = "()V"; env.message("adding " + ca.classControl().userClassName() + 1355 "." + methodName + Descriptor.userMethodArgs(methodSig)); 1357 1358 final ConstantPool pool = ca.classFile().pool(); 1359 final ConstClass theClass = ca.classFile().className(); 1360 1361 final AttributeVector methodAttrs = new AttributeVector(); 1362 final ClassMethod jdoClearMethod 1363 = new ClassMethod(ACCPublic, 1364 pool.addUtf8(methodName), 1365 pool.addUtf8(methodSig), 1366 methodAttrs); 1367 1368 final InsnTarget begin = new InsnTarget(); 1371 Insn insn = begin; 1372 1373 if (false) { 1375 insn = insn.append(Insn.create(opc_aload_0)); 1377 insn = insn.append(Insn.create(opc_iconst_1)); 1378 insn = insn.append( 1379 Insn.create(opc_putfield, 1380 pool.addFieldRef(theClass.asString(), 1381 JDOMetaData.JDOFlagsFieldName, 1382 JDOMetaData.JDOFlagsFieldSig))); 1383 } 1384 1385 for (Iterator e = ca.fieldActions(); e.hasNext();) { 1387 final FieldAction act = (FieldAction)e.next(); 1388 1391 if (!act.isPersistent()) 1393 continue; 1394 1395 if (act.isPrimaryKey()) 1397 continue; 1398 1399 if (act.isMutableSCO()) { 1401 insn = insn.append(Insn.create(opc_aload_0)); 1403 insn = insn.append( 1404 Insn.create(opc_getfield, 1405 pool.addFieldRef( 1406 theClass.asString(), 1407 act.fieldName(), 1408 act.typeDescriptor()))); 1409 1410 final ConstClass cc 1413 = pool.addClass(JDOMetaData.JDOSecondClassObjectBasePath); 1414 InsnTarget disconnect = new InsnTarget(); 1415 InsnTarget afterDisconnect = new InsnTarget(); 1416 insn = insn.append( 1417 Insn.create(opc_dup)); 1418 insn = insn.append( 1419 Insn.create(opc_instanceof, 1420 cc)); 1421 insn = insn.append( 1422 Insn.create(opc_ifne, 1423 disconnect)); 1424 1425 insn = insn.append( 1427 Insn.create(opc_pop)); 1428 insn = insn.append( 1429 Insn.create(opc_goto, afterDisconnect)); 1430 1431 insn = insn.append(disconnect); 1433 1434 insn = insn.append( 1436 Insn.create(opc_checkcast, 1437 cc)); 1438 1439 final int requiredStack = 1; 1441 insn = insn.append( 1442 new InsnInterfaceInvoke( 1443 pool.addInterfaceMethodRef( 1444 JDOMetaData.JDOSecondClassObjectBasePath, 1445 "unsetOwner", "()V"), requiredStack)); 1448 1449 insn = insn.append(afterDisconnect); 1450 } 1451 1452 insn = insn.append(Insn.create(opc_aload_0)); 1454 1455 switch(act.getMethodReturn()) { 1457 case T_DOUBLE: 1458 insn = insn.append(Insn.create(opc_dconst_0)); 1459 break; 1460 case T_LONG: 1461 insn = insn.append(Insn.create(opc_lconst_0)); 1462 break; 1463 case T_FLOAT: 1464 insn = insn.append(Insn.create(opc_fconst_0)); 1465 break; 1466 case T_BOOLEAN: 1467 case T_CHAR: 1468 case T_BYTE: 1469 case T_SHORT: 1470 case T_INT: 1471 insn = insn.append(Insn.create(opc_iconst_0)); 1472 break; 1473 case TC_STRING: 1474 case TC_OBJECT: 1475 case TC_INTERFACE: 1476 insn = insn.append(Insn.create(opc_aconst_null)); 1477 break; 1478 default: 1479 throw new InternalError ("Unexpected return type"); } 1481 1482 insn = insn.append( 1484 Insn.create(opc_putfield, 1485 pool.addFieldRef(theClass.asString(), 1486 act.fieldName(), 1487 act.typeDescriptor()))); 1488 } 1489 1490 insn = insn.append(Insn.create(opc_return)); 1492 1493 final AttributeVector codeSpecificAttrs = new AttributeVector(); 1494 1495 if (addLineNumberTableAttr) { 1497 codeSpecificAttrs.addElement( 1498 new LineNumberTableAttribute( 1499 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 1500 new short[]{ 0 }, new InsnTarget[]{ begin })); 1501 } 1502 1503 methodAttrs.addElement( 1504 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 1505 3, 1, begin, 1508 new ExceptionTable(), 1509 codeSpecificAttrs)); 1510 1511 if (addSyntheticAttr) { 1513 methodAttrs.addElement( 1514 new SyntheticAttribute( 1515 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 1516 } 1517 1518 return jdoClearMethod; 1519 } 1520 1521 1528 1743 1744 1751 ClassMethod makeJDOGetFieldMethod(final ClassAction ca, 1753 final String methodName) { 1754 final String methodSig = "(I)Ljava/lang/Object;"; env.message("adding " + ca.classControl().userClassName() + 1758 "." + methodName + Descriptor.userMethodArgs(methodSig)); 1760 1761 final ConstantPool pool = ca.classFile().pool(); 1762 final ConstClass theClass = ca.classFile().className(); 1763 1764 final AttributeVector methodAttrs = new AttributeVector(); 1765 final ClassMethod jdoGetFieldMethod 1766 = new ClassMethod(ACCPublic, 1767 pool.addUtf8(methodName), 1768 pool.addUtf8(methodSig), 1769 methodAttrs); 1770 1771 final InsnTarget begin = new InsnTarget(); 1774 Insn insn = begin; 1775 1776 final String className = ca.className(); 1778 final String [] fieldNames 1780 = env.getJDOMetaData().getManagedFields(className); 1781 final int nofFields = fieldNames.length; 1782 if (false) { 1784 System.out.print("MethodBuilder.makeJDOGetFieldMethod(): " + " declared, persistent fields of class '" + className + "' = {"); for (int i = 0; i < nofFields; i++) 1788 System.out.print(" " + fieldNames[i]); System.out.println(" }"); } 1791 1792 final InsnTarget defaultOp = new InsnTarget(); 1794 if (nofFields > 0) { 1795 final HashMap fieldsByName = new HashMap (); 1797 for (Iterator e = ca.fieldActions(); e.hasNext();) { 1798 final FieldAction act = (FieldAction)e.next(); 1799 fieldsByName.put(act.fieldName(), act); 1800 } 1801 1802 insn = insn.append(Insn.create(opc_iload_1)); 1804 final int lowOp = 0; 1805 final InsnTarget[] targetsOp = new InsnTarget[nofFields]; 1806 for (int i = 0; i < nofFields; i++) 1807 targetsOp[i] = new InsnTarget(); 1808 insn = insn.append( 1809 new InsnTableSwitch(lowOp, defaultOp, targetsOp)); 1810 1811 for (int i = 0; i < nofFields; i++) { 1813 insn = insn.append(targetsOp[i]); 1815 1816 final FieldAction act 1817 = (FieldAction)fieldsByName.get(fieldNames[i]); 1818 affirm(act, 1819 ("Field '" + fieldNames[i] + "' returned by JDOMetaData is not known by class '" + className + "'.")); 1823 final String wrapperClassName; 1825 final String wrapperSignature; 1826 switch(act.getMethodReturn()) { 1827 case T_DOUBLE: 1828 wrapperClassName = "java/lang/Double"; wrapperSignature = "(D)V"; insn = insn.append( 1831 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1832 insn = insn.append(Insn.create(opc_dup)); 1833 break; 1834 case T_LONG: 1835 wrapperClassName = "java/lang/Long"; wrapperSignature = "(J)V"; insn = insn.append( 1838 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1839 insn = insn.append(Insn.create(opc_dup)); 1840 break; 1841 case T_FLOAT: 1842 wrapperClassName = "java/lang/Float"; wrapperSignature = "(F)V"; insn = insn.append( 1845 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1846 insn = insn.append(Insn.create(opc_dup)); 1847 break; 1848 case T_BOOLEAN: 1849 wrapperClassName = "java/lang/Boolean"; wrapperSignature = "(Z)V"; insn = insn.append( 1852 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1853 insn = insn.append(Insn.create(opc_dup)); 1854 break; 1855 case T_CHAR: 1856 wrapperClassName = "java/lang/Character"; wrapperSignature = "(C)V"; insn = insn.append( 1859 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1860 insn = insn.append(Insn.create(opc_dup)); 1861 break; 1862 case T_BYTE: 1863 wrapperClassName = "java/lang/Byte"; wrapperSignature = "(B)V"; insn = insn.append( 1866 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1867 insn = insn.append(Insn.create(opc_dup)); 1868 break; 1869 case T_SHORT: 1870 wrapperClassName = "java/lang/Short"; wrapperSignature = "(S)V"; insn = insn.append( 1873 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1874 insn = insn.append(Insn.create(opc_dup)); 1875 break; 1876 case T_INT: 1877 wrapperClassName = "java/lang/Integer"; wrapperSignature = "(I)V"; insn = insn.append( 1880 Insn.create(opc_new, pool.addClass(wrapperClassName))); 1881 insn = insn.append(Insn.create(opc_dup)); 1882 break; 1883 case TC_STRING: 1884 case TC_OBJECT: 1885 case TC_INTERFACE: 1886 wrapperClassName = null; 1887 wrapperSignature = null; 1888 break; 1889 default: 1890 throw new InternalError ("Unexpected return type"); } 1892 1893 insn = insn.append(Insn.create(opc_aload_0)); 1895 insn = insn.append( 1896 Insn.create( 1897 opc_getfield, 1898 pool.addFieldRef( 1899 theClass.asString(), 1900 act.fieldName(), 1901 act.typeDescriptor()))); 1902 1903 switch(act.getMethodReturn()) { 1905 case T_DOUBLE: 1906 case T_LONG: 1907 case T_FLOAT: 1908 case T_BOOLEAN: 1909 case T_CHAR: 1910 case T_BYTE: 1911 case T_SHORT: 1912 case T_INT: 1913 insn = insn.append( 1914 Insn.create( 1915 opc_invokespecial, 1916 pool.addMethodRef( 1917 wrapperClassName, 1918 "<init>", wrapperSignature))); 1920 break; 1921 case TC_STRING: 1922 case TC_OBJECT: 1923 case TC_INTERFACE: 1924 break; 1925 default: 1926 throw new InternalError ("Unexpected return type"); } 1928 1929 insn = insn.append(Insn.create(opc_areturn)); 1931 } 1932 } 1933 1934 insn = insn.append(defaultOp); 1936 final String exceptionClassName 1937 = "com/sun/jdo/api/persistence/support/JDOFatalException"; insn = insn.append( 1939 Insn.create( 1940 opc_new, 1941 pool.addClass(exceptionClassName))); 1942 insn = insn.append(Insn.create(opc_dup)); 1943 insn = insn.append( 1944 Insn.create( 1945 opc_invokespecial, 1946 pool.addMethodRef( 1947 exceptionClassName, 1948 "<init>", "()V"))); 1951 insn = insn.append(Insn.create(opc_athrow)); 1953 1954 final AttributeVector codeSpecificAttrs = new AttributeVector(); 1955 1956 if (addLineNumberTableAttr) { 1958 codeSpecificAttrs.addElement( 1959 new LineNumberTableAttribute( 1960 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 1961 new short[]{ 0 }, new InsnTarget[]{ begin })); 1962 } 1963 1964 methodAttrs.addElement( 1965 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 1966 4, 2, begin, 1969 new ExceptionTable(), 1970 codeSpecificAttrs)); 1971 1972 if (addSyntheticAttr) { 1974 methodAttrs.addElement( 1975 new SyntheticAttribute( 1976 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 1977 } 1978 1979 return jdoGetFieldMethod; 1980 } 1981 1982 1989 ClassMethod makeJDOSetFieldMethod(final ClassAction ca, 1991 final String methodName) { 1992 final String methodSig = "(ILjava/lang/Object;)V"; env.message("adding " + ca.classControl().userClassName() + 1996 "." + methodName + Descriptor.userMethodArgs(methodSig)); 1998 1999 final ConstantPool pool = ca.classFile().pool(); 2000 final ConstClass theClass = ca.classFile().className(); 2001 2002 final AttributeVector methodAttrs = new AttributeVector(); 2003 final ClassMethod jdoSetFieldMethod 2004 = new ClassMethod(ACCPublic, 2005 pool.addUtf8(methodName), 2006 pool.addUtf8(methodSig), 2007 methodAttrs); 2008 2009 final InsnTarget begin = new InsnTarget(); 2012 Insn insn = begin; 2013 2014 final String className = ca.className(); 2016 final String [] fieldNames 2018 = env.getJDOMetaData().getManagedFields(className); 2019 final int nofFields = fieldNames.length; 2020 if (false) { 2022 System.out.print("MethodBuilder.makeJDOSetFieldMethod(): " + " declared, persistent fields of class '" + className + "' = {"); for (int i = 0; i < nofFields; i++) 2026 System.out.print(" " + fieldNames[i]); System.out.println(" }"); } 2029 2030 final InsnTarget defaultOp = new InsnTarget(); 2032 if (nofFields > 0) { 2033 final HashMap fieldsByName = new HashMap (); 2035 for (Iterator e = ca.fieldActions(); e.hasNext();) { 2036 final FieldAction act = (FieldAction)e.next(); 2037 fieldsByName.put(act.fieldName(), act); 2038 } 2039 2040 insn = insn.append(Insn.create(opc_iload_1)); 2042 final int lowOp = 0; 2043 final InsnTarget[] targetsOp = new InsnTarget[nofFields]; 2044 for (int i = 0; i < nofFields; i++) 2045 targetsOp[i] = new InsnTarget(); 2046 insn = insn.append( 2047 new InsnTableSwitch(lowOp, defaultOp, targetsOp)); 2048 2049 for (int i = 0; i < nofFields; i++) { 2051 insn = insn.append(targetsOp[i]); 2053 2054 final FieldAction act 2055 = (FieldAction)fieldsByName.get(fieldNames[i]); 2056 affirm(act, 2057 ("Field '" + fieldNames[i] 2059 + "' returned by JDOMetaData is not known by class '" + className + "'.")); 2062 insn = insn.append(Insn.create(opc_aload_0)); 2064 insn = insn.append(Insn.create(opc_aload_2)); 2065 2066 final String wrapperClassName; 2068 final String unwrapperSignature; 2069 final String unwrapperName; 2070 switch(act.getMethodReturn()) { 2071 case T_DOUBLE: 2072 wrapperClassName = "java/lang/Double"; unwrapperSignature = "()D"; unwrapperName = "doubleValue"; insn = insn.append( 2076 Insn.create(opc_checkcast, 2077 pool.addClass(wrapperClassName))); 2078 break; 2079 case T_LONG: 2080 wrapperClassName = "java/lang/Long"; unwrapperSignature = "()J"; unwrapperName = "longValue"; insn = insn.append( 2084 Insn.create(opc_checkcast, 2085 pool.addClass(wrapperClassName))); 2086 break; 2087 case T_FLOAT: 2088 wrapperClassName = "java/lang/Float"; unwrapperSignature = "()F"; unwrapperName = "floatValue"; insn = insn.append( 2092 Insn.create(opc_checkcast, 2093 pool.addClass(wrapperClassName))); 2094 break; 2095 case T_BOOLEAN: 2096 wrapperClassName = "java/lang/Boolean"; unwrapperSignature = "()Z"; unwrapperName = "booleanValue"; insn = insn.append( 2100 Insn.create(opc_checkcast, 2101 pool.addClass(wrapperClassName))); 2102 break; 2103 case T_CHAR: 2104 wrapperClassName = "java/lang/Character"; unwrapperSignature = "()C"; unwrapperName = "charValue"; insn = insn.append( 2108 Insn.create(opc_checkcast, 2109 pool.addClass(wrapperClassName))); 2110 break; 2111 case T_BYTE: 2112 wrapperClassName = "java/lang/Byte"; unwrapperSignature = "()B"; unwrapperName = "byteValue"; insn = insn.append( 2116 Insn.create(opc_checkcast, 2117 pool.addClass(wrapperClassName))); 2118 break; 2119 case T_SHORT: 2120 wrapperClassName = "java/lang/Short"; unwrapperSignature = "()S"; unwrapperName = "shortValue"; insn = insn.append( 2124 Insn.create(opc_checkcast, 2125 pool.addClass(wrapperClassName))); 2126 break; 2127 case T_INT: 2128 wrapperClassName = "java/lang/Integer"; unwrapperSignature = "()I"; unwrapperName = "intValue"; insn = insn.append( 2132 Insn.create(opc_checkcast, 2133 pool.addClass(wrapperClassName))); 2134 break; 2135 case TC_STRING: 2136 case TC_OBJECT: 2137 case TC_INTERFACE: 2138 wrapperClassName = null; 2139 unwrapperSignature = null; 2140 unwrapperName = null; 2141 insn = insn.append( 2142 Insn.create(opc_checkcast, 2143 pool.addClass(act.typeName()))); 2144 break; 2145 default: 2146 throw new InternalError ("Unexpected return type"); } 2148 2149 switch(act.getMethodReturn()) { 2151 case T_DOUBLE: 2152 case T_LONG: 2153 case T_FLOAT: 2154 case T_BOOLEAN: 2155 case T_CHAR: 2156 case T_BYTE: 2157 case T_SHORT: 2158 case T_INT: 2159 insn = insn.append( 2160 Insn.create( 2161 opc_invokevirtual, 2162 pool.addMethodRef( 2163 wrapperClassName, 2164 unwrapperName, 2165 unwrapperSignature))); 2166 break; 2167 case TC_STRING: 2168 case TC_OBJECT: 2169 case TC_INTERFACE: 2170 break; 2171 default: 2172 throw new InternalError ("Unexpected return type"); } 2174 2175 insn = insn.append( 2177 Insn.create( 2178 opc_putfield, 2179 pool.addFieldRef( 2180 theClass.asString(), 2181 act.fieldName(), 2182 act.typeDescriptor()))); 2183 2184 insn = insn.append(Insn.create(opc_return)); 2186 } 2187 } 2188 2189 insn = insn.append(defaultOp); 2191 final String exceptionClassName 2192 = "com/sun/jdo/api/persistence/support/JDOFatalException"; insn = insn.append( 2194 Insn.create( 2195 opc_new, 2196 pool.addClass(exceptionClassName))); 2197 insn = insn.append(Insn.create(opc_dup)); 2198 insn = insn.append( 2199 Insn.create( 2200 opc_invokespecial, 2201 pool.addMethodRef( 2202 exceptionClassName, 2203 "<init>", "()V"))); 2206 insn = insn.append(Insn.create(opc_athrow)); 2208 2209 final AttributeVector codeSpecificAttrs = new AttributeVector(); 2210 2211 if (addLineNumberTableAttr) { 2213 codeSpecificAttrs.addElement( 2214 new LineNumberTableAttribute( 2215 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 2216 new short[]{ 0 }, new InsnTarget[]{ begin })); 2217 } 2218 2219 methodAttrs.addElement( 2220 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 2221 3, 3, begin, 2224 new ExceptionTable(), 2225 codeSpecificAttrs)); 2226 2227 if (addSyntheticAttr) { 2229 methodAttrs.addElement( 2230 new SyntheticAttribute( 2231 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 2232 } 2233 2234 return jdoSetFieldMethod; 2235 } 2236 2237 2240 ClassMethod makeJDOClone(final ClassAction ca, 2242 final String methodName) { 2243 final String methodSig = "()Ljava/lang/Object;"; env.message("adding " + ca.classControl().userClassName() + 2247 "." + methodName + Descriptor.userMethodArgs(methodSig)); 2249 2250 final ClassFile cFile = ca.classFile(); 2251 final ConstantPool pool = cFile.pool(); 2252 final ConstClass theClass = cFile.className(); 2253 final ConstClass superClass = cFile.superName(); 2254 2255 final AttributeVector methodAttrs = new AttributeVector(); 2256 final ClassMethod cloneMethod 2260 = new ClassMethod(ACCPublic, pool.addUtf8(methodName), 2262 pool.addUtf8(methodSig), 2263 methodAttrs); 2264 2265 final InsnTarget begin = new InsnTarget(); 2268 Insn insn = begin; 2269 2270 2293 2294 { 2296 insn = insn.append(Insn.create(opc_aload_0)); 2297 insn = insn.append( 2298 Insn.create(opc_invokespecial, 2299 pool.addMethodRef(superClass.asString(), 2300 methodName, 2302 methodSig))); 2303 2304 insn = insn.append(Insn.create(opc_checkcast, theClass)); 2306 } 2307 2308 2312 if (false) 2314 { 2315 insn = insn.append(Insn.create(opc_dup)); 2316 insn = insn.append(Insn.create(opc_aconst_null)); 2317 insn = insn.append( 2318 Insn.create( 2319 opc_putfield, 2320 pool.addFieldRef(theClass.asString(), 2321 JDOMetaData.JDOStateManagerFieldName, 2322 JDOMetaData.JDOStateManagerFieldSig))); 2323 } 2324 2325 2329 if (false) 2331 { 2332 insn = insn.append(Insn.create(opc_dup)); 2333 insn = insn.append(Insn.create(opc_iconst_0)); 2334 insn = insn.append( 2335 Insn.create(opc_putfield, 2336 pool.addFieldRef(theClass.asString(), 2337 JDOMetaData.JDOFlagsFieldName, 2338 JDOMetaData.JDOFlagsFieldSig))); 2339 } 2340 2341 2343 insn = insn.append(Insn.create(opc_areturn)); 2345 2346 final AttributeVector codeSpecificAttrs = new AttributeVector(); 2347 2348 if (addLineNumberTableAttr) { 2350 codeSpecificAttrs.addElement( 2351 new LineNumberTableAttribute( 2352 pool.addUtf8(LineNumberTableAttribute.expectedAttrName), 2353 new short[]{ 0 }, new InsnTarget[]{ begin })); 2354 } 2355 2356 methodAttrs.addElement( 2357 new CodeAttribute(pool.addUtf8(CodeAttribute.expectedAttrName), 2358 1, 1, begin, 2362 new ExceptionTable(), 2363 codeSpecificAttrs)); 2364 2365 if (addSyntheticAttr) { 2367 methodAttrs.addElement( 2368 new SyntheticAttribute( 2369 pool.addUtf8(SyntheticAttribute.expectedAttrName))); 2370 } 2371 2372 methodAttrs.addElement( 2373 new ExceptionsAttribute( 2374 pool.addUtf8(ExceptionsAttribute.expectedAttrName), 2375 pool.addClass("java/lang/CloneNotSupportedException"))); 2377 return cloneMethod; 2378 } 2379 2380 static private void printFieldAction(FieldAction act) { 2382 System.out.println("fieldName() = " + act.fieldName()); System.out.println("userFieldName() = " + act.userFieldName()); System.out.println("typeDescriptor() = " + act.typeDescriptor()); System.out.println("typeName() = " + act.typeName()); System.out.println("fieldClassName() = " + act.fieldClassName()); System.out.println("isPersistent() = " + act.isPersistent()); System.out.println("isPrimaryKey() = " + act.isPrimaryKey()); System.out.println("isMutableSCO() = " + act.isMutableSCO()); System.out.println("isSynthetic() = " + act.isSynthetic()); System.out.println("nDims() = " + act.nDims()); System.out.println("createMethod() = " + act.createMethod()); System.out.println("createMethodSig() = " + act.createMethodSig()); System.out.println("setMethod() = " + act.setMethod()); System.out.println("setMethodSig() = " + act.setMethodSig()); System.out.println("setMethodArg() = " + typeToString(act.setMethodArg())); 2399 System.out.println("getMethod() = " + act.getMethod()); System.out.println("getMethodSig() = " + act.getMethodSig()); System.out.println("getMethodReturn() = " + typeToString(act.getMethodReturn())); 2403 } 2404 2405 static private String typeToString(int val) { 2407 switch(val) { 2408 case T_DOUBLE: 2409 return "T_DOUBLE"; case T_LONG: 2411 return "T_LONG"; case T_BOOLEAN: 2413 return "T_BOOLEAN"; case T_CHAR: 2415 return "T_CHAR"; case T_FLOAT: 2417 return "T_FLOAT"; case T_BYTE: 2419 return "T_BYTE"; case T_SHORT: 2421 return "T_SHORT"; case T_INT: 2423 return "T_INT"; case TC_STRING: 2425 return "TC_STRING"; case TC_OBJECT: 2427 return "TC_OBJECT"; case TC_INTERFACE: 2429 return "TC_INTERFACE"; default: 2431 throw new InternalError ("Unexpected return type"); } 2433 } 2434} 2435 | Popular Tags |