package org.jerlang.erts.emulator;
import org.jerlang.Opcode;
import org.jerlang.type.Atom;
import org.jerlang.type.Term;
import org.jerlang.type.Tuple;
/**
* https://github.com/erlang/otp/blob/master/erts/emulator/beam/ops.tab
* https://github.com/erlang/otp/blob/master/erts/emulator/utils/beam_makeops
*/
public class Instruction extends Tuple {
private final Opcode opcode;
private final Term[] args;
private final int index;
public Instruction(int index, Opcode opcode, Term... args) {
super(args.length + 1);
this.index = index;
this.opcode = opcode;
this.args = args;
set(1, Atom.of(opcode.toString()));
for (int i = 0; i < args.length; i++) {
set(2 + i, args[i]);
}
}
public Term arg(int index) {
return args[index];
}
public int arity() {
return args.length;
}
public int index() {
return index;
}
public Opcode opcode() {
return opcode;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder("{");
stringBuilder.append(opcode);
stringBuilder.append(",");
for (Term arg : args) {
stringBuilder.append(arg).append(",");
}
stringBuilder.setLength(stringBuilder.length() - 1);
stringBuilder.append("}");
return stringBuilder.toString();
}
}