📄 stack.h
字号:
#include "configure.h"#include "threads.h"#include "interpreter.h"#include "memory.h"#include "language.h"#ifndef _STACK_H#define _STACK_H#define get_local_word(IDX_) (localsBase[(IDX_)])#define get_local_ref(IDX_) (localsBase[(IDX_)])#define inc_local_word(IDX_,NUM_) (localsBase[(IDX_)] += (NUM_))#define just_set_top_word(WRD_) (stackTop[0] = (WRD_))#define get_top_word() (stackTop[0])#define get_top_ref() (stackTop[0])#define get_word_at(DOWN_) (*(stackTop-(DOWN_)))#define get_ref_at(DOWN_) *(stackTop-(DOWN_))#define get_stack_ptr() (stackTop)#define get_stack_ptr_at(DOWN_) (stackTop-(DOWN_))// Note: The following locals should only be accessed// in this header file.extern STACKWORD *localsBase;extern STACKWORD *stackTop;/** * Clears the operand stack for the given stack frame. */static inline void init_sp (StackFrame *stackFrame, MethodRecord *methodRecord){ stackTop = stackFrame->localsBase + methodRecord->numLocals - 1;}/** * Clears/initializes the operand stack at the bottom-most stack frame, * and pushes a void (unitialized) element, which should be overriden * immediately with set_top_word or set_top_ref. */static inline void init_sp_pv (void){ stackTop = stack_array();}/** * With stack cleared, checks for stack overflow in given method. */static inline boolean is_stack_overflow (MethodRecord *methodRecord){ return (stackTop + methodRecord->maxOperands) >= (stack_array() + get_array_length((Object *) word2ptr (currentThread->stackArray)));}extern void update_stack_frame (StackFrame *stackFrame);extern void update_registers (StackFrame *stackFrame);/**--**/static inline void update_constant_registers (StackFrame *stackFrame){ localsBase = stackFrame->localsBase;}static inline void push_word (const STACKWORD word){ *(++stackTop) = word;}static inline void push_ref (const REFERENCE word){ *(++stackTop) = word;}static inline STACKWORD pop_word (void){ return *stackTop--;}static inline REFERENCE pop_ref (void){ return *stackTop--;}static inline JINT pop_jint (void){ return word2jint(*stackTop--);}static inline STACKWORD pop_word_or_ref(){ return *stackTop--;}static inline void pop_jlong (JLONG *lword){ lword->lo = *stackTop--; lword->hi = *stackTop--;}static inline void pop_words (byte aNum){ stackTop -= aNum;}static inline void just_pop_word (void){ --stackTop;}static inline void just_pop_ref (void){ --stackTop;}static inline void push_void (void){ ++stackTop;}static inline void set_top_ref (REFERENCE aRef){ *stackTop = aRef;}static inline void set_top_word (STACKWORD aWord){ *stackTop = aWord;}static inline void dup (void){ stackTop++; *stackTop = *(stackTop-1);}static inline void dup2 (void){ *(stackTop+1) = *(stackTop-1); *(stackTop+2) = *stackTop; stackTop += 2;}static inline void dup_x1 (void){ stackTop++; *stackTop = *(stackTop-1); *(stackTop-1) = *(stackTop-2); *(stackTop-2) = *stackTop;}static inline void dup2_x1 (void){ stackTop += 2; *stackTop = *(stackTop-2); *(stackTop-1) = *(stackTop-3); *(stackTop-2) = *(stackTop-4); *(stackTop-3) = *stackTop; *(stackTop-4) = *(stackTop-1);}static inline void dup_x2 (void){ stackTop++; *stackTop = *(stackTop-1); *(stackTop-1) = *(stackTop-2); *(stackTop-2) = *(stackTop-3); *(stackTop-3) = *stackTop;}static inline void dup2_x2 (void){ stackTop += 2; *stackTop = *(stackTop-2); *(stackTop-1) = *(stackTop-3); *(stackTop-2) = *(stackTop-4); *(stackTop-3) = *(stackTop-5); *(stackTop-4) = *stackTop; *(stackTop-5) = *(stackTop-1);}static inline void swap (void){ tempStackWord = *stackTop; *stackTop = *(stackTop-1); *(stackTop-1) = tempStackWord;}static inline void set_local_word (byte aIndex, STACKWORD aWord){ localsBase[aIndex] = aWord;}static inline void set_local_ref (byte aIndex, REFERENCE aWord){ localsBase[aIndex] = aWord;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -