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.code;
 
Represents a stack frame in the virtual machine. Holds the state of the local variable array and the stack

Author(s):
Stuart Douglas
 
 public class StackFrame {

    
The current state of the stack
 
     private final StackState stackState;

    
The local variable state
 
     private final LocalVariableState localVariableState;
 
     private final StackFrameType type;

    
Creates the initial stack frame
 
     public StackFrame(ClassMethod method) {
         this. = new StackState(method.getClassFile().getConstPool());
         this. = new LocalVariableState(method);
         this. = .;
     }
 
     public StackFrame(StackState stackStateLocalVariableState localVariableStateStackFrameType type) {
         this. = stackState;
         this. = localVariableState;
         this. = type;
     }
 
     public StackState getStackState() {
         return ;
     }
 
         return ;
     }

    
push an operand of the given type onto the stack

If the entry is wide then a corresponding TOP type will be created

 
     public StackFrame push(String type) {
         StackState ns = .push(type);
         return new StackFrame(nstypeNoLocalChange(ns));
     }

    
push an operand of the given type onto the stack.

If the entry is wide then a corresponding TOP type will be created

 
     public StackFrame push(StackEntry entry) {
         StackState ns = .push(entry);
         return new StackFrame(nstypeNoLocalChange(ns));
     }

    
pushes a null type onto the stack

Returns:
 
     public StackFrame aconstNull() {
         StackState ns = .aconstNull();
         return new StackFrame(nstypeNoLocalChange(ns));
 
     }
 
     public StackFrame pop(int no) {
         StackState ns = .pop(no);
         return new StackFrame(nstypeNoLocalChange(ns));
     }

    
pops an operand from the stack
    public StackFrame pop() {
        StackState ns = .pop(1);
        return new StackFrame(nstypeNoLocalChange(ns));
    }

    
pops 2 operands from the stack
    public StackFrame pop2() {
        StackState ns = .pop(2);
        return new StackFrame(nstypeNoLocalChange(ns));
    }

    
pops 3 operands from the stack
    public StackFrame pop3() {
        StackState ns = .pop(3);
        return new StackFrame(nstypeNoLocalChange(ns));
    }

    
pops 4 operands from the stack
    public StackFrame pop4() {
        StackState ns = .pop(4);
        return new StackFrame(nstypeNoLocalChange(ns));
    }

    
replace the operand at the top of the stack with the given operand
    public StackFrame replace(String type) {
        // TODO: inefficinet
        StackState ns = .pop(1).push(type);
        return new StackFrame(nstypeNoLocalChange(ns));
    }
    public StackFrame dup() {
        StackState ns = .dup();
        return new StackFrame(ns.);
    }
    public StackFrame dupX1() {
        StackState ns = .dupX1();
        return new StackFrame(ns.);
    }
    public StackFrame dupX2() {
        StackState ns = .dupX2();
        return new StackFrame(ns.);
    }
    public StackFrame dup2() {
        StackState ns = .dup2();
        return new StackFrame(ns.);
    }
    public StackFrame dup2X1() {
        StackState ns = .dup2X1();
        return new StackFrame(ns.);
    }
    public StackFrame dup2X2() {
        StackState ns = .dup2X2();
        return new StackFrame(ns.);
    }

    
Store the variable on top of the stack into a local variable, poping the variable from the stack. Wide types are handled automatically
    public StackFrame store(int no) {
        StackEntry top = .top();
        StackState ns;
        LocalVariableState ls;
        if(top.getType() == .) { //wide type
            StackEntry type = .top_1();
            ns = .pop(2);
            ls = .storeWide(notype);
        } else {
            StackEntry type = .top();
            ns = .pop(1);
            ls = .store(notype);
        }
        return new StackFrame(nsls.);
    }

    
remote the top two operands and replace them with an different operand
    public StackFrame pop2push1(String type) {
        StackState ns = .pop(2).push(type);
        return new StackFrame(nstypeNoLocalChange(ns));
    }

    
remote the top two operands and replace them with an different operand
    public StackFrame pop4push1(String type) {
        StackState ns = .pop(4).push(type);
        return new StackFrame(nstypeNoLocalChange(ns));
    }
    @Override
    public String toString() {
        return "StackFrame [localVariableState=" +  + ", stackState=" +  + "]";
    }

    
marks the value in potition initializedValueStackPosition as initialized. This also pops this value and everything above it
    public StackFrame constructorCall(int initializedValueStackPosition) {
        StackEntry entry = .getContents().get(.getContents().size() - 1 - initializedValueStackPosition);
        StackState ns = .constructorCall(initializedValueStackPositionentry);
        LocalVariableState locals = .constructorCall(entry);
        return new StackFrame(nslocals.);
    }
    public StackFrame swap() {
        StackState ns = .swap();
        return new StackFrame(ns.);
    }

    
determins the type of stack frame this is when no local variables have changed
        int size = ns.getContents().size();
        if (size == 0) {
            return .;
        } else if (size == 1) {
            return .;
        }
        return .;
    }
    public StackFrameType getType() {
        return ;
    }
New to GrepCode? Check out our FAQ X