/**
* This file is part of Erjang - A JVM-based Erlang VM
*
* Copyright (c) 2009 by Trifork
*
* 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 erjang.beam;
import org.objectweb.asm.Type;
import erjang.EObject;
/**
*
*/
public class Arg {
public enum Kind {
X, Y, F, IMMEDIATE, EXT_FUNC;
public boolean isReg() {
return this == X || this == Y || this == F;
}
}
public static final Arg[] NO_ARGS = new Arg[0];
public final Kind kind;
int no;
public Type type;
EObject value;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return kind.name() + "{#" + no +", val="+String.valueOf(value)+", type="+String.valueOf(type)+"}";
}
public Arg(Kind kind, int reg) {
this(kind, reg, kind==Kind.F ? Type.DOUBLE_TYPE : null);
}
public Arg(Kind kind, int reg, Type type) {
if (kind == Kind.IMMEDIATE) { throw new IllegalArgumentException(); }
this.kind = kind;
this.no = reg;
this.type = type;
}
public Arg(EObject value) {
this.kind = Kind.IMMEDIATE;
this.value = value;
this.type = Type.getType(value.getClass());
}
public Arg(EObject value, Type type) {
this.kind = Kind.IMMEDIATE;
this.value = value;
this.type = type;
}
/**
* @param arg1
* @param out
*/
public Arg(Arg arg1, Type type) {
this.kind = arg1.kind;
this.no = arg1.no;
this.value = arg1.value;
this.type = type;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Arg) {
Arg arg = (Arg) obj;
return kind == arg.kind && no == arg.no && value == arg.value;
}
return false;
}
}