/* stack.h * tag: stack and stack access functions * * Copyright (C) 2003 Patrick Mauritz, Stefan Reinauer * * See the file "COPYING" for further information about * the copyright and warranty status of this work. */ #ifndef __STACK_H #define __STACK_H #define dstacksize 512 extern int dstackcnt; extern cell dstack[dstacksize]; #define rstacksize 512 extern int rstackcnt; extern cell rstack[rstacksize]; extern int dbgrstackcnt; //typedef struct opaque_xt *xt_t; //typedef struct opaque_ihandle *ihandle_t; //typedef struct opaque_phandle *phandle_t; typedef ucell xt_t; typedef ucell ihandle_t; typedef ucell phandle_t; #ifdef NATIVE_BITWIDTH_EQUALS_HOST_BITWIDTH static inline ucell pointer2cell(const void* x) { return (ucell)(uintptr_t)x; } static inline void* cell2pointer(ucell x) { return (void*)(uintptr_t)x; } #endif static inline void PUSH(ucell value) { dstack[++dstackcnt] = (value); } static inline void PUSH_xt( xt_t xt ) { PUSH( (ucell)xt ); } static inline void PUSH_ih( ihandle_t ih ) { PUSH( (ucell)ih ); } static inline void PUSH_ph( phandle_t ph ) { PUSH( (ucell)ph ); } static inline ucell POP(void) { return (ucell) dstack[dstackcnt--]; } static inline xt_t POP_xt( void ) { return (xt_t)POP(); } static inline ihandle_t POP_ih( void ) { return (ihandle_t)POP(); } static inline phandle_t POP_ph( void ) { return (phandle_t)POP(); } static inline void DROP(void) { dstackcnt--; } static inline void DDROP(void) { dstackcnt -= 2; } static inline void DPUSH(ducell value) { #ifdef NEED_FAKE_INT128_T dstack[++dstackcnt] = (cell) value.lo; dstack[++dstackcnt] = (cell) value.hi; #else dstack[++dstackcnt] = (cell) value; dstack[++dstackcnt] = (cell) (value >> bitspercell); #endif } static inline ducell DPOP(void) { #ifdef NEED_FAKE_INT128_T ducell du; du.hi = (ucell) dstack[dstackcnt--]; du.lo = (ucell) dstack[dstackcnt--]; return du; #else ducell du; du = ((ducell)(ucell) dstack[dstackcnt--]) << bitspercell; du |= (ucell) dstack[dstackcnt--]; return du; #endif } static inline ucell GETTOS(void) { return dstack[dstackcnt]; } #define GETITEM(number) (dstack[dstackcnt - number]) static inline void PUSHR(ucell value) { rstack[++rstackcnt] = (value); } static inline ucell POPR(void) { return (ucell) rstack[rstackcnt--]; } static inline ucell GETTORS(void) { return rstack[rstackcnt]; } #if defined(DEBUG_DSTACK) || defined(FCOMPILER) void printdstack(void); #endif #if defined(DEBUG_RSTACK) || defined(FCOMPILER) void printrstack(void); #endif #endif