Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
 /*
  * fb-contrib - Auxiliary detectors for Java programs
  * Copyright (C) 2005-2012 Dave Brosius
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package com.mebigfatguy.fbcontrib.utils;
import  org.apache.bcel.Constants;
import  edu.umd.cs.findbugs.OpcodeStack;

restores OpcodeStack Item's userValues when a ternary is processed. This class is required because Findbugs has a bug whereby it strips the user value field from all OpcodeStack items when a GOTO is processed when items are on the stack. Normally this is not the case, but in the case of ternary handling there may be N items on the stack before what the ternary pushes. Now clearly the uservalue should be stripped for items pushed on by both branches of the ternary, but items that were on the stack before the ternary was executed should be left alone. This is currently not happening in findbugs. So this class saves off user values across a GOTO involved with a ternary and restores them appropriately.
public class TernaryPatcher {
	private static List<ObjectuserValues = new ArrayList<Object>();
	private static boolean sawGOTO = false;
	private TernaryPatcher() {
	}

called before the execution of the parent OpcodeStack.sawOpcode() to save user values if the opcode is a GOTO or GOTO_W.

Parameters:
stack the OpcodeStack with the items containing user values
opcode the opcode currently seen
	public static void pre(OpcodeStack stackint opcode) {
		if (!) {
			 = (opcode == Constants.GOTO) || (opcode == Constants.GOTO_W);
			if () {
				int depth = stack.getStackDepth();
				if (depth > 0) {
					for (int i = 0; i < depthi++) {
						OpcodeStack.Item item = stack.getStackItem(i);
						.add(item.getUserValue());
					}
				}
			}
		}
	}

called after the execution of the parent OpcodeStack.sawOpcode, to restore the user values after the GOTO or GOTO_W's mergeJumps were processed

Parameters:
stack the OpcodeStack with the items containing user values
opcode the opcode currently seen
	public static void post(OpcodeStack stackint opcode) {
		if ((opcode != Constants.GOTO) && (opcode != Constants.GOTO_W)) {
			if () {
				int depth = stack.getStackDepth();
				if (depth > 0) {
					for (int i = 0; i < depthi++) {
						if (.size() > i) {
							OpcodeStack.Item item = stack.getStackItem(i);
							if (item.getUserValue() == null) {
								item.setUserValue(.get(i));
							}
						}
					}
				}
				 = false;
			}
		}
	}
New to GrepCode? Check out our FAQ X