View Javadoc

1   /*
2    * Copyright  2000-2004 The Apache Software Foundation
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License"); 
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License. 
15   *
16   */ 
17  package org.apache.bcel.verifier.structurals;
18  
19  
20  
21  /***
22   * This class represents a JVM execution frame; that means,
23   * a local variable array and an operand stack.
24   *
25   * @version $Id: Frame.java 386056 2006-03-15 11:31:56Z tcurdt $
26   * @author Enver Haase
27   */
28   
29  public class Frame{
30  
31  	/***
32  	 * For instance initialization methods, it is important to remember
33  	 * which instance it is that is not initialized yet. It will be
34  	 * initialized invoking another constructor later.
35  	 * NULL means the instance already *is* initialized.
36  	 */
37  	protected static UninitializedObjectType _this;
38  
39  	/***
40  	 *
41  	 */
42  	private LocalVariables locals;
43  
44  	/***
45  	 *
46  	 */
47  	private OperandStack stack;
48  
49  	/***
50  	 *
51  	 */
52  	public Frame(int maxLocals, int maxStack){
53  		locals = new LocalVariables(maxLocals);
54  		stack = new OperandStack(maxStack);
55  	}
56  
57  	/***
58  	 *
59  	 */
60  	public Frame(LocalVariables locals, OperandStack stack){
61  		this.locals = locals;
62  		this.stack = stack;
63  	}
64  
65  	/***
66  	 *
67  	 */
68  	protected Object clone(){
69  		Frame f = new Frame(locals.getClone(), stack.getClone());
70  		return f;
71  	}
72  
73  	/***
74  	 *
75  	 */
76  	public Frame getClone(){
77  		return (Frame) clone();
78  	}
79  
80  	/***
81  	 *
82  	 */
83  	public LocalVariables getLocals(){
84  		return locals;
85  	}
86  
87  	/***
88  	 *
89  	 */
90  	public OperandStack getStack(){
91  		return stack;
92  	}
93  
94  	/*** @return a hash code value for the object.
95       */
96  	public int hashCode() { return stack.hashCode() ^ locals.hashCode(); }
97  
98  	/***
99  	 *
100 	 */
101 	public boolean equals(Object o){
102 		if (!(o instanceof Frame)) {
103             return false; // implies "null" is non-equal.
104         }
105 		Frame f = (Frame) o;
106 		return this.stack.equals(f.stack) && this.locals.equals(f.locals);
107 	}
108 
109 	/***
110 	 * Returns a String representation of the Frame instance.
111 	 */
112 	public String toString(){
113 		String s="Local Variables:\n";
114 		s += locals;
115 		s += "OperandStack:\n";
116 		s += stack;
117 		return s;
118 	}
119 }