[前][次][番号順一覧][スレッド一覧]

ruby-changes:53382

From: shyouhei <ko1@a...>
Date: Wed, 7 Nov 2018 17:04:37 +0900 (JST)
Subject: [ruby-changes:53382] shyouhei:r65598 (trunk): vm_backtrace.c: pos can be zero

shyouhei	2018-11-07 17:04:33 +0900 (Wed, 07 Nov 2018)

  New Revision: 65598

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=65598

  Log:
    vm_backtrace.c: pos can be zero
    
    (lldb) target create "./miniruby"
    Current executable set to './miniruby' (x86_64).
    (lldb) settings set -- target.run-args  "-e0"
    (lldb) run
    Process 97005 launched: './miniruby' (x86_64)
    ./miniruby(rb_print_backtrace+0x15) [0x10024f7d5] vm_dump.c:715
    ./miniruby(rb_vm_get_sourceline+0x85) [0x10024c4f5] vm_backtrace.c:43
    ./miniruby(rb_vm_make_binding+0x146) [0x100236976] vm.c:941
    ./miniruby(Init_VM+0x592) [0x100249f02] vm.c:3091
    ./miniruby(rb_call_inits+0xc2) [0x1000c5a72] inits.c:58
    ./miniruby(ruby_setup+0xcb) [0x100098c6b] eval.c:74
    ./miniruby(ruby_init+0x9) [0x100098c99] eval.c:91
    ./miniruby(main+0x4d) [0x10025ddbd] addr2line.c:246
    Process 97005 stopped
    * thread #1: tid = 0x639bb, 0x000000010024c4f5 miniruby`rb_vm_get_sourceline(cfp=<unavailable>) + 133 at vm_backtrace.c:44, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
        frame #0: 0x000000010024c4f5 miniruby`rb_vm_get_sourceline(cfp=<unavailable>) + 133 at vm_backtrace.c:44
       41       else {
       42           /* SDR() is not possible; that causes infinite loop. */
       43           rb_print_backtrace();
    -> 44           __builtin_trap();
       45       }
       46   #endif
       47       return rb_iseq_line_no(iseq, pos);
    (lldb)

  Modified files:
    trunk/configure.ac
    trunk/vm_backtrace.c
Index: vm_backtrace.c
===================================================================
--- vm_backtrace.c	(revision 65597)
+++ vm_backtrace.c	(revision 65598)
@@ -33,8 +33,18 @@ inline static int https://github.com/ruby/ruby/blob/trunk/vm_backtrace.c#L33
 calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
 {
     size_t pos = (size_t)(pc - iseq->body->iseq_encoded);
-    /* use pos-1 because PC points next instruction at the beginning of instruction */
-    return rb_iseq_line_no(iseq, pos - 1);
+    if (LIKELY(pos)) {
+        /* use pos-1 because PC points next instruction at the beginning of instruction */
+        pos--;
+    }
+#if VMDEBUG && defined(HAVE_BUILTIN___BUILTIN_TRAP)
+    else {
+        /* SDR() is not possible; that causes infinite loop. */
+        rb_print_backtrace();
+        __builtin_trap();
+    }
+#endif
+    return rb_iseq_line_no(iseq, pos);
 }
 
 int
Index: configure.ac
===================================================================
--- configure.ac	(revision 65597)
+++ configure.ac	(revision 65598)
@@ -1993,6 +1993,7 @@ AS_IF([test x$rb_cv_builtin___builtin_ch https://github.com/ruby/ruby/blob/trunk/configure.ac#L1993
     ])
 ])
 RUBY_CHECK_BUILTIN_FUNC(__builtin_types_compatible_p, [__builtin_types_compatible_p(int, int)])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_trap, [__builtin_trap()])
 
 AS_IF([test "$ac_cv_func_qsort_r" != no], [
   AC_CACHE_CHECK(whether qsort_r is GNU version, rb_cv_gnu_qsort_r,

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]