aboutsummaryrefslogtreecommitdiffstats
path: root/cont.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-13 01:05:23 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-13 01:05:23 +0000
commit80d6d5d3568b9f393b3bb956dfc2bb0cc443310b (patch)
treed5debdf8289d1b0f4557cd6e3e0841cab83f949d /cont.c
parentf6627e2903c4b8875cd78a559690a4d9875df010 (diff)
downloadruby-80d6d5d3568b9f393b3bb956dfc2bb0cc443310b.tar.gz
cont.c: avoid needless branch for dmark callbacks
gc.c (gc_mark_children, case T_DATA) does not use the dmark function pointer if DATA_PTR is NULL * cont.c (cont_mark, fiber_mark): remove branch, ptr is never NULL git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57614 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c66
1 files changed, 32 insertions, 34 deletions
diff --git a/cont.c b/cont.c
index 6760cb3504..50fa45e96e 100644
--- a/cont.c
+++ b/cont.c
@@ -170,48 +170,48 @@ NOINLINE(static VALUE cont_capture(volatile int *volatile stat));
static void
cont_mark(void *ptr)
{
+ rb_context_t *cont = ptr;
+
RUBY_MARK_ENTER("cont");
- if (ptr) {
- rb_context_t *cont = ptr;
- rb_gc_mark(cont->value);
+ rb_gc_mark(cont->value);
- rb_thread_mark(&cont->saved_thread);
- rb_gc_mark(cont->saved_thread.self);
+ rb_thread_mark(&cont->saved_thread);
+ rb_gc_mark(cont->saved_thread.self);
- if (cont->vm_stack) {
+ if (cont->vm_stack) {
#ifdef CAPTURE_JUST_VALID_VM_STACK
- rb_gc_mark_locations(cont->vm_stack,
- cont->vm_stack + cont->vm_stack_slen + cont->vm_stack_clen);
+ rb_gc_mark_locations(cont->vm_stack,
+ cont->vm_stack + cont->vm_stack_slen + cont->vm_stack_clen);
#else
- rb_gc_mark_locations(cont->vm_stack,
- cont->vm_stack, cont->saved_thread.stack_size);
+ rb_gc_mark_locations(cont->vm_stack,
+ cont->vm_stack, cont->saved_thread.stack_size);
#endif
- }
+ }
- if (cont->machine.stack) {
- if (cont->type == CONTINUATION_CONTEXT) {
- /* cont */
+ if (cont->machine.stack) {
+ if (cont->type == CONTINUATION_CONTEXT) {
+ /* cont */
+ rb_gc_mark_locations(cont->machine.stack,
+ cont->machine.stack + cont->machine.stack_size);
+ }
+ else {
+ /* fiber */
+ rb_thread_t *th;
+ rb_fiber_t *fib = (rb_fiber_t*)cont;
+ GetThreadPtr(cont->saved_thread.self, th);
+ if ((th->fiber != fib) && fib->status == RUNNING) {
rb_gc_mark_locations(cont->machine.stack,
cont->machine.stack + cont->machine.stack_size);
- }
- else {
- /* fiber */
- rb_thread_t *th;
- rb_fiber_t *fib = (rb_fiber_t*)cont;
- GetThreadPtr(cont->saved_thread.self, th);
- if ((th->fiber != fib) && fib->status == RUNNING) {
- rb_gc_mark_locations(cont->machine.stack,
- cont->machine.stack + cont->machine.stack_size);
- }
}
}
+ }
#ifdef __ia64
- if (cont->machine.register_stack) {
- rb_gc_mark_locations(cont->machine.register_stack,
- cont->machine.register_stack + cont->machine.register_stack_size);
- }
-#endif
+ if (cont->machine.register_stack) {
+ rb_gc_mark_locations(cont->machine.register_stack,
+ cont->machine.register_stack + cont->machine.register_stack_size);
}
+#endif
+
RUBY_MARK_LEAVE("cont");
}
@@ -307,12 +307,10 @@ rb_fiber_mark_self(rb_fiber_t *fib)
static void
fiber_mark(void *ptr)
{
+ rb_fiber_t *fib = ptr;
RUBY_MARK_ENTER("cont");
- if (ptr) {
- rb_fiber_t *fib = ptr;
- rb_fiber_mark_self(fib->prev);
- cont_mark(&fib->cont);
- }
+ rb_fiber_mark_self(fib->prev);
+ cont_mark(&fib->cont);
RUBY_MARK_LEAVE("cont");
}