Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   *
   * Copyright 2012 Red Hat, Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package org.jboss.classfilewriter.attributes;
 
 
 import java.util.List;
A JDK 6 StackMap sttribute. TODO: this will currently fall over if the code length, max locals or max stack is above 65535

Author(s):
Stuart Douglas
 
 public class StackMapTableAttribute extends Attribute {
 
     private static int FULL_FRAME = 255;
     private static int SAME_FRAME_EXTENDED = 251;
 
 
     public static final String NAME = "StackMapTable";
 
     private final ClassMethod method;
 
     public StackMapTableAttribute(ClassMethod classMethodConstPool constPool) {
         super(constPool);
          = classMethod;
     }
 
     @Override
     public void writeData(ByteArrayDataOutputStream streamthrows IOException {
         // as we don't know the size yet we write everything to a byte stream first
         // TODO: make this better
         final CodeAttribute ca = .getCodeAttribute();
         // now we need to write the stack frames.
         // for now we are going to write all frames as full frames
         // TODO: optimise the frame creation
 
         // write to dstream
         LazySize size = stream.writeSize();
         stream.writeShort(ca.getStackFrames().size());
         int lastPos = -1;
         for (Entry<IntegerStackFrameentry : .getCodeAttribute().getStackFrames().entrySet()) {
             int offset = entry.getKey() - lastPos - 1;
             lastPos = entry.getKey();
             StackFrame frame = entry.getValue();
             if (frame.getType() == . || frame.getType() == .) {
                 writeSameFrame(streamoffsetlastPosframe);
             } else if (frame.getType() == . && offset < (127 - 64)) {
                 writeSameLocals1Stack(streamoffsetlastPosframe);
             } else {
                 writeFullFrame(streamoffsetlastPosentry.getValue());
             }
         }
         size.markEnd();
     }
 
     private void writeSameLocals1Stack(DataOutputStream dstreamint offsetint lastPosStackFrame framethrows IOException {
         dstream.writeByte(offset + 64);
         frame.getStackState().getContents().get(0).write(dstream);
     }
 
     private void writeSameFrame(DataOutputStream dstreamint offsetint lastPosStackFrame framethrows IOException {
         if (offset > 63) {
             dstream.writeByte();
             dstream.writeShort(offset);
         } else {
             dstream.writeByte(offset);
         }
     }

    
writes a full_frame to the stack map table
    private void writeFullFrame(DataOutputStream dstreamint offsetint positionStackFrame valuethrows IOException {
        dstream.writeByte();
        dstream.writeShort(offset);
        List<StackEntryrealLocalVars = new ArrayList<StackEntry>(value.getLocalVariableState().getContents().size());
        for (StackEntry i : value.getLocalVariableState().getContents()) {
            if (i.getType() != .) {
                realLocalVars.add(i);
            }
        }
        dstream.writeShort(realLocalVars.size());
        for (StackEntry i : realLocalVars) {
            i.write(dstream);
        }
        // TODO: this is inefficient, the stack should store the number of TOP values in each frame
        List<StackEntryrealStack = new ArrayList<StackEntry>(value.getStackState().getContents().size());
        for (StackEntry i : value.getStackState().getContents()) {
            if (i.getType() != .) {
                realStack.add(i);
            }
        }
        dstream.writeShort(realStack.size());
        for (StackEntry i : realStack) {
            i.write(dstream);
        }
    }
New to GrepCode? Check out our FAQ X