1 /* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu) 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the Free 9 * Software Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * This program 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 General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 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 an exceptions attribute. 30 * 31 * @author Eric Lafortune 32 */ 33 public class StackMapAttribute extends Attribute 34 { 35 public int u2stackMapFramesCount; 36 public FullFrame[] stackMapFrames; 37 38 39 /** 40 * Creates an uninitialized ExceptionsAttribute. 41 */ StackMapAttribute()42 public StackMapAttribute() 43 { 44 } 45 46 47 /** 48 * Creates a StackMapTableAttribute with the given stack map frames. 49 */ StackMapAttribute(FullFrame[] stackMapFrames)50 public StackMapAttribute(FullFrame[] stackMapFrames) 51 { 52 this(stackMapFrames.length, stackMapFrames); 53 } 54 55 56 /** 57 * Creates a StackMapTableAttribute with the given stack map frames. 58 */ StackMapAttribute(int stackMapFramesCount, FullFrame[] stackMapFrames)59 public StackMapAttribute(int stackMapFramesCount, 60 FullFrame[] stackMapFrames) 61 { 62 this.u2stackMapFramesCount = stackMapFramesCount; 63 this.stackMapFrames = stackMapFrames; 64 } 65 66 67 68 69 // Implementations for Attribute. 70 accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor)71 public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor) 72 { 73 attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, this); 74 } 75 76 77 /** 78 * Applies the given stack map frame visitor to all stack map frames. 79 */ stackMapFramesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapFrameVisitor stackMapFrameVisitor)80 public void stackMapFramesAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapFrameVisitor stackMapFrameVisitor) 81 { 82 for (int index = 0; index < u2stackMapFramesCount; index++) 83 { 84 FullFrame stackMapFrame = stackMapFrames[index]; 85 86 // We don't need double dispatching here, since there is only one 87 // type of StackMapFrame. 88 stackMapFrameVisitor.visitFullFrame(clazz, method, codeAttribute, stackMapFrame.getOffsetDelta(), stackMapFrame); 89 } 90 } 91 } 92