mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
error.h: use RBasic instead of RObject for generic objects
RObject is type for objects with instance variables. For generic objects, use RBasic.
This commit is contained in:
@@ -17,8 +17,8 @@ MRB_BEGIN_DECL
|
||||
struct RException {
|
||||
MRB_OBJECT_HEADER;
|
||||
struct iv_tbl *iv;
|
||||
struct RObject *mesg; // NULL or probably RString
|
||||
struct RObject *backtrace; // NULL, RArray or RData
|
||||
struct RBasic *mesg; // NULL or probably RString
|
||||
struct RBasic *backtrace; // NULL, RArray or RData
|
||||
};
|
||||
|
||||
/* error that should terminate execution */
|
||||
|
||||
+19
-19
@@ -92,7 +92,7 @@ pack_backtrace(mrb_state *mrb, ptrdiff_t ciidx, struct mrb_backtrace_location *p
|
||||
return n;
|
||||
}
|
||||
|
||||
static struct RObject*
|
||||
static struct RBasic*
|
||||
packed_backtrace(mrb_state *mrb)
|
||||
{
|
||||
struct RBacktrace *backtrace;
|
||||
@@ -109,15 +109,15 @@ packed_backtrace(mrb_state *mrb)
|
||||
backtrace->locations = (struct mrb_backtrace_location*)ptr;
|
||||
backtrace->len = pack_backtrace(mrb, ciidx, backtrace->locations);
|
||||
|
||||
return (struct RObject*)backtrace;
|
||||
return (struct RBasic*)backtrace;
|
||||
}
|
||||
|
||||
static void
|
||||
store_backtrace(mrb_state *mrb, mrb_value exc, struct RObject *backtrace)
|
||||
store_backtrace(mrb_state *mrb, mrb_value exc, struct RBasic *backtrace)
|
||||
{
|
||||
struct RException *e = mrb_exc_ptr(exc);
|
||||
e->backtrace = backtrace;
|
||||
mrb_field_write_barrier(mrb, (struct RBasic*)e, (struct RBasic*)backtrace);
|
||||
mrb_field_write_barrier(mrb, (struct RBasic*)e, backtrace);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -128,7 +128,7 @@ mrb_keep_backtrace(mrb_state *mrb, mrb_value exc)
|
||||
if (mrb->c->ci == NULL) return;
|
||||
if (mrb_exc_ptr(exc)->backtrace) return;
|
||||
ai = mrb_gc_arena_save(mrb);
|
||||
struct RObject *backtrace = packed_backtrace(mrb);
|
||||
struct RBasic *backtrace = packed_backtrace(mrb);
|
||||
store_backtrace(mrb, exc, backtrace);
|
||||
mrb_gc_arena_restore(mrb, ai);
|
||||
}
|
||||
@@ -156,11 +156,11 @@ decode_location(mrb_state *mrb, const struct mrb_backtrace_location *entry)
|
||||
return btline;
|
||||
}
|
||||
|
||||
static struct RObject*
|
||||
mrb_unpack_backtrace(mrb_state *mrb, struct RObject *backtrace)
|
||||
static struct RBasic*
|
||||
mrb_unpack_backtrace(mrb_state *mrb, struct RBasic *backtrace)
|
||||
{
|
||||
if (backtrace == NULL) {
|
||||
return mrb_obj_ptr(mrb_ary_new_capa(mrb, 0));
|
||||
return mrb_basic_ptr(mrb_ary_new_capa(mrb, 0));
|
||||
}
|
||||
if (backtrace->tt == MRB_TT_ARRAY) return backtrace;
|
||||
|
||||
@@ -170,7 +170,7 @@ mrb_unpack_backtrace(mrb_state *mrb, struct RObject *backtrace)
|
||||
mrb_int n = bt ? (mrb_int)bt->len : 0;
|
||||
const struct mrb_backtrace_location *loc = bt->locations;
|
||||
|
||||
backtrace = mrb_obj_ptr(mrb_ary_new_capa(mrb, n));
|
||||
backtrace = mrb_basic_ptr(mrb_ary_new_capa(mrb, n));
|
||||
int ai = mrb_gc_arena_save(mrb);
|
||||
for (mrb_int i = 0; i < n; i++) {
|
||||
mrb_value btline = decode_location(mrb, &loc[i]);
|
||||
@@ -184,7 +184,7 @@ mrb_unpack_backtrace(mrb_state *mrb, struct RObject *backtrace)
|
||||
mrb_value
|
||||
mrb_exc_backtrace(mrb_state *mrb, mrb_value exc)
|
||||
{
|
||||
struct RObject *backtrace = mrb_exc_ptr(exc)->backtrace;
|
||||
struct RBasic *backtrace = mrb_exc_ptr(exc)->backtrace;
|
||||
if (backtrace == NULL) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
@@ -206,16 +206,16 @@ mrb_get_backtrace(mrb_state *mrb)
|
||||
#ifndef MRB_NO_STDIO
|
||||
|
||||
static void
|
||||
print_backtrace(mrb_state *mrb, struct RObject *exc, struct RArray *backtrace)
|
||||
print_backtrace(mrb_state *mrb, struct RObject *exc, struct RBasic *bt)
|
||||
{
|
||||
mrb_int i;
|
||||
struct RArray *backtrace = (struct RArray*)bt;
|
||||
mrb_int n = (backtrace ? ARY_LEN(backtrace) : 0);
|
||||
mrb_value *loc, mesg;
|
||||
|
||||
if (n != 0) {
|
||||
if (n > 1) {
|
||||
fputs("trace (most recent call last):\n", stderr);
|
||||
}
|
||||
mrb_value *loc;
|
||||
mrb_int i;
|
||||
|
||||
fputs("trace (most recent call last):\n", stderr);
|
||||
for (i=n-1,loc=&ARY_PTR(backtrace)[i]; i>0; i--,loc--) {
|
||||
if (mrb_string_p(*loc)) {
|
||||
fprintf(stderr, "\t[%d] ", (int)i);
|
||||
@@ -237,7 +237,7 @@ print_backtrace(mrb_state *mrb, struct RObject *exc, struct RArray *backtrace)
|
||||
fwrite(nomem, sizeof(nomem)-1, 1, stderr);
|
||||
}
|
||||
else {
|
||||
mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc));
|
||||
mrb_value mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc));
|
||||
fwrite(RSTRING_PTR(mesg), RSTRING_LEN(mesg), 1, stderr);
|
||||
fputc('\n', stderr);
|
||||
}
|
||||
@@ -255,9 +255,9 @@ mrb_print_backtrace(mrb_state *mrb)
|
||||
return;
|
||||
}
|
||||
|
||||
struct RObject *backtrace = ((struct RException*)mrb->exc)->backtrace;
|
||||
struct RBasic *backtrace = ((struct RException*)mrb->exc)->backtrace;
|
||||
if (backtrace && backtrace->tt != MRB_TT_ARRAY) backtrace = mrb_unpack_backtrace(mrb, backtrace);
|
||||
print_backtrace(mrb, mrb->exc, (struct RArray*)backtrace);
|
||||
print_backtrace(mrb, mrb->exc, backtrace);
|
||||
}
|
||||
#else
|
||||
MRB_API void
|
||||
|
||||
+2
-2
@@ -24,7 +24,7 @@ mrb_exc_mesg_set(mrb_state *mrb, struct RException *exc, mrb_value mesg)
|
||||
if (!mrb_string_p(mesg)) {
|
||||
mesg = mrb_obj_as_string(mrb, mesg);
|
||||
}
|
||||
exc->mesg = mrb_obj_ptr(mesg);
|
||||
exc->mesg = mrb_basic_ptr(mesg);
|
||||
mrb_field_write_barrier_value(mrb, (struct RBasic*)exc, mesg);
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ set_backtrace(mrb_state *mrb, mrb_value exc, mrb_value backtrace)
|
||||
p++;
|
||||
}
|
||||
}
|
||||
mrb_exc_ptr(exc)->backtrace = mrb_obj_ptr(backtrace);
|
||||
mrb_exc_ptr(exc)->backtrace = mrb_basic_ptr(backtrace);
|
||||
mrb_field_write_barrier_value(mrb, mrb_basic_ptr(exc), backtrace);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user