/** * Pops as many abstract types from the output frame stack as described by the given descriptor. * * @param descriptor a type or method descriptor (in which case its argument types are popped). */ private void pop(final String descriptor) { char firstDescriptorChar = descriptor.charAt(0); if (firstDescriptorChar == '(') { pop((Type.getArgumentsAndReturnSizes(descriptor) >> 2) - 1); } else if (firstDescriptorChar == 'J' || firstDescriptorChar == 'D') { pop(2); } else { pop(1); } }
/** * Pops a type from the output frame stack. * * @param desc * the descriptor of the type to be popped. Can also be a method * descriptor (in this case this method pops the types * corresponding to the method arguments). */ private void pop(final String desc) { char c = desc.charAt(0); if (c == '(') { pop((Type.getArgumentsAndReturnSizes(desc) >> 2) - 1); } else if (c == 'J' || c == 'D') { pop(2); } else { pop(1); } }
/** * Pops a type from the output frame stack. * * @param desc the descriptor of the type to be popped. Can also be a method * descriptor (in this case this method pops the types corresponding * to the method arguments). */ private void pop(final String desc) { char c = desc.charAt(0); if (c == '(') { pop((MethodWriter.getArgumentsAndReturnSizes(desc) >> 2) - 1); } else if (c == 'J' || c == 'D') { pop(2); } else { pop(1); } }
case Opcodes.CALOAD: case Opcodes.SALOAD: pop(2); push(INTEGER); break; case Opcodes.LALOAD: case Opcodes.D2L: pop(2); push(LONG); push(TOP); break; case Opcodes.FALOAD: pop(2); push(FLOAT); break; case Opcodes.DALOAD: case Opcodes.L2D: pop(2); push(DOUBLE); push(TOP); break; case Opcodes.AALOAD: pop(1); t1 = pop(); push(t1 == NULL ? t1 : ELEMENT_OF + t1); break; case Opcodes.FSTORE: case Opcodes.ASTORE:
case Opcodes.CALOAD: case Opcodes.SALOAD: pop(2); push(INTEGER); break; case Opcodes.LALOAD: case Opcodes.D2L: pop(2); push(LONG); push(TOP); break; case Opcodes.FALOAD: pop(2); push(FLOAT); break; case Opcodes.DALOAD: case Opcodes.L2D: pop(2); push(DOUBLE); push(TOP); break; case Opcodes.AALOAD: pop(1); t1 = pop(); push(ELEMENT_OF + t1); break; case Opcodes.FSTORE: case Opcodes.ASTORE:
case Opcodes.LALOAD: case Opcodes.D2L: pop(2); push(LONG); push(TOP); case Opcodes.DALOAD: case Opcodes.L2D: pop(2); push(DOUBLE); push(TOP); break; case Opcodes.AALOAD: pop(1); abstractType1 = pop(); push(abstractType1 == NULL ? abstractType1 : ELEMENT_OF + abstractType1); break; case Opcodes.FSTORE: case Opcodes.ASTORE: abstractType1 = pop(); setLocal(arg, abstractType1); if (arg > 0) { case Opcodes.LSTORE: case Opcodes.DSTORE: pop(1); abstractType1 = pop(); setLocal(arg, abstractType1);