001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 *
017 */
018package org.apache.bcel.verifier.structurals;
019
020/**
021 * This class represents a JVM execution frame; that means, a local variable array and an operand stack.
022 *
023 */
024
025public class Frame {
026
027    /**
028     * For instance initialization methods, it is important to remember which instance it is that is not initialized yet. It
029     * will be initialized invoking another constructor later. NULL means the instance already *is* initialized.
030     *
031     * @deprecated Use the getter/setter to access the field as it may be made private in a later release
032     */
033    @Deprecated
034    protected static UninitializedObjectType _this;
035
036    /**
037     * @return the _this
038     * @since 6.0
039     */
040    public static UninitializedObjectType getThis() {
041        return _this;
042    }
043
044    /**
045     * @param _this the _this to set
046     * @since 6.0
047     */
048    public static void setThis(final UninitializedObjectType _this) {
049        Frame._this = _this;
050    }
051
052    /**
053     *
054     */
055    private final LocalVariables locals;
056
057    /**
058     *
059     */
060    private final OperandStack stack;
061
062    /**
063     *
064     */
065    public Frame(final int maxLocals, final int maxStack) {
066        locals = new LocalVariables(maxLocals);
067        stack = new OperandStack(maxStack);
068    }
069
070    /**
071     *
072     */
073    public Frame(final LocalVariables locals, final OperandStack stack) {
074        this.locals = locals;
075        this.stack = stack;
076    }
077
078    /**
079     *
080     */
081    @Override
082    protected Object clone() {
083        return new Frame(locals.getClone(), stack.getClone());
084    }
085
086    /**
087     *
088     */
089    @Override
090    public boolean equals(final Object o) {
091        if (!(o instanceof Frame)) {
092            return false; // implies "null" is non-equal.
093        }
094        final Frame f = (Frame) o;
095        return this.stack.equals(f.stack) && this.locals.equals(f.locals);
096    }
097
098    /**
099     *
100     */
101    public Frame getClone() {
102        return (Frame) clone();
103    }
104
105    /**
106     *
107     */
108    public LocalVariables getLocals() {
109        return locals;
110    }
111
112    /**
113     *
114     */
115    public OperandStack getStack() {
116        return stack;
117    }
118
119    /**
120     * @return a hash code value for the object.
121     */
122    @Override
123    public int hashCode() {
124        return stack.hashCode() ^ locals.hashCode();
125    }
126
127    /**
128     * Returns a String representation of the Frame instance.
129     */
130    @Override
131    public String toString() {
132        String s = "Local Variables:\n";
133        s += locals;
134        s += "OperandStack:\n";
135        s += stack;
136        return s;
137    }
138}