/* Software Name : AsmDex * Version : 1.0 * * Copyright © 2012 France Télécom * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ package org.ow2.asmdex.structureCommon; import java.util.ArrayList; import java.util.List; /** * A Local Variable. It is identified by its Register Number. It can hold none or one Starts, * and none, one or or several Ends and/or Restart Labels. * The Start may be unknown. In that case, the name, type and signature are also unknown, as they * are given along with the Start in the debug_info_item. * * @author Julien Névo */ public class LocalVariable { /** * The register index of the variable. */ private int register; /** * The name of the variable. */ private String name; /** * The type (descriptor) of the variable. */ private String type; /** * The signature. Only used by generics, Null otherwise. */ private String signature; /** * The Label where the variable starts. */ private Label start; /** * The Labels where the variable ends. May be null. */ private List<Label> ends; /** * The Labels where the variable restarts. May be null. */ private List<Label> restarts; /** * Constructor of the Local Variable. * @param register the register index of the variable. * @param name the name of the variable. * @param type the type (descriptor) of the variable. * @param signature the signature. Only used by generics, Null otherwise. * @param start the Label where the variable starts. * @param ends the Labels where the variable ends. May be null. * @param restarts the Labels where the variable restarts. May be null. */ public LocalVariable(int register, String name, String type, String signature, Label start, List<Label> ends, List<Label> restarts) { this.register = register; this.name = name; this.type = type; this.signature = signature; this.start = start; this.ends = ends; this.restarts = restarts; } /** * Constructor of the Local Variable. * @param register the register index of the variable. */ public LocalVariable(int register) { this.register = register; } // ------------------------------------ // Getters and Setters. // ------------------------------------ /** * Returns the register index of the variable. * @return the register index of the variable. */ public int getRegister() { return register; } /** * Returns the name of the variable. * @return the name of the variable. */ public String getName() { return name; } /** * Sets the name of the variable. * @param name the name of the variable. */ public void setName(String name) { this.name = name; } /** * Returns the type (descriptor) of the variable. * @return the type (descriptor) of the variable. */ public String getType() { return type; } /** * Sets the type of the variable. * @param type the type of the variable. */ public void setType(String type) { this.type = type; } /** * Returns the signature. Only used by generics, Null otherwise. * @return the signature. Only used by generics, Null otherwise. */ public String getSignature() { return signature; } /** * Sets the signature of the variable. * @param signature the signature of the variable. */ public void setSignature(String signature) { this.signature = signature; } /** * Returns the Label where the variable starts. * @return the Label where the variable starts. */ public Label getStart() { return start; } /** * Sets the Start of the variable. * @param start the Start of the variable. */ public void setStart(Label start) { this.start = start; } /** * Returns the Labels where the variable ends. May be null. * @return the Labels where the variable ends. May be null. */ public List<Label> getEnds() { return ends; } /** * Returns the Labels where the variable restarts. May be null. * @return the Labels where the variable restarts. May be null. */ public List<Label> getRestarts() { return restarts; } /** * Adds the Label where the variable ends. * @param end the Label where the variable ends. */ public void addEnd(Label end) { ends = addLabel(ends, end); } /** * Adds the Label where the variable restarts. * @param restart the Label where the variable restarts. */ public void addRestart(Label restart) { restarts = addLabel(restarts, restart); } /** * Adds a Label to the given list, creating it if it was null. * @param labelList the list. * @param label the Label to add. * @param the modified list. */ private List<Label> addLabel(List<Label> labelList, Label label) { List<Label> result = labelList; if (result == null) { result = new ArrayList<Label>(); } result.add(label); return result; } }