blob: f7c2ca0b79cb042f6c18d02c2c6798c45faeeb5c [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.flex.abc.models;
import java.util.Collection;
import org.apache.flex.abc.graph.IBasicBlock;
import org.apache.flex.abc.semantics.Instruction;
/**
* The FrameModelVisitor interface presents an abstract view
* of ABC bytecode semantics, focused on maintenance of the
* AVM "frame" (the local variable slots, the scope stack,
* and the value stack).
*/
public interface FrameModelVisitor<T>
{
/**
* Begin a visit to a method body.
* @param encoder - the FrameModelEncoder driving the visit.
*/
public void visit(FrameModelEncoder encoder);
/**
* Finish visiting a method body.
*/
public void visitEnd();
/**
* Handle an instruction that does not affect the frame.
* @param i - the Instruction.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T noFrameEffect(Instruction i);
/**
* Handle an instruction that consumes value stack elements.
* @param i - the Instruction.
* @param count - the number of value stack elements consumed.
* @return a representation of the Instruction and its operands,
* which may be null if the visitor works by internal side effect.
*/
public T consumeValue(Instruction i, int count);
/**
* Handle an instruction that pushes a value onto the stack.
* @param i - the Instruction.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T produceValue(Instruction i);
/**
* Handle an instruction that consumes value stack elements,
* and then pushes a new value onto the stack.
* @param i - the Instruction.
* @param consumeCount - the number of value stack elements consumed.
* @return a representation of the Instruction and its operands,
* which may be null if the visitor works by internal side effect.
*/
public T consumeAndProduceValue(Instruction i, int consumeCount);
/**
* Handle a branch instruction.
* @param i - the Instruction.
* @param target - the Instruction's target. Instructions with
* fall-through semantics also implicitly target the next Block.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T branch(Instruction i, IBasicBlock target);
/**
* Handle a multibranch instruction.
* @param i - the Instruction.
* @param targets - the Instruction's targets.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T multiwayBranch(Instruction i, Collection<IBasicBlock> targets);
/**
* Get a local variable, leaving its value on the stack.
* @param i - the Instruction.
* @param idx - the variable's index.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T getlocal(Instruction i, int idx);
/**
* Set a local variable, comsuming a value from the stack.
* @param i - the Instruction.
* @param idx - the variable's index.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T setlocal(Instruction i, int idx);
/**
* Modify (i.e., increment, decrement, or kill)
* a local variable. Note that this does not
* yield an Instruction, it's a notification.
* @param i - the Instruction.
* @param idx - the variable's index.
*/
public void modifyLocal(Instruction i, int idx);
/**
* Move the top of the value stack to the top
* of the scope stack.
* @param i - the Instruction.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T moveValueToScopeStack(Instruction i);
/**
* Pop the top of the scope stack.
* @param i - the Instruction.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T popscope(Instruction i);
/**
* Get a value from the scope stack.
* @param i - the Instruction.
* @param idx - the index of the object in the scope stack.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T getScopeobject(Instruction i, int idx);
/**
* Special-case the hasnext2 instruction.
* @param i - the Instruction.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T hasnext2(Instruction i);
/**
* Duplicate the top of the stack.
* @param i - the Instruction.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T dup(Instruction i);
/**
* Swap the two top values on the stack.
* @param i - the Instruction.
* @return a representation of the Instruction, which may
* be null if the visitor works by internal side effect.
*/
public T swap(Instruction i);
/**
* Visit a new Block.
* @param b - the Block.
* @return true if the stack encoder should continue visiting the Block.
*/
public boolean visitBlock(IBasicBlock b);
/**
* End a visit to a block.
* @param b - the Block. Must be the block passed
* to the most recent visitBlock(b) call that returned true.
*/
public void visitEndBlock(IBasicBlock b);
/**
* Visit a control-flow edge from one Block to another.
*/
public void visitEdge(IBasicBlock from, IBasicBlock to);
}