package org.jerlang.stdlib.beam_lib;
import org.jerlang.FunctionSignature;
import org.jerlang.type.Atom;
import org.jerlang.type.Integer;
import org.jerlang.type.Tuple;
/**
* Java representation of type `l_info` defined in
* https://github.com/erlang/otp/blob/master/lib/compiler/src/beam_disasm.erl
* as
* `{non_neg_integer(), {_,_,_,_,_,_}}`
*/
public class LambdaInfo extends Tuple {
public LambdaInfo(
int functionId,
int arity,
int label,
int index,
int numFree,
int oldUnique,
int oldIndex,
AtomChunk atomChunk) {
super(2);
set(1, Integer.of(oldIndex));
set(2, Tuple.of(
atomChunk.atoms()[functionId - 1],
Integer.of(arity),
Integer.of(label),
Integer.of(index),
Integer.of(numFree),
Integer.of(oldUnique)));
}
public FunctionSignature toFunctionSignature(Atom module) {
Tuple tuple = element(2).toTuple();
Atom function = tuple.element(1).toAtom();
Integer arity = tuple.element(2).toInteger();
return new FunctionSignature(module, function, arity);
}
public Integer label() {
Tuple tuple = element(2).toTuple();
return tuple.element(3).toInteger();
}
public int numFree() {
Tuple tuple = element(2).toTuple();
return tuple.element(5).toInteger().toInt();
}
}