1/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5/*
6 * Licensed to the Apache Software Foundation (ASF) under one or more
7 * contributor license agreements.  See the NOTICE file distributed with
8 * this work for additional information regarding copyright ownership.
9 * The ASF licenses this file to You under the Apache License, Version 2.0
10 * (the "License"); you may not use this file except in compliance with
11 * the License.  You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
21
22package com.sun.org.apache.bcel.internal.classfile;
23
24import java.io.DataInput;
25import java.io.DataOutputStream;
26import java.io.IOException;
27
28/**
29 * This class represents a (PC offset, line number) pair, i.e., a line number in
30 * the source that corresponds to a relative address in the byte code. This
31 * is used for debugging purposes.
32 *
33 * @version $Id: LineNumber.java 1749603 2016-06-21 20:50:19Z ggregory $
34 * @see     LineNumberTable
35 */
36public final class LineNumber implements Cloneable, Node {
37
38    /** Program Counter (PC) corresponds to line */
39    private short start_pc;
40
41    /** number in source file */
42    private short line_number;
43
44    /**
45     * Initialize from another object.
46     *
47     * @param c the object to copy
48     */
49    public LineNumber(final LineNumber c) {
50        this(c.getStartPC(), c.getLineNumber());
51    }
52
53
54    /**
55     * Construct object from file stream.
56     *
57     * @param file Input stream
58     * @throws IOEXception if an I/O Exception occurs in readUnsignedShort
59     */
60    LineNumber(final DataInput file) throws IOException {
61        this(file.readUnsignedShort(), file.readUnsignedShort());
62    }
63
64
65    /**
66     * @param start_pc Program Counter (PC) corresponds to
67     * @param line_number line number in source file
68     */
69    public LineNumber(final int start_pc, final int line_number) {
70        this.start_pc = (short) start_pc;
71        this.line_number = (short)line_number;
72    }
73
74
75    /**
76     * Called by objects that are traversing the nodes of the tree implicitely
77     * defined by the contents of a Java class. I.e., the hierarchy of methods,
78     * fields, attributes, etc. spawns a tree of objects.
79     *
80     * @param v Visitor object
81     */
82    @Override
83    public void accept( final Visitor v ) {
84        v.visitLineNumber(this);
85    }
86
87
88    /**
89     * Dump line number/pc pair to file stream in binary format.
90     *
91     * @param file Output file stream
92     * @throws IOEXception if an I/O Exception occurs in writeShort
93     */
94    public final void dump( final DataOutputStream file ) throws IOException {
95        file.writeShort(start_pc);
96        file.writeShort(line_number);
97    }
98
99
100    /**
101     * @return Corresponding source line
102     */
103    public final int getLineNumber() {
104        return 0xffff & line_number;
105    }
106
107
108    /**
109     * @return PC in code
110     */
111    public final int getStartPC() {
112        return  0xffff & start_pc;
113    }
114
115
116    /**
117     * @param line_number the source line number
118     */
119    public final void setLineNumber( final int line_number ) {
120        this.line_number = (short) line_number;
121    }
122
123
124    /**
125     * @param start_pc the pc for this line number
126     */
127    public final void setStartPC( final int start_pc ) {
128        this.start_pc = (short) start_pc;
129    }
130
131
132    /**
133     * @return String representation
134     */
135    @Override
136    public final String toString() {
137        return "LineNumber(" + start_pc + ", " + line_number + ")";
138    }
139
140
141    /**
142     * @return deep copy of this object
143     */
144    public LineNumber copy() {
145        try {
146            return (LineNumber) clone();
147        } catch (final CloneNotSupportedException e) {
148            // TODO should this throw?
149        }
150        return null;
151    }
152}
153