756 */
757 static int type(final ClassWriter cw, final String desc) {
758 String t;
759 int index = desc.charAt(0) == '(' ? desc.indexOf(')') + 1 : 0;
760 switch (desc.charAt(index)) {
761 case 'V':
762 return 0;
763 case 'Z':
764 case 'C':
765 case 'B':
766 case 'S':
767 case 'I':
768 return INTEGER;
769 case 'F':
770 return FLOAT;
771 case 'J':
772 return LONG;
773 case 'D':
774 return DOUBLE;
775 case 'L':
776 // stores the internal name, not the descriptor!
777 t = desc.substring(index + 1, desc.length() - 1);
778 return OBJECT | cw.addType(t);
779 // case '[':
780 default:
781 // extracts the dimensions and the element type
782 int data;
783 int dims = index + 1;
784 while (desc.charAt(dims) == '[') {
785 ++dims;
786 }
787 switch (desc.charAt(dims)) {
788 case 'Z':
789 data = BOOLEAN;
790 break;
791 case 'C':
792 data = CHAR;
793 break;
794 case 'B':
795 data = BYTE;
796 break;
797 case 'S':
798 data = SHORT;
799 break;
800 case 'I':
801 data = INTEGER;
802 break;
803 case 'F':
804 data = FLOAT;
805 break;
806 case 'J':
807 data = LONG;
808 break;
809 case 'D':
810 data = DOUBLE;
811 break;
812 // case 'L':
813 default:
814 // stores the internal name, not the descriptor
815 t = desc.substring(dims + 1, desc.length() - 1);
816 data = OBJECT | cw.addType(t);
817 }
818 return (dims - index) << 28 | data;
819 }
820 }
821
822 /**
823 * Pops a type from the output frame stack and returns its value.
824 *
825 * @return the type that has been popped from the output frame stack.
826 */
827 private int pop() {
828 if (outputStackTop > 0) {
829 return outputStack[--outputStackTop];
830 } else {
831 // if the output frame stack is empty, pops from the input stack
832 return STACK | -(--owner.inputStackTop);
|
756 */
757 static int type(final ClassWriter cw, final String desc) {
758 String t;
759 int index = desc.charAt(0) == '(' ? desc.indexOf(')') + 1 : 0;
760 switch (desc.charAt(index)) {
761 case 'V':
762 return 0;
763 case 'Z':
764 case 'C':
765 case 'B':
766 case 'S':
767 case 'I':
768 return INTEGER;
769 case 'F':
770 return FLOAT;
771 case 'J':
772 return LONG;
773 case 'D':
774 return DOUBLE;
775 case 'L':
776 case 'Q':
777 // stores the internal name, not the descriptor!
778 t = desc.substring(index + 1, desc.length() - 1);
779 return OBJECT | cw.addType(t);
780 // case '[':
781 default:
782 // extracts the dimensions and the element type
783 int data;
784 int dims = index + 1;
785 while (desc.charAt(dims) == '[') {
786 ++dims;
787 }
788 switch (desc.charAt(dims)) {
789 case 'Z':
790 data = BOOLEAN;
791 break;
792 case 'C':
793 data = CHAR;
794 break;
795 case 'B':
796 data = BYTE;
797 break;
798 case 'S':
799 data = SHORT;
800 break;
801 case 'I':
802 data = INTEGER;
803 break;
804 case 'F':
805 data = FLOAT;
806 break;
807 case 'J':
808 data = LONG;
809 break;
810 case 'D':
811 data = DOUBLE;
812 break;
813 // case 'L':
814 // case 'Q':
815 default:
816 // stores the internal name, not the descriptor
817 t = desc.substring(dims + 1, desc.length() - 1);
818 data = OBJECT | cw.addType(t);
819 }
820 return (dims - index) << 28 | data;
821 }
822 }
823
824 /**
825 * Pops a type from the output frame stack and returns its value.
826 *
827 * @return the type that has been popped from the output frame stack.
828 */
829 private int pop() {
830 if (outputStackTop > 0) {
831 return outputStack[--outputStackTop];
832 } else {
833 // if the output frame stack is empty, pops from the input stack
834 return STACK | -(--owner.inputStackTop);
|