Пример #1
0
        public string GetCurrentBackTrace()
        {
#if MRUBY
            System.Text.StringBuilder builder = new System.Text.StringBuilder();

            R_VAL backtrace = RubyDLL.r_get_backtrace(rb_state);

            builder.AppendLine("trace:");
            for (var i = 0; i < RubyDLL.r_funcall(rb_state, backtrace, "size", 0); ++i)
            {
                R_VAL v = RubyDLL.r_ary_ref(rb_state, backtrace, i);
                builder.AppendLine($"  [{i}] {v.ToString ( rb_state )}");
            }

            return(builder.ToString());
#else
            System.Text.StringBuilder builder = new System.Text.StringBuilder();

            R_VAL exc       = DoString("Exception.new('*interactive*')");
            R_VAL backtrace = RubyDLL.r_get_backtrace(exc);

            builder.AppendLine("trace:");
            for (var i = 0; i < RubyDLL.r_funcall(backtrace, R_VAL.Create("size"), 0); ++i)
            {
                R_VAL v = RubyDLL.r_ary_ref(backtrace, R_VAL.Create(i));
                builder.AppendLine($"  [{i}] {v.ToString ()}");
            }

            return(builder.ToString());
#endif
            // return RubyDLL.mrb_inspect ( mrb_state, RubyDLL.mrb_get_backtrace ( mrb_state ) ).ToString ( mrb_state );
            // return RubyDLL.mrb_funcall ( mrb_state, RubyDLL.mrb_exc_backtrace ( mrb_state, RubyDLL.mrb_get_exc_value ( mrb_state ) ), "to_s", 0 ).ToString ( mrb_state );
            // return RubyDLL.mrb_inspect ( mrb_state, RubyDLL.mrb_get_exc_value ( mrb_state ) ).ToString ( mrb_state );
            // return RubyDLL.mrb_inspect ( mrb_state, RubyDLL.mrb_exc_backtrace ( mrb_state, RubyDLL.mrb_get_exc_value ( mrb_state ) ) ).ToString ( mrb_state );
        }