diff options
Diffstat (limited to 'vm_insnhelper.h')
-rw-r--r-- | vm_insnhelper.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/vm_insnhelper.h b/vm_insnhelper.h index 71ca408bf2..0fc31d2cea 100644 --- a/vm_insnhelper.h +++ b/vm_insnhelper.h @@ -101,6 +101,22 @@ enum vm_regan_acttype { #define DEC_SP(x) (VM_REG_SP -= (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x)))) #define SET_SV(x) (*GET_SP() = (x)) /* set current stack value as x */ +#ifdef _MSC_VER +/* Workaround needed for adding negative number to a pointer */ +#define ADJ_SP(x) do { \ + rb_snum_t adj = (x); \ + if (adj >= 0) { \ + INC_SP(adj); \ + } \ + else { \ + SIGNED_VALUE dec = -1; \ + dec *= adj; \ + DEC_SP(dec); \ + } \ +} while (0) +#else +#define ADJ_SP(x) INC_SP(x) +#endif /* instruction sequence C struct */ #define GET_ISEQ() (GET_CFP()->iseq) |