~ubuntu-branches/ubuntu/natty/aspectj/natty

« back to all changes in this revision

Viewing changes to org.aspectj/modules/bcel-builder/src/org/aspectj/apache/bcel/generic/TABLESWITCH.java

  • Committer: Bazaar Package Importer
  • Author(s): Damien Raude-Morvan
  • Date: 2009-10-04 16:37:23 UTC
  • mfrom: (1.1.3 upstream) (3.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20091004163723-ck4y7j7fhjxskkie
Tags: 1.6.6+dfsg-1
* New upstream release.
  - Update 02_use_gjdoc.diff patch
* Update my email address

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
package org.aspectj.apache.bcel.generic;
2
 
 
3
 
/* ====================================================================
4
 
 * The Apache Software License, Version 1.1
5
 
 *
6
 
 * Copyright (c) 2001 The Apache Software Foundation.  All rights
7
 
 * reserved.
8
 
 *
9
 
 * Redistribution and use in source and binary forms, with or without
10
 
 * modification, are permitted provided that the following conditions
11
 
 * are met:
12
 
 *
13
 
 * 1. Redistributions of source code must retain the above copyright
14
 
 *    notice, this list of conditions and the following disclaimer.
15
 
 *
16
 
 * 2. Redistributions in binary form must reproduce the above copyright
17
 
 *    notice, this list of conditions and the following disclaimer in
18
 
 *    the documentation and/or other materials provided with the
19
 
 *    distribution.
20
 
 *
21
 
 * 3. The end-user documentation included with the redistribution,
22
 
 *    if any, must include the following acknowledgment:
23
 
 *       "This product includes software developed by the
24
 
 *        Apache Software Foundation (http://www.apache.org/)."
25
 
 *    Alternately, this acknowledgment may appear in the software itself,
26
 
 *    if and wherever such third-party acknowledgments normally appear.
27
 
 *
28
 
 * 4. The names "Apache" and "Apache Software Foundation" and
29
 
 *    "Apache BCEL" must not be used to endorse or promote products
30
 
 *    derived from this software without prior written permission. For
31
 
 *    written permission, please contact apache@apache.org.
32
 
 *
33
 
 * 5. Products derived from this software may not be called "Apache",
34
 
 *    "Apache BCEL", nor may "Apache" appear in their name, without
35
 
 *    prior written permission of the Apache Software Foundation.
36
 
 *
37
 
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38
 
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39
 
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40
 
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41
 
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42
 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43
 
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44
 
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45
 
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46
 
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47
 
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48
 
 * SUCH DAMAGE.
49
 
 * ====================================================================
50
 
 *
51
 
 * This software consists of voluntary contributions made by many
52
 
 * individuals on behalf of the Apache Software Foundation.  For more
53
 
 * information on the Apache Software Foundation, please see
54
 
 * <http://www.apache.org/>.
55
 
 */
56
 
import java.io.*;
57
 
import org.aspectj.apache.bcel.util.ByteSequence;
58
 
 
59
 
/** 
60
 
 * TABLESWITCH - Switch within given range of values, i.e., low..high
61
 
 *
62
 
 * @version $Id: TABLESWITCH.java,v 1.3 2005/08/25 11:35:49 aclement Exp $
63
 
 * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
64
 
 * @see SWITCH
65
 
 */
66
 
public class TABLESWITCH extends Select {
67
 
  /**
68
 
   * Empty constructor needed for the Class.newInstance() statement in
69
 
   * Instruction.readInstruction(). Not to be used otherwise.
70
 
   */
71
 
  TABLESWITCH() {}
72
 
 
73
 
  /**
74
 
   * @param match sorted array of match values, match[0] must be low value, 
75
 
   * match[match_length - 1] high value
76
 
   * @param targets where to branch for matched values
77
 
   * @param target default branch
78
 
   */
79
 
  public TABLESWITCH(int[] match, InstructionHandle[] targets,
80
 
                     InstructionHandle target) {
81
 
    super(org.aspectj.apache.bcel.Constants.TABLESWITCH, match, targets, target);
82
 
    
83
 
//    if (match_length==0) {
84
 
//      throw new RuntimeException("A tableswitch with no targets should be represented as a LOOKUPSWITCH");
85
 
//    }
86
 
    
87
 
    length = (short)(13 + match_length * 4); /* Alignment remainder assumed
88
 
                                              * 0 here, until dump time */
89
 
    fixed_length = length;
90
 
  }
91
 
 
92
 
  /**
93
 
   * Dump instruction as byte code to stream out.
94
 
   * @param out Output stream
95
 
   */
96
 
  public void dump(DataOutputStream out) throws IOException {
97
 
    super.dump(out);
98
 
 
99
 
    int low = (match_length > 0)? match[0] : 0;
100
 
    out.writeInt(low);
101
 
 
102
 
    int high = (match_length > 0)? match[match_length - 1] : 0;
103
 
    out.writeInt(high);
104
 
 
105
 
//  See aj bug pr104720
106
 
//    if (match_length==0) out.writeInt(0); // following the switch you need to supply "HIGH-LOW+1" entries
107
 
    
108
 
    for(int i=0; i < match_length; i++)     // jump offsets
109
 
      out.writeInt(indices[i] = getTargetOffset(targets[i]));
110
 
  }
111
 
 
112
 
  /**
113
 
   * Read needed data (e.g. index) from file.
114
 
   */
115
 
  protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException
116
 
  {
117
 
    super.initFromFile(bytes, wide);
118
 
 
119
 
    int low    = bytes.readInt();
120
 
    int high   = bytes.readInt();
121
 
 
122
 
    match_length = high - low + 1;
123
 
    fixed_length = (short)(13 + match_length * 4);
124
 
    length       = (short)(fixed_length + padding);
125
 
 
126
 
    match   = new int[match_length];
127
 
    indices = new int[match_length];
128
 
    targets = new InstructionHandle[match_length];
129
 
 
130
 
    for(int i=low; i <= high; i++)
131
 
      match[i - low] = i;
132
 
 
133
 
    for(int i=0; i < match_length; i++) {
134
 
      indices[i] = bytes.readInt();
135
 
    }
136
 
  }
137
 
 
138
 
 
139
 
  /**
140
 
   * Call corresponding visitor method(s). The order is:
141
 
   * Call visitor methods of implemented interfaces first, then
142
 
   * call methods according to the class hierarchy in descending order,
143
 
   * i.e., the most specific visitXXX() call comes last.
144
 
   *
145
 
   * @param v Visitor object
146
 
   */
147
 
  public void accept(Visitor v) {
148
 
    v.visitVariableLengthInstruction(this);
149
 
    v.visitStackProducer(this);
150
 
    v.visitBranchInstruction(this);
151
 
    v.visitSelect(this);
152
 
    v.visitTABLESWITCH(this);
153
 
  }
154
 
}