| /* |
| * |
| * 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); |
| } |