<2023-11-06 Mon>
emacs
源码分析(三)
这次来分析TAG_PTR
宏定义(将指针变成Lisp_Object
),首先看LISP_INITIALLY
在gdb
中展开的样子:
(gdb) macro exp LISP_INITIALLY(w)
expands to: (w)
从上面输出可以看出LISP_INITIALLY
的相关定义走的是这个分支:
/* A Lisp_Object is a tagged pointer or integer. Ordinarily it is a
Lisp_Word. However, if CHECK_LISP_OBJECT_TYPE, it is a wrapper
around Lisp_Word, to help catch thinkos like 'Lisp_Object x = 0;'.
LISP_INITIALLY (W) initializes a Lisp object with a tagged value
that is a Lisp_Word W. It can be used in a static initializer. */
typedef Lisp_Word Lisp_Object;
# define LISP_INITIALLY(w) (w)
enum CHECK_LISP_OBJECT_TYPE {
CHECK_LISP_OBJECT_TYPE = false };
再看关于LISP_WORD_TAG(tag)
的gdb
相关输出:
(gdb) p pI
$23 = "l"
(gdb) p (int)EMACS_INT_WIDTH
$24 = 64
(gdb) p (int)VALBITS
$25 = 61
(gdb) p EMACS_INT_MAX
$26 = 9223372036854775807
(gdb) p VAL_MAX
$27 = 2305843009213693951
(gdb) macro exp LISP_WORD_TAG(tag)
expands to: ((Lisp_Word_tag) (tag) << (((0x7fffffffffffffffL >> (3 - 1)) / 2 < (0x7fffffffffffffffL)) ? 0 : VALBITS))
对应代码:
enum Lisp_Bits
{