TABLESWITCH.java revision 628:2bfaf29cc90b
1/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5package com.sun.org.apache.bcel.internal.generic;
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 */
60import java.io.*;
61import com.sun.org.apache.bcel.internal.util.ByteSequence;
62
63/**
64 * TABLESWITCH - Switch within given range of values, i.e., low..high
65 *
66 * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
67 * @see SWITCH
68 */
69public class TABLESWITCH extends Select {
70  /**
71   * Empty constructor needed for the Class.newInstance() statement in
72   * Instruction.readInstruction(). Not to be used otherwise.
73   */
74  TABLESWITCH() {}
75
76  /**
77   * @param match sorted array of match values, match[0] must be low value,
78   * match[match_length - 1] high value
79   * @param targets where to branch for matched values
80   * @param target default branch
81   */
82  public TABLESWITCH(int[] match, InstructionHandle[] targets,
83                     InstructionHandle target) {
84    super(com.sun.org.apache.bcel.internal.Constants.TABLESWITCH, match, targets, target);
85
86    length = (short)(13 + match_length * 4); /* Alignment remainder assumed
87                                              * 0 here, until dump time */
88    fixed_length = length;
89  }
90
91  /**
92   * Dump instruction as byte code to stream out.
93   * @param out Output stream
94   */
95  public void dump(DataOutputStream out) throws IOException {
96    super.dump(out);
97
98    int low = (match_length > 0)? match[0] : 0;
99    out.writeInt(low);
100
101    int high = (match_length > 0)? match[match_length - 1] : 0;
102    out.writeInt(high);
103
104    for(int i=0; i < match_length; i++)     // jump offsets
105      out.writeInt(indices[i] = getTargetOffset(targets[i]));
106  }
107
108  /**
109   * Read needed data (e.g. index) from file.
110   */
111  protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException
112  {
113    super.initFromFile(bytes, wide);
114
115    int low    = bytes.readInt();
116    int high   = bytes.readInt();
117
118    match_length = high - low + 1;
119    fixed_length = (short)(13 + match_length * 4);
120    length       = (short)(fixed_length + padding);
121
122    match   = new int[match_length];
123    indices = new int[match_length];
124    targets = new InstructionHandle[match_length];
125
126    for(int i=low; i <= high; i++)
127      match[i - low] = i;
128
129    for(int i=0; i < match_length; i++) {
130      indices[i] = bytes.readInt();
131    }
132  }
133
134
135  /**
136   * Call corresponding visitor method(s). The order is:
137   * Call visitor methods of implemented interfaces first, then
138   * call methods according to the class hierarchy in descending order,
139   * i.e., the most specific visitXXX() call comes last.
140   *
141   * @param v Visitor object
142   */
143  public void accept(Visitor v) {
144    v.visitVariableLengthInstruction(this);
145    v.visitStackProducer(this);
146    v.visitBranchInstruction(this);
147    v.visitSelect(this);
148    v.visitTABLESWITCH(this);
149  }
150}
151