Skip to content

Commit

Permalink
vm_core.h: extract VM_STACK_OVERFLOWED_P
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
nobu committed Nov 18, 2013
1 parent aa358ac commit 52e3546
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 14 deletions.
18 changes: 11 additions & 7 deletions vm_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

Expand Down
9 changes: 9 additions & 0 deletions vm_exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 2 additions & 7 deletions vm_exec.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

0 comments on commit 52e3546

Please sign in to comment.