mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
objspace_dump.c: special const
* ext/objspace/objspace_dump.c: support special constant objects. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52191 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7594a99322
commit
c92322b537
2 changed files with 68 additions and 18 deletions
|
@ -51,8 +51,9 @@ dump_append(struct dump_config *dc, const char *format, ...)
|
|||
static void
|
||||
dump_append_string_value(struct dump_config *dc, VALUE obj)
|
||||
{
|
||||
int i;
|
||||
char c, *value;
|
||||
long i;
|
||||
char c;
|
||||
const char *value;
|
||||
|
||||
dump_append(dc, "\"");
|
||||
for (i = 0, value = RSTRING_PTR(obj); i < RSTRING_LEN(obj); i++) {
|
||||
|
@ -89,6 +90,14 @@ dump_append_string_value(struct dump_config *dc, VALUE obj)
|
|||
dump_append(dc, "\"");
|
||||
}
|
||||
|
||||
static void
|
||||
dump_append_symbol_value(struct dump_config *dc, VALUE obj)
|
||||
{
|
||||
dump_append(dc, "{\"type\":\"SYMBOL\", \"value\":");
|
||||
dump_append_string_value(dc, rb_sym2str(obj));
|
||||
dump_append(dc, "}");
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
obj_type(VALUE obj)
|
||||
{
|
||||
|
@ -125,6 +134,32 @@ obj_type(VALUE obj)
|
|||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
static void
|
||||
dump_append_special_const(struct dump_config *dc, VALUE value)
|
||||
{
|
||||
if (value == Qtrue) {
|
||||
dump_append(dc, "true");
|
||||
}
|
||||
else if (value == Qfalse) {
|
||||
dump_append(dc, "false");
|
||||
}
|
||||
else if (value == Qnil) {
|
||||
dump_append(dc, "null");
|
||||
}
|
||||
else if (FIXNUM_P(value)) {
|
||||
dump_append(dc, "%ld", FIX2LONG(value));
|
||||
}
|
||||
else if (FLONUM_P(value)) {
|
||||
dump_append(dc, "%#g", RFLOAT_VALUE(value));
|
||||
}
|
||||
else if (SYMBOL_P(value)) {
|
||||
dump_append_symbol_value(dc, value);
|
||||
}
|
||||
else {
|
||||
dump_append(dc, "{}");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
reachable_object_i(VALUE ref, void *data)
|
||||
{
|
||||
|
@ -141,6 +176,19 @@ reachable_object_i(VALUE ref, void *data)
|
|||
dc->cur_obj_references++;
|
||||
}
|
||||
|
||||
static void
|
||||
dump_append_string_content(struct dump_config *dc, VALUE obj)
|
||||
{
|
||||
dump_append(dc, ", \"bytesize\":%ld", RSTRING_LEN(obj));
|
||||
if (!STR_EMBED_P(obj) && !STR_SHARED_P(obj) && (long)rb_str_capacity(obj) != RSTRING_LEN(obj))
|
||||
dump_append(dc, ", \"capacity\":%ld", rb_str_capacity(obj));
|
||||
|
||||
if (is_ascii_string(obj)) {
|
||||
dump_append(dc, ", \"value\":");
|
||||
dump_append_string_value(dc, obj);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
dump_object(VALUE obj, struct dump_config *dc)
|
||||
{
|
||||
|
@ -151,7 +199,7 @@ dump_object(VALUE obj, struct dump_config *dc)
|
|||
size_t n, i;
|
||||
|
||||
if (SPECIAL_CONST_P(obj)) {
|
||||
dump_append(dc, "{}");
|
||||
dump_append_special_const(dc, obj);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -174,6 +222,10 @@ dump_object(VALUE obj, struct dump_config *dc)
|
|||
dump_append(dc, ", \"node_type\":\"%s\"", ruby_node_name(nd_type(obj)));
|
||||
break;
|
||||
|
||||
case T_SYMBOL:
|
||||
dump_append_string_content(dc, rb_sym2str(obj));
|
||||
break;
|
||||
|
||||
case T_STRING:
|
||||
if (STR_EMBED_P(obj))
|
||||
dump_append(dc, ", \"embedded\":true");
|
||||
|
@ -183,16 +235,8 @@ dump_object(VALUE obj, struct dump_config *dc)
|
|||
dump_append(dc, ", \"fstring\":true");
|
||||
if (STR_SHARED_P(obj))
|
||||
dump_append(dc, ", \"shared\":true");
|
||||
else {
|
||||
dump_append(dc, ", \"bytesize\":%ld", RSTRING_LEN(obj));
|
||||
if (!STR_EMBED_P(obj) && !STR_SHARED_P(obj) && (long)rb_str_capacity(obj) != RSTRING_LEN(obj))
|
||||
dump_append(dc, ", \"capacity\":%ld", rb_str_capacity(obj));
|
||||
|
||||
if (is_ascii_string(obj)) {
|
||||
dump_append(dc, ", \"value\":");
|
||||
dump_append_string_value(dc, obj);
|
||||
}
|
||||
}
|
||||
else
|
||||
dump_append_string_content(dc, obj);
|
||||
|
||||
if (!ENCODING_IS_ASCII8BIT(obj))
|
||||
dump_append(dc, ", \"encoding\":\"%s\"", rb_enc_name(rb_enc_from_index(ENCODING_GET(obj))));
|
||||
|
|
|
@ -255,11 +255,17 @@ class TestObjSpace < Test::Unit::TestCase
|
|||
|
||||
def test_dump_special_consts
|
||||
# [ruby-core:69692] [Bug #11291]
|
||||
assert_equal('{}', ObjectSpace.dump(nil))
|
||||
assert_equal('{}', ObjectSpace.dump(true))
|
||||
assert_equal('{}', ObjectSpace.dump(false))
|
||||
assert_equal('{}', ObjectSpace.dump(0))
|
||||
assert_equal('{}', ObjectSpace.dump(:foo))
|
||||
assert_equal('null', ObjectSpace.dump(nil))
|
||||
assert_equal('true', ObjectSpace.dump(true))
|
||||
assert_equal('false', ObjectSpace.dump(false))
|
||||
assert_equal('0', ObjectSpace.dump(0))
|
||||
assert_equal('{"type":"SYMBOL", "value":"foo"}', ObjectSpace.dump(:foo))
|
||||
end
|
||||
|
||||
def test_dump_dynamic_symbol
|
||||
dump = ObjectSpace.dump(("foobar%x" % rand(0x10000)).to_sym)
|
||||
assert_match /"type":"SYMBOL"/, dump
|
||||
assert_match /"value":"foobar\h+"/, dump
|
||||
end
|
||||
|
||||
def test_dump_all
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue