/******************************************************************************* * Copyright (c) 2002,2006 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.wala.shrikeBT.info; import com.ibm.wala.shrikeBT.ExceptionHandler; import com.ibm.wala.shrikeBT.IInstruction; import com.ibm.wala.shrikeBT.MethodData; import com.ibm.wala.shrikeBT.StoreInstruction; /** * This method annotation checks to see whether "this" is assigned to by the method. The result is cached in an annotation. */ public class ThisAssignmentChecker implements MethodData.Results { private final static String key = ThisAssignmentChecker.class.getName(); private boolean assignmentToThis; ThisAssignmentChecker(MethodData info) { recalculateFrom(info); } private void recalculateFrom(MethodData info) { assignmentToThis = false; if (!info.getIsStatic()) { IInstruction[] instructions = info.getInstructions(); for (int i = 0; i < instructions.length; i++) { IInstruction instr = instructions[i]; if (instr instanceof StoreInstruction) { StoreInstruction st = (StoreInstruction) instr; if (st.getVarIndex() == 0) { assignmentToThis = true; } } } } } /** * This should not be called by any client. */ @Override public boolean notifyUpdate(MethodData info, IInstruction[] newInstructions, ExceptionHandler[][] newHandlers, int[] newInstructionMap) { // just throw this away and we'll recalculate from scratch if necessary return true; } /** * @return true iff 'this' is assigned to by the method */ public static boolean isThisAssigned(MethodData info) throws IllegalArgumentException { if (info == null) { throw new IllegalArgumentException(); } ThisAssignmentChecker c = (ThisAssignmentChecker) info.getInfo(key); if (c == null) { c = new ThisAssignmentChecker(info); info.putInfo(key, c); } return c.assignmentToThis; } }