mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge branch 'pr-add-mrb_ptr_as_string' of https://github.com/monaka/mruby into monaka-pr-add-mrb_ptr_as_string
This commit is contained in:
+22
-20
@@ -1228,10 +1228,9 @@ mrb_class_name(mrb_state *mrb, struct RClass* c)
|
||||
{
|
||||
mrb_value path = mrb_class_path(mrb, c);
|
||||
if (mrb_nil_p(path)) {
|
||||
char buf[32];
|
||||
|
||||
snprintf(buf, 32, "#<Class:%p>", c);
|
||||
path = mrb_str_new_cstr(mrb, buf);
|
||||
path = mrb_str_new(mrb, "#<Class:", 8);
|
||||
mrb_str_concat(mrb, path, mrb_ptr_as_string(mrb, c));
|
||||
mrb_str_cat(mrb, path, ">", 1);
|
||||
}
|
||||
return mrb_str_ptr(path)->ptr;
|
||||
}
|
||||
@@ -1350,51 +1349,54 @@ mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const
|
||||
static mrb_value
|
||||
mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
|
||||
{
|
||||
mrb_value str;
|
||||
|
||||
if (mrb_type(klass) == MRB_TT_SCLASS) {
|
||||
mrb_value s = mrb_str_new(mrb, "#<", 2);
|
||||
mrb_value v = mrb_iv_get(mrb, klass, mrb_intern2(mrb, "__attached__", 12));
|
||||
|
||||
mrb_str_cat(mrb, s, "Class:", 6);
|
||||
str = mrb_str_new(mrb, "#<Class:", 8);
|
||||
|
||||
switch (mrb_type(v)) {
|
||||
case MRB_TT_CLASS:
|
||||
case MRB_TT_MODULE:
|
||||
case MRB_TT_SCLASS:
|
||||
mrb_str_append(mrb, s, mrb_inspect(mrb, v));
|
||||
mrb_str_append(mrb, str, mrb_inspect(mrb, v));
|
||||
break;
|
||||
default:
|
||||
mrb_str_append(mrb, s, mrb_any_to_s(mrb, v));
|
||||
mrb_str_append(mrb, str, mrb_any_to_s(mrb, v));
|
||||
break;
|
||||
}
|
||||
mrb_str_cat(mrb, s, ">", 1);
|
||||
|
||||
return s;
|
||||
mrb_str_cat(mrb, str, ">", 1);
|
||||
}
|
||||
else {
|
||||
str = mrb_str_buf_new(mrb, 32);
|
||||
struct RClass *c = mrb_class_ptr(klass);
|
||||
const char *cn = mrb_class_name(mrb, c);
|
||||
|
||||
if (!cn) {
|
||||
char buf[256];
|
||||
int n = 0;
|
||||
mrb_value path = mrb_class_path(mrb, c);
|
||||
|
||||
if (mrb_nil_p(path)) {
|
||||
switch (mrb_type(klass)) {
|
||||
case MRB_TT_CLASS:
|
||||
n = snprintf(buf, sizeof(buf), "#<Class:%p>", c);
|
||||
mrb_str_cat(mrb, str, "#<Class:", 8);
|
||||
break;
|
||||
|
||||
case MRB_TT_MODULE:
|
||||
n = snprintf(buf, sizeof(buf), "#<Module:%p>", c);
|
||||
mrb_str_cat(mrb, str, "#<Module:", 9);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Shouldn't be happened? */
|
||||
mrb_str_cat(mrb, str, "#<??????:", 9);
|
||||
break;
|
||||
}
|
||||
return mrb_str_dup(mrb, mrb_str_new(mrb, buf, n));
|
||||
mrb_str_concat(mrb, str, mrb_ptr_as_string(mrb, c));
|
||||
mrb_str_cat(mrb, str, ">", 1);
|
||||
}
|
||||
else {
|
||||
return mrb_str_dup(mrb, mrb_str_new_cstr(mrb, cn));
|
||||
str = path;
|
||||
}
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
mrb_value
|
||||
|
||||
+8
-1
@@ -439,8 +439,15 @@ mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t)
|
||||
mrb_value
|
||||
mrb_any_to_s(mrb_state *mrb, mrb_value obj)
|
||||
{
|
||||
mrb_value str = mrb_str_buf_new(mrb, 20);
|
||||
const char *cname = mrb_obj_classname(mrb, obj);
|
||||
return mrb_sprintf(mrb, "#<%s:%p>", cname, mrb_voidp(obj));
|
||||
|
||||
mrb_str_buf_cat(mrb, str, "#<", 2);
|
||||
mrb_str_cat2(mrb, str, cname);
|
||||
mrb_str_concat(mrb, str, mrb_ptr_as_string(mrb, mrb_voidp(obj)));
|
||||
mrb_str_buf_cat(mrb, str, ">", 1);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1528,6 +1528,36 @@ mrb_obj_as_string(mrb_state *mrb, mrb_value obj)
|
||||
return str;
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_ptr_as_string(mrb_state *mrb, void *p)
|
||||
{
|
||||
struct RString *p_str;
|
||||
char *p1;
|
||||
char *p2;
|
||||
intptr_t n = (intptr_t)p;
|
||||
|
||||
p_str = str_new(mrb, NULL, 2 + sizeof(uintptr_t) * CHAR_BIT / 4);
|
||||
p1 = p_str->ptr;
|
||||
*p1++ = '0';
|
||||
*p1++ = 'x';
|
||||
p2 = p1;
|
||||
|
||||
do {
|
||||
*p2++ = mrb_digitmap[n % 16];
|
||||
n /= 16;
|
||||
} while (n > 0);
|
||||
*p2 = '\0';
|
||||
p_str->len = (mrb_int)(p2 - p_str->ptr);
|
||||
|
||||
while (p1 < p2) {
|
||||
const char c = *p1;
|
||||
*p1++ = *--p2;
|
||||
*p2 = c;
|
||||
}
|
||||
|
||||
return mrb_obj_value(p_str);
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_check_string_type(mrb_state *mrb, mrb_value str)
|
||||
{
|
||||
|
||||
+6
-1
@@ -545,7 +545,12 @@ mrb_obj_iv_inspect(mrb_state *mrb, struct RObject *obj)
|
||||
|
||||
if (len > 0) {
|
||||
const char *cn = mrb_obj_classname(mrb, mrb_obj_value(obj));
|
||||
mrb_value str = mrb_sprintf(mrb, "-<%s:%p", cn, (void*)obj);
|
||||
mrb_value str = mrb_str_buf_new(mrb, 30);
|
||||
|
||||
mrb_str_buf_cat(mrb, str, "-<", 2);
|
||||
mrb_str_cat2(mrb, str, cn);
|
||||
mrb_str_cat(mrb, str, ":", 1);
|
||||
mrb_str_concat(mrb, str, mrb_ptr_as_string(mrb, obj));
|
||||
|
||||
iv_foreach(mrb, t, inspect_i, &str);
|
||||
mrb_str_cat(mrb, str, ">", 1);
|
||||
|
||||
Reference in New Issue
Block a user