概要
CPythonでのスタック操作のマクロを確認しておく。
雰囲気を見ることが目的なので、デバッグ版ではないものに限定する。
内容
Python 3.x
スタック操作マクロ
Python/ceval.c
/* The stack can grow at most MAXINT deep, as co_nlocals and
co_stacksize are ints. */
# define STACK_LEVEL() ((int)(stack_pointer - f->f_valuestack))
# define EMPTY() (STACK_LEVEL() == 0)
# define TOP() (stack_pointer[-1])
# define SECOND() (stack_pointer[-2])
# define THIRD() (stack_pointer[-3])
# define FOURTH() (stack_pointer[-4])
# define PEEK(n) (stack_pointer[-(n)])
# define SET_TOP(v) (stack_pointer[-1] = (v))
# define SET_SECOND(v) (stack_pointer[-2] = (v))
# define SET_THIRD(v) (stack_pointer[-3] = (v))
# define SET_FOURTH(v) (stack_pointer[-4] = (v))
# define BASIC_STACKADJ(n) (stack_pointer += n)
# define BASIC_PUSH(v) (*stack_pointer++ = (v))
# define BASIC_POP() (*--stack_pointer)
...
# define PUSH(v) BASIC_PUSH(v)
# define POP() BASIC_POP()
# define STACK_GROW(n) BASIC_STACKADJ(n)
# define STACK_SHRINK(n) BASIC_STACKADJ(-n)
# define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
stack_pointer
が使われて実装されている。