⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sourcecodeparser.java

📁 JASML is a java byte code compiler, providing yet another approach to view, write and edit java clas
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
				if (scanner.nextToken() != Colon) {
					exception(scanner, "expecting.':'.after.label.name");
				}
				if (scanner.nextToken() != Instruction) {
					exception(scanner, "expecting.instruction.after.label");
				}
			case Instruction: {
				opinfo = OpcodeHelper.getOpcodeInfo(scanner.token());
				switch (opinfo.opcode) {
				case Constants.TABLESWITCH:
					// like default=line1, low=1, high=2, jump_table:line32,line34
					scanner.nextToken();
					info = new ArrayList();
					if (scanner.token().equals("default") == false) {
						exception(scanner, "'default'.expected.here");
					}
					if (scanner.nextToken() != Equal) {
						exception(scanner, "'='.expected.here.");
					}
					scanner.nextToken();
					info.add(scanner.token());
					if (scanner.nextToken() != Comma) {
						exception(scanner, "','.expected.here.");
					}
					scanner.nextToken();
					if (scanner.token().equals("low") == false) {
						exception(scanner, "'low'.expected.here.");
					}
					if (scanner.nextToken() != Equal) {
						exception(scanner, "'='.expected.here.");
					}
					if (scanner.nextToken() != Number_Integer) {
						exception(scanner, "number.expected.here.");
					}
					low = parseInteger(scanner.token());
					if (scanner.nextToken() != Comma) {
						exception(scanner, "','.expected.here.");
					}
					scanner.nextToken();
					if (scanner.token().equals("high") == false) {
						exception(scanner, "'high'.expected.here.");
					}
					if (scanner.nextToken() != Equal) {
						exception(scanner, "'='.expected.here.");
					}
					if (scanner.nextToken() != Number_Integer) {
						exception(scanner, "number.expected.here.");
					}
					high = parseInteger(scanner.token());
					if (scanner.nextToken() != Comma) {
						exception(scanner, "','.expected.here.");
					}
					scanner.nextToken();
					if (scanner.token().equals("jump_table") == false) {
						exception(scanner, "'jump_table'.expected.here.");
					}
					if (scanner.nextToken() != Colon) {
						exception(scanner, "':'.expected.here.");
					}
					scanner.nextToken();
					counter = 0;
					while (scanner.tokenType() != EOF) {
						if (scanner.tokenType() != JavaName) {
							exception(scanner, "label.name.expected.here");
						}
						info.add(scanner.token());
						if (scanner.nextToken() != Comma) {
							break;
						}
						scanner.nextToken();
					}
					operands = new byte[high - low + 5][];
					operands[0] = new byte[3 - offset % 4];
					for (i = 0; i < operands[0].length; i++) {
						operands[0][i] = (byte) 0;
					}

					operands[2] = Util.getBytes(low, 4);
					operands[3] = Util.getBytes(high, 4);
					op = new OpcodeWrapper(offset, opinfo.opcode, operands, info);
					toUpdate.add(op);
					codeLength = 1 + operands[0].length + operands.length * 4 - 4;
					info = null;
					break;
				case Constants.LOOKUPSWITCH:
					// like default=line58, npairs=3, jump_table:-1->line40,200->line46,2100->52					
					scanner.nextToken();
					info = new ArrayList();
					if (scanner.token().equals("default") == false) {
						exception(scanner, "'default'.expected.here");
					}
					if (scanner.nextToken() != Equal) {
						exception(scanner, "'='.expected.here.");
					}
					scanner.nextToken();
					info.add(scanner.token());
					if (scanner.nextToken() != Comma) {
						exception(scanner, "','.expected.here.");
					}
					scanner.nextToken();
					if (scanner.token().equals("npairs") == false) {
						exception(scanner, "'npairs'.expected.here.");
					}
					if (scanner.nextToken() != Equal) {
						exception(scanner, "'='.expected.here.");
					}
					if (scanner.nextToken() != Number_Integer) {
						exception(scanner, "number.expected.here.");
					}
					npairs = parseInteger(scanner.token());
					if (scanner.nextToken() != Comma) {
						exception(scanner, "','.expected.here.");
					}
					scanner.nextToken();
					if (scanner.token().equals("jump_table") == false) {
						exception(scanner, "'jump_table'.expected.here.");
					}
					if (scanner.nextToken() != Colon) {
						exception(scanner, "':'.expected.here.");
					}
					scanner.nextToken();

					operands = new byte[npairs * 2 + 3][];
					operands[0] = new byte[3 - offset % 4];

					for (i = 0; i < operands[0].length; i++) {
						operands[0][i] = (byte) 0;
					}
					operands[2] = Util.getBytes(npairs, 4);
					counter = 3;
					while (scanner.tokenType() != EOF) {
						if (scanner.tokenType() != Number_Integer) {
							exception(scanner, "number.expected.here");
						}
						operands[counter] = Util.getBytes(parseInteger(scanner.token()), 4);
						counter = counter + 2;
						if (scanner.nextToken() != Pointer) {
							exception(scanner, "->.expected.here");
						}
						scanner.nextToken();
						info.add(scanner.token());
						if (scanner.nextToken() != Comma) {
							break;
						}
						scanner.nextToken();
					}
					op = new OpcodeWrapper(offset, opinfo.opcode, operands, info);
					codeLength = 1 + operands[0].length + operands.length * 4 - 4;
					toUpdate.add(op);
					info = null;
					break;
				case Constants.GETFIELD:
				case Constants.GETSTATIC:
				case Constants.PUTFIELD:
				case Constants.PUTSTATIC:
					// like : getstatic java.io.PrintStream java.lang.System.out			
					scanner.nextToken();
					operands = new byte[1][];
					type = scanner.token();
					scanner.nextToken();
					temp = scanner.token();
					i = temp.lastIndexOf('.');
					i = cpl.addFieldref(temp.substring(i + 1), temp.substring(0, i), type);
					operands[0] = Util.getBytes(i, 2);
					codeLength = 3;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					break;
				case Constants.INVOKESPECIAL:
				case Constants.INVOKESTATIC:
				case Constants.INVOKEVIRTUAL:
					// like invokespecial void java.lang.Object.<init>()			
					operands = new byte[1][];
					scanner.nextToken();
					retType = scanner.token();
					scanner.nextToken();
					temp = scanner.token();
					i = temp.lastIndexOf('.');
					if ((scanner.nextToken() == SBracket_Left) == false) {
						exception(scanner, "'('.expected.here");
					}
					if (scanner.nextToken() != SBracket_Right) {
						while (scanner.tokenType() != SBracket_Right && scanner.tokenType() != EOF) {
							paras.append(scanner.token());
							if (scanner.nextToken() == Comma) {
								paras.append(',');
								scanner.nextToken();
							}
						}
						if (scanner.tokenType() != SBracket_Right) {
							exception(scanner, "')'.expected.here");
						}
					} else {
						paras.append("");
					}
					operands[0] = Util.getBytes(cpl.addMethodref(temp.substring(i + 1), temp.substring(0, i), retType, paras.toString()), 2);
					paras.delete(0, paras.length());
					codeLength = 3;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					break;
				case Constants.INVOKEINTERFACE:
					// like invokeinterface void jce.aa.bb(int,double) 4
					scanner.nextToken();
					operands = new byte[3][];
					retType = scanner.token();
					scanner.nextToken();
					temp = scanner.token();
					i = temp.lastIndexOf('.');
					if (scanner.nextToken() == SBracket_Left == false) {
						exception(scanner, "'('.expected.here");
					}
					if (scanner.nextToken() != SBracket_Right) {
						while (scanner.tokenType() != SBracket_Right && scanner.tokenType() != EOF) {
							paras.append(scanner.token());
							if (scanner.nextToken() == Comma) {
								paras.append(',');
								scanner.nextToken();
							}
						}
						if (scanner.tokenType() != SBracket_Right) {
							exception(scanner, "')'.expected.here");
						}
					} else {
						paras.append("");
					}

					if (scanner.nextToken() != Number_Integer) {
						exception(scanner, "number.expected.here");
					}
					t = parseInteger(scanner.token());
					operands[0] = Util.getBytes(cpl.addInterfaceMethodref(temp.substring(i + 1), temp.substring(0, i), retType, paras.toString()), 2);
					operands[1] = Util.getBytes(t, 1);
					operands[2] = Util.getBytes(0, 1); // this byte is aways 0
					codeLength = 5;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					paras.delete(0, paras.length());
					break;
				/*
				 * Operands are references to classes in constant pool
				 */
				case Constants.NEW:
				// like: new java.lang.Object
				case Constants.CHECKCAST:
				// like: checkcast java.lang.String
				case Constants.INSTANCEOF:
					// like: instanceof java.lang.String			
					scanner.nextToken();
					operands = new byte[1][];
					operands[0] = Util.getBytes(cpl.addClass(scanner.token()), 2);
					codeLength = 3;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					break;
				case Constants.LDC:
					/*
					 *  like 4:ldc 1411111 or 4:ldc 1411111f or 4:ldc "abcde" 
					 *  or a special case ldc Infinity, this is to load a Infinity double value
					 */

					scanner.nextToken();
					operands = new byte[1][];
					temp = scanner.token();
					tokenType = scanner.tokenType();
					if (tokenType == String) {
						i = cpl.addString(Util.parseViewableString(temp.substring(1, temp.length() - 1)));
					} else if (tokenType == Number_Float || tokenType == Number_Float_Positive_Infinity || tokenType == Number_Float_Negativ_Infinity
							|| tokenType == Number_Float_NaN) {
						i = cpl.addFloat(parseFloat(temp));
					} else if (tokenType == Number_Integer) {
						i = cpl.addInteger(parseInteger(temp));
					} else {
						exception(scanner, "expecting.integer.or.string.or.float.here");
					}
					if (i < 255) {
						operands[0] = Util.getBytes(i, 1);
						codeLength = 2;
						op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					} else {
						// the index value for LDC is one byte, for those greater than one byte, have to use LDC_W
						operands[0] = Util.getBytes(i, 2);
						op = new Attribute_Code.Opcode(offset, Constants.LDC_W, operands);
						codeLength = 3;
					}
					scanner.nextToken();
					break;
				case Constants.LDC_W:
					// the same as LDC, except that it's index value are two bytes
					scanner.nextToken();
					operands = new byte[1][];
					temp = scanner.token();
					tokenType = scanner.tokenType();
					if (tokenType == String) {
						i = cpl.addString(Util.parseViewableString(temp.substring(1, temp.length() - 1)));
					} else if (tokenType == Number_Float || tokenType == Number_Float_NaN || tokenType == Number_Float_Negativ_Infinity
							|| tokenType == Number_Float_Positive_Infinity) {
						i = cpl.addFloat(parseFloat(temp));
					} else if (tokenType == Number_Integer) {
						i = cpl.addInteger(parseInteger(temp));
					} else {
						exception(scanner, "expecting.integer.or.string.or.float.here");
					}
					operands[0] = Util.getBytes(i, 2);
					codeLength = 3;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					break;
				case Constants.LDC2_W:
					// like ldc2_w 14l, load a long/double value from constant pool
					scanner.nextToken();
					operands = new byte[1][];
					temp = scanner.token();
					tokenType = scanner.tokenType();
					if (tokenType == Number_Long) {
						i = cpl.addLong(parseLong(temp));
					} else if (tokenType == Number_Double || tokenType == Number_Double_NaN || tokenType == Number_Double_Negativ_Infinity
							|| tokenType == Number_Double_Positive_Infinity) {
						i = cpl.addDouble(parseDouble(temp));
					} else {
						exception(scanner, "expecting.long.or.double.here");
					}
					operands[0] = Util.getBytes(i, 2);
					codeLength = 3;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					break;
				case Constants.NEWARRAY:
					// 5:newarray int
					scanner.nextToken();
					operands = new byte[1][1];
					operands[0][0] = Util.getPrimitiveTypeCode(scanner.token());
					codeLength = 2;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					break;
				case Constants.ANEWARRAY:
					// 9:anewarray java.lang.String
					scanner.nextToken();
					operands = new byte[1][];
					operands[0] = Util.getBytes(cpl.addClass(scanner.token()), 2);
					codeLength = 3;
					op = new Attribute_Code.Opcode(offset, opinfo.opcode, operands);
					scanner.nextToken();
					break;
				case Constants.MULTIANEWARRAY:
					// multianewarray int[][][] 3
					scanner.nextToken();
					operands = new byte[2][];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -