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   */
18  package org.apache.bcel.verifier.structurals;
19  
20  
21  
22  /**
23   * This class represents a JVM execution frame; that means,
24   * a local variable array and an operand stack.
25   *
26   * @version $Id: Frame.html 1018313 2017-09-18 09:03:04Z britter $
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       * @deprecated Use the getter/setter to access the field as it may
37       * be made private in a later release
38       */
39      @Deprecated
40      protected static UninitializedObjectType _this;
41  
42      /**
43       *
44       */
45      private final LocalVariables locals;
46  
47      /**
48       *
49       */
50      private final OperandStack stack;
51  
52      /**
53       *
54       */
55      public Frame(final int maxLocals, final int maxStack) {
56          locals = new LocalVariables(maxLocals);
57          stack = new OperandStack(maxStack);
58      }
59  
60      /**
61       *
62       */
63      public Frame(final LocalVariables locals, final OperandStack stack) {
64          this.locals = locals;
65          this.stack = stack;
66      }
67  
68      /**
69       *
70       */
71      @Override
72      protected Object clone() {
73          final Frame f = new Frame(locals.getClone(), stack.getClone());
74          return f;
75      }
76  
77      /**
78       *
79       */
80      public Frame getClone() {
81          return (Frame) clone();
82      }
83  
84      /**
85       *
86       */
87      public LocalVariables getLocals() {
88          return locals;
89      }
90  
91      /**
92       *
93       */
94      public OperandStack getStack() {
95          return stack;
96      }
97  
98      /** @return a hash code value for the object.
99       */
100     @Override
101     public int hashCode() { return stack.hashCode() ^ locals.hashCode(); }
102 
103     /**
104      *
105      */
106     @Override
107     public boolean equals(final Object o) {
108         if (!(o instanceof Frame)) {
109             return false; // implies "null" is non-equal.
110         }
111         final Frame f = (Frame) o;
112         return this.stack.equals(f.stack) && this.locals.equals(f.locals);
113     }
114 
115     /**
116      * Returns a String representation of the Frame instance.
117      */
118     @Override
119     public String toString() {
120         String s="Local Variables:\n";
121         s += locals;
122         s += "OperandStack:\n";
123         s += stack;
124         return s;
125     }
126 
127     /**
128      * @return the _this
129      * @since 6.0
130      */
131     public static UninitializedObjectType getThis() {
132         return _this;
133     }
134 
135     /**
136      * @param _this the _this to set
137      * @since 6.0
138      */
139     public static void setThis(final UninitializedObjectType _this) {
140         Frame._this = _this;
141     }
142 }