I do not understand the following between erl_eterm and erl_interface.h
In erl_eterm the following are described as:
ETERM *ERL_PID_NODE(t)
ETERM *ERL_PID_NODE_UTF8(t)
ETERM *ERL_PORT_NODE(t)
ETERM *ERL_PORT_NODE_UTF8(t)
Where as in erl_interface.h they are defined as
#define ERL_PID_NODE(x) erl_atom_ptr_latin1((Erl_Atom_data*) &(x)->uval.pidval.node)
#define ERL_PID_NODE_UTF8(x) erl_atom_ptr_utf8((Erl_Atom_data*) &(x)->uval.pidval.node)
#define ERL_PORT_NODE(x) erl_atom_ptr_latin1((Erl_Atom_data*) &(x)->uval.portval.node)
#define ERL_PORT_NODE_UTF8(x) erl_atom_ptr_utf8((Erl_Atom_data*) &(x)->uval.portval.node)
#define ERL_REF_NODE(x) erl_atom_ptr_latin1((Erl_Atom_data*) &(x)->uval.refval.node)
If ERL_ATOM_PTR/ERL_ATOM_PTR_UTF8 needs to be used together with ERL_ATOM_SIZE/ERL_ATOM_SIZE_UTF8 to construct a NULL terminated c-string (char*), the same should be true for ERL_*_NODE* macros as they are all defined similarly. And none of them return ETERM* as defined in doc.
What am I missing here?