Source code: org/apache/bcel/generic/BranchHandle.java
1 /*
2 * Copyright 2000-2004 The Apache Software Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17 package org.apache.bcel.generic;
18
19 /**
20 * BranchHandle is returned by specialized InstructionList.append() whenever a
21 * BranchInstruction is appended. This is useful when the target of this
22 * instruction is not known at time of creation and must be set later
23 * via setTarget().
24 *
25 * @see InstructionHandle
26 * @see Instruction
27 * @see InstructionList
28 * @version $Id: BranchHandle.java 386056 2006-03-15 11:31:56Z tcurdt $
29 * @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
30 */
31 public final class BranchHandle extends InstructionHandle {
32
33 private BranchInstruction bi; // An alias in fact, but saves lots of casts
34
35
36 private BranchHandle(BranchInstruction i) {
37 super(i);
38 bi = i;
39 }
40
41 /** Factory methods.
42 */
43 private static BranchHandle bh_list = null; // List of reusable handles
44
45
46 static final BranchHandle getBranchHandle( BranchInstruction i ) {
47 if (bh_list == null) {
48 return new BranchHandle(i);
49 }
50 BranchHandle bh = bh_list;
51 bh_list = (BranchHandle) bh.next;
52 bh.setInstruction(i);
53 return bh;
54 }
55
56
57 /** Handle adds itself to the list of resuable handles.
58 */
59 protected void addHandle() {
60 next = bh_list;
61 bh_list = this;
62 }
63
64
65 /* Override InstructionHandle methods: delegate to branch instruction.
66 * Through this overriding all access to the private i_position field should
67 * be prevented.
68 */
69 public int getPosition() {
70 return bi.position;
71 }
72
73
74 void setPosition( int pos ) {
75 i_position = bi.position = pos;
76 }
77
78
79 protected int updatePosition( int offset, int max_offset ) {
80 int x = bi.updatePosition(offset, max_offset);
81 i_position = bi.position;
82 return x;
83 }
84
85
86 /**
87 * Pass new target to instruction.
88 */
89 public void setTarget( InstructionHandle ih ) {
90 bi.setTarget(ih);
91 }
92
93
94 /**
95 * Update target of instruction.
96 */
97 public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) {
98 bi.updateTarget(old_ih, new_ih);
99 }
100
101
102 /**
103 * @return target of instruction.
104 */
105 public InstructionHandle getTarget() {
106 return bi.getTarget();
107 }
108
109
110 /**
111 * Set new contents. Old instruction is disposed and may not be used anymore.
112 */
113 public void setInstruction( Instruction i ) {
114 super.setInstruction(i);
115 if (!(i instanceof BranchInstruction)) {
116 throw new ClassGenException("Assigning " + i
117 + " to branch handle which is not a branch instruction");
118 }
119 bi = (BranchInstruction) i;
120 }
121 }