blob: bb90bafe382c2509dea78e7efb19b5e06fcd67d6 [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.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());
}
}
}
}