package org.jerlang.stdlib.erl_internal; import org.jerlang.type.Atom; import org.jerlang.type.Boolean; import org.jerlang.type.Integer; import org.jerlang.type.List; import org.jerlang.type.Term; public class ErlInternalGuardBif { private ErlInternalGuardBif() { } public static Term dispatch(List params) { switch (params.length()) { case 2: Atom name = params.head().toAtom(); params = params.tail(); Integer arity = params.head().toInteger(); return guard_bif_2(name, arity); default: throw new org.jerlang.erts.erlang.Error("badarg"); } } /** * Returns `true` if `name/arity` is an Erlang BIF which is allowed in guards, * otherwise `false`. * * http://www.erlang.org/doc/man/erl_internal.html#guard_bif-2 */ public static Term guard_bif_2(Atom name, Integer arity) { switch (name.toString() + "/" + arity) { case "abs/1": case "float/1": case "trunc/1": case "round/1": case "length/1": case "hd/1": case "tl/1": case "size/1": case "bit_size/1": case "byte_size/1": case "element/2": case "self/0": case "map_size/1": case "node/0": case "node/1": case "tuple_size/1": case "is_atom/1": case "is_binary/1": case "is_bitstring/1": case "is_boolean/1": case "is_float/1": case "is_function/1": case "is_function/2": case "is_integer/1": case "is_list/1": case "is_map/1": case "is_number/1": case "is_pid/1": case "is_port/1": case "is_reference/1": case "is_tuple/1": case "is_record/2": case "is_record/3": case "binary_part/2": case "binary_part/3": return Boolean.am_true; default: return Boolean.am_false; } } }