mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
vm_core.h: extract VM_STACK_OVERFLOWED_P
* vm_core.h (VM_STACK_OVERFLOWED_P, WHEN_VM_STACK_OVERFLOWED): extract condition from CHECK_VM_STACK_OVERFLOW. * vm_exec.c (vm_stack_overflow_for_insn): move rb_bug call. * vm_exec.h (CHECK_VM_STACK_OVERFLOW_FOR_INSN): share the condition with CHECK_VM_STACK_OVERFLOW. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43702 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
aa358ac11c
commit
52e35469f0
3 changed files with 22 additions and 14 deletions
18
vm_core.h
18
vm_core.h
|
@ -889,13 +889,17 @@ int rb_autoloading_value(VALUE mod, ID id, VALUE* value);
|
|||
|
||||
#define sysstack_error GET_VM()->special_exceptions[ruby_error_sysstack]
|
||||
|
||||
#define CHECK_VM_STACK_OVERFLOW0(cfp, sp, margin) do { \
|
||||
if ((VALUE *)((char *)((VALUE *)(sp) + (margin)) + sizeof(rb_control_frame_t)) >= ((VALUE *)(cfp))) { \
|
||||
vm_stackoverflow(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define CHECK_VM_STACK_OVERFLOW(cfp, margin) CHECK_VM_STACK_OVERFLOW0((cfp), (cfp)->sp, margin)
|
||||
#define RUBY_CONST_ASSERT(expr) (1/!!(expr)) /* expr must be a compile-time constant */
|
||||
#define VM_STACK_OVERFLOWED_P(cfp, sp, margin) \
|
||||
(!RUBY_CONST_ASSERT(sizeof(*(sp)) == sizeof(VALUE)) || \
|
||||
!RUBY_CONST_ASSERT(sizeof(*(cfp)) == sizeof(rb_control_frame_t)) || \
|
||||
((rb_control_frame_t *)((sp) + (margin)) + 1) >= (cfp))
|
||||
#define WHEN_VM_STACK_OVERFLOWED(cfp, sp, margin) \
|
||||
if (LIKELY(!VM_STACK_OVERFLOWED_P(cfp, sp, margin))) {(void)0;} else /* overflowed */
|
||||
#define CHECK_VM_STACK_OVERFLOW0(cfp, sp, margin) \
|
||||
WHEN_VM_STACK_OVERFLOWED(cfp, sp, margin) vm_stackoverflow()
|
||||
#define CHECK_VM_STACK_OVERFLOW(cfp, margin) \
|
||||
WHEN_VM_STACK_OVERFLOWED(cfp, (cfp)->sp, margin) vm_stackoverflow()
|
||||
|
||||
/* for thread */
|
||||
|
||||
|
|
|
@ -29,6 +29,15 @@ static void vm_analysis_insn(int insn);
|
|||
#endif
|
||||
/* #define DECL_SC_REG(r, reg) VALUE reg_##r */
|
||||
|
||||
NORETURN(static void vm_stack_overflow_for_insn(void));
|
||||
static void
|
||||
vm_stack_overflow_for_insn(void)
|
||||
{
|
||||
rb_bug("CHECK_VM_STACK_OVERFLOW_FOR_INSN: should not overflow here. "
|
||||
"Please contact ruby-core/dev with your (a part of) script. "
|
||||
"This check will be removed soon.");
|
||||
}
|
||||
|
||||
#if !OPT_CALL_THREADED_CODE
|
||||
static VALUE
|
||||
vm_exec_core(rb_thread_t *th, VALUE initial)
|
||||
|
|
|
@ -169,12 +169,7 @@ default: \
|
|||
#endif
|
||||
|
||||
#define SCREG(r) (reg_##r)
|
||||
#define CHECK_VM_STACK_OVERFLOW_FOR_INSN(cfp, margin) do { \
|
||||
if (((rb_control_frame_t *)(((cfp)->sp) + (margin)) + 1) >= (cfp)) { \
|
||||
rb_bug("CHECK_VM_STACK_OVERFLOW_FOR_INSN: should not overflow here. " \
|
||||
"Please contact ruby-core/dev with your (a part of) script. " \
|
||||
"This check will be removed soon."); \
|
||||
} \
|
||||
} while (0)
|
||||
#define CHECK_VM_STACK_OVERFLOW_FOR_INSN(cfp, margin) \
|
||||
WHEN_VM_STACK_OVERFLOWED(cfp, (cfp)->sp, margin) vm_stack_overflow_for_insn()
|
||||
|
||||
#endif /* RUBY_VM_EXEC_H */
|
||||
|
|
Loading…
Reference in a new issue