亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? methodrewriter.java

?? 配置文件
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
	 */
	private void inlineSubroutines() 
		throws AnalyzerException 
	{
		// Set up the first instruction region to be
		// processed as the entire method code...
		Region methodRegion = new Region(0, srcMethod.instructions.size());

		// Scan through the instructions in the method and
		// get organized
		createSubroutineMap();
		sortTryCatchBlocks(methodRegion);
		
		// Copy the non-code information
		updatedMethod = copyMethodMetadata(srcMethod);
		
		// Set up some mapping information
		lineNumberMap = createLineNumberMap();
		localVariableByStartLabelMap = createLocalVariableMap();

		// Copy the instructions while inlining subroutines
		copyRegion(updatedMethod, methodRegion);
		
		// The WTK reduces the visibility of the local variables
		if (shouldReduceVariableVisibility(updatedMethod)) {
			List instructions = updatedMethod.instructions;
			int instructionCount = instructions.size();
			AbstractInsnNode lastLabel = 
				(AbstractInsnNode) instructions.remove(instructionCount - 1);
			instructions.add(instructionCount - 2, lastLabel);
		}
		
		updatedMethod.visitMaxs(srcMethod.maxStack, srcMethod.maxLocals);
	}

	/**
	 * Add a new local variabled to the variables by end label map.
	 * 
	 * @param newLocalVariable
	 */
	private void addNewLocalVariableByEnd(LocalVariableNode newLocalVariable) {
		ArrayList endLocalVariables = 
			(ArrayList) localVariableByEndLabelMap.get(newLocalVariable.end);
		
		if (endLocalVariables == null) {
			endLocalVariables = new ArrayList();
			localVariableByEndLabelMap.put(newLocalVariable.end, endLocalVariables);
		}
		
		endLocalVariables.add(newLocalVariable);
	}

	/**
	 * Add a new stack map type.
	 * 
	 * @param localOrStack
	 * @param region
	 * @param label
	 * @param value
	 */
	private void addStackMapType(List localOrStack, Label label, Value value) {
		BasicValue basicValue = (BasicValue) value;
		
        if (this == BasicValue.UNINITIALIZED_VALUE) {
			localOrStack.add(newStackMapType(label, StackMapType.ITEM_Uninitialized));
        } else {
    		Type valueType = basicValue.getType();

			if (valueType == null) {
				localOrStack.add(newStackMapType(label, StackMapType.ITEM_Top));
			} else {
				switch (valueType.getSort()) {
					case Type.BOOLEAN:
					case Type.BYTE:
					case Type.CHAR:
					case Type.INT:
					case Type.SHORT:
						localOrStack.add(newStackMapType(label, StackMapType.ITEM_Integer));
						break;
					
					case Type.DOUBLE:
						localOrStack.add(newStackMapType(label, StackMapType.ITEM_Double));
						localOrStack.add(newStackMapType(label, StackMapType.ITEM_Top));
						break;
					
					case Type.FLOAT:
						localOrStack.add(newStackMapType(label, StackMapType.ITEM_Float));
						break;
					
					case Type.LONG:
						localOrStack.add(newStackMapType(label, StackMapType.ITEM_Long));
						localOrStack.add(newStackMapType(label, StackMapType.ITEM_Top));
						break;
					
					case Type.OBJECT:
					{
						StackMapType mapType = null;
						
						String typeName = valueType.getInternalName();
						if (typeName.equals("null")) {
							mapType = newStackMapType(label, StackMapType.ITEM_Null);
						} else {
							mapType = newStackMapType(label, StackMapType.ITEM_Object);
							mapType.setObject(typeName);
						}
						
						localOrStack.add(mapType);
						break;
					}
					
					case Type.ARRAY:
					{
						StackMapType mapType = newStackMapType(label, StackMapType.ITEM_Object);
						mapType.setObject(valueType.toString());
						localOrStack.add(mapType);
						break;
					}
				}
			}
		}
	}

	/**
	 * Copy all of the try/catch blocks in the method, realigning based on
	 * the rewritten code.
	 * 
	 * @param methodNode
	 * @param methodRegion
	 */
	private void copyTryCatchBlocks(MethodNode methodNode, Region region, List blocks) {
		Iterator tryCatchBlocks = blocks.iterator();
		while (tryCatchBlocks.hasNext()) {
			TryCatchBlockNode tryCatch = (TryCatchBlockNode) tryCatchBlocks.next();
			if (shouldCopy(tryCatch)) {
				methodNode.visitTryCatchBlock(
						region.getMappedLabel(tryCatch.start), 
						region.getMappedLabel(tryCatch.end), 
						region.getMappedLabel(tryCatch.handler), 
						tryCatch.type);
			}			
		}
	}

	/**
	 * Create a mapping from line number location (Label) to the instance
	 * of the line number nodes.
	 * 
	 * @return
	 */
	private Map createLineNumberMap() {
		Map map = new HashMap();

		Iterator lineNumbers = srcMethod.lineNumbers.iterator();
		while (lineNumbers.hasNext()) {
			LineNumberNode lineNumber = (LineNumberNode) lineNumbers.next();
			map.put(lineNumber.start, lineNumber);
		}
		
		return map;
	}

	/**
	 * Create a mapping from local variable location (Label) to the instance
	 * of the local variable nodes.
	 * 
	 * @return
	 */
	private Map createLocalVariableMap() {
		Map map = new HashMap();
		
		Iterator localVariables = srcMethod.localVariables.iterator();
		while (localVariables.hasNext()) {
			LocalVariableNode localVariable = (LocalVariableNode) localVariables.next();
			ArrayList startList = (ArrayList) map.get(localVariable.start);
			if (startList == null) {
				startList = new ArrayList();
				map.put(localVariable.start, startList);
			}
			
			startList.add(localVariable);
		}
		
		return map;
	}

	/**
	 * Copy the method node's metadata that is not changing.
	 * 
	 * @param method
	 * @return
	 */
	private MethodNode copyMethodMetadata(MethodNode method) {
		// Start a new method node
		String[] exceptions = 
			(String[]) method.exceptions.toArray(new String[method.exceptions.size()]);
		
		return new MethodNode(
			method.access,
			method.name,
			method.desc,
			method.signature,
			exceptions);
	}

	/**
	 * Copy the specified region of code potentially recursively.
	 * 
	 * @param method
	 * @param region
	 * @throws AnalyzerException
	 */
	private void copyRegion(MethodNode method, Region region) 
		throws AnalyzerException 
	{
		// Do any region-specific setup
		region.enter(method);
		
		// Walk the instructions.. inlining as we go
		for (int index = region.startIndex; index < region.endIndex; ++index) {
			AbstractInsnNode insnNode = getInstruction(srcMethod, index); 
			
			// Special case for labels, as they may indicate the start of
			// a subroutine that can be skipped.
			if (insnNode.getType() == AbstractInsnNode.LABEL) {
				Label label = ((LabelNode) insnNode).label;
				visitLabel(method, region, label);
				
				if (isSubroutineStart(label)) {
					// Skip over this subroutine implementation
					Subroutine subroutine = (Subroutine) subroutineMap.get(label);
					index = subroutine.endIndex;
				} 
			} else {
				if (!region.isSubroutineReturnStore(srcMethod, index)) {
					visitInstruction(method, region, insnNode);
				}
			} 
		}
		
		// Do any region-specific cleanup
		region.exit(method);
	}

	/**
	 * Create a new stack map frame.
	 * 
	 * @param region
	 * @param label
	 * @param frame
	 * @return
	 * @throws AnalyzerException
	 */
	private StackMapFrame newStackMapFrame(Label label, Frame frame) 
		throws AnalyzerException 
	{
		// Handle the locals
		ArrayList locals = new ArrayList();
		int localsCount = frame.getLocals();
		for (int i = 0; i < localsCount; i++) {
			addStackMapType(locals, label, frame.getLocal(i));
		}
		removeTrailingTops(locals);
		
		// Handle the stack
		ArrayList stack = new ArrayList();
		int stackCount = frame.getStackSize();
		for (int i = 0; i < stackCount; i++) {
			addStackMapType(stack, label, frame.getStack(i));
		}
		removeTrailingTops(stack);
		
		return new StackMapFrame(label, locals, stack);
	}
	
	/**
	 * Create a new StackMapType instance for the specified label.
	 * 
	 * @param label
	 * @param typeCode
	 * @return
	 */
	private StackMapType newStackMapType(Label label, int typeCode) {
		StackMapType type = StackMapType.getTypeInfo(typeCode);
		type.setLabel(label);
		return type;
	}

	/**
	 * Remove the trailing TOP types from the specified locals or stack.
	 * 
	 * @param locals
	 */
	private void removeTrailingTops(ArrayList localsOrStack) {
		while (removeTrailingTop(localsOrStack)) { }
	}

	/**
	 * Remove the trailing TOP value from the list.
	 * 
	 * @param localsOrStack
	 * @return
	 */
	private boolean removeTrailingTop(ArrayList localsOrStack) {
		boolean removed = false;
		
		if (localsOrStack.size() > 0) {
			int lastIndex = localsOrStack.size() - 1;
			
			StackMapType type = (StackMapType) localsOrStack.get(lastIndex);
			if (type.getType() == StackMapType.ITEM_Top) {
				localsOrStack.remove(lastIndex);
				removed = true;
			}
		}
		
		return removed;
	}

	/**
	 * Scan the instructions in the source method and find
	 * the subroutines and locations of any target labels.
	 * 
	 * @param method
	 * @throws AnalyzerException
	 */
	private void createSubroutineMap() 
		throws AnalyzerException 
    {
		subroutineMap = new HashMap();
		
		// Look through the JSR instructions and collect the
		// target labels.  Those target labels are the starting
		// points for the subroutines.
		Set subroutineStartLabels = new HashSet();
		Iterator jsrInstructionIndices = srcMethod.getJsrInstructionIndices().iterator();
		while (jsrInstructionIndices.hasNext()) {
			Integer instructionIndex = (Integer) jsrInstructionIndices.next();
			JumpInsnNode jumpNode = 
				(JumpInsnNode) getInstruction(srcMethod, instructionIndex.intValue());
			subroutineStartLabels.add(jumpNode.label);
		}

		// Now, start searching for the subroutine starts.  This
		// must be done to account for nested subroutine implementations
		if (subroutineStartLabels.size() > 0) {
			for (int i = 0; i < srcMethod.instructions.size(); i++) {
				AbstractInsnNode insnNode = getInstruction(srcMethod, i); 
				if (insnNode.getType() == AbstractInsnNode.LABEL) {
					LabelNode labelNode = (LabelNode) insnNode;
					if (subroutineStartLabels.contains(labelNode.label)) {
						// This is the start of a subroutine
						i = captureSubroutine(
								subroutineStartLabels, 
								subroutineMap, 
								i, 
								srcMethod, 
								(LabelNode) insnNode);
					}
				}
			}
		}
	}

	/**
	 * Capture the specified subroutine, potentially recursively
	 * capturing nested subroutines.  Captured subroutines are
	 * added to the map of subroutines.
	 * 
	 * @param subroutineStartLabels
	 * @param subroutineMap
	 * @param index
	 * @param method
	 * @param labelNode
	 * @return
	 */
	private int captureSubroutine(
		Set subroutineStartLabels,
		Map subroutineMap, 
		int index,
		MethodNode method,
		LabelNode labelNode) 
	{
		Subroutine subroutine = new Subroutine(labelNode.label);
		
		subroutine.startIndex = index + 1;
		for (subroutine.endIndex = subroutine.startIndex; true; subroutine.endIndex++) 
		{
			AbstractInsnNode insn = getInstruction(method, subroutine.endIndex);
			
			if (insn.getType() == AbstractInsnNode.LABEL) {
				Label label = ((LabelNode) insn).label;
				if (subroutineStartLabels.contains(label)) {
					subroutine.endIndex = captureSubroutine(
							subroutineStartLabels, 
							subroutineMap, 
							subroutine.endIndex, 
							srcMethod, 
							(LabelNode) insn);
				} else {
					subroutine.addLabel(label);
				}
			} else {
				if (insn.getOpcode() == Opcodes.RET) {
					// Figure out the variable that is being used
					// for the return instruction
					VarInsnNode varInsnNode = (VarInsnNode) insn;
					int variableNumber = varInsnNode.var;
					subroutine.setReturnVariable(variableNumber);
					
					break;
				} 
			}
		}

		// Add the newly found subroutine to the map
		Label label = labelNode.label;
		if (!subroutineMap.containsKey(label)) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜精品久久| 日韩1区2区日韩1区2区| 精品福利一区二区三区| 欧美色图激情小说| 99在线精品一区二区三区| 日本中文字幕不卡| 亚洲三级小视频| 国产精品人成在线观看免费| ww久久中文字幕| 日韩欧美你懂的| 欧美一区二区网站| 欧美久久久一区| 91极品美女在线| 成人黄色a**站在线观看| 国产成人av电影| 国内精品视频666| 精品亚洲成a人在线观看| 麻豆精品视频在线观看免费| 婷婷久久综合九色综合伊人色| 一区二区三区中文在线观看| 日韩一区中文字幕| 国产精品欧美一区二区三区| 国产精品午夜在线| 国产精品成人免费在线| 国产精品久久久久久户外露出| 国产精品毛片高清在线完整版| 久久精品一区八戒影视| 日韩久久久精品| 精品久久久久久久一区二区蜜臀| 欧美电影免费观看高清完整版在 | 青青草视频一区| 日韩va亚洲va欧美va久久| 天天免费综合色| 奇米一区二区三区| 精品中文字幕一区二区| 国产一区二区三区综合| 成人综合婷婷国产精品久久蜜臀| 成人国产一区二区三区精品| kk眼镜猥琐国模调教系列一区二区| 韩国女主播成人在线| 国产成人午夜精品影院观看视频 | 欧美亚洲国产bt| 欧美日韩亚洲高清一区二区| 欧美一区二区三区免费大片| 欧美成人vr18sexvr| 国产午夜精品久久久久久久| 国产精品国模大尺度视频| 亚洲一区二区三区在线播放| 日韩激情视频网站| 国产成人午夜电影网| 91网页版在线| 欧美精选在线播放| 久久久国产一区二区三区四区小说| 国产精品嫩草99a| 亚洲影院理伦片| 亚洲成av人片一区二区三区| 日韩精品视频网| 国产成人精品aa毛片| 在线观看三级视频欧美| 日韩三级中文字幕| 国产精品色一区二区三区| 亚洲一级电影视频| 激情图片小说一区| 91香蕉国产在线观看软件| 91麻豆精品国产91久久久久| 久久久99精品免费观看不卡| 亚洲另类色综合网站| 美日韩黄色大片| 99视频精品免费视频| 欧美久久久久久久久中文字幕| 日韩欧美视频一区| 久久久五月婷婷| 亚洲一区二区高清| 丰满岳乱妇一区二区三区| 欧美性色黄大片| 国产视频一区二区三区在线观看| 亚洲国产aⅴ成人精品无吗| 国产伦精品一区二区三区视频青涩| 日本伦理一区二区| 2021久久国产精品不只是精品| 亚洲免费伊人电影| 国产精品2024| 91精品欧美综合在线观看最新| 中文字幕不卡一区| 卡一卡二国产精品 | 国产999精品久久久久久| 欧美影片第一页| 久久综合视频网| 天使萌一区二区三区免费观看| 精品一区二区三区不卡| 欧美在线观看你懂的| 国产精品私人自拍| 精品一区免费av| 欧美日韩免费不卡视频一区二区三区| 中文字幕成人av| 极品少妇xxxx偷拍精品少妇| 在线影院国内精品| 国产拍揄自揄精品视频麻豆| 麻豆免费看一区二区三区| 欧美日韩不卡在线| 亚洲欧美日韩国产综合在线| 国产ts人妖一区二区| 精品久久久久久无| 青娱乐精品视频| 欧美日韩大陆一区二区| 一级女性全黄久久生活片免费| 99热这里都是精品| 国产精品美女www爽爽爽| 国产精一区二区三区| 欧美成人bangbros| 亚洲成人1区2区| 在线看国产一区| 亚洲嫩草精品久久| 99久久婷婷国产综合精品电影| 国产欧美视频一区二区三区| 国产美女在线观看一区| 精品国产免费人成电影在线观看四季| 日韩激情视频网站| 91精品国产欧美一区二区18| 三级久久三级久久久| 欧美理论片在线| 天堂久久一区二区三区| 欧美老女人第四色| 亚洲国产精品一区二区久久 | 欧美剧情片在线观看| 亚洲成人免费av| 欧美日韩在线观看一区二区| 夜夜精品视频一区二区| 国产夫妻精品视频| 久久国产精品色| 国产成人免费视频网站高清观看视频| 国内精品久久久久影院色| 国产精品久久久久一区| 亚洲人成网站色在线观看 | 男女男精品视频网| 日韩欧美的一区| 午夜av电影一区| 欧美一区二区在线免费播放| 久久精品国产一区二区三 | 麻豆精品新av中文字幕| 亚洲精品一线二线三线| 蜜臀久久99精品久久久久久9| 7878成人国产在线观看| 久久99精品国产麻豆婷婷 | 欧美激情在线观看视频免费| 国产成人8x视频一区二区| 亚洲欧洲美洲综合色网| 色婷婷激情综合| 天堂成人国产精品一区| 久久在线免费观看| 亚洲精品精品亚洲| 国产成人av电影在线观看| 综合久久一区二区三区| 日韩亚洲欧美一区二区三区| 狠狠色狠狠色综合| 91精品国产综合久久婷婷香蕉| 最新欧美精品一区二区三区| 亚洲免费视频成人| 亚洲午夜一二三区视频| 久久精品国产亚洲aⅴ| 成人18视频日本| 波多野洁衣一区| 粉嫩一区二区三区在线看| 99国产精品久久久久| av在线不卡电影| 欧美色网一区二区| 日韩一级免费观看| 99亚偷拍自图区亚洲| 日本亚洲视频在线| 久久一二三国产| 在线免费不卡视频| 激情小说欧美图片| 中文字幕一区二区三区在线观看| 色婷婷久久综合| 另类欧美日韩国产在线| 国产精品毛片无遮挡高清| 欧美日韩中文字幕一区二区| 久久国产尿小便嘘嘘尿| 一区二区三区在线观看欧美| 欧美一级黄色录像| 99精品热视频| 国产99精品国产| 老汉av免费一区二区三区| 亚洲日本在线天堂| 国产欧美日韩不卡| 精品国产凹凸成av人网站| 不卡av在线免费观看| 日韩av电影一区| 五月婷婷综合在线| 亚洲成人资源网| 亚洲成人福利片| 亚洲成av人片www| 一区二区三区电影在线播| 日韩中文字幕91| 国产在线精品视频| 国产伦精品一区二区三区视频青涩| 极品美女销魂一区二区三区| 不卡一二三区首页| 粉嫩在线一区二区三区视频| 成人黄色软件下载|