View Javadoc
1   /*
2    * reserved comment block
3    * DO NOT REMOVE OR ALTER!
4    */
5   package com.sun.org.apache.bcel.internal.classfile;
6   
7   /* ====================================================================
8    * The Apache Software License, Version 1.1
9    *
10   * Copyright (c) 2001 The Apache Software Foundation.  All rights
11   * reserved.
12   *
13   * Redistribution and use in source and binary forms, with or without
14   * modification, are permitted provided that the following conditions
15   * are met:
16   *
17   * 1. Redistributions of source code must retain the above copyright
18   *    notice, this list of conditions and the following disclaimer.
19   *
20   * 2. Redistributions in binary form must reproduce the above copyright
21   *    notice, this list of conditions and the following disclaimer in
22   *    the documentation and/or other materials provided with the
23   *    distribution.
24   *
25   * 3. The end-user documentation included with the redistribution,
26   *    if any, must include the following acknowledgment:
27   *       "This product includes software developed by the
28   *        Apache Software Foundation (http://www.apache.org/)."
29   *    Alternately, this acknowledgment may appear in the software itself,
30   *    if and wherever such third-party acknowledgments normally appear.
31   *
32   * 4. The names "Apache" and "Apache Software Foundation" and
33   *    "Apache BCEL" must not be used to endorse or promote products
34   *    derived from this software without prior written permission. For
35   *    written permission, please contact apache@apache.org.
36   *
37   * 5. Products derived from this software may not be called "Apache",
38   *    "Apache BCEL", nor may "Apache" appear in their name, without
39   *    prior written permission of the Apache Software Foundation.
40   *
41   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52   * SUCH DAMAGE.
53   * ====================================================================
54   *
55   * This software consists of voluntary contributions made by many
56   * individuals on behalf of the Apache Software Foundation.  For more
57   * information on the Apache Software Foundation, please see
58   * <http://www.apache.org/>.
59   */
60  
61  import  com.sun.org.apache.bcel.internal.Constants;
62  import  java.io.*;
63  
64  /**
65   * This class represents a (PC offset, line number) pair, i.e., a line number in
66   * the source that corresponds to a relative address in the byte code. This
67   * is used for debugging purposes.
68   *
69   * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
70   * @see     LineNumberTable
71   */
72  public final class LineNumber implements Cloneable, Node, Serializable {
73    private int start_pc;    // Program Counter (PC) corresponds to line
74    private int line_number; // number in source file
75  
76    /**
77     * Initialize from another object.
78     */
79    public LineNumber(LineNumber c) {
80      this(c.getStartPC(), c.getLineNumber());
81    }
82  
83    /**
84     * Construct object from file stream.
85     * @param file Input stream
86     * @throws IOException
87     */
88    LineNumber(DataInputStream file) throws IOException
89    {
90      this(file.readUnsignedShort(), file.readUnsignedShort());
91    }
92  
93    /**
94     * @param start_pc Program Counter (PC) corresponds to
95     * @param line_number line number in source file
96     */
97    public LineNumber(int start_pc, int line_number)
98    {
99      this.start_pc    = start_pc;
100     this.line_number = line_number;
101   }
102 
103   /**
104    * Called by objects that are traversing the nodes of the tree implicitely
105    * defined by the contents of a Java class. I.e., the hierarchy of methods,
106    * fields, attributes, etc. spawns a tree of objects.
107    *
108    * @param v Visitor object
109    */
110   public void accept(Visitor v) {
111     v.visitLineNumber(this);
112   }
113 
114   /**
115    * Dump line number/pc pair to file stream in binary format.
116    *
117    * @param file Output file stream
118    * @throws IOException
119    */
120   public final void dump(DataOutputStream file) throws IOException
121   {
122     file.writeShort(start_pc);
123     file.writeShort(line_number);
124 
125   }
126   /**
127    * @return Corresponding source line
128    */
129   public final int getLineNumber() { return line_number; }
130 
131   /**
132    * @return PC in code
133    */
134   public final int getStartPC() { return start_pc; }
135 
136   /**
137    * @param line_number.
138    */
139   public final void setLineNumber(int line_number) {
140     this.line_number = line_number;
141   }
142 
143   /**
144    * @param start_pc.
145    */
146   public final void setStartPC(int start_pc) {
147     this.start_pc = start_pc;
148   }
149 
150   /**
151    * @return String representation
152    */
153   public final String toString() {
154     return "LineNumber(" + start_pc + ", " + line_number + ")";
155   }
156 
157   /**
158    * @return deep copy of this object
159    */
160   public LineNumber copy() {
161     try {
162       return (LineNumber)clone();
163     } catch(CloneNotSupportedException e) {}
164 
165     return null;
166   }
167 }