001/***
002 * ASM: a very small and fast Java bytecode manipulation framework
003 * Copyright (c) 2000-2011 INRIA, France Telecom
004 * All rights reserved.
005 *
006 * Redistribution and use in source and binary forms, with or without
007 * modification, are permitted provided that the following conditions
008 * are met:
009 * 1. Redistributions of source code must retain the above copyright
010 *    notice, this list of conditions and the following disclaimer.
011 * 2. Redistributions in binary form must reproduce the above copyright
012 *    notice, this list of conditions and the following disclaimer in the
013 *    documentation and/or other materials provided with the distribution.
014 * 3. Neither the name of the copyright holders nor the names of its
015 *    contributors may be used to endorse or promote products derived from
016 *    this software without specific prior written permission.
017 *
018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
028 * THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package io.ebean.enhance.asm.tree.analysis;
031
032import io.ebean.enhance.asm.tree.AbstractInsnNode;
033
034import java.util.Set;
035
036/**
037 * A {@link Value} that is represented by its type in a two types type system.
038 * This type system distinguishes the ONEWORD and TWOWORDS types.
039 * 
040 * @author Eric Bruneton
041 */
042public class SourceValue implements Value {
043
044    /**
045     * The size of this value.
046     */
047    public final int size;
048
049    /**
050     * The instructions that can produce this value. For example, for the Java
051     * code below, the instructions that can produce the value of <tt>i</tt> at
052     * line 5 are the txo ISTORE instructions at line 1 and 3:
053     * 
054     * <pre>
055     * 1: i = 0;
056     * 2: if (...) {
057     * 3:   i = 1;
058     * 4: }
059     * 5: return i;
060     * </pre>
061     * 
062     * This field is a set of {@link AbstractInsnNode} objects.
063     */
064    public final Set<AbstractInsnNode> insns;
065
066    public SourceValue(final int size) {
067        this(size, SmallSet.<AbstractInsnNode> emptySet());
068    }
069
070    public SourceValue(final int size, final AbstractInsnNode insn) {
071        this.size = size;
072        this.insns = new SmallSet<AbstractInsnNode>(insn, null);
073    }
074
075    public SourceValue(final int size, final Set<AbstractInsnNode> insns) {
076        this.size = size;
077        this.insns = insns;
078    }
079
080    public int getSize() {
081        return size;
082    }
083
084    @Override
085    public boolean equals(final Object value) {
086        if (!(value instanceof SourceValue)) {
087            return false;
088        }
089        SourceValue v = (SourceValue) value;
090        return size == v.size && insns.equals(v.insns);
091    }
092
093    @Override
094    public int hashCode() {
095        return insns.hashCode();
096    }
097}