1
0
Fork 0
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:
nobu 2013-11-18 02:29:58 +00:00
parent aa358ac11c
commit 52e35469f0
3 changed files with 22 additions and 14 deletions

View file

@ -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 */

View file

@ -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)

View file

@ -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 */