01: /*
02: * ProGuard -- shrinking, optimization, obfuscation, and preverification
03: * of Java bytecode.
04: *
05: * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
06: *
07: * This library is free software; you can redistribute it and/or modify it
08: * under the terms of the GNU General Public License as published by the Free
09: * Software Foundation; either version 2 of the License, or (at your option)
10: * any later version.
11: *
12: * This library is distributed in the hope that it will be useful, but WITHOUT
13: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
15: * for more details.
16: *
17: * You should have received a copy of the GNU Lesser General Public License
18: * along with this library; if not, write to the Free Software Foundation,
19: * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20: */
21: package proguard.classfile.attribute.preverification;
22:
23: import proguard.classfile.*;
24: import proguard.classfile.attribute.*;
25: import proguard.classfile.attribute.preverification.visitor.StackMapFrameVisitor;
26: import proguard.classfile.attribute.visitor.AttributeVisitor;
27:
28: /**
29: * This Attribute represents a stack map table attribute.
30: *
31: * @author Eric Lafortune
32: */
33: public class StackMapTableAttribute extends Attribute {
34: public int u2stackMapFramesCount;
35: public StackMapFrame[] stackMapFrames;
36:
37: /**
38: * Creates an uninitialized StackMapTableAttribute.
39: */
40: public StackMapTableAttribute() {
41: }
42:
43: /**
44: * Creates a StackMapTableAttribute with the given stack map frames.
45: */
46: public StackMapTableAttribute(StackMapFrame[] stackMapFrames) {
47: this (stackMapFrames.length, stackMapFrames);
48: }
49:
50: /**
51: * Creates a StackMapTableAttribute with the given stack map frames.
52: */
53: public StackMapTableAttribute(int stackMapFramesCount,
54: StackMapFrame[] stackMapFrames) {
55: this .u2stackMapFramesCount = stackMapFramesCount;
56: this .stackMapFrames = stackMapFrames;
57: }
58:
59: // Implementations for Attribute.
60:
61: public void accept(Clazz clazz, Method method,
62: CodeAttribute codeAttribute,
63: AttributeVisitor attributeVisitor) {
64: attributeVisitor.visitStackMapTableAttribute(clazz, method,
65: codeAttribute, this );
66: }
67:
68: /**
69: * Applies the given stack map frame visitor to all stack map frames.
70: */
71: public void stackMapFramesAccept(Clazz clazz, Method method,
72: CodeAttribute codeAttribute,
73: StackMapFrameVisitor stackMapFrameVisitor) {
74: int offset = 0;
75:
76: for (int index = 0; index < u2stackMapFramesCount; index++) {
77: StackMapFrame stackMapFrame = stackMapFrames[index];
78:
79: // Note that the byte code offset is computed differently for the
80: // first stack map frame.
81: offset += stackMapFrame.getOffsetDelta()
82: + (index == 0 ? 0 : 1);
83:
84: stackMapFrame.accept(clazz, method, codeAttribute, offset,
85: stackMapFrameVisitor);
86: }
87: }
88: }
|