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 org.apache.bcel.generic.*;
20  
21  /**
22   * This interface defines properties of JVM bytecode subroutines.
23   * Note that it is 'abused' to maintain the top-level code in a
24   * consistent fashion, too.
25   * 
26   * WARNING! These classes are a fork of the bcel verifier.
27   *
28   * @version $Id: Subroutine.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 Subroutine{
32  	/**
33  	 * Returns all the JsrInstructions that have the
34  	 * first instruction of this subroutine as their target.
35  	 * <B>Must not be invoked on the 'top-level subroutine'.</B>
36  	 */
37  	public InstructionHandle[] getEnteringJsrInstructions();
38  	
39  	/**
40  	 * Returns the one and only RET that leaves the subroutine.
41  	 * Note that JustIce has a pretty rigid notion of a subroutine.
42  	 * <B>Must not be invoked on the 'top-level subroutine'.</B>
43  	 *
44  	 * @see org.apache.bcel.verifier.structurals.Subroutines
45  	 */
46  	public InstructionHandle getLeavingRET();
47  
48  	/**
49  	 * Returns all instructions that together form this subroutine.
50  	 * Note that an instruction is part of exactly one subroutine
51  	 * (the top-level code is considered to be a special subroutine) -
52  	 * else it is not reachable at all (dead code).
53  	 */
54  	public InstructionHandle[] getInstructions();
55  
56  	/**
57  	 * Returns if the given InstructionHandle refers to an instruction
58  	 * that is part of this subroutine. This is a convenience method
59  	 * that saves iteration over the InstructionHandle objects returned
60  	 * by getInstructions().
61  	 *
62  	 * @see #getInstructions()
63  	 */
64  	public boolean contains(InstructionHandle inst);
65  
66  	/**
67  	 * Returns an int[] containing the indices of the local variable slots
68  	 * accessed by this Subroutine (read-accessed, write-accessed or both);
69  	 * local variables referenced by subroutines of this subroutine are
70  	 * not included.
71  	 *
72  	 * @see #getRecursivelyAccessedLocalsIndices()
73  	 */
74  	public int[] getAccessedLocalsIndices();
75  
76  	/**
77  	 * Returns an int[] containing the indices of the local variable slots
78  	 * accessed by this Subroutine (read-accessed, write-accessed or both);
79  	 * local variables referenced by subroutines of this subroutine are
80  	 * included.
81  	 *
82  	 * @see #getAccessedLocalsIndices()
83  	 */
84  	public int[] getRecursivelyAccessedLocalsIndices();
85  		
86  	/**
87  	 * Returns the subroutines that are directly called from this subroutine.
88  	 */
89  	public Subroutine[] subSubs();
90  }