📄 erl_term.h
字号:
/* flonum ("float") access methods */#ifdef ARCH_64#define HEADER_FLONUM _make_header(1,_TAG_HEADER_FLOAT)#else#define HEADER_FLONUM _make_header(2,_TAG_HEADER_FLOAT)#endif#define make_float(x) make_boxed((x))#define is_float(x) (is_boxed((x)) && *boxed_val((x)) == HEADER_FLONUM)#define is_not_float(x) (!is_float(x))#define _unchecked_float_val(x) _unchecked_boxed_val((x))_ET_DECLARE_CHECKED(Eterm*,float_val,Eterm);#define float_val(x) _ET_APPLY(float_val,(x))/* Float definition for byte and word access */typedef double ieee754_8;typedef union float_def{ ieee754_8 fd; byte fb[sizeof(ieee754_8)]; Uint16 fs[sizeof(ieee754_8) / sizeof(Uint16)]; Uint32 fw[sizeof(ieee754_8) / sizeof(Uint32)];#ifdef ARCH_64 Uint fdw;#endif} FloatDef;#ifdef ARCH_64#define GET_DOUBLE(x, f) (f).fdw = *(float_val(x)+1)#define PUT_DOUBLE(f, x) *(x) = HEADER_FLONUM, \ *((x)+1) = (f).fdw#define GET_DOUBLE_DATA(p, f) (f).fdw = *((Uint *) (p))#define PUT_DOUBLE_DATA(f,p) *((Uint *) (p)) = (f).fdw#else#define GET_DOUBLE(x, f) (f).fw[0] = *(float_val(x)+1), \ (f).fw[1] = *(float_val(x)+2)#define PUT_DOUBLE(f, x) *(x) = HEADER_FLONUM, \ *((x)+1) = (f).fw[0], \ *((x)+2) = (f).fw[1]#define GET_DOUBLE_DATA(p, f) (f).fw[0] = *((Uint *) (p)),\ (f).fw[1] = *(((Uint *) (p))+1)#define PUT_DOUBLE_DATA(f,p) *((Uint *) (p)) = (f).fw[0],\ *(((Uint *) (p))+1) = (f).fw[1]#endif#define DOUBLE_DATA_WORDS (sizeof(ieee754_8)/sizeof(Eterm))#define FLOAT_SIZE_OBJECT (DOUBLE_DATA_WORDS+1)/* tuple access methods */#define make_tuple(x) make_boxed((x))#define is_tuple(x) (is_boxed((x)) && is_arity_value(*boxed_val((x))))#define is_not_tuple(x) (!is_tuple((x)))#define _unchecked_tuple_val(x) _unchecked_boxed_val(x)_ET_DECLARE_CHECKED(Eterm*,tuple_val,Eterm);#define tuple_val(x) _ET_APPLY(tuple_val,(x))#define TUPLE0(t) \ ((t)[0] = make_arityval(0), \ make_tuple(t))#define TUPLE1(t,e1) \ ((t)[0] = make_arityval(1), \ (t)[1] = (e1), \ make_tuple(t))#define TUPLE2(t,e1,e2) \ ((t)[0] = make_arityval(2), \ (t)[1] = (e1), \ (t)[2] = (e2), \ make_tuple(t))#define TUPLE3(t,e1,e2,e3) \ ((t)[0] = make_arityval(3), \ (t)[1] = (e1), \ (t)[2] = (e2), \ (t)[3] = (e3), \ make_tuple(t))#define TUPLE4(t,e1,e2,e3,e4) \ ((t)[0] = make_arityval(4), \ (t)[1] = (e1), \ (t)[2] = (e2), \ (t)[3] = (e3), \ (t)[4] = (e4), \ make_tuple(t))#define TUPLE5(t,e1,e2,e3,e4,e5) \ ((t)[0] = make_arityval(5), \ (t)[1] = (e1), \ (t)[2] = (e2), \ (t)[3] = (e3), \ (t)[4] = (e4), \ (t)[5] = (e5), \ make_tuple(t))#define TUPLE6(t,e1,e2,e3,e4,e5,e6) \ ((t)[0] = make_arityval(6), \ (t)[1] = (e1), \ (t)[2] = (e2), \ (t)[3] = (e3), \ (t)[4] = (e4), \ (t)[5] = (e5), \ (t)[6] = (e6), \ make_tuple(t))#define TUPLE7(t,e1,e2,e3,e4,e5,e6,e7) \ ((t)[0] = make_arityval(7), \ (t)[1] = (e1), \ (t)[2] = (e2), \ (t)[3] = (e3), \ (t)[4] = (e4), \ (t)[5] = (e5), \ (t)[6] = (e6), \ (t)[7] = (e7), \ make_tuple(t))#define TUPLE8(t,e1,e2,e3,e4,e5,e6,e7,e8) \ ((t)[0] = make_arityval(8), \ (t)[1] = (e1), \ (t)[2] = (e2), \ (t)[3] = (e3), \ (t)[4] = (e4), \ (t)[5] = (e5), \ (t)[6] = (e6), \ (t)[7] = (e7), \ (t)[8] = (e8), \ make_tuple(t))/* This macro get Size bits starting at low order position Pos and adjusts the bits to the right bits are numbered from 0 - (sizeof(Uint)*8-1) */#define _GETBITS(X,Pos,Size) (((X) >> (Pos)) & ~(~((Uint) 0) << (Size)))/* * Observe! New layout for pids, ports and references in R9 (see also note * in erl_node_container_utils.h). *//* * Creation in node specific data (pids, ports, refs) */#define _CRE_SIZE 2/* MAX value for the creation field in pid, port and reference */#define MAX_CREATION (1 << _CRE_SIZE)/* * PID layout (internal pids): * * |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | | * |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0| * | | | | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |n n n n n n n n n n n n n n n n n n n n n n n n n n n n|0 0|1 1| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * n : number * * Old pid layout: * * |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | | * |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0| * | | | | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |s s s|n n n n n n n n n n n n n n n|N N N N N N N N|c c|0 0|1 1| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * s : serial * n : number * c : creation * N : node number * */#define _PID_R9_SER_SIZE 3#define _PID_SER_SIZE (_PID_DATA_SIZE - _PID_NUM_SIZE)#define _PID_NUM_SIZE 15#define _PID_DATA_SIZE 28#define _PID_DATA_SHIFT (_TAG_IMMED1_SIZE)#define _GET_PID_DATA(X) _GETBITS((X),_PID_DATA_SHIFT,_PID_DATA_SIZE)#define _GET_PID_NUM(X) _GETBITS((X),0,_PID_NUM_SIZE)#define _GET_PID_SER(X) _GETBITS((X),_PID_NUM_SIZE,_PID_SER_SIZE)#define make_pid_data(Ser, Num) \ ((Uint) ((Ser) << _PID_NUM_SIZE | (Num)))#define make_internal_pid(X) \ ((Eterm) (((X) << _PID_DATA_SHIFT) | _TAG_IMMED1_PID))#define is_internal_pid(x) (((x) & _TAG_IMMED1_MASK) == _TAG_IMMED1_PID)#define is_not_internal_pid(x) (!is_internal_pid((x)))#define _unchecked_internal_pid_data(x) _GET_PID_DATA((x))_ET_DECLARE_CHECKED(Uint,internal_pid_data,Eterm);#define internal_pid_data(x) _ET_APPLY(internal_pid_data,(x))#define _unchecked_internal_pid_node(x) erts_this_node_ET_DECLARE_CHECKED(struct erl_node_*,internal_pid_node,Eterm);#define internal_pid_node(x) _ET_APPLY(internal_pid_node,(x))#define internal_pid_number(x) _GET_PID_NUM(internal_pid_data((x)))#define internal_pid_serial(x) _GET_PID_SER(internal_pid_data((x)))#define internal_pid_data_words(x) (1)/* * PORT layout (internal ports): * * |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | | * |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0| * | | | | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |n n n n n n n n n n n n n n n n n n n n n n n n n n n n|0 1|1 1| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * n : number * * Old port layout: * * |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | | * |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0| * | | | | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |N N N N N N N N|n n n n n n n n n n n n n n n n n n|c c|0 1|1 1| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * s : serial * n : number * c : creation * N : node number * */#define _PORT_R9_NUM_SIZE 18#define _PORT_NUM_SIZE _PORT_DATA_SIZE#define _PORT_DATA_SIZE 28#define _PORT_DATA_SHIFT (_TAG_IMMED1_SIZE)#define _GET_PORT_DATA(X) _GETBITS((X),_PORT_DATA_SHIFT,_PORT_DATA_SIZE)#define _GET_PORT_NUM(X) _GETBITS((X), 0, _PORT_NUM_SIZE)#define make_internal_port(X) \ ((Eterm) (((X) << _PORT_DATA_SHIFT) | _TAG_IMMED1_PORT))#define is_internal_port(x) (((x) & _TAG_IMMED1_MASK) == _TAG_IMMED1_PORT)#define is_not_internal_port(x) (!is_internal_port(x))#define _unchecked_internal_port_data(x) _GET_PORT_DATA((x))_ET_DECLARE_CHECKED(Uint,internal_port_data,Eterm);#define internal_port_data(x) _ET_APPLY(internal_port_data,(x))#define internal_port_number(x) _GET_PORT_NUM(internal_port_data((x)))#define _unchecked_internal_port_node(x) erts_this_node_ET_DECLARE_CHECKED(struct erl_node_*,internal_port_node,Eterm);#define internal_port_node(x) _ET_APPLY(internal_port_node,(x))#define internal_port_data_words(x) (1)/* * Ref layout (internal references): * * |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | | * |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0| * | | | | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1|0 1 0 0|0 0| Thing * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |0 0 0 0 0 0 0 0 0 0 0 0 0 0|r r r r r r r r r r r r r r r r r r| Data 0 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r| Data 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r| Data 2 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * * r : reference number * c : creation * * * Old "heap ref" layout: * * * |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | | * |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0| * | | | | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1|0 1 0 0|0 0| Thing * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |N N N N N N N N|0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0|c c|0 1 1 1| Head * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |0 0 0 0 0 0 0 0 0 0 0 0 0 0|r r r r r r r r r r r r r r r r r r| Word 0 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r| Word 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r r| Word 2 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * r : reference number * c : creation * N : node index * * Old "one-word ref" layout: * * |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1 | | * |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0| * | | | | | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |N N N N N N N N|r r r r r r r r r r r r r r r r r r|c c|T T T T| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * * r : reference number * c : creation * N : node index * */#define _REF_NUM_SIZE 18/* Old maximum number of references in the system */#define MAX_REFERENCE (1 << _REF_NUM_SIZE)#define REF_MASK (~(~((Uint)0) << _REF_NUM_SIZE))#define ERTS_MAX_REF_NUMBERS 3#define ERTS_REF_NUMBERS ERTS_MAX_REF_NUMBERS#ifdef ARCH_64# define ERTS_REF_WORDS (ERTS_REF_NUMBERS/2 + 1)#else# define ERTS_REF_WORDS ERTS_REF_NUMBERS#endiftypedef struct { Eterm header; Uint data[ERTS_REF_WORDS];} RefThing;#define REF_THING_SIZE (sizeof(RefThing)/sizeof(Uint))#define REF_THING_HEAD_SIZE (sizeof(Eterm)/sizeof(Uint))#define make_ref_thing_header(DW) \ _make_header((DW)+REF_THING_HEAD_SIZE-1,_TAG_HEADER_REF)#ifdef ARCH_64/* * Ref layout on a 64-bit little endian machine: * * 63 31 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -