From 1b4d0c76de494b8bdbcf83db6f0d0950d4ccc64a Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 21 May 2009 13:17:54 +0000 Subject: [PATCH] * template/id.h.tmpl, id.h (enum ruby_method_ids): added some IDs. * debug.c (dummy_gdb_enums): added enum ruby_method_ids. * .gdbinit (rp): improved output of Symbol. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23511 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- .gdbinit | 301 ++++++++++++++++++++++++++++----------------- ChangeLog | 8 ++ debug.c | 4 +- id.h | 7 ++ template/id.h.tmpl | 7 ++ 5 files changed, 210 insertions(+), 117 deletions(-) diff --git a/.gdbinit b/.gdbinit index dd716ed807..b65456312a 100644 --- a/.gdbinit +++ b/.gdbinit @@ -1,63 +1,132 @@ define rp - if (VALUE)$arg0 & RUBY_FIXNUM_FLAG - printf "FIXNUM: %ld\n", (long)$arg0 >> 1 + if (VALUE)($arg0) & RUBY_FIXNUM_FLAG + printf "FIXNUM: %ld\n", (long)($arg0) >> 1 else - if ((VALUE)$arg0 & ~(~(VALUE)0<> RUBY_SPECIAL_SHIFT + if ((VALUE)($arg0) & ~(~(VALUE)0<> RUBY_SPECIAL_SHIFT) + if $id == '!' || $id == '+' || $id == '-' || $id == '*' || $id == '/' || $id == '%' || $id == '<' || $id == '>' || $id == '`' + printf "SYMBOL(:%c)\n", $id + else + if $id == idDot2 + echo SYMBOL(:..)\n + else + if $id == idDot3 + echo SYMBOL(:...)\n + else + if $id == idUPlus + echo SYMBOL(:+@)\n + else + if $id == idUMinus + echo SYMBOL(:-@)\n + else + if $id == idPow + echo SYMBOL(:**)\n + else + if $id == idCmp + echo SYMBOL(:<=>)\n + else + if $id == idLTLT + echo SYMBOL(:<<)\n + else + if $id == idLE + echo SYMBOL(:<=)\n + else + if $id == idGE + echo SYMBOL(:>=)\n + else + if $id == idEq + echo SYMBOL(:==)\n + else + if $id == idEqq + echo SYMBOL(:===)\n + else + if $id == idNeq + echo SYMBOL(:!=)\n + else + if $id == idEqTilde + echo SYMBOL(:=~)\n + else + if $id == idNeqTilde + echo SYMBOL(:!~)\n + else + if $id == idAREF + echo SYMBOL(:[])\n + else + if $id == idASET + echo SYMBOL(:[]=)\n + else + printf "SYMBOL(%ld)\n", $id + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end else - if $arg0 == RUBY_Qfalse + if ($arg0) == RUBY_Qfalse echo false\n else - if $arg0 == RUBY_Qtrue + if ($arg0) == RUBY_Qtrue echo true\n else - if $arg0 == RUBY_Qnil + if ($arg0) == RUBY_Qnil echo nil\n else - if $arg0 == RUBY_Qundef + if ($arg0) == RUBY_Qundef echo undef\n else - if (VALUE)$arg0 & RUBY_IMMEDIATE_MASK + if (VALUE)($arg0) & RUBY_IMMEDIATE_MASK echo immediate\n else - set $flags = ((struct RBasic*)$arg0)->flags + set $flags = ((struct RBasic*)($arg0))->flags if ($flags & RUBY_T_MASK) == RUBY_T_NONE printf "T_NONE: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_NIL printf "T_NIL: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_OBJECT printf "T_OBJECT: " - print (struct RObject *)$arg0 + print (struct RObject *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_CLASS printf "T_CLASS: " - print (struct RClass *)$arg0 + print (struct RClass *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_ICLASS printf "T_ICLASS: " - print (struct RClass *)$arg0 + print (struct RClass *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_MODULE printf "T_MODULE: " - print (struct RClass *)$arg0 + print (struct RClass *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_FLOAT - printf "T_FLOAT: %.16g ", (((struct RFloat*)$arg0)->float_value) - print (struct RFloat *)$arg0 + printf "T_FLOAT: %.16g ", (((struct RFloat*)($arg0))->float_value) + print (struct RFloat *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_STRING printf "T_STRING: " set print address off output (char *)(($flags & RUBY_FL_USER1) ? \ - ((struct RString*)$arg0)->as.heap.ptr : \ - ((struct RString*)$arg0)->as.ary) + ((struct RString*)($arg0))->as.heap.ptr : \ + ((struct RString*)($arg0))->as.ary) set print address on printf " bytesize:%ld ", ($flags & RUBY_FL_USER1) ? \ - ((struct RString*)$arg0)->as.heap.len : \ + ((struct RString*)($arg0))->as.heap.len : \ (($flags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2) if !($flags & RUBY_FL_USER1) printf "(embed) " @@ -83,10 +152,10 @@ define rp end end end - print (struct RString *)$arg0 + print (struct RString *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_REGEXP - set $regsrc = ((struct RRegexp*)$arg0)->src + set $regsrc = ((struct RRegexp*)($arg0))->src set $rsflags = ((struct RBasic*)$regsrc)->flags printf "T_REGEXP: " set print address off @@ -107,7 +176,7 @@ define rp printf "(fixed) " end printf "encoding:%d ", ($flags & RUBY_ENCODING_MASK) >> RUBY_ENCODING_SHIFT - print (struct RRegexp *)$arg0 + print (struct RRegexp *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_ARRAY if ($flags & RUBY_FL_USER1) @@ -117,113 +186,113 @@ define rp if ($len == 0) printf "{(empty)} " else - output/x *((VALUE*)((struct RArray*)$arg0)->as.ary) @ $len + output/x *((VALUE*)((struct RArray*)($arg0))->as.ary) @ $len printf " " end else - set $len = ((struct RArray*)$arg0)->as.heap.len + set $len = ((struct RArray*)($arg0))->as.heap.len printf "T_ARRAY: len=%ld ", $len if ($flags & RUBY_FL_USER2) printf "(shared) shared=" - output/x ((struct RArray*)$arg0)->as.heap.aux.shared + output/x ((struct RArray*)($arg0))->as.heap.aux.shared printf " " else - printf "(ownership) capa=%ld ", ((struct RArray*)$arg0)->as.heap.aux.capa + printf "(ownership) capa=%ld ", ((struct RArray*)($arg0))->as.heap.aux.capa end if ($len == 0) printf "{(empty)} " else - output/x *((VALUE*)((struct RArray*)$arg0)->as.heap.ptr) @ $len + output/x *((VALUE*)((struct RArray*)($arg0))->as.heap.ptr) @ $len printf " " end end - print (struct RArray *)$arg0 + print (struct RArray *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_FIXNUM printf "T_FIXNUM: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_HASH printf "T_HASH: ", - if ((struct RHash *)$arg0)->ntbl - printf "len=%ld ", ((struct RHash *)$arg0)->ntbl->num_entries + if ((struct RHash *)($arg0))->ntbl + printf "len=%ld ", ((struct RHash *)($arg0))->ntbl->num_entries end - print (struct RHash *)$arg0 + print (struct RHash *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_STRUCT printf "T_STRUCT: len=%ld ", \ (($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \ ($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) >> (RUBY_FL_USHIFT+1) : \ - ((struct RStruct *)$arg0)->as.heap.len) - print (struct RStruct *)$arg0 + ((struct RStruct *)($arg0))->as.heap.len) + print (struct RStruct *)($arg0) x/xw (($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \ - ((struct RStruct *)$arg0)->as.ary : \ - ((struct RStruct *)$arg0)->as.heap.ptr) + ((struct RStruct *)($arg0))->as.ary : \ + ((struct RStruct *)($arg0))->as.heap.ptr) else if ($flags & RUBY_T_MASK) == RUBY_T_BIGNUM printf "T_BIGNUM: sign=%d len=%ld ", \ (($flags & RUBY_FL_USER1) != 0), \ (($flags & RUBY_FL_USER2) ? \ ($flags & (RUBY_FL_USER5|RUBY_FL_USER4|RUBY_FL_USER3)) >> (RUBY_FL_USHIFT+3) : \ - ((struct RBignum*)$arg0)->as.heap.len) + ((struct RBignum*)($arg0))->as.heap.len) if $flags & RUBY_FL_USER2 printf "(embed) " end - print (struct RBignum *)$arg0 + print (struct RBignum *)($arg0) x/xw (($flags & RUBY_FL_USER2) ? \ - ((struct RBignum*)$arg0)->as.ary : \ - ((struct RBignum*)$arg0)->as.heap.digits) + ((struct RBignum*)($arg0))->as.ary : \ + ((struct RBignum*)($arg0))->as.heap.digits) else if ($flags & RUBY_T_MASK) == RUBY_T_RATIONAL printf "T_RATIONAL: " - print (struct RRational *)$arg0 + print (struct RRational *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_COMPLEX printf "T_COMPLEX: " - print (struct RComplex *)$arg0 + print (struct RComplex *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_FILE printf "T_FILE: " - print (struct RFile *)$arg0 - output *((struct RFile *)$arg0)->fptr + print (struct RFile *)($arg0) + output *((struct RFile *)($arg0))->fptr printf "\n" else if ($flags & RUBY_T_MASK) == RUBY_T_TRUE printf "T_TRUE: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_FALSE printf "T_FALSE: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_DATA printf "T_DATA: " - print (struct RData *)$arg0 + print (struct RData *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_MATCH printf "T_MATCH: " - print (struct RMatch *)$arg0 + print (struct RMatch *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_SYMBOL printf "T_SYMBOL: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_UNDEF printf "T_UNDEF: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_NODE printf "T_NODE(" output (enum node_type)(($flags&RUBY_NODE_TYPEMASK)>>RUBY_NODE_TYPESHIFT) printf "): " - print *(NODE *)$arg0 + print *(NODE *)($arg0) else if ($flags & RUBY_T_MASK) == RUBY_T_ZOMBIE printf "T_ZOMBIE: " - print (struct RData *)$arg0 + print (struct RData *)($arg0) else printf "unknown: " - print (struct RBasic *)$arg0 + print (struct RBasic *)($arg0) end end end @@ -262,21 +331,21 @@ document rp end define nd_type - print (enum node_type)((((NODE*)$arg0)->flags&RUBY_NODE_TYPEMASK)>>RUBY_NODE_TYPESHIFT) + print (enum node_type)((((NODE*)($arg0))->flags&RUBY_NODE_TYPEMASK)>>RUBY_NODE_TYPESHIFT) end document nd_type Print a Ruby' node type. end define nd_file - print ((NODE*)$arg0)->nd_file + print ((NODE*)($arg0))->nd_file end document nd_file Print the source file name of a node. end define nd_line - print ((unsigned int)((((NODE*)$arg0)->flags>>RUBY_NODE_LSHIFT)&RUBY_NODE_LMASK)) + print ((unsigned int)((((NODE*)($arg0))->flags>>RUBY_NODE_LSHIFT)&RUBY_NODE_LMASK)) end document nd_line Print the source line number of a node. @@ -286,257 +355,257 @@ end define nd_head printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_alen printf "u2.argc: " - p $arg0.u2.argc + p ($arg0).u2.argc end define nd_next printf "u3.node: " - rp $arg0.u3.node + rp ($arg0).u3.node end define nd_cond printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_body printf "u2.node: " - rp $arg0.u2.node + rp ($arg0).u2.node end define nd_else printf "u3.node: " - rp $arg0.u3.node + rp ($arg0).u3.node end define nd_orig printf "u3.value: " - rp $arg0.u3.value + rp ($arg0).u3.value end define nd_resq printf "u2.node: " - rp $arg0.u2.node + rp ($arg0).u2.node end define nd_ensr printf "u3.node: " - rp $arg0.u3.node + rp ($arg0).u3.node end define nd_1st printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_2nd printf "u2.node: " - rp $arg0.u2.node + rp ($arg0).u2.node end define nd_stts printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_entry printf "u3.entry: " - p $arg0.u3.entry + p ($arg0).u3.entry end define nd_vid printf "u1.id: " - p $arg0.u1.id + p ($arg0).u1.id end define nd_cflag printf "u2.id: " - p $arg0.u2.id + p ($arg0).u2.id end define nd_cval printf "u3.value: " - rp $arg0.u3.value + rp ($arg0).u3.value end define nd_cnt printf "u3.cnt: " - p $arg0.u3.cnt + p ($arg0).u3.cnt end define nd_tbl printf "u1.tbl: " - p $arg0.u1.tbl + p ($arg0).u1.tbl end define nd_var printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_ibdy printf "u2.node: " - rp $arg0.u2.node + rp ($arg0).u2.node end define nd_iter printf "u3.node: " - rp $arg0.u3.node + rp ($arg0).u3.node end define nd_value printf "u2.node: " - rp $arg0.u2.node + rp ($arg0).u2.node end define nd_aid printf "u3.id: " - p $arg0.u3.id + p ($arg0).u3.id end define nd_lit printf "u1.value: " - rp $arg0.u1.value + rp ($arg0).u1.value end define nd_frml printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_rest printf "u2.argc: " - p $arg0.u2.argc + p ($arg0).u2.argc end define nd_opt printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_recv printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_mid printf "u2.id: " - p $arg0.u2.id + p ($arg0).u2.id end define nd_args printf "u3.node: " - rp $arg0.u3.node + rp ($arg0).u3.node end define nd_noex printf "u1.id: " - p $arg0.u1.id + p ($arg0).u1.id end define nd_defn printf "u3.node: " - rp $arg0.u3.node + rp ($arg0).u3.node end define nd_old printf "u1.id: " - p $arg0.u1.id + p ($arg0).u1.id end define nd_new printf "u2.id: " - p $arg0.u2.id + p ($arg0).u2.id end define nd_cfnc printf "u1.cfunc: " - p $arg0.u1.cfunc + p ($arg0).u1.cfunc end define nd_argc printf "u2.argc: " - p $arg0.u2.argc + p ($arg0).u2.argc end define nd_cname printf "u1.id: " - p $arg0.u1.id + p ($arg0).u1.id end define nd_super printf "u3.node: " - rp $arg0.u3.node + rp ($arg0).u3.node end define nd_modl printf "u1.id: " - p $arg0.u1.id + p ($arg0).u1.id end define nd_clss printf "u1.value: " - rp $arg0.u1.value + rp ($arg0).u1.value end define nd_beg printf "u1.node: " - rp $arg0.u1.node + rp ($arg0).u1.node end define nd_end printf "u2.node: " - rp $arg0.u2.node + rp ($arg0).u2.node end define nd_state printf "u3.state: " - p $arg0.u3.state + p ($arg0).u3.state end define nd_rval printf "u2.value: " - rp $arg0.u2.value + rp ($arg0).u2.value end define nd_nth printf "u2.argc: " - p $arg0.u2.argc + p ($arg0).u2.argc end define nd_tag printf "u1.id: " - p $arg0.u1.id + p ($arg0).u1.id end define nd_tval printf "u2.value: " - rp $arg0.u2.value + rp ($arg0).u2.value end define rb_p @@ -550,7 +619,7 @@ end define rb_classname call classname($arg0) rb_p $ - print *(struct RClass*)$arg0 + print *(struct RClass*)($arg0) end define rb_backtrace @@ -558,25 +627,25 @@ define rb_backtrace end define iseq - if $arg0->type == ISEQ_ELEMENT_NONE + if ($arg0)->type == ISEQ_ELEMENT_NONE echo [none]\n end - if $arg0->type == ISEQ_ELEMENT_LABEL - print *(LABEL*)$arg0 + if ($arg0)->type == ISEQ_ELEMENT_LABEL + print *(LABEL*)($arg0) end - if $arg0->type == ISEQ_ELEMENT_INSN - print *(INSN*)$arg0 - if ((INSN*)$arg0)->insn_id != YARVINSN_jump + if ($arg0)->type == ISEQ_ELEMENT_INSN + print *(INSN*)($arg0) + if ((INSN*)($arg0))->insn_id != YARVINSN_jump set $i = 0 - set $operand_size = ((INSN*)$arg0)->operand_size - set $operands = ((INSN*)$arg0)->operands + set $operand_size = ((INSN*)($arg0))->operand_size + set $operands = ((INSN*)($arg0))->operands while $i < $operand_size rp $operands[$i++] end end end - if $arg0->type == ISEQ_ELEMENT_ADJUST - print *(ADJUST*)$arg0 + if ($arg0)->type == ISEQ_ELEMENT_ADJUST + print *(ADJUST*)($arg0) end end diff --git a/ChangeLog b/ChangeLog index c63af76a3a..d063d0904a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu May 21 22:17:52 2009 Nobuyoshi Nakada + + * template/id.h.tmpl, id.h (enum ruby_method_ids): added some IDs. + + * debug.c (dummy_gdb_enums): added enum ruby_method_ids. + + * .gdbinit (rp): improved output of Symbol. + Thu May 21 21:07:22 2009 Nobuyoshi Nakada * missing/vsnprintf.c (BSD_vfprintf): support for 'z' modifier. diff --git a/debug.c b/debug.c index b5f280508e..874d1c84b7 100644 --- a/debug.c +++ b/debug.c @@ -15,6 +15,7 @@ #include "debug.h" #include "eval_intern.h" #include "vm_core.h" +#include "id.h" /* for gdb */ static const union { @@ -22,6 +23,7 @@ static const union { enum ruby_value_type value_type; enum ruby_tag_type tag_type; enum node_type node_type; + enum ruby_method_ids method_ids; enum { RUBY_ENCODING_INLINE_MAX = ENCODING_INLINE_MAX, RUBY_ENCODING_SHIFT = ENCODING_SHIFT, @@ -96,7 +98,7 @@ ruby_debug_print_value(int level, int debug_level, const char *header, VALUE obj VALUE str; str = rb_inspect(obj); fprintf(stderr, "DBG> %s: %s\n", header, - obj == -1 ? "" : StringValueCStr(str)); + obj == (VALUE)(SIGNED_VALUE)-1 ? "" : StringValueCStr(str)); fflush(stderr); } return obj; diff --git a/id.h b/id.h index 97faaf4f6f..cd45012268 100644 --- a/id.h +++ b/id.h @@ -70,6 +70,12 @@ enum ruby_method_ids { id_core_set_postexe = 375, tLAST_TOKEN = 376, #endif + idDot2 = tDOT2, + idDot3 = tDOT3, + idUPlus = tUPLUS, + idUMinus = tUMINUS, + idPow = tPOW, + idCmp = tCMP, idPLUS = '+', idMINUS = '-', idMULT = '*', @@ -86,6 +92,7 @@ enum ruby_method_ids { idNot = '!', idBackquote = '`', idEqTilde = tMATCH, + idNeqTilde = tNMATCH, idAREF = tAREF, idASET = tASET, idLAST_TOKEN = tLAST_TOKEN >> ID_SCOPE_SHIFT, diff --git a/template/id.h.tmpl b/template/id.h.tmpl index dd0afab27d..fccb5cf059 100644 --- a/template/id.h.tmpl +++ b/template/id.h.tmpl @@ -63,6 +63,12 @@ enum ruby_method_ids { <%=token%> = <%=value%>, % end #endif + idDot2 = tDOT2, + idDot3 = tDOT3, + idUPlus = tUPLUS, + idUMinus = tUMINUS, + idPow = tPOW, + idCmp = tCMP, idPLUS = '+', idMINUS = '-', idMULT = '*', @@ -79,6 +85,7 @@ enum ruby_method_ids { idNot = '!', idBackquote = '`', idEqTilde = tMATCH, + idNeqTilde = tNMATCH, idAREF = tAREF, idASET = tASET, idLAST_TOKEN = tLAST_TOKEN >> ID_SCOPE_SHIFT,