summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-04-03 01:06:56 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-04-03 01:16:57 +0900
commit2a4049b23c081eb5509490bac0414ac40e83c5c4 (patch)
tree48f2bfdd9590d8c6bb8611528dddc1b08ce7ac0e
parent2544bf9452b5208a450509aa219bc33aeffbd292 (diff)
Bail out before pushing unexpected object
-rw-r--r--gc.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index 1840edb024..5d2801ccca 100644
--- a/gc.c
+++ b/gc.c
@@ -4629,6 +4629,18 @@ free_stack_chunks(mark_stack_t *stack)
static void
push_mark_stack(mark_stack_t *stack, VALUE data)
{
+ VALUE obj = data;
+ switch (BUILTIN_TYPE(obj)) {
+ case T_NIL:
+ case T_FIXNUM:
+ rb_bug("push_mark_stack() called for broken object");
+ break;
+
+ case T_NODE:
+ UNEXPECTED_NODE(push_mark_stack);
+ break;
+ }
+
if (stack->index == stack->limit) {
push_mark_stack_chunk(stack);
}