View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.javaflow.bytecode.transformation.bcel.analyser;
18  
19  import java.util.ArrayList;
20  
21  import org.apache.bcel.generic.InstructionHandle;
22  
23  /**
24   * An InstructionContext offers convenient access
25   * to information like control flow successors and
26   * such.
27   *
28   * @version $Id: InstructionContext.java 480487 2006-11-29 08:54:42Z bayard $
29   * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
30   */
31  public interface InstructionContext{
32  
33  	/**
34  	 * This method symbolically executes the Instruction
35  	 * held in the InstructionContext.
36  	 * It "merges in" the incoming execution frame situation
37  	 * (see The Java Virtual Machine Specification, 2nd
38  	 * edition, page 146).
39  	 * By so doing, the outgoing execution frame situation
40  	 * is calculated.
41  	 *
42  	 * This method is JustIce-specific and is usually of
43  	 * no sense for users of the ControlFlowGraph class.
44  	 * They should use getInstruction().accept(Visitor),
45  	 * possibly in conjunction with the ExecutionVisitor.
46  	 * 
47  	 * WARNING! These classes are a fork of the bcel verifier.
48  	 *
49  	 * @see ControlFlowGraph
50  	 * @see ExecutionVisitor
51  	 * @see #getOutFrame(ArrayList)
52  	 * @return true -  if and only if the "outgoing" frame situation
53  	 * changed from the one before execute()ing.
54  	 */
55  	boolean execute(Frame inFrame, ExecutionPath executionPredecessors, ExecutionVisitor ev);
56  
57  	Frame getInFrame();
58  
59  	/**
60  	 * This method returns the outgoing execution frame situation;
61  	 * therefore <B>it has to be calculated by execute(Frame, ArrayList)
62  	 * first.</B>
63  	 *
64  	 * @see #execute(Frame, ExecutionPath, ExecutionVisitor)
65  	 */
66  	Frame getOutFrame(ExecutionPath executionPredecessors);
67  	
68  	/**
69  	 * Returns the InstructionHandle this InstructionContext is wrapped around.
70  	 *
71  	 * @return The InstructionHandle this InstructionContext is wrapped around.
72  	 */
73  	InstructionHandle getInstruction();
74  
75  	/**
76  	 * Returns the usual control flow successors.
77  	 * @see #getExceptionHandlers()
78  	 */
79  	InstructionContext[] getSuccessors();
80  
81  	/**
82  	 * Returns the exception handlers that protect this instruction.
83  	 * They are special control flow successors.
84  	 */
85  	ExceptionHandler[] getExceptionHandlers();
86  }