Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mruby
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
mruby
Commits
d12b6ab2
Commit
d12b6ab2
authored
Aug 26, 2013
by
take_cheeze
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add verbose_backtrace
parent
d19d9bb0
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
44 additions
and
8 deletions
+44
-8
include/mruby.h
include/mruby.h
+1
-0
src/backtrace.c
src/backtrace.c
+28
-6
src/class.c
src/class.c
+3
-2
src/error.c
src/error.c
+2
-0
test/t/exception.rb
test/t/exception.rb
+10
-0
No files found.
include/mruby.h
View file @
d12b6ab2
...
...
@@ -323,6 +323,7 @@ void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
void
mrb_warn
(
mrb_state
*
mrb
,
const
char
*
fmt
,
...);
void
mrb_bug
(
mrb_state
*
mrb
,
const
char
*
fmt
,
...);
void
mrb_print_backtrace
(
mrb_state
*
mrb
);
void
mrb_print_verbose_backtrace
(
mrb_state
*
mrb
);
void
mrb_print_error
(
mrb_state
*
mrb
);
/* macros to get typical exception objects
...
...
src/backtrace.c
View file @
d12b6ab2
...
...
@@ -55,7 +55,7 @@ get_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...
}
static
void
mrb_output_backtrace
(
mrb_state
*
mrb
,
struct
RObject
*
exc
,
output_stream_func
func
,
void
*
stream
)
mrb_output_backtrace
(
mrb_state
*
mrb
,
struct
RObject
*
exc
,
output_stream_func
func
,
void
*
stream
,
mrb_bool
verbose
)
{
mrb_callinfo
*
ci
;
mrb_int
ciidx
;
...
...
@@ -72,10 +72,10 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
filename
=
"(unknown)"
;
line
=
-
1
;
if
(
MRB_PROC_CFUNC_P
(
ci
->
proc
))
{
if
(
!
verbose
&&
MRB_PROC_CFUNC_P
(
ci
->
proc
))
{
continue
;
}
else
{
if
(
!
MRB_PROC_CFUNC_P
(
ci
->
proc
))
{
mrb_irep
*
irep
=
ci
->
proc
->
body
.
irep
;
if
(
irep
->
filename
!=
NULL
)
filename
=
irep
->
filename
;
...
...
@@ -93,13 +93,16 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
}
}
}
if
(
line
==
-
1
)
continue
;
if
(
!
verbose
&&
line
==
-
1
)
continue
;
if
(
ci
->
target_class
==
ci
->
proc
->
target_class
)
sep
=
"."
;
else
sep
=
"#"
;
method
=
mrb_sym2name
(
mrb
,
ci
->
mid
);
if
(
verbose
&&
!
method
&&
ci
->
proc
->
env
)
{
method
=
mrb_sym2name
(
mrb
,
ci
->
proc
->
env
->
mid
);
}
if
(
method
)
{
const
char
*
cn
=
mrb_class_name
(
mrb
,
ci
->
proc
->
target_class
);
...
...
@@ -126,7 +129,15 @@ void
mrb_print_backtrace
(
mrb_state
*
mrb
)
{
#ifdef ENABLE_STDIO
mrb_output_backtrace
(
mrb
,
mrb
->
exc
,
print_backtrace_i
,
(
void
*
)
stderr
);
mrb_output_backtrace
(
mrb
,
mrb
->
exc
,
print_backtrace_i
,
(
void
*
)
stderr
,
0
);
#endif
}
void
mrb_print_verbose_backtrace
(
mrb_state
*
mrb
)
{
#ifdef ENABLE_STDIO
mrb_output_backtrace
(
mrb
,
mrb
->
exc
,
print_backtrace_i
,
(
void
*
)
stderr
,
1
);
#endif
}
...
...
@@ -136,7 +147,18 @@ mrb_get_backtrace(mrb_state *mrb, mrb_value self)
mrb_value
ary
;
ary
=
mrb_ary_new
(
mrb
);
mrb_output_backtrace
(
mrb
,
mrb_obj_ptr
(
self
),
get_backtrace_i
,
(
void
*
)
mrb_ary_ptr
(
ary
));
mrb_output_backtrace
(
mrb
,
mrb_obj_ptr
(
self
),
get_backtrace_i
,
(
void
*
)
mrb_ary_ptr
(
ary
),
0
);
return
ary
;
}
mrb_value
mrb_get_verbose_backtrace
(
mrb_state
*
mrb
,
mrb_value
self
)
{
mrb_value
ary
;
ary
=
mrb_ary_new
(
mrb
);
mrb_output_backtrace
(
mrb
,
mrb_obj_ptr
(
self
),
get_backtrace_i
,
(
void
*
)
mrb_ary_ptr
(
ary
),
1
);
return
ary
;
}
src/class.c
View file @
d12b6ab2
...
...
@@ -55,7 +55,7 @@ mrb_name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
mrb_obj_iv_set
(
mrb
,
(
struct
RObject
*
)
c
,
mrb_intern2
(
mrb
,
"__classid__"
,
11
),
mrb_symbol_value
(
name
));
}
#define make_metaclass(mrb, c) prepare_singleton_class((mrb), (struct RBasic*)(c))
static
void
...
...
@@ -311,6 +311,7 @@ mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t f
int
ai
=
mrb_gc_arena_save
(
mrb
);
p
=
mrb_proc_new_cfunc
(
mrb
,
func
);
p
->
target_class
=
c
;
mrb_define_method_raw
(
mrb
,
c
,
mid
,
p
);
mrb_gc_arena_restore
(
mrb
,
ai
);
}
...
...
@@ -1065,7 +1066,7 @@ mrb_class_new_class(mrb_state *mrb, mrb_value cv)
{
mrb_value
super
;
struct
RClass
*
new_class
;
if
(
mrb_get_args
(
mrb
,
"|o"
,
&
super
)
==
0
)
{
super
=
mrb_obj_value
(
mrb
->
object_class
);
}
...
...
src/error.c
View file @
d12b6ab2
...
...
@@ -436,6 +436,7 @@ mrb_sys_fail(mrb_state *mrb, const char *mesg)
}
mrb_value
mrb_get_backtrace
(
mrb_state
*
,
mrb_value
);
mrb_value
mrb_get_verbose_backtrace
(
mrb_state
*
,
mrb_value
);
void
mrb_init_exception
(
mrb_state
*
mrb
)
...
...
@@ -451,6 +452,7 @@ mrb_init_exception(mrb_state *mrb)
mrb_define_method
(
mrb
,
e
,
"message"
,
exc_message
,
MRB_ARGS_NONE
());
mrb_define_method
(
mrb
,
e
,
"inspect"
,
exc_inspect
,
MRB_ARGS_NONE
());
mrb_define_method
(
mrb
,
e
,
"backtrace"
,
mrb_get_backtrace
,
MRB_ARGS_NONE
());
mrb_define_method
(
mrb
,
e
,
"verbose_backtrace"
,
mrb_get_verbose_backtrace
,
MRB_ARGS_NONE
());
mrb
->
eStandardError_class
=
mrb_define_class
(
mrb
,
"StandardError"
,
mrb
->
eException_class
);
/* 15.2.23 */
mrb_define_class
(
mrb
,
"RuntimeError"
,
mrb
->
eStandardError_class
);
/* 15.2.28 */
...
...
test/t/exception.rb
View file @
d12b6ab2
...
...
@@ -345,3 +345,13 @@ assert('Exception#backtrace') do
true
end
assert
(
'Exception#verbose_backtrace'
)
do
begin
raise
"get backtrace"
rescue
=>
e
e
.
verbose_backtrace
end
true
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment