/* * * 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.semantics; import org.apache.flex.abc.ABCConstants; /** * An Instruction implementation with one immediate operand. */ public class ImmediateOperandInstruction extends Instruction { /** * Set this to allow any immediate instruction to set its immediate field * after construction. */ public static final boolean allowAnyDeferredIntermediate = false; public ImmediateOperandInstruction(int opcode, int immediate) { super(opcode); this.immediate = immediate; } public ImmediateOperandInstruction(int opcode) { super(opcode); verifyDeferredImmediate("%s requires an immediate operand."); } /** * The instruction's immediate operand. */ private int immediate; @Override public String toString() { return String.format("%s(%d)", super.toString(), this.immediate); } /** * @return this Instruction's immediate operand. */ @Override public int getImmediate() { return this.immediate; } /** * determine if instruction has immediate operands. * * @return true, this type of Instruction has an immediate operand. */ @Override public boolean isImmediate() { return true; } /** * Set the immediate field of a local register access instruction. * * @pre only valid for get/set/inc/declocal, hasnext, and kill. */ @Override public void setImmediate(final int immediate) { verifyDeferredImmediate("Cannot set immediate field on %s"); this.immediate = immediate; } private void verifyDeferredImmediate(String diagnostic) { switch (opcode) { case ABCConstants.OP_getlocal: case ABCConstants.OP_setlocal: case ABCConstants.OP_inclocal: case ABCConstants.OP_inclocal_i: case ABCConstants.OP_declocal: case ABCConstants.OP_declocal_i: case ABCConstants.OP_hasnext: case ABCConstants.OP_kill: { // Allow these. break; } default: { assert allowAnyDeferredIntermediate : String.format(diagnostic, toString()); } } } }