⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 erl_term.h

📁 OTP是开放电信平台的简称
💻 H
📖 第 1 页 / 共 3 页
字号:
/* 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 + -