1 30 package org.objectweb.asm; 31 32 37 final class Frame { 38 39 91 92 96 final static int DIM = 0xF0000000; 97 98 101 final static int ARRAY_OF = 0x10000000; 102 103 106 final static int ELEMENT_OF = 0xF0000000; 107 108 115 final static int KIND = 0xF000000; 116 117 120 final static int VALUE = 0xFFFFFF; 121 122 125 final static int BASE_KIND = 0xFF00000; 126 127 130 final static int BASE_VALUE = 0xFFFFF; 131 132 135 final static int BASE = 0x1000000; 136 137 141 final static int OBJECT = BASE | 0x700000; 142 143 148 final static int UNINITIALIZED = BASE | 0x800000; 149 150 154 private final static int LOCAL = 0x2000000; 155 156 161 private final static int STACK = 0x3000000; 162 163 166 final static int TOP = BASE | 0; 167 168 171 final static int BOOLEAN = BASE | 9; 172 173 176 final static int BYTE = BASE | 10; 177 178 181 final static int CHAR = BASE | 11; 182 183 186 final static int SHORT = BASE | 12; 187 188 191 final static int INTEGER = BASE | 1; 192 193 196 final static int FLOAT = BASE | 2; 197 198 201 final static int DOUBLE = BASE | 3; 202 203 206 final static int LONG = BASE | 4; 207 208 211 final static int NULL = BASE | 5; 212 213 216 final static int UNINITIALIZED_THIS = BASE | 6; 217 218 223 final static int[] SIZE; 224 225 228 static { 229 int i; 230 int[] b = new int[202]; 231 String s = "EFFFFFFFFGGFFFGGFFFEEFGFGFEEEEEEEEEEEEEEEEEEEEDEDEDDDDD" 232 + "CDCDEEEEEEEEEEEEEEEEEEEEBABABBBBDCFFFGGGEDCDCDCDCDCDCDCDCD" 233 + "CDCEEEEDDDDDDDCDCDCEFEFDDEEFFDEDEEEBDDBBDDDDDDCCCCCCCCEFED" 234 + "DDCDCDEEEEEEEEEEFEEEEEEDDEEDDEE"; 235 for (i = 0; i < b.length; ++i) { 236 b[i] = s.charAt(i) - 'E'; 237 } 238 SIZE = b; 239 240 } 453 454 458 Label owner; 459 460 463 int[] inputLocals; 464 465 468 int[] inputStack; 469 470 473 private int[] outputLocals; 474 475 478 private int[] outputStack; 479 480 490 private int outputStackTop; 491 492 497 private int initializationCount; 498 499 512 private int[] initializations; 513 514 520 private int get(final int local) { 521 if (outputLocals == null || local >= outputLocals.length) { 522 return LOCAL | local; 525 } else { 526 int type = outputLocals[local]; 527 if (type == 0) { 528 type = outputLocals[local] = LOCAL | local; 531 } 532 return type; 533 } 534 } 535 536 542 private void set(final int local, final int type) { 543 if (outputLocals == null) { 545 outputLocals = new int[10]; 546 } 547 int n = outputLocals.length; 548 if (local >= n) { 549 int[] t = new int[Math.max(local + 1, 2 * n)]; 550 System.arraycopy(outputLocals, 0, t, 0, n); 551 outputLocals = t; 552 } 553 outputLocals[local] = type; 555 } 556 557 562 private void push(final int type) { 563 if (outputStack == null) { 565 outputStack = new int[10]; 566 } 567 int n = outputStack.length; 568 if (outputStackTop >= n) { 569 int[] t = new int[Math.max(outputStackTop + 1, 2 * n)]; 570 System.arraycopy(outputStack, 0, t, 0, n); 571 outputStack = t; 572 } 573 outputStack[outputStackTop++] = type; 575 int top = owner.inputStackTop + outputStackTop; 577 if (top > owner.outputStackMax) { 578 owner.outputStackMax = top; 579 } 580 } 581 582 590 private void push(final ClassWriter cw, final String desc) { 591 int type = type(cw, desc); 592 if (type != 0) { 593 push(type); 594 if (type == LONG || type == DOUBLE) { 595 push(TOP); 596 } 597 } 598 } 599 600 607 private int type(final ClassWriter cw, final String desc) { 608 String t; 609 int index = desc.charAt(0) == '(' ? desc.indexOf(')') + 1 : 0; 610 switch (desc.charAt(index)) { 611 case 'V': 612 return 0; 613 case 'Z': 614 case 'C': 615 case 'B': 616 case 'S': 617 case 'I': 618 return INTEGER; 619 case 'F': 620 return FLOAT; 621 case 'J': 622 return LONG; 623 case 'D': 624 return DOUBLE; 625 case 'L': 626 t = desc.substring(index + 1, desc.length() - 1); 628 return OBJECT | cw.addType(t); 629 default: 631 int data; 633 int dims = index + 1; 634 while (desc.charAt(dims) == '[') { 635 ++dims; 636 } 637 switch (desc.charAt(dims)) { 638 case 'Z': 639 data = BOOLEAN; 640 break; 641 case 'C': 642 data = CHAR; 643 break; 644 case 'B': 645 data = BYTE; 646 break; 647 case 'S': 648 data = SHORT; 649 break; 650 case 'I': 651 data = INTEGER; 652 break; 653 case 'F': 654 data = FLOAT; 655 break; 656 case 'J': 657 data = LONG; 658 break; 659 case 'D': 660 data = DOUBLE; 661 break; 662 default: 664 t = desc.substring(dims + 1, desc.length() - 1); 666 data = OBJECT | cw.addType(t); 667 } 668 return (dims - index) << 28 | data; 669 } 670 } 671 672 677 private int pop() { 678 if (outputStackTop > 0) { 679 return outputStack[--outputStackTop]; 680 } else { 681 return STACK | -(--owner.inputStackTop); 683 } 684 } 685 686 691 private void pop(final int elements) { 692 if (outputStackTop >= elements) { 693 outputStackTop -= elements; 694 } else { 695 owner.inputStackTop -= elements - outputStackTop; 699 outputStackTop = 0; 700 } 701 } 702 703 710 private void pop(final String desc) { 711 char c = desc.charAt(0); 712 if (c == '(') { 713 pop((MethodWriter.getArgumentsAndReturnSizes(desc) >> 2) - 1); 714 } else if (c == 'J' || c == 'D') { 715 pop(2); 716 } else { 717 pop(1); 718 } 719 } 720 721 727 private void init(final int var) { 728 if (initializations == null) { 730 initializations = new int[2]; 731 } 732 int n = initializations.length; 733 if (initializationCount >= n) { 734 int[] t = new int[Math.max(initializationCount + 1, 2 * n)]; 735 System.arraycopy(initializations, 0, t, 0, n); 736 initializations = t; 737 } 738 initializations[initializationCount++] = var; 740 } 741 742 751 private int init(final ClassWriter cw, final int t) { 752 int s; 753 if (t == UNINITIALIZED_THIS) { 754 s = OBJECT | cw.addType(cw.thisName); 755 } else if ((t & (DIM | BASE_KIND)) == UNINITIALIZED) { 756 String type = cw.typeTable[t & BASE_VALUE].strVal1; 757 s = OBJECT | cw.addType(type); 758 } else { 759 return t; 760 } 761 for (int j = 0; j < initializationCount; ++j) { 762 int u = initializations[j]; 763 int dim = u & DIM; 764 int kind = u & KIND; 765 if (kind == LOCAL) { 766 u = dim + inputLocals[u & VALUE]; 767 } else if (kind == STACK) { 768 u = dim + inputStack[inputStack.length - (u & VALUE)]; 769 } 770 if (t == u) { 771 return s; 772 } 773 } 774 return t; 775 } 776 777 786 void initInputFrame( 787 final ClassWriter cw, 788 final int access, 789 final Type[] args, 790 final int maxLocals) 791 { 792 inputLocals = new int[maxLocals]; 793 inputStack = new int[0]; 794 int i = 0; 795 if ((access & Opcodes.ACC_STATIC) == 0) { 796 if ((access & MethodWriter.ACC_CONSTRUCTOR) == 0) { 797 inputLocals[i++] = OBJECT | cw.addType(cw.thisName); 798 } else { 799 inputLocals[i++] = UNINITIALIZED_THIS; 800 } 801 } 802 for (int j = 0; j < args.length; ++j) { 803 int t = type(cw, args[j].getDescriptor()); 804 inputLocals[i++] = t; 805 if (t == LONG || t == DOUBLE) { 806 inputLocals[i++] = TOP; 807 } 808 } 809 while (i < maxLocals) { 810 inputLocals[i++] = TOP; 811 } 812 } 813 814 822 void execute( 823 final int opcode, 824 final int arg, 825 final ClassWriter cw, 826 final Item item) 827 { 828 int t1, t2, t3, t4; 829 switch (opcode) { 830 case Opcodes.NOP: 831 case Opcodes.INEG: 832 case Opcodes.LNEG: 833 case Opcodes.FNEG: 834 case Opcodes.DNEG: 835 case Opcodes.I2B: 836 case Opcodes.I2C: 837 case Opcodes.I2S: 838 case Opcodes.GOTO: 839 case Opcodes.RETURN: 840 break; 841 case Opcodes.ACONST_NULL: 842 push(NULL); 843 break; 844 case Opcodes.ICONST_M1: 845 case Opcodes.ICONST_0: 846 case Opcodes.ICONST_1: 847 case Opcodes.ICONST_2: 848 case Opcodes.ICONST_3: 849 case Opcodes.ICONST_4: 850 case Opcodes.ICONST_5: 851 case Opcodes.BIPUSH: 852 case Opcodes.SIPUSH: 853 case Opcodes.ILOAD: 854 push(INTEGER); 855 break; 856 case Opcodes.LCONST_0: 857 case Opcodes.LCONST_1: 858 case Opcodes.LLOAD: 859 push(LONG); 860 push(TOP); 861 break; 862 case Opcodes.FCONST_0: 863 case Opcodes.FCONST_1: 864 case Opcodes.FCONST_2: 865 case Opcodes.FLOAD: 866 push(FLOAT); 867 break; 868 case Opcodes.DCONST_0: 869 case Opcodes.DCONST_1: 870 case Opcodes.DLOAD: 871 push(DOUBLE); 872 push(TOP); 873 break; 874 case Opcodes.LDC: 875 switch (item.type) { 876 case ClassWriter.INT: 877 push(INTEGER); 878 break; 879 case ClassWriter.LONG: 880 push(LONG); 881 push(TOP); 882 break; 883 case ClassWriter.FLOAT: 884 push(FLOAT); 885 break; 886 case ClassWriter.DOUBLE: 887 push(DOUBLE); 888 push(TOP); 889 break; 890 case ClassWriter.CLASS: 891 push(OBJECT | cw.addType("java/lang/Class")); 892 break; 893 default: 895 push(OBJECT | cw.addType("java/lang/String")); 896 } 897 break; 898 case Opcodes.ALOAD: 899 push(get(arg)); 900 break; 901 case Opcodes.IALOAD: 902 case Opcodes.BALOAD: 903 case Opcodes.CALOAD: 904 case Opcodes.SALOAD: 905 pop(2); 906 push(INTEGER); 907 break; 908 case Opcodes.LALOAD: 909 case Opcodes.D2L: 910 pop(2); 911 push(LONG); 912 push(TOP); 913 break; 914 case Opcodes.FALOAD: 915 pop(2); 916 push(FLOAT); 917 break; 918 case Opcodes.DALOAD: 919 case Opcodes.L2D: 920 pop(2); 921 push(DOUBLE); 922 push(TOP); 923 break; 924 case Opcodes.AALOAD: 925 pop(1); 926 t1 = pop(); 927 push(ELEMENT_OF + t1); 928 break; 929 case Opcodes.ISTORE: 930 case Opcodes.FSTORE: 931 case Opcodes.ASTORE: 932 t1 = pop(); 933 set(arg, t1); 934 if (arg > 0) { 935 t2 = get(arg - 1); 936 if (t2 == LONG || t2 == DOUBLE) { 938 set(arg - 1, TOP); 939 } 940 } 941 break; 942 case Opcodes.LSTORE: 943 case Opcodes.DSTORE: 944 pop(1); 945 t1 = pop(); 946 set(arg, t1); 947 set(arg + 1, TOP); 948 if (arg > 0) { 949 t2 = get(arg - 1); 950 if (t2 == LONG || t2 == DOUBLE) { 952 set(arg - 1, TOP); 953 } 954 } 955 break; 956 case Opcodes.IASTORE: 957 case Opcodes.BASTORE: 958 case Opcodes.CASTORE: 959 case Opcodes.SASTORE: 960 case Opcodes.FASTORE: 961 case Opcodes.AASTORE: 962 pop(3); 963 break; 964 case Opcodes.LASTORE: 965 case Opcodes.DASTORE: 966 pop(4); 967 break; 968 case Opcodes.POP: 969 case Opcodes.IFEQ: 970 case Opcodes.IFNE: 971 case Opcodes.IFLT: 972 case Opcodes.IFGE: 973 case Opcodes.IFGT: 974 case Opcodes.IFLE: 975 case Opcodes.IRETURN: 976 case Opcodes.FRETURN: 977 case Opcodes.ARETURN: 978 case Opcodes.TABLESWITCH: 979 case Opcodes.LOOKUPSWITCH: 980 case Opcodes.ATHROW: 981 case Opcodes.MONITORENTER: 982 case Opcodes.MONITOREXIT: 983 case Opcodes.IFNULL: 984 case Opcodes.IFNONNULL: 985 pop(1); 986 break; 987 case Opcodes.POP2: 988 case Opcodes.IF_ICMPEQ: 989 case Opcodes.IF_ICMPNE: 990 case Opcodes.IF_ICMPLT: 991 case Opcodes.IF_ICMPGE: 992 case Opcodes.IF_ICMPGT: 993 case Opcodes.IF_ICMPLE: 994 case Opcodes.IF_ACMPEQ: 995 case Opcodes.IF_ACMPNE: 996 case Opcodes.LRETURN: 997 case Opcodes.DRETURN: 998 pop(2); 999 break; 1000 case Opcodes.DUP: 1001 t1 = pop(); 1002 push(t1); 1003 push(t1); 1004 break; 1005 case Opcodes.DUP_X1: 1006 t1 = pop(); 1007 t2 = pop(); 1008 push(t1); 1009 push(t2); 1010 push(t1); 1011 break; 1012 case Opcodes.DUP_X2: 1013 t1 = pop(); 1014 t2 = pop(); 1015 t3 = pop(); 1016 push(t1); 1017 push(t3); 1018 push(t2); 1019 push(t1); 1020 break; 1021 case Opcodes.DUP2: 1022 t1 = pop(); 1023 t2 = pop(); 1024 push(t2); 1025 push(t1); 1026 push(t2); 1027 push(t1); 1028 break; 1029 case Opcodes.DUP2_X1: 1030 t1 = pop(); 1031 t2 = pop(); 1032 t3 = pop(); 1033 push(t2); 1034 push(t1); 1035 push(t3); 1036 push(t2); 1037 push(t1); 1038 break; 1039 case Opcodes.DUP2_X2: 1040 t1 = pop(); 1041 t2 = pop(); 1042 t3 = pop(); 1043 t4 = pop(); 1044 push(t2); 1045 push(t1); 1046 push(t4); 1047 push(t3); 1048 push(t2); 1049 push(t1); 1050 break; 1051 case Opcodes.SWAP: 1052 t1 = pop(); 1053 t2 = pop(); 1054 push(t1); 1055 push(t2); 1056 break; 1057 case Opcodes.IADD: 1058 case Opcodes.ISUB: 1059 case Opcodes.IMUL: 1060 case Opcodes.IDIV: 1061 case Opcodes.IREM: 1062 case Opcodes.IAND: 1063 case Opcodes.IOR: 1064 case Opcodes.IXOR: 1065 case Opcodes.ISHL: 1066 case Opcodes.ISHR: 1067 case Opcodes.IUSHR: 1068 case Opcodes.L2I: 1069 case Opcodes.D2I: 1070 case Opcodes.FCMPL: 1071 case Opcodes.FCMPG: 1072 pop(2); 1073 push(INTEGER); 1074 break; 1075 case Opcodes.LADD: 1076 case Opcodes.LSUB: 1077 case Opcodes.LMUL: 1078 case Opcodes.LDIV: 1079 case Opcodes.LREM: 1080 case Opcodes.LAND: 1081 case Opcodes.LOR: 1082 case Opcodes.LXOR: 1083 pop(4); 1084 push(LONG); 1085 push(TOP); 1086 break; 1087 case Opcodes.FADD: 1088 case Opcodes.FSUB: 1089 case Opcodes.FMUL: 1090 case Opcodes.FDIV: 1091 case Opcodes.FREM: 1092 case Opcodes.L2F: 1093 case Opcodes.D2F: 1094 pop(2); 1095 push(FLOAT); 1096 break; 1097 case Opcodes.DADD: 1098 case Opcodes.DSUB: 1099 case Opcodes.DMUL: 1100 case Opcodes.DDIV: 1101 case Opcodes.DREM: 1102 pop(4); 1103 push(DOUBLE); 1104 push(TOP); 1105 break; 1106 case Opcodes.LSHL: 1107 case Opcodes.LSHR: 1108 case Opcodes.LUSHR: 1109 pop(3); 1110 push(LONG); 1111 push(TOP); 1112 break; 1113 case Opcodes.IINC: 1114 set(arg, INTEGER); 1115 break; 1116 case Opcodes.I2L: 1117 case Opcodes.F2L: 1118 pop(1); 1119 push(LONG); 1120 push(TOP); 1121 break; 1122 case Opcodes.I2F: 1123 pop(1); 1124 push(FLOAT); 1125 break; 1126 case Opcodes.I2D: 1127 case Opcodes.F2D: 1128 pop(1); 1129 push(DOUBLE); 1130 push(TOP); 1131 break; 1132 case Opcodes.F2I: 1133 case Opcodes.ARRAYLENGTH: 1134 case Opcodes.INSTANCEOF: 1135 pop(1); 1136 push(INTEGER); 1137 break; 1138 case Opcodes.LCMP: 1139 case Opcodes.DCMPL: 1140 case Opcodes.DCMPG: 1141 pop(4); 1142 push(INTEGER); 1143 break; 1144 case Opcodes.JSR: 1145 case Opcodes.RET: 1146 throw new RuntimeException ("JSR/RET are not supported with computeFrames option"); 1147 case Opcodes.GETSTATIC: 1148 push(cw, item.strVal3); 1149 break; 1150 case Opcodes.PUTSTATIC: 1151 pop(item.strVal3); 1152 break; 1153 case Opcodes.GETFIELD: 1154 pop(1); 1155 push(cw, item.strVal3); 1156 break; 1157 case Opcodes.PUTFIELD: 1158 pop(item.strVal3); 1159 pop(); 1160 break; 1161 case Opcodes.INVOKEVIRTUAL: 1162 case Opcodes.INVOKESPECIAL: 1163 case Opcodes.INVOKESTATIC: 1164 case Opcodes.INVOKEINTERFACE: 1165 pop(item.strVal3); 1166 if (opcode != Opcodes.INVOKESTATIC) { 1167 t1 = pop(); 1168 if (opcode == Opcodes.INVOKESPECIAL 1169 && item.strVal2.charAt(0) == '<') 1170 { 1171 init(t1); 1172 } 1173 } 1174 push(cw, item.strVal3); 1175 break; 1176 case Opcodes.NEW: 1177 push(UNINITIALIZED | cw.addUninitializedType(item.strVal1, arg)); 1178 break; 1179 case Opcodes.NEWARRAY: 1180 pop(); 1181 switch (arg) { 1182 case Opcodes.T_BOOLEAN: 1183 push(ARRAY_OF | BOOLEAN); 1184 break; 1185 case Opcodes.T_CHAR: 1186 push(ARRAY_OF | CHAR); 1187 break; 1188 case Opcodes.T_BYTE: 1189 push(ARRAY_OF | BYTE); 1190 break; 1191 case Opcodes.T_SHORT: 1192 push(ARRAY_OF | SHORT); 1193 break; 1194 case Opcodes.T_INT: 1195 push(ARRAY_OF | INTEGER); 1196 break; 1197 case Opcodes.T_FLOAT: 1198 push(ARRAY_OF | FLOAT); 1199 break; 1200 case Opcodes.T_DOUBLE: 1201 push(ARRAY_OF | DOUBLE); 1202 break; 1203 default: 1205 push(ARRAY_OF | LONG); 1206 break; 1207 } 1208 break; 1209 case Opcodes.ANEWARRAY: 1210 String s = item.strVal1; 1211 pop(); 1212 if (s.charAt(0) == '[') { 1213 push(cw, "[" + s); 1214 } else { 1215 push(ARRAY_OF | OBJECT | cw.addType(s)); 1216 } 1217 break; 1218 case Opcodes.CHECKCAST: 1219 s = item.strVal1; 1220 pop(); 1221 if (s.charAt(0) == '[') { 1222 push(cw, s); 1223 } else { 1224 push(OBJECT | cw.addType(s)); 1225 } 1226 break; 1227 default: 1229 pop(arg); 1230 push(cw, item.strVal1); 1231 break; 1232 } 1233 } 1234 1235 1247 boolean merge(final ClassWriter cw, final Frame frame, final int edge) { 1248 boolean changed = false; 1249 int i, s, dim, kind, t; 1250 1251 int nLocal = inputLocals.length; 1252 int nStack = inputStack.length; 1253 if (frame.inputLocals == null) { 1254 frame.inputLocals = new int[nLocal]; 1255 changed = true; 1256 } 1257 1258 for (i = 0; i < nLocal; ++i) { 1259 if (outputLocals != null && i < outputLocals.length) { 1260 s = outputLocals[i]; 1261 if (s == 0) { 1262 t = inputLocals[i]; 1263 } else { 1264 dim = s & DIM; 1265 kind = s & KIND; 1266 if (kind == LOCAL) { 1267 t = dim + inputLocals[s & VALUE]; 1268 } else if (kind == STACK) { 1269 t = dim + inputStack[nStack - (s & VALUE)]; 1270 } else { 1271 t = s; 1272 } 1273 } 1274 } else { 1275 t = inputLocals[i]; 1276 } 1277 if (initializations != null) { 1278 t = init(cw, t); 1279 } 1280 changed |= merge(cw, t, frame.inputLocals, i); 1281 } 1282 1283 if (edge > 0) { 1284 for (i = 0; i < nLocal; ++i) { 1285 t = inputLocals[i]; 1286 changed |= merge(cw, t, frame.inputLocals, i); 1287 } 1288 if (frame.inputStack == null) { 1289 frame.inputStack = new int[1]; 1290 changed = true; 1291 } 1292 changed |= merge(cw, edge, frame.inputStack, 0); 1293 return changed; 1294 } 1295 1296 int nInputStack = inputStack.length + owner.inputStackTop; 1297 if (frame.inputStack == null) { 1298 frame.inputStack = new int[nInputStack + outputStackTop]; 1299 changed = true; 1300 } 1301 1302 for (i = 0; i < nInputStack; ++i) { 1303 t = inputStack[i]; 1304 if (initializations != null) { 1305 t = init(cw, t); 1306 } 1307 changed |= merge(cw, t, frame.inputStack, i); 1308 } 1309 for (i = 0; i < outputStackTop; ++i) { 1310 s = outputStack[i]; 1311 dim = s & DIM; 1312 kind = s & KIND; 1313 if (kind == LOCAL) { 1314 t = dim + inputLocals[s & VALUE]; 1315 } else if (kind == STACK) { 1316 t = dim + inputStack[nStack - (s & VALUE)]; 1317 } else { 1318 t = s; 1319 } 1320 if (initializations != null) { 1321 t = init(cw, t); 1322 } 1323 changed |= merge(cw, t, frame.inputStack, nInputStack + i); 1324 } 1325 return changed; 1326 } 1327 1328 1340 private boolean merge( 1341 final ClassWriter cw, 1342 int t, 1343 final int[] types, 1344 final int index) 1345 { 1346 int u = types[index]; 1347 if (u == t) { 1348 return false; 1350 } 1351 if ((t & ~DIM) == NULL) { 1352 if (u == NULL) { 1353 return false; 1354 } 1355 t = NULL; 1356 } 1357 if (u == 0) { 1358 types[index] = t; 1360 return true; 1361 } 1362 int v; 1363 if ((u & BASE_KIND) == OBJECT || (u & DIM) != 0) { 1364 if (t == NULL) { 1366 return false; 1368 } else if ((t & (DIM | BASE_KIND)) == (u & (DIM | BASE_KIND))) { 1369 if ((u & BASE_KIND) == OBJECT) { 1370 v = (t & DIM) | OBJECT 1374 | cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE); 1375 } else { 1376 v = OBJECT | cw.addType("java/lang/Object"); 1379 } 1380 } else if ((t & BASE_KIND) == OBJECT || (t & DIM) != 0) { 1381 v = OBJECT | cw.addType("java/lang/Object"); 1384 } else { 1385 v = TOP; 1387 } 1388 } else if (u == NULL) { 1389 v = (t & BASE_KIND) == OBJECT || (t & DIM) != 0 ? t : TOP; 1392 } else { 1393 v = TOP; 1395 } 1396 if (u != v) { 1397 types[index] = v; 1398 return true; 1399 } 1400 return false; 1401 } 1402} 1403 | Popular Tags |