< prev index next >

src/java.base/share/classes/jdk/internal/org/objectweb/asm/ClassReader.java

Print this page

1837                 case Opcodes.DLOAD:
1838                 case Opcodes.ALOAD:
1839                 case Opcodes.ISTORE:
1840                 case Opcodes.LSTORE:
1841                 case Opcodes.FSTORE:
1842                 case Opcodes.DSTORE:
1843                 case Opcodes.ASTORE:
1844                 case Opcodes.RET:
1845                 case Opcodes.BIPUSH:
1846                 case Opcodes.NEWARRAY:
1847                 case Opcodes.LDC:
1848                     currentOffset += 2;
1849                     break;
1850                 case Opcodes.SIPUSH:
1851                 case Constants.LDC_W:
1852                 case Constants.LDC2_W:
1853                 case Opcodes.GETSTATIC:
1854                 case Opcodes.PUTSTATIC:
1855                 case Opcodes.GETFIELD:
1856                 case Opcodes.PUTFIELD:


1857                 case Opcodes.INVOKEVIRTUAL:
1858                 case Opcodes.INVOKESPECIAL:
1859                 case Opcodes.INVOKESTATIC:
1860                 case Opcodes.NEW:
1861                 case Opcodes.ANEWARRAY:
1862                 case Opcodes.CHECKCAST:
1863                 case Opcodes.INSTANCEOF:
1864                 case Opcodes.IINC:
1865                     currentOffset += 3;
1866                     break;
1867                 case Opcodes.INVOKEINTERFACE:
1868                 case Opcodes.INVOKEDYNAMIC:
1869                     currentOffset += 5;
1870                     break;
1871                 case Opcodes.MULTIANEWARRAY:
1872                     currentOffset += 4;
1873                     break;
1874                 default:
1875                     throw new IllegalArgumentException();
1876             }

2449                     methodVisitor.visitIntInsn(opcode, readShort(currentOffset + 1));
2450                     currentOffset += 3;
2451                     break;
2452                 case Opcodes.LDC:
2453                     methodVisitor.visitLdcInsn(readConst(classBuffer[currentOffset + 1] & 0xFF, charBuffer));
2454                     currentOffset += 2;
2455                     break;
2456                 case Constants.LDC_W:
2457                 case Constants.LDC2_W:
2458                     methodVisitor.visitLdcInsn(readConst(readUnsignedShort(currentOffset + 1), charBuffer));
2459                     currentOffset += 3;
2460                     break;
2461                 case Opcodes.GETSTATIC:
2462                 case Opcodes.PUTSTATIC:
2463                 case Opcodes.GETFIELD:
2464                 case Opcodes.PUTFIELD:
2465                 case Opcodes.INVOKEVIRTUAL:
2466                 case Opcodes.INVOKESPECIAL:
2467                 case Opcodes.INVOKESTATIC:
2468                 case Opcodes.INVOKEINTERFACE:

2469                     {
2470                         int cpInfoOffset = cpInfoOffsets[readUnsignedShort(currentOffset + 1)];
2471                         int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)];
2472                         String owner = readClass(cpInfoOffset, charBuffer);
2473                         String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
2474                         String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
2475                         if (opcode < Opcodes.INVOKEVIRTUAL) {
2476                             methodVisitor.visitFieldInsn(opcode, owner, name, descriptor);
2477                         } else {
2478                             boolean isInterface =
2479                                     classBuffer[cpInfoOffset - 1] == Symbol.CONSTANT_INTERFACE_METHODREF_TAG;
2480                             methodVisitor.visitMethodInsn(opcode, owner, name, descriptor, isInterface);


2481                         }
2482                         if (opcode == Opcodes.INVOKEINTERFACE) {
2483                             currentOffset += 5;
2484                         } else {
2485                             currentOffset += 3;
2486                         }
2487                         break;
2488                     }
2489                 case Opcodes.INVOKEDYNAMIC:
2490                     {
2491                         int cpInfoOffset = cpInfoOffsets[readUnsignedShort(currentOffset + 1)];
2492                         int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)];
2493                         String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
2494                         String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
2495                         int bootstrapMethodOffset = bootstrapMethodOffsets[readUnsignedShort(cpInfoOffset)];
2496                         Handle handle =
2497                                 (Handle) readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
2498                         Object[] bootstrapMethodArguments =
2499                                 new Object[readUnsignedShort(bootstrapMethodOffset + 2)];
2500                         bootstrapMethodOffset += 4;
2501                         for (int i = 0; i < bootstrapMethodArguments.length; i++) {
2502                             bootstrapMethodArguments[i] =
2503                                     readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
2504                             bootstrapMethodOffset += 2;
2505                         }
2506                         methodVisitor.visitInvokeDynamicInsn(
2507                                 name, descriptor, handle, bootstrapMethodArguments);
2508                         currentOffset += 5;
2509                         break;
2510                     }
2511                 case Opcodes.NEW:
2512                 case Opcodes.ANEWARRAY:
2513                 case Opcodes.CHECKCAST:
2514                 case Opcodes.INSTANCEOF:

2515                     methodVisitor.visitTypeInsn(opcode, readClass(currentOffset + 1, charBuffer));
2516                     currentOffset += 3;
2517                     break;
2518                 case Opcodes.IINC:
2519                     methodVisitor.visitIincInsn(
2520                             classBuffer[currentOffset + 1] & 0xFF, classBuffer[currentOffset + 2]);
2521                     currentOffset += 3;
2522                     break;
2523                 case Opcodes.MULTIANEWARRAY:
2524                     methodVisitor.visitMultiANewArrayInsn(
2525                             readClass(currentOffset + 1, charBuffer), classBuffer[currentOffset + 3] & 0xFF);
2526                     currentOffset += 4;
2527                     break;
2528                 default:
2529                     throw new AssertionError();
2530             }
2531 
2532             // Visit the runtime visible instruction annotations, if any.
2533             while (visibleTypeAnnotationOffsets != null
2534                     && currentVisibleTypeAnnotationIndex < visibleTypeAnnotationOffsets.length

3246                 case 'Z':
3247                 case 'C':
3248                 case 'B':
3249                 case 'S':
3250                 case 'I':
3251                     locals[numLocal++] = Opcodes.INTEGER;
3252                     break;
3253                 case 'F':
3254                     locals[numLocal++] = Opcodes.FLOAT;
3255                     break;
3256                 case 'J':
3257                     locals[numLocal++] = Opcodes.LONG;
3258                     break;
3259                 case 'D':
3260                     locals[numLocal++] = Opcodes.DOUBLE;
3261                     break;
3262                 case '[':
3263                     while (methodDescriptor.charAt(currentMethodDescritorOffset) == '[') {
3264                         ++currentMethodDescritorOffset;
3265                     }
3266                     if (methodDescriptor.charAt(currentMethodDescritorOffset) == 'L') {

3267                         ++currentMethodDescritorOffset;
3268                         while (methodDescriptor.charAt(currentMethodDescritorOffset) != ';') {
3269                             ++currentMethodDescritorOffset;
3270                         }
3271                     }
3272                     locals[numLocal++] =
3273                             methodDescriptor.substring(
3274                                     currentArgumentDescriptorStartOffset, ++currentMethodDescritorOffset);
3275                     break;
3276                 case 'L':
3277                     while (methodDescriptor.charAt(currentMethodDescritorOffset) != ';') {
3278                         ++currentMethodDescritorOffset;
3279                     }
3280                     locals[numLocal++] =
3281                             methodDescriptor.substring(
3282                                     currentArgumentDescriptorStartOffset + 1, currentMethodDescritorOffset++);
3283                     break;
3284                 default:
3285                     context.currentFrameLocalCount = numLocal;
3286                     return;

1837                 case Opcodes.DLOAD:
1838                 case Opcodes.ALOAD:
1839                 case Opcodes.ISTORE:
1840                 case Opcodes.LSTORE:
1841                 case Opcodes.FSTORE:
1842                 case Opcodes.DSTORE:
1843                 case Opcodes.ASTORE:
1844                 case Opcodes.RET:
1845                 case Opcodes.BIPUSH:
1846                 case Opcodes.NEWARRAY:
1847                 case Opcodes.LDC:
1848                     currentOffset += 2;
1849                     break;
1850                 case Opcodes.SIPUSH:
1851                 case Constants.LDC_W:
1852                 case Constants.LDC2_W:
1853                 case Opcodes.GETSTATIC:
1854                 case Opcodes.PUTSTATIC:
1855                 case Opcodes.GETFIELD:
1856                 case Opcodes.PUTFIELD:
1857                 case Opcodes.DEFAULT:
1858                 case Opcodes.WITHFIELD:
1859                 case Opcodes.INVOKEVIRTUAL:
1860                 case Opcodes.INVOKESPECIAL:
1861                 case Opcodes.INVOKESTATIC:
1862                 case Opcodes.NEW:
1863                 case Opcodes.ANEWARRAY:
1864                 case Opcodes.CHECKCAST:
1865                 case Opcodes.INSTANCEOF:
1866                 case Opcodes.IINC:
1867                     currentOffset += 3;
1868                     break;
1869                 case Opcodes.INVOKEINTERFACE:
1870                 case Opcodes.INVOKEDYNAMIC:
1871                     currentOffset += 5;
1872                     break;
1873                 case Opcodes.MULTIANEWARRAY:
1874                     currentOffset += 4;
1875                     break;
1876                 default:
1877                     throw new IllegalArgumentException();
1878             }

2451                     methodVisitor.visitIntInsn(opcode, readShort(currentOffset + 1));
2452                     currentOffset += 3;
2453                     break;
2454                 case Opcodes.LDC:
2455                     methodVisitor.visitLdcInsn(readConst(classBuffer[currentOffset + 1] & 0xFF, charBuffer));
2456                     currentOffset += 2;
2457                     break;
2458                 case Constants.LDC_W:
2459                 case Constants.LDC2_W:
2460                     methodVisitor.visitLdcInsn(readConst(readUnsignedShort(currentOffset + 1), charBuffer));
2461                     currentOffset += 3;
2462                     break;
2463                 case Opcodes.GETSTATIC:
2464                 case Opcodes.PUTSTATIC:
2465                 case Opcodes.GETFIELD:
2466                 case Opcodes.PUTFIELD:
2467                 case Opcodes.INVOKEVIRTUAL:
2468                 case Opcodes.INVOKESPECIAL:
2469                 case Opcodes.INVOKESTATIC:
2470                 case Opcodes.INVOKEINTERFACE:
2471                 case Opcodes.WITHFIELD:
2472                     {
2473                         int cpInfoOffset = cpInfoOffsets[readUnsignedShort(currentOffset + 1)];
2474                         int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)];
2475                         String owner = readClass(cpInfoOffset, charBuffer);
2476                         String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
2477                         String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
2478                         if (opcode >= Opcodes.INVOKEVIRTUAL && opcode <= Opcodes.INVOKEINTERFACE) {


2479                             boolean isInterface =
2480                                     classBuffer[cpInfoOffset - 1] == Symbol.CONSTANT_INTERFACE_METHODREF_TAG;
2481                             methodVisitor.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
2482                         } else {
2483                             methodVisitor.visitFieldInsn(opcode, owner, name, descriptor);
2484                         }
2485                         if (opcode == Opcodes.INVOKEINTERFACE) {
2486                             currentOffset += 5;
2487                         } else {
2488                             currentOffset += 3;
2489                         }
2490                         break;
2491                     }
2492                 case Opcodes.INVOKEDYNAMIC:
2493                     {
2494                         int cpInfoOffset = cpInfoOffsets[readUnsignedShort(currentOffset + 1)];
2495                         int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)];
2496                         String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
2497                         String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
2498                         int bootstrapMethodOffset = bootstrapMethodOffsets[readUnsignedShort(cpInfoOffset)];
2499                         Handle handle =
2500                                 (Handle) readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
2501                         Object[] bootstrapMethodArguments =
2502                                 new Object[readUnsignedShort(bootstrapMethodOffset + 2)];
2503                         bootstrapMethodOffset += 4;
2504                         for (int i = 0; i < bootstrapMethodArguments.length; i++) {
2505                             bootstrapMethodArguments[i] =
2506                                     readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
2507                             bootstrapMethodOffset += 2;
2508                         }
2509                         methodVisitor.visitInvokeDynamicInsn(
2510                                 name, descriptor, handle, bootstrapMethodArguments);
2511                         currentOffset += 5;
2512                         break;
2513                     }
2514                 case Opcodes.NEW:
2515                 case Opcodes.ANEWARRAY:
2516                 case Opcodes.CHECKCAST:
2517                 case Opcodes.INSTANCEOF:
2518                 case Opcodes.DEFAULT:
2519                     methodVisitor.visitTypeInsn(opcode, readClass(currentOffset + 1, charBuffer));
2520                     currentOffset += 3;
2521                     break;
2522                 case Opcodes.IINC:
2523                     methodVisitor.visitIincInsn(
2524                             classBuffer[currentOffset + 1] & 0xFF, classBuffer[currentOffset + 2]);
2525                     currentOffset += 3;
2526                     break;
2527                 case Opcodes.MULTIANEWARRAY:
2528                     methodVisitor.visitMultiANewArrayInsn(
2529                             readClass(currentOffset + 1, charBuffer), classBuffer[currentOffset + 3] & 0xFF);
2530                     currentOffset += 4;
2531                     break;
2532                 default:
2533                     throw new AssertionError();
2534             }
2535 
2536             // Visit the runtime visible instruction annotations, if any.
2537             while (visibleTypeAnnotationOffsets != null
2538                     && currentVisibleTypeAnnotationIndex < visibleTypeAnnotationOffsets.length

3250                 case 'Z':
3251                 case 'C':
3252                 case 'B':
3253                 case 'S':
3254                 case 'I':
3255                     locals[numLocal++] = Opcodes.INTEGER;
3256                     break;
3257                 case 'F':
3258                     locals[numLocal++] = Opcodes.FLOAT;
3259                     break;
3260                 case 'J':
3261                     locals[numLocal++] = Opcodes.LONG;
3262                     break;
3263                 case 'D':
3264                     locals[numLocal++] = Opcodes.DOUBLE;
3265                     break;
3266                 case '[':
3267                     while (methodDescriptor.charAt(currentMethodDescritorOffset) == '[') {
3268                         ++currentMethodDescritorOffset;
3269                     }
3270                     char descType = methodDescriptor.charAt(currentMethodDescritorOffset);
3271                     if (descType == 'L' || descType == 'Q') {
3272                         ++currentMethodDescritorOffset;
3273                         while (methodDescriptor.charAt(currentMethodDescritorOffset) != ';') {
3274                             ++currentMethodDescritorOffset;
3275                         }
3276                     }
3277                     locals[numLocal++] =
3278                             methodDescriptor.substring(
3279                                     currentArgumentDescriptorStartOffset, ++currentMethodDescritorOffset);
3280                     break;
3281                 case 'L':
3282                     while (methodDescriptor.charAt(currentMethodDescritorOffset) != ';') {
3283                         ++currentMethodDescritorOffset;
3284                     }
3285                     locals[numLocal++] =
3286                             methodDescriptor.substring(
3287                                     currentArgumentDescriptorStartOffset + 1, currentMethodDescritorOffset++);
3288                     break;
3289                 default:
3290                     context.currentFrameLocalCount = numLocal;
3291                     return;
< prev index next >