    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
    022/**
    023 * This class represents a JVM execution frame; that means,
    024 * a local variable array and an operand stack.
    025 *
    026 * @version $Id: Frame.java 1806200 2017-08-25 16:33:06Z ggregory $
    027 */
    028
    029public class Frame{
    030
    031    /**
    032     * For instance initialization methods, it is important to remember
    033     * which instance it is that is not initialized yet. It will be
    034     * initialized invoking another constructor later.
    035     * NULL means the instance already *is* initialized.
    036     * @deprecated Use the getter/setter to access the field as it may
    037     * be made private in a later release
    038     */
    039    @Deprecated
    040    protected static UninitializedObjectType _this;
    041
    042    /**
    043     *
    044     */
    045    private final LocalVariables locals;
    046
    047    /**
    048     *
    049     */
    050    private final OperandStack stack;
    051
    052    /**
    053     *
    054     */
    055    public Frame(final int maxLocals, final int maxStack) {
    056        locals = new LocalVariables(maxLocals);
    057        stack = new OperandStack(maxStack);
    058    }
    059
    060    /**
    061     *
    062     */
    063    public Frame(final LocalVariables locals, final OperandStack stack) {
    064        this.locals = locals;
    065        this.stack = stack;
    066    }
    067
    068    /**
    069     *
    070     */
    071    @Override
    072    protected Object clone() {
    073        final Frame f = new Frame(locals.getClone(), stack.getClone());
    074        return f;
    075    }
    076
    077    /**
    078     *
    079     */
    080    public Frame getClone() {
    081        return (Frame) clone();
    082    }
    083
    084    /**
    085     *
    086     */
    087    public LocalVariables getLocals() {
    088        return locals;
    089    }
    090
    091    /**
    092     *
    093     */
    094    public OperandStack getStack() {
    095        return stack;
    096    }
    097
    098    /** @return a hash code value for the object.
    099     */
    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}