diff options
10644 files changed, 1815429 insertions, 405843 deletions
diff --git a/.cvsignore b/.cvsignore deleted file mode 100644 index a72211d03f..0000000000 --- a/.cvsignore +++ /dev/null @@ -1,48 +0,0 @@ -*.bak -*.orig -*.rej -*.sav -*~ -.*.list -.*.time -.ccmalloc -.ppack -.ext -.git -.svn -.pc -COPYING.LIB -ChangeLog.pre-alpha -ChangeLog.pre1_1 -Makefile -README.fat-patch -README.v6 -README.atheos -archive -autom4te*.cache -automake -beos -config.cache -config.h -config.h.in -config.log -config.status -configure -libruby.so.* -miniruby -newdate.rb -newver.rb -parse.c -patches -ppack -preview -rbconfig.rb -repack -riscos -rubicon -ruby -ruby-man.rd.gz -tmp -web -y.output -y.tab.c @@ -5,12 +5,32 @@ # Process all the C source files *.c +*.y -# the lib/ directory (which has its own .document file) +# prelude +prelude.rb -lib +rbconfig.rb +# the lib/ directory (which has its own .document file) +lib # and some of the ext/ directory (which has its own .document file) - ext + +# rdoc files +NEWS + +README.md +README.ja.md + +COPYING +COPYING.ja +CONTRIBUTING.md + +LEGAL + +# win32/README.win32 linked from README.md +win32 + +doc diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..cb2729fff9 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,27 @@ +root = true + +[*] +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +tab_width = 8 +trim_trailing_whitespace = true + +[*.bat] +end_of_line = crlf + +[*.gemspec] +indent_size = 2 + +[*.rb] +indent_size = 2 + +[*.yml] +indent_size = 2 + +[{*[Mm]akefile*,*.mak,*.mk,depend}] +indent_style = tab + +[reg*.[ch]] +indent_size = 2 diff --git a/.gdbinit b/.gdbinit new file mode 100644 index 0000000000..1806196a42 --- /dev/null +++ b/.gdbinit @@ -0,0 +1,1346 @@ +set startup-with-shell off + +define hook-run + set $color_type = 0 + set $color_highlite = 0 + set $color_end = 0 +end + +define ruby_gdb_init + if !$color_type + set $color_type = "\033[31m" + end + if !$color_highlite + set $color_highlite = "\033[36m" + end + if !$color_end + set $color_end = "\033[m" + end + if ruby_dummy_gdb_enums.special_consts + end +end + +# set prompt \033[36m(gdb)\033[m\040 + +define rp + ruby_gdb_init + if (VALUE)($arg0) & RUBY_FIXNUM_FLAG + printf "FIXNUM: %ld\n", (long)($arg0) >> 1 + else + if ((VALUE)($arg0) & ~(~(VALUE)0<<RUBY_SPECIAL_SHIFT)) == RUBY_SYMBOL_FLAG + set $id = (($arg0) >> RUBY_SPECIAL_SHIFT) + printf "%sSYMBOL%s: ", $color_type, $color_end + rp_id $id + else + if ($arg0) == RUBY_Qfalse + echo false\n + else + if ($arg0) == RUBY_Qtrue + echo true\n + else + if ($arg0) == RUBY_Qnil + echo nil\n + else + if ($arg0) == RUBY_Qundef + echo undef\n + else + if (VALUE)($arg0) & RUBY_IMMEDIATE_MASK + if ((VALUE)($arg0) & RUBY_FLONUM_MASK) == RUBY_FLONUM_FLAG + printf "%sFLONUM%s: %g\n", $color_type, $color_end, (double)rb_float_value($arg0) + else + echo immediate\n + end + else + set $flags = ((struct RBasic*)($arg0))->flags + if ($flags & RUBY_FL_PROMOTED) == RUBY_FL_PROMOTED + printf "[PROMOTED] " + end + if ($flags & RUBY_T_MASK) == RUBY_T_NONE + printf "%sT_NONE%s: ", $color_type, $color_end + print (struct RBasic *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_NIL + printf "%sT_NIL%s: ", $color_type, $color_end + print (struct RBasic *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_OBJECT + printf "%sT_OBJECT%s: ", $color_type, $color_end + print ((struct RObject *)($arg0))->basic + if ($flags & ROBJECT_EMBED) + print/x *((VALUE*)((struct RObject*)($arg0))->as.ary) @ (ROBJECT_EMBED_LEN_MAX+0) + else + print (((struct RObject *)($arg0))->as.heap) + if (((struct RObject*)($arg0))->as.heap.numiv) > 0 + print/x *(((struct RObject*)($arg0))->as.heap.ivptr) @ (((struct RObject*)($arg0))->as.heap.numiv) + end + end + else + if ($flags & RUBY_T_MASK) == RUBY_T_CLASS + printf "%sT_CLASS%s%s: ", $color_type, ($flags & RUBY_FL_SINGLETON) ? "*" : "", $color_end + rp_class $arg0 + else + if ($flags & RUBY_T_MASK) == RUBY_T_ICLASS + printf "%sT_ICLASS%s: ", $color_type, $color_end + rp_class $arg0 + else + if ($flags & RUBY_T_MASK) == RUBY_T_MODULE + printf "%sT_MODULE%s: ", $color_type, $color_end + rp_class $arg0 + else + if ($flags & RUBY_T_MASK) == RUBY_T_FLOAT + printf "%sT_FLOAT%s: %.16g ", $color_type, $color_end, (((struct RFloat*)($arg0))->float_value) + print (struct RFloat *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_STRING + printf "%sT_STRING%s: ", $color_type, $color_end + rp_string $arg0 $flags + else + if ($flags & RUBY_T_MASK) == RUBY_T_REGEXP + set $regsrc = ((struct RRegexp*)($arg0))->src + set $rsflags = ((struct RBasic*)$regsrc)->flags + printf "%sT_REGEXP%s: ", $color_type, $color_end + set $len = ($rsflags & RUBY_FL_USER1) ? \ + ((struct RString*)$regsrc)->as.heap.len : \ + (($rsflags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2) + set print address off + output *(char *)(($rsflags & RUBY_FL_USER1) ? \ + ((struct RString*)$regsrc)->as.heap.ptr : \ + ((struct RString*)$regsrc)->as.ary) @ $len + set print address on + printf " len:%ld ", $len + if $flags & RUBY_FL_USER6 + printf "(none) " + end + if $flags & RUBY_FL_USER5 + printf "(literal) " + end + if $flags & RUBY_FL_USER4 + printf "(fixed) " + end + printf "encoding:%d ", ($flags & RUBY_ENCODING_MASK) >> RUBY_ENCODING_SHIFT + print (struct RRegexp *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_ARRAY + if ($flags & RUBY_FL_USER1) + set $len = (($flags & (RUBY_FL_USER3|RUBY_FL_USER4)) >> (RUBY_FL_USHIFT+3)) + printf "%sT_ARRAY%s: len=%ld ", $color_type, $color_end, $len + printf "(embed) " + if ($len == 0) + printf "{(empty)} " + else + print/x *((VALUE*)((struct RArray*)($arg0))->as.ary) @ $len + printf " " + end + else + set $len = ((struct RArray*)($arg0))->as.heap.len + printf "%sT_ARRAY%s: len=%ld ", $color_type, $color_end, $len + if ($flags & RUBY_FL_USER2) + printf "(shared) shared=" + output/x ((struct RArray*)($arg0))->as.heap.aux.shared + printf " " + else + printf "(ownership) capa=%ld ", ((struct RArray*)($arg0))->as.heap.aux.capa + end + if ($len == 0) + printf "{(empty)} " + else + print/x *((VALUE*)((struct RArray*)($arg0))->as.heap.ptr) @ $len + printf " " + end + end + print (struct RArray *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_FIXNUM + printf "%sT_FIXNUM%s: ", $color_type, $color_end + print (struct RBasic *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_HASH + printf "%sT_HASH%s: ", $color_type, $color_end, + if (((struct RHash *)($arg0))->basic->flags & RHASH_ST_TABLE_FLAG) + printf "st len=%ld ", ((struct RHash *)($arg0))->as.st->num_entries + else + printf "li len=%ld bound=%ld ", \ + ((((struct RHash *)($arg0))->basic->flags & RHASH_ARRAY_LEN_MASK) >> RHASH_ARRAY_LEN_SHIFT), \ + ((((struct RHash *)($arg0))->basic->flags & RHASH_ARRAY_BOUND_MASK) >> RHASH_ARRAY_BOUND_SHIFT) + end + print (struct RHash *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_STRUCT + set $len = (($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \ + ($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) >> (RUBY_FL_USHIFT+1) : \ + ((struct RStruct *)($arg0))->as.heap.len) + printf "%sT_STRUCT%s: len=%ld ", $color_type, $color_end, $len + print (struct RStruct *)($arg0) + output/x *(($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \ + ((struct RStruct *)($arg0))->as.ary : \ + ((struct RStruct *)($arg0))->as.heap.ptr) @ $len + else + if ($flags & RUBY_T_MASK) == RUBY_T_BIGNUM + rp_bignum $arg0 + else + if ($flags & RUBY_T_MASK) == RUBY_T_RATIONAL + printf "%sT_RATIONAL%s: ", $color_type, $color_end + print (struct RRational *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_COMPLEX + printf "%sT_COMPLEX%s: ", $color_type, $color_end + print (struct RComplex *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_FILE + printf "%sT_FILE%s: ", $color_type, $color_end + print (struct RFile *)($arg0) + output *((struct RFile *)($arg0))->fptr + printf "\n" + else + if ($flags & RUBY_T_MASK) == RUBY_T_TRUE + printf "%sT_TRUE%s: ", $color_type, $color_end + print (struct RBasic *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_FALSE + printf "%sT_FALSE%s: ", $color_type, $color_end + print (struct RBasic *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_DATA + if ((struct RTypedData *)($arg0))->typed_flag == 1 + printf "%sT_DATA%s(%s): ", $color_type, $color_end, ((struct RTypedData *)($arg0))->type->wrap_struct_name + print (struct RTypedData *)($arg0) + else + printf "%sT_DATA%s: ", $color_type, $color_end + print (struct RData *)($arg0) + end + else + if ($flags & RUBY_T_MASK) == RUBY_T_MATCH + printf "%sT_MATCH%s: ", $color_type, $color_end + print (struct RMatch *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_SYMBOL + printf "%sT_SYMBOL%s: ", $color_type, $color_end + print (struct RSymbol *)($arg0) + set $id_type = ((struct RSymbol *)($arg0))->id & RUBY_ID_SCOPE_MASK + if $id_type == RUBY_ID_LOCAL + printf "l" + else + if $id_type == RUBY_ID_INSTANCE + printf "i" + else + if $id_type == RUBY_ID_GLOBAL + printf "G" + else + if $id_type == RUBY_ID_ATTRSET + printf "a" + else + if $id_type == RUBY_ID_CONST + printf "C" + else + if $id_type == RUBY_ID_CLASS + printf "c" + else + printf "j" + end + end + end + end + end + end + set $id_fstr = ((struct RSymbol *)($arg0))->fstr + rp_string $id_fstr + else + if ($flags & RUBY_T_MASK) == RUBY_T_UNDEF + printf "%sT_UNDEF%s: ", $color_type, $color_end + print (struct RBasic *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_IMEMO + printf "%sT_IMEMO%s(", $color_type, $color_end + output (enum imemo_type)(($flags>>RUBY_FL_USHIFT)&RUBY_IMEMO_MASK) + printf "): " + rp_imemo $arg0 + else + if ($flags & RUBY_T_MASK) == RUBY_T_NODE + printf "%sT_NODE%s(", $color_type, $color_end + output (enum node_type)(($flags&RUBY_NODE_TYPEMASK)>>RUBY_NODE_TYPESHIFT) + printf "): " + print *(NODE *)($arg0) + else + if ($flags & RUBY_T_MASK) == RUBY_T_ZOMBIE + printf "%sT_ZOMBIE%s: ", $color_type, $color_end + print (struct RData *)($arg0) + else + printf "%sunknown%s: ", $color_type, $color_end + print (struct RBasic *)($arg0) + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end +end +document rp + Print a Ruby's VALUE. +end + +define rp_id + set $id = (ID)$arg0 + if $id == '!' || $id == '+' || $id == '-' || $id == '*' || $id == '/' || $id == '%' || $id == '<' || $id == '>' || $id == '`' + printf "(:%c)\n", $id + else + if $id == idDot2 + printf "(:..)\n" + else + if $id == idDot3 + printf "(:...)\n" + else + if $id == idUPlus + printf "(:+@)\n" + else + if $id == idUMinus + printf "(:-@)\n" + else + if $id == idPow + printf "(:**)\n" + else + if $id == idCmp + printf "(:<=>)\n" + else + if $id == idLTLT + printf "(:<<)\n" + else + if $id == idGTGT + printf "(:>>)\n" + else + if $id == idLE + printf "(:<=)\n" + else + if $id == idGE + printf "(:>=)\n" + else + if $id == idEq + printf "(:==)\n" + else + if $id == idEqq + printf "(:===)\n" + else + if $id == idNeq + printf "(:!=)\n" + else + if $id == idEqTilde + printf "(:=~)\n" + else + if $id == idNeqTilde + printf "(:!~)\n" + else + if $id == idAREF + printf "(:[])\n" + else + if $id == idASET + printf "(:[]=)\n" + else + if $id == idCOLON2 + printf "(:'::')\n" + else + if $id == idANDOP + printf "(:&&)\n" + else + if $id == idOROP + printf "(:||)\n" + else + if $id == idANDDOT + printf "(:&.)\n" + else + if $id <= tLAST_OP_ID + printf "O" + else + set $id_type = $id & RUBY_ID_SCOPE_MASK + if $id_type == RUBY_ID_LOCAL + printf "l" + else + if $id_type == RUBY_ID_INSTANCE + printf "i" + else + if $id_type == RUBY_ID_GLOBAL + printf "G" + else + if $id_type == RUBY_ID_ATTRSET + printf "a" + else + if $id_type == RUBY_ID_CONST + printf "C" + else + if $id_type == RUBY_ID_CLASS + printf "c" + else + printf "j" + end + end + end + end + end + end + end + printf "(%ld): ", $id + print_id $id + echo \n + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end + end +end +document rp_id + Print an ID. +end + +define output_string + set $flags = ((struct RBasic*)($arg0))->flags + set $len = ($flags & RUBY_FL_USER1) ? \ + ((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 $len > 0 + output *(char *)(($flags & RUBY_FL_USER1) ? \ + ((struct RString*)($arg0))->as.heap.ptr : \ + ((struct RString*)($arg0))->as.ary) @ $len + else + output "" + end +end + +define print_string + set $flags = ((struct RBasic*)($arg0))->flags + set $len = ($flags & RUBY_FL_USER1) ? \ + ((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 $len > 0 + printf "%s", *(char *)(($flags & RUBY_FL_USER1) ? \ + ((struct RString*)($arg0))->as.heap.ptr : \ + ((struct RString*)($arg0))->as.ary) @ $len + end +end + +define rp_string + output_string $arg0 + printf " bytesize:%ld ", $len + if !($flags & RUBY_FL_USER1) + printf "(embed) " + else + if ($flags & RUBY_FL_USER2) + printf "(shared) " + end + if ($flags & RUBY_FL_USER3) + printf "(assoc) " + end + end + printf "encoding:%d ", ($flags & RUBY_ENCODING_MASK) >> RUBY_ENCODING_SHIFT + if ($flags & RUBY_ENC_CODERANGE_MASK) == 0 + printf "coderange:unknown " + else + if ($flags & RUBY_ENC_CODERANGE_MASK) == RUBY_ENC_CODERANGE_7BIT + printf "coderange:7bit " + else + if ($flags & RUBY_ENC_CODERANGE_MASK) == RUBY_ENC_CODERANGE_VALID + printf "coderange:valid " + else + printf "coderange:broken " + end + end + end + print (struct RString *)($arg0) +end +document rp_string + Print the content of a String. +end + +define rp_bignum + set $flags = ((struct RBignum*)($arg0))->basic.flags + set $len = (($flags & RUBY_FL_USER2) ? \ + ($flags & (RUBY_FL_USER5|RUBY_FL_USER4|RUBY_FL_USER3)) >> (RUBY_FL_USHIFT+3) : \ + ((struct RBignum*)($arg0))->as.heap.len) + printf "%sT_BIGNUM%s: sign=%d len=%ld ", $color_type, $color_end, \ + (($flags & RUBY_FL_USER1) != 0), $len + if $flags & RUBY_FL_USER2 + printf "(embed) " + end + print (struct RBignum *)($arg0) + set $ptr = (($flags & RUBY_FL_USER2) ? \ + ((struct RBignum*)($arg0))->as.ary : \ + ((struct RBignum*)($arg0))->as.heap.digits) + set $len = $len-1 + printf "0x%x", $ptr[$len] + while $len > 0 + set $len = $len-1 + set $val = $ptr[$len] + set $w = sizeof($ptr[0]) + printf "_" + if $w > 8 + printf "%.32x", $val + else + if $w > 4 + printf "%.16x", $val + else + if $w > 2 + printf "%.8x", $val + else + if $w > 1 + printf "%.4x", $val + else + printf "%.2x", $val + end + end + end + end + end + printf "\n" +end +document rp_bignum + Print the content of a Bignum. +end + +define rp_class + printf "(struct RClass *) %p", (void*)$arg0 + if ((struct RClass *)($arg0))->ptr.origin_ != $arg0 + printf " -> %p", ((struct RClass *)($arg0))->ptr.origin_ + end + printf "\n" + rb_classname $arg0 + print/x *(struct RClass *)($arg0) + print *((struct RClass *)($arg0))->ptr +end +document rp_class + Print the content of a Class/Module. +end + +define rp_imemo + set $flags = (enum imemo_type)((((struct RBasic *)($arg0))->flags >> RUBY_FL_USHIFT) & RUBY_IMEMO_MASK) + if $flags == imemo_cref + printf "(rb_cref_t *) %p\n", (void*)$arg0 + print *(rb_cref_t *)$arg0 + else + if $flags == imemo_svar + printf "(struct vm_svar *) %p\n", (void*)$arg0 + print *(struct vm_svar *)$arg0 + else + if $flags == imemo_throw_data + printf "(struct vm_throw_data *) %p\n", (void*)$arg0 + print *(struct vm_throw_data *)$arg0 + else + if $flags == imemo_ifunc + printf "(struct vm_ifunc *) %p\n", (void*)$arg0 + print *(struct vm_ifunc *)$arg0 + else + if $flags == imemo_memo + printf "(struct MEMO *) %p\n", (void*)$arg0 + print *(struct MEMO *)$arg0 + else + if $flags == imemo_ment + printf "(rb_method_entry_t *) %p\n", (void*)$arg0 + print *(rb_method_entry_t *)$arg0 + else + if $flags == imemo_iseq + printf "(rb_iseq_t *) %p\n", (void*)$arg0 + print *(rb_iseq_t *)$arg0 + else + printf "(struct RIMemo *) %p\n", (void*)$arg0 + print *(struct RIMemo *)$arg0 + end + end + end + end + end + end + end +end +document rp_imemo + Print the content of a memo +end + +define nd_type + 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 +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)) +end +document nd_line + Print the source line number of a node. +end + +# Print members of ruby node. + +define nd_head + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + +define nd_alen + printf "%su2.argc%s: ", $color_highlite, $color_end + p ($arg0).u2.argc +end + +define nd_next + printf "%su3.node%s: ", $color_highlite, $color_end + rp ($arg0).u3.node +end + + +define nd_cond + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + +define nd_body + printf "%su2.node%s: ", $color_highlite, $color_end + rp ($arg0).u2.node +end + +define nd_else + printf "%su3.node%s: ", $color_highlite, $color_end + rp ($arg0).u3.node +end + + +define nd_orig + printf "%su3.value%s: ", $color_highlite, $color_end + rp ($arg0).u3.value +end + + +define nd_resq + printf "%su2.node%s: ", $color_highlite, $color_end + rp ($arg0).u2.node +end + +define nd_ensr + printf "%su3.node%s: ", $color_highlite, $color_end + rp ($arg0).u3.node +end + + +define nd_1st + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + +define nd_2nd + printf "%su2.node%s: ", $color_highlite, $color_end + rp ($arg0).u2.node +end + + +define nd_stts + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + + +define nd_entry + printf "%su3.entry%s: ", $color_highlite, $color_end + p ($arg0).u3.entry +end + +define nd_vid + printf "%su1.id%s: ", $color_highlite, $color_end + p ($arg0).u1.id +end + +define nd_cflag + printf "%su2.id%s: ", $color_highlite, $color_end + p ($arg0).u2.id +end + +define nd_cval + printf "%su3.value%s: ", $color_highlite, $color_end + rp ($arg0).u3.value +end + +define nd_tbl + printf "%su1.tbl%s: ", $color_highlite, $color_end + p ($arg0).u1.tbl +end + + +define nd_var + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + +define nd_ibdy + printf "%su2.node%s: ", $color_highlite, $color_end + rp ($arg0).u2.node +end + +define nd_iter + printf "%su3.node%s: ", $color_highlite, $color_end + rp ($arg0).u3.node +end + + +define nd_value + printf "%su2.node%s: ", $color_highlite, $color_end + rp ($arg0).u2.node +end + +define nd_aid + printf "%su3.id%s: ", $color_highlite, $color_end + p ($arg0).u3.id +end + + +define nd_lit + printf "%su1.value%s: ", $color_highlite, $color_end + rp ($arg0).u1.value +end + +define nd_rest + printf "%su2.argc%s: ", $color_highlite, $color_end + p ($arg0).u2.argc +end + +define nd_opt + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + + +define nd_recv + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + +define nd_mid + printf "%su2.id%s: ", $color_highlite, $color_end + p ($arg0).u2.id +end + +define nd_args + printf "%su3.node%s: ", $color_highlite, $color_end + rp ($arg0).u3.node +end + +define nd_defn + printf "%su3.node%s: ", $color_highlite, $color_end + rp ($arg0).u3.node +end + + +define nd_old + printf "%su1.id%s: ", $color_highlite, $color_end + p ($arg0).u1.id +end + +define nd_new + printf "%su2.id%s: ", $color_highlite, $color_end + p ($arg0).u2.id +end + + +define nd_cname + printf "%su1.id%s: ", $color_highlite, $color_end + p ($arg0).u1.id +end + +define nd_super + printf "%su3.node%s: ", $color_highlite, $color_end + rp ($arg0).u3.node +end + + +define nd_modl + printf "%su1.id%s: ", $color_highlite, $color_end + p ($arg0).u1.id +end + +define nd_clss + printf "%su1.value%s: ", $color_highlite, $color_end + rp ($arg0).u1.value +end + + +define nd_beg + printf "%su1.node%s: ", $color_highlite, $color_end + rp ($arg0).u1.node +end + +define nd_end + printf "%su2.node%s: ", $color_highlite, $color_end + rp ($arg0).u2.node +end + +define nd_state + printf "%su3.state%s: ", $color_highlite, $color_end + p ($arg0).u3.state +end + +define nd_rval + printf "%su2.value%s: ", $color_highlite, $color_end + rp ($arg0).u2.value +end + + +define nd_nth + printf "%su2.argc%s: ", $color_highlite, $color_end + p ($arg0).u2.argc +end + + +define nd_tag + printf "%su1.id%s: ", $color_highlite, $color_end + p ($arg0).u1.id +end + +define nd_tval + printf "%su2.value%s: ", $color_highlite, $color_end + rp ($arg0).u2.value +end + +define nd_tree + set $buf = (struct RString *)rb_str_buf_new(0) + call dump_node((VALUE)($buf), rb_str_tmp_new(0), 0, ($arg0)) + printf "%s\n", $buf->as.heap.ptr +end + +define rb_p + call rb_p($arg0) +end + +define rb_numtable_entry + set $rb_numtable_tbl = $arg0 + set $rb_numtable_id = (st_data_t)$arg1 + set $rb_numtable_key = 0 + set $rb_numtable_rec = 0 + if $rb_numtable_tbl->entries_packed + set $rb_numtable_p = $rb_numtable_tbl->as.packed.bins + while $rb_numtable_p && $rb_numtable_p < $rb_numtable_tbl->as.packed.bins+$rb_numtable_tbl->num_entries + if $rb_numtable_p.k == $rb_numtable_id + set $rb_numtable_key = $rb_numtable_p.k + set $rb_numtable_rec = $rb_numtable_p.v + set $rb_numtable_p = 0 + else + set $rb_numtable_p = $rb_numtable_p + 1 + end + end + else + set $rb_numtable_p = $rb_numtable_tbl->as.big.bins[st_numhash($rb_numtable_id) % $rb_numtable_tbl->num_bins] + while $rb_numtable_p + if $rb_numtable_p->key == $rb_numtable_id + set $rb_numtable_key = $rb_numtable_p->key + set $rb_numtable_rec = $rb_numtable_p->record + set $rb_numtable_p = 0 + else + set $rb_numtable_p = $rb_numtable_p->next + end + end + end +end + +define rb_id2name + ruby_gdb_init + printf "%sID%s: ", $color_type, $color_end + rp_id $arg0 +end +document rb_id2name + Print the name of id +end + +define rb_method_entry + set $rb_method_entry_klass = (struct RClass *)$arg0 + set $rb_method_entry_id = (ID)$arg1 + set $rb_method_entry_me = (rb_method_entry_t *)0 + while !$rb_method_entry_me && $rb_method_entry_klass + rb_numtable_entry $rb_method_entry_klass->m_tbl_wrapper->tbl $rb_method_entry_id + set $rb_method_entry_me = (rb_method_entry_t *)$rb_numtable_rec + if !$rb_method_entry_me + set $rb_method_entry_klass = (struct RClass *)RCLASS_SUPER($rb_method_entry_klass) + end + end + if $rb_method_entry_me + print *$rb_method_entry_klass + print *$rb_method_entry_me + else + echo method not found\n + end +end +document rb_method_entry + Search method entry by class and id +end + +define rb_classname + # up to 128bit int + set $rb_classname = rb_mod_name($arg0) + if $rb_classname != RUBY_Qnil + rp $rb_classname + else + echo anonymous class/module\n + end +end + +define rb_ancestors + set $rb_ancestors_module = $arg0 + while $rb_ancestors_module + rp_class $rb_ancestors_module + set $rb_ancestors_module = RCLASS_SUPER($rb_ancestors_module) + end +end +document rb_ancestors + Print ancestors. +end + +define rb_backtrace + call rb_backtrace() +end + +define iseq + if ruby_dummy_gdb_enums.special_consts + end + if ($arg0)->type == ISEQ_ELEMENT_NONE + echo [none]\n + end + 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 + set $i = 0 + 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) + end +end + +define rb_ps + rb_ps_vm ruby_current_vm_ptr +end +document rb_ps +Dump all threads and their callstacks +end + +define rb_ps_vm + print $ps_vm = (rb_vm_t*)$arg0 + set $ps_thread_ln = $ps_vm->living_threads.n.next + set $ps_thread_ln_last = $ps_vm->living_threads.n.prev + while 1 + set $ps_thread_th = (rb_thread_t *)$ps_thread_ln + set $ps_thread = (VALUE)($ps_thread_th->self) + rb_ps_thread $ps_thread + if $ps_thread_ln == $ps_thread_ln_last + loop_break + end + set $ps_thread_ln = $ps_thread_ln->next + end +end +document rb_ps_vm +Dump all threads in a (rb_vm_t*) and their callstacks +end + +define print_lineno + set $cfp = $arg0 + set $iseq = $cfp->iseq + set $pos = $cfp->pc - $iseq->body->iseq_encoded + if $pos != 0 + set $pos = $pos - 1 + end + + set $index = 0 + set $size = $iseq->body->insns_info.size + set $table = $iseq->body->insns_info.body + set $positions = $iseq->body->insns_info.positions + #printf "size: %d\n", $size + if $size == 0 + else + if $size == 1 + printf "%d", $table[0].line_no + else + if $positions + # get_insn_info_linear_search + set $index = 1 + while $index < $size + #printf "table[%d]: position: %d, line: %d, pos: %d\n", $i, $positions[$i], $table[$i].line_no, $pos + if $positions[$index] > $pos + loop_break + end + set $index = $index + 1 + if $positions[$index] == $pos + loop_break + end + end + else + # get_insn_info_succinct_bitvector + set $sd = $iseq->body->insns_info.succ_index_table + set $immediate_table_size = sizeof($sd->imm_part) / sizeof(uint64_t) * 9 + if $pos < $immediate_table_size + set $i = $pos / 9 + set $j = $pos % 9 + set $index = ((int)($sd->imm_part[$i] >> ($j * 7))) & 0x7f + else + set $block_index = ($pos - $immediate_table_size) / 512 + set $block = &$sd->succ_part[$block_index] + set $block_bit_index = ($pos - $immediate_table_size) % 512 + set $small_block_index = $block_bit_index / 64 + set $small_block_popcount = $small_block_index == 0 ? 0 : (((int)($block->small_block_ranks >> (($small_block_index - 1) * 9))) & 0x1ff) + set $x = $block->bits[$small_block_index] << (63 - $block_bit_index % 64) + set $x = ($x & 0x5555555555555555) + ($x >> 1 & 0x5555555555555555) + set $x = ($x & 0x3333333333333333) + ($x >> 2 & 0x3333333333333333) + set $x = ($x & 0x0707070707070707) + ($x >> 4 & 0x0707070707070707) + set $x = ($x & 0x001f001f001f001f) + ($x >> 8 & 0x001f001f001f001f) + set $x = ($x & 0x0000003f0000003f) + ($x >>16 & 0x0000003f0000003f) + set $popcnt = ($x & 0x7f) + ($x >>32 & 0x7f) + set $index = $block->rank + $small_block_popcount + $popcnt + end + end + printf "%d", $table[$index-1].line_no + end + end +end + +define check_method_entry + set $imemo = (struct RBasic *)$arg0 + if $imemo != RUBY_Qfalse + set $type = ($imemo->flags >> 12) & 0x07 + if $type == imemo_ment + set $me = (rb_callable_method_entry_t *)$imemo + else + if $type == imemo_svar + set $imemo = ((struct vm_svar *)$imemo)->cref_or_me + check_method_entry $imemo + end + end + end +end + +define print_id + set $id = $arg0 + # rb_id_to_serial + if $id > tLAST_OP_ID + set $serial = (rb_id_serial_t)($id >> RUBY_ID_SCOPE_SHIFT) + else + set $serial = (rb_id_serial_t)$id + end + if $serial && $serial <= global_symbols.last_id + set $idx = $serial / ID_ENTRY_UNIT + set $ids = (struct RArray *)global_symbols.ids + set $flags = $ids->basic.flags + if ($flags & RUBY_FL_USER1) + set $idsptr = $ids->as.ary + set $idslen = (($flags & (RUBY_FL_USER3|RUBY_FL_USER4)) >> (RUBY_FL_USHIFT+3)) + else + set $idsptr = $ids->as.heap.ptr + set $idslen = $ids->as.heap.len + end + if $idx < $idslen + set $t = 0 + set $ary = (struct RArray *)$idsptr[$idx] + if $ary != RUBY_Qnil + set $flags = $ary->basic.flags + if ($flags & RUBY_FL_USER1) + set $aryptr = $ary->as.ary + set $arylen = (($flags & (RUBY_FL_USER3|RUBY_FL_USER4)) >> (RUBY_FL_USHIFT+3)) + else + set $aryptr = $ary->as.heap.ptr + set $arylen = $ary->as.heap.len + end + set $result = $aryptr[($serial % ID_ENTRY_UNIT) * ID_ENTRY_SIZE + $t] + if $result != RUBY_Qnil + print_string $result + else + echo undef + end + end + end + end +end + +define print_pathobj + set $flags = ((struct RBasic*)($arg0))->flags + if ($flags & RUBY_T_MASK) == RUBY_T_STRING + print_string $arg0 + end + if ($flags & RUBY_T_MASK) == RUBY_T_ARRAY + if $flags & RUBY_FL_USER1 + set $str = ((struct RArray*)($arg0))->as.ary[0] + else + set $str = ((struct RArray*)($arg0))->as.heap.ptr[0] + end + print_string $str + end +end + +define rb_ps_thread + set $ps_thread = (struct RTypedData*)$arg0 + set $ps_thread_th = (rb_thread_t*)$ps_thread->data + printf "* #<Thread:%p rb_thread_t:%p native_thread:%p>\n", \ + $ps_thread, $ps_thread_th, $ps_thread_th->thread_id + set $cfp = $ps_thread_th->ec->cfp + set $cfpend = (rb_control_frame_t *)($ps_thread_th->ec->vm_stack + $ps_thread_th->ec->vm_stack_size)-1 + while $cfp < $cfpend + if $cfp->iseq + if !((VALUE)$cfp->iseq & RUBY_IMMEDIATE_MASK) && (((imemo_ifunc << RUBY_FL_USHIFT) | RUBY_T_IMEMO)==$cfp->iseq->flags & ((RUBY_IMEMO_MASK << RUBY_FL_USHIFT) | RUBY_T_MASK)) + printf "%d:ifunc ", $cfpend-$cfp + set print symbol-filename on + output/a $cfp->iseq.body + set print symbol-filename off + printf "\n" + else + if $cfp->pc + set $location = $cfp->iseq->body->location + printf "%d:", $cfpend-$cfp + print_pathobj $location.pathobj + printf ":" + print_lineno $cfp + printf ":in `" + print_string $location.label + printf "'\n" + else + printf "%d: ???.rb:???:in `???'\n", $cfpend-$cfp + end + end + else + # if VM_FRAME_TYPE($cfp->flag) == VM_FRAME_MAGIC_CFUNC + set $ep = $cfp->ep + if ($ep[0] & 0xffff0001) == 0x55550001 + #define VM_ENV_FLAG_LOCAL 0x02 + #define VM_ENV_PREV_EP(ep) GC_GUARDED_PTR_REF(ep[VM_ENV_DATA_INDEX_SPECVAL]) + set $me = 0 + set $env_specval = $ep[-1] + set $env_me_cref = $ep[-2] + while ($env_specval & 0x02) != 0 + check_method_entry $env_me_cref + if $me != 0 + loop_break + end + set $ep = $ep[0] + set $env_specval = $ep[-1] + set $env_me_cref = $ep[-2] + end + if $me == 0 + check_method_entry $env_me_cref + end + printf "%d:", $cfpend-$cfp + set print symbol-filename on + output/a $me->def->body.cfunc.func + set print symbol-filename off + set $mid = $me->def->original_id + printf ":in `" + print_id $mid + printf "'\n" + else + printf "%d:unknown_frame:???:in `???'\n", $cfpend-$cfp + end + end + set $cfp = $cfp + 1 + end +end + +define rb_count_objects + set $objspace = ruby_current_vm_ptr->objspace + set $counts_00 = 0 + set $counts_01 = 0 + set $counts_02 = 0 + set $counts_03 = 0 + set $counts_04 = 0 + set $counts_05 = 0 + set $counts_06 = 0 + set $counts_07 = 0 + set $counts_08 = 0 + set $counts_09 = 0 + set $counts_0a = 0 + set $counts_0b = 0 + set $counts_0c = 0 + set $counts_0d = 0 + set $counts_0e = 0 + set $counts_0f = 0 + set $counts_10 = 0 + set $counts_11 = 0 + set $counts_12 = 0 + set $counts_13 = 0 + set $counts_14 = 0 + set $counts_15 = 0 + set $counts_16 = 0 + set $counts_17 = 0 + set $counts_18 = 0 + set $counts_19 = 0 + set $counts_1a = 0 + set $counts_1b = 0 + set $counts_1c = 0 + set $counts_1d = 0 + set $counts_1e = 0 + set $counts_1f = 0 + set $total = 0 + set $i = 0 + while $i < $objspace->heap_pages.allocated_pages + printf "\rcounting... %d/%d", $i, $objspace->heap_pages.allocated_pages + set $page = $objspace->heap_pages.sorted[$i] + set $p = $page->start + set $pend = $p + $page->total_slots + while $p < $pend + set $flags = $p->as.basic.flags & 0x1f + eval "set $counts_%02x = $counts_%02x + 1", $flags, $flags + set $p = $p + 1 + end + set $total = $total + $page->total_slots + set $i = $i + 1 + end + printf "\rTOTAL: %d, FREE: %d\n", $total, $counts_00 + printf "T_OBJECT: %d\n", $counts_01 + printf "T_CLASS: %d\n", $counts_02 + printf "T_MODULE: %d\n", $counts_03 + printf "T_FLOAT: %d\n", $counts_04 + printf "T_STRING: %d\n", $counts_05 + printf "T_REGEXP: %d\n", $counts_06 + printf "T_ARRAY: %d\n", $counts_07 + printf "T_HASH: %d\n", $counts_08 + printf "T_STRUCT: %d\n", $counts_09 + printf "T_BIGNUM: %d\n", $counts_0a + printf "T_FILE: %d\n", $counts_0b + printf "T_DATA: %d\n", $counts_0c + printf "T_MATCH: %d\n", $counts_0d + printf "T_COMPLEX: %d\n", $counts_0e + printf "T_RATIONAL: %d\n", $counts_0f + #printf "UNKNOWN_10: %d\n", $counts_10 + printf "T_NIL: %d\n", $counts_11 + printf "T_TRUE: %d\n", $counts_12 + printf "T_FALSE: %d\n", $counts_13 + printf "T_SYMBOL: %d\n", $counts_14 + printf "T_FIXNUM: %d\n", $counts_15 + printf "T_UNDEF: %d\n", $counts_16 + #printf "UNKNOWN_17: %d\n", $counts_17 + #printf "UNKNOWN_18: %d\n", $counts_18 + #printf "UNKNOWN_19: %d\n", $counts_19 + printf "T_IMEMO: %d\n", $counts_1a + printf "T_NODE: %d\n", $counts_1b + printf "T_ICLASS: %d\n", $counts_1c + printf "T_ZOMBIE: %d\n", $counts_1d + #printf "UNKNOWN_1E: %d\n", $counts_1e + printf "T_MASK: %d\n", $counts_1f +end +document rb_count_objects + Counts all objects grouped by type. +end + +# Details: https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/MachineInstructionsTraceWithGDB +define trace_machine_instructions + set logging on + set height 0 + set width 0 + display/i $pc + while !$exit_code + info line *$pc + si + end +end + +define SDR + call rb_vmdebug_stack_dump_raw_current() +end + +define rbi + if ((LINK_ELEMENT*)$arg0)->type == ISEQ_ELEMENT_LABEL + p *(LABEL*)$arg0 + else + if ((LINK_ELEMENT*)$arg0)->type == ISEQ_ELEMENT_INSN + p *(INSN*)$arg0 + else + if ((LINK_ELEMENT*)$arg0)->type == ISEQ_ELEMENT_ADJUST + p *(ADJUST*)$arg0 + else + print *$arg0 + end + end + end +end + +define dump_node + set $str = rb_parser_dump_tree($arg0, 0) + set $flags = ((struct RBasic*)($str))->flags + printf "%s", (char *)(($flags & RUBY_FL_USER1) ? \ + ((struct RString*)$str)->as.heap.ptr : \ + ((struct RString*)$str)->as.ary) +end + +define print_flags + printf "RUBY_FL_WB_PROTECTED: %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_WB_PROTECTED ? "1" : "0" + printf "RUBY_FL_PROMOTED0 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_PROMOTED0 ? "1" : "0" + printf "RUBY_FL_PROMOTED1 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_PROMOTED1 ? "1" : "0" + printf "RUBY_FL_FINALIZE : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_FINALIZE ? "1" : "0" + printf "RUBY_FL_TAINT : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_TAINT ? "1" : "0" + printf "RUBY_FL_UNTRUSTED : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_UNTRUSTED ? "1" : "0" + printf "RUBY_FL_EXIVAR : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_EXIVAR ? "1" : "0" + printf "RUBY_FL_FREEZE : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_FREEZE ? "1" : "0" + + printf "RUBY_FL_USER0 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER0 ? "1" : "0" + printf "RUBY_FL_USER1 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER1 ? "1" : "0" + printf "RUBY_FL_USER2 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER2 ? "1" : "0" + printf "RUBY_FL_USER3 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER3 ? "1" : "0" + printf "RUBY_FL_USER4 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER4 ? "1" : "0" + printf "RUBY_FL_USER5 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER5 ? "1" : "0" + printf "RUBY_FL_USER6 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER6 ? "1" : "0" + printf "RUBY_FL_USER7 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER7 ? "1" : "0" + printf "RUBY_FL_USER8 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER8 ? "1" : "0" + printf "RUBY_FL_USER9 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER9 ? "1" : "0" + printf "RUBY_FL_USER10 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER10 ? "1" : "0" + printf "RUBY_FL_USER11 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER11 ? "1" : "0" + printf "RUBY_FL_USER12 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER12 ? "1" : "0" + printf "RUBY_FL_USER13 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER13 ? "1" : "0" + printf "RUBY_FL_USER14 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER14 ? "1" : "0" + printf "RUBY_FL_USER15 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER15 ? "1" : "0" + printf "RUBY_FL_USER16 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER16 ? "1" : "0" + printf "RUBY_FL_USER17 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER17 ? "1" : "0" + printf "RUBY_FL_USER18 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER18 ? "1" : "0" +end diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..6ca2f89462 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +*.gemspec diff=ruby +*.rb diff=ruby +bin svn-properties=svn:ignore=ruby +bin/* diff=ruby +tool/update-deps diff=ruby +tool/make-snapshot diff=ruby diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..50bf27f28a --- /dev/null +++ b/.gitignore @@ -0,0 +1,212 @@ +*-*-*.def +*-*-*.exp +*-*-*.lib +*.a +*.bak +*.bc +*.bundle +*.dSYM +*.dmyh +*.dylib +*.elc +*.i +*.inc +*.log +*.o +*.obj +*.old +*.orig +*.pch +*.pdb +*.rej +*.s +*.sav +*.sl +*.so +*.swp +*.yarb +*~ +.*-* +.*.list +.*.time +.DS_Store +.bundle +.ccmalloc +.ext +.pc +.ppack +.svn +Makefile +cygruby*.def +extconf.h +y.output +y.tab.c +*.gcda +*.gcno +*.gcov +lcov*.info + +# / +/*-fake.rb +/*.dll +/*.exe +/*.res +/*.pc +/*.rc +/*_prelude.c +/COPYING.LIB +/Doxyfile +/GNUmakefile +/README.atheos +/README.fat-patch +/README.v6 +/TAGS +/archive +/autom4te*.cache +/automake +/benchmark/benchmark-driver +/beos +/bmlog-* +/breakpoints.gdb +/config.cache +/config.h +/config.h.in +/config.status +/config.status.lineno +/configure +/coverage/simplecov +/coverage/simplecov-html +/coverage/doclie +/coverage/.last_run.json +/coverage/.resultset.json* +/coverage/assets +/coverage/index.html +/doc/capi +/enc.mk +/encdb.h +/exts.mk +/goruby +/id.[ch] +/largefile.h +/lcov-c-out +/lcov-rb-out +/lcov-out +/lex.c +/libruby*.* +/miniprelude.c +/miniruby +/newdate.rb +/newline.c +/newver.rb +/parse.c +/parse.h +/patches +/patches-master +/pitest.rb +/ppack +/prelude.c +/preview +/probes.dmyh +/probes.h +/rbconfig.rb +/rename2.h +/repack +/revision.h +/riscos +/rubicon +/ruby +/ruby-runner +/ruby-runner.h +/ruby-man.rd.gz +/run.gdb +/sizes.c +/test.rb +/test-coverage.dat +/tmp +/transdb.h +/uncommon.mk +/verconf.h +/verconf.mk +/web +/yasmdata.rb + +# /benchmark/ +/benchmark/bm_require.data +/benchmark/bmx_*.rb +/benchmark/fasta.output.* +/benchmark/wc.input + +/enc/*.def +/enc/*.exp +/enc/*.lib +/enc/jis/props.h +/enc/unicode/data + +# /coroutine/ +!/coroutine/**/*.s +/coroutine/**/.time + +# /enc/trans/ +/enc/trans/*.c +/enc/trans/*.def +/enc/trans/*.exp +/enc/trans/*.lib +/enc/trans/.time + +# /exe/ +/exe/goruby +/exe/ruby +/exe/.time + +# /ext/ +/ext/extinit.c +/ext/configure-ext.mk +/ext/*/exts.mk + +# /ext/-test-/win32/dln/ +/ext/-test-/win32/dln/dlntest.dll +/ext/-test-/win32/dln/dlntest.exp +/ext/-test-/win32/dln/dlntest.lib + +# /ext/etc/ +/ext/etc/constdefs.h + +# /ext/fiddle/ +/ext/fiddle/libffi-* + +# /ext/rbconfig/ +/ext/rbconfig/sizeof/sizes.c +/ext/rbconfig/sizeof/limits.c + +# /ext/ripper/ +/ext/ripper/eventids1.c +/ext/ripper/eventids2table.c +/ext/ripper/ripper.* +/ext/ripper/ids1 +/ext/ripper/ids2 + +# /ext/socket/ +/ext/socket/constants.h +/ext/socket/constdefs.h +/ext/socket/constdefs.c + +# /gems +/gems/*.gem +/gems/src +/gems/*-* + +# /spec/bundler +/.rspec_status + +# /tool/ +/tool/config.guess +/tool/config.sub + +# /win32/ +/win32/*.ico +/win32/.time + +# MJIT +/rb_mjit_header.h +/mjit_config.h +/include/ruby-*/*/rb_mjit_min_header-*.h diff --git a/.indent.pro b/.indent.pro new file mode 100644 index 0000000000..6a207a0554 --- /dev/null +++ b/.indent.pro @@ -0,0 +1,21 @@ +-bap +-nbbb +-nbc +-br +-nbs +-ncdb +-ce +-cli0.5 +-ndj +-ei +-nfc1 +-i4 +-l120 +-lp +-npcs +-psl +-sc +-sob + +-TID +-TVALUE diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..6004cf50db --- /dev/null +++ b/.travis.yml @@ -0,0 +1,412 @@ +# Copyright (C) 2011 Urabe, Shyouhei. All rights reserved. +# +# This file is a part of the programming language Ruby. Permission is hereby +# granted, to either redistribute or modify this file, provided that the +# conditions mentioned in the file COPYING are met. Consult the file for +# details. + +# This is a Travis-CI build configuration file. The list of configurations +# available is located in +# +# http://about.travis-ci.org/docs/user/build-configuration/ +# +# and as Ruby itself is a project written in C language, +# +# http://about.travis-ci.org/docs/user/languages/c/ +# +# is also a good place to look at. + +language: c + +dist: xenial + +osx_image: xcode10.1 + +sudo: false + +git: + quiet: true + +addons: + apt: + config: + retries: true + update: true + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-8 + - libffi-dev + - libgdbm-dev + - libgmp-dev + - libjemalloc-dev + - libncurses5-dev + - libncursesw5-dev + - libreadline6-dev + - libssl-dev + - libyaml-dev + - openssl + - valgrind + - zlib1g-dev + homebrew: + packages: + - gdbm + - gmp + - libffi + - openssl@1.1 + - zlib + - ccache + +cache: + ccache: true + directories: + - $HOME/config_2nd + - $HOME/.downloaded-cache + +env: + global: + - CONFIGURE_TTY=no + - CCACHE_COMPILERCHECK=none + - CCACHE_NOCOMPRESS=1 + - CCACHE_MAXSIZE=512Mi + - >- + NPROC="`case ${TRAVIS_OS_NAME} in + osx) sysctl -n hw.activecpu ;; + linux) nproc ;; + esac`" + # JOBS and SETARCH are overridden when necessary; see below. + - JOBS=-j$((1+${NPROC})) + - SETARCH= + - RUBY_PREFIX=/tmp/ruby-prefix + - GEMS_FOR_TEST='timezone tzinfo' + +.org.ruby-lang.ci.matrix-definitions: + + - &cron-only + if: (type = cron) AND (branch = trunk) AND (fork = false) + + - &make-test-only + script: + - $SETARCH make -s test TESTOPTS="${TESTOPTS=$JOBS -q --tty=no}" + + - &linux + os: linux + compiler: gcc-8 + + - &osx + os: osx + compiler: clang + before_install: + - /usr/local/opt/openssl@1.1/bin/openssl version + + # -------- + + - &x86_64-linux + name: x86_64-linux + <<: *linux + + - &jemalloc + name: --with-jemalloc + <<: *linux + <<: *cron-only + env: + - CONFIG_FLAG='--with-gmp --with-jemalloc --with-valgrind' + + - &VM_CHECK_MODE + name: VM_CHECK_MODE=3 + <<: *linux + <<: *cron-only + <<: *make-test-only + env: + - cppflags=-DVM_CHECK_MODE=0x0003 + + - &FIBER_USE_sjlj + name: FIBER_USE_NATIVE=0 + <<: *linux + <<: *cron-only + env: + - cppflags=-DFIBER_USE_NATIVE=0 + + - &TOKEN_THREADED_CODE + name: TOKEN_THREADED_CODE + <<: *linux + <<: *cron-only + <<: *make-test-only + env: + - cppflags=-DOPT_THREADED_CODE=1 + + - &CALL_THREADED_CODE + name: CALL_THREADED_CODE + <<: *linux + <<: *cron-only + <<: *make-test-only + env: + - cppflags=-DOPT_THREADED_CODE=2 + + - &NO_THREADED_CODE + name: NO_THREADED_CODE + <<: *linux + <<: *cron-only + <<: *make-test-only + env: + - cppflags=-DOPT_THREADED_CODE=3 + + - &ASAN + name: -fsanitize=address + <<: *linux + #<<: *cron-only + <<: *make-test-only + compiler: clang + env: + - ASAN_OPTIONS=detect_leaks=0 + - cflags='-march=native -fsanitize=address -fno-omit-frame-pointer' + - debugflags=-ggdb3 + - optflags=-O1 + - LD=clang + - LDFLAGS=-fsanitize=address + + - &MSAN + name: -fsanitize=memory + <<: *linux + #<<: *cron-only + <<: *make-test-only + compiler: clang + env: + - cflags='-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer' + - optflags=-O1 + - LD=clang + - LDFLAGS=-fsanitize=memory + - CONFIG_FLAG=--with-out-ext=openssl + + - &UBSAN + name: -fsanitize=undefined + <<: *linux + #<<: *cron-only + <<: *make-test-only + compiler: clang + env: + - cflags='-fsanitize=undefined,integer,nullability -fno-omit-frame-pointer' + - cppflags=-DUNALIGNED_WORD_ACCESS=0 + - debugflags=-ggdb3 + - optflags='-O1 -march=native' + - LD=clang + - LDFLAGS=-fsanitize=undefined,integer,nullability + + - &i686-linux + name: i686-linux + <<: *linux + sudo: required + env: + - GCC_FLAGS=-m32 + - debugflags=-g0 + - SETARCH='setarch i686 --verbose --3gb' + addons: + apt: + config: + retries: true + update: true + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-8-multilib + - libffi-dev:i386 + - libffi6:i386 + - libgdbm-dev:i386 + - libgdbm3:i386 + - libncurses5-dev:i386 + - libncurses5:i386 + - libncursesw5-dev:i386 + - libreadline6-dev:i386 + - libreadline6:i386 + - libssl-dev:i386 + - libssl1.0.0:i386 + - linux-libc-dev:i386 + - zlib1g-dev:i386 + - zlib1g:i386 + + - &pedanticism + name: -ansi -pedantic + <<: *linux + <<: *make-test-only + compiler: clang + env: + - GCC_FLAGS='-ansi -Werror=pedantic -pedantic-errors -std=iso9899:1990' + - CONFIG_FLAG= + - JOBS= + - >- + warnflags=' + -Wall + -Wextra + -Werror=declaration-after-statement + -Werror=deprecated-declarations + -Werror=division-by-zero + -Werror=extra-tokens + -Werror=implicit-function-declaration + -Werror=implicit-int + -Werror=long-long + -Werror=pointer-arith + -Werror=shorten-64-to-32 + -Werror=write-strings + -Wmissing-noreturn + -Wno-constant-logical-operand + -Wno-missing-field-initializers + -Wno-overlength-strings + -Wno-parentheses-equality + -Wno-self-assign + -Wno-tautological-compare + -Wno-unused-local-typedef + -Wno-unused-parameter + -Wunused-variable + ' + - LDFLAGS=-Wno-unused-command-line-argument + + - &rubyspec + name: ruby/spec on Ruby 2.3 # to ensure version guards are correctly added + <<: *linux + language: ruby + rvm: 2.3.8 + addons: + apt: + packages: + before_install: + install: + before_script: chmod -R u+w spec/ruby + # -j randomly hangs. Using -fs to make sure we can know problematic spec on failure. + script: ruby -C spec/ruby ../mspec/bin/mspec -fs . + + - &x86_64-darwin17 + name: x86_64-darwin17 + <<: *osx + env: + - CONFIG_FLAG=--with-opt-dir=/usr/local/opt/openssl@1.1:/usr/local/opt/zlib + - TEST_ALL_OPTS="$JOBS -q --tty=no --excludes=\$(TESTSDIR)/excludes/_travis/osx" + + - &universal-darwin17 + name: uinversal.x86_64h-darwin17 + <<: *osx + <<: *cron-only + <<: *make-test-only + env: + - CONFIG_FLAG=--with-arch=x86_64h,x86_64,i386 + - TEST_ALL_OPTS="$JOBS -q --tty=no --excludes=\$(TESTSDIR)/excludes/_travis/osx" + +matrix: + include: + # to reduce time for finishing all jobs, run the slowest osx build first. + - <<: *x86_64-darwin17 + - <<: *x86_64-linux + - <<: *i686-linux + - <<: *jemalloc + - <<: *pedanticism + - <<: *ASAN + - <<: *MSAN + - <<: *UBSAN + - <<: *VM_CHECK_MODE + - <<: *FIBER_USE_sjlj + - <<: *TOKEN_THREADED_CODE + - <<: *CALL_THREADED_CODE + - <<: *NO_THREADED_CODE + - <<: *rubyspec + allow_failures: + - name: uinversal.x86_64h-darwin17 + - name: -fsanitize=address + - name: -fsanitize=memory + - name: -fsanitize=undefined + fast_finish: true + +before_script: + - echo JOBS=${JOBS} SETARCH=${SETARCH} + - $SETARCH uname -a + - $SETARCH uname -r + - rm -fr .ext autom4te.cache + - echo $TERM + - |- + [ -d ~/.downloaded-cache ] || + mkdir ~/.downloaded-cache + - ln -s ~/.downloaded-cache + - "> config.status" + - sed -f tool/prereq.status Makefile.in common.mk > Makefile + - make -s $JOBS update-download + - make -s $JOBS srcs + - rm config.status Makefile rbconfig.rb .rbconfig.time + - |- + if [ -d ~/config_2nd ]; then + cp -pr ~/config_2nd build + else + mkdir build + fi + - mkdir config_1st config_2nd + - chmod -R a-w . + - chmod -R u+w build config_1st config_2nd + - cd build + - ccache --show-stats + - |- + case "$CC" in + gcc*) CC="ccache $CC${GCC_FLAGS:+ }$GCC_FLAGS -fno-diagnostics-color";; + clang*) CC="ccache $CC${GCC_FLAGS:+ }$GCC_FLAGS -fno-color-diagnostics";; + esac + - |- + [ ! -f config.cache ] || + [ "$CC" = "`sed -n s/^ac_cv_prog_CC=//p config.cache`" ] || + (set -x; exec rm config.cache) + - $SETARCH ../configure -C --disable-install-doc --prefix=$RUBY_PREFIX $CONFIG_FLAG + - cp -pr config.cache config.status .ext/include ../config_1st + - $SETARCH make reconfig + - cp -pr config.cache config.status .ext/include ../config_2nd + - (cd .. && exec diff -ru config_1st config_2nd) + - chmod u+w .. + - rm -rf ~/config_2nd + - mv ../config_2nd ~ + - chmod u-w .. + - $SETARCH make -s $JOBS && make install + - ccache --show-stats + - |- + [ -z "${GEMS_FOR_TEST}" ] || + $RUBY_PREFIX/bin/gem install --no-document $GEMS_FOR_TEST + +script: + - $SETARCH make -s test TESTOPTS="${TESTOPTS=$JOBS -q --tty=no}" + - $SETARCH make -s test-all -o exts TESTOPTS="${TEST_ALL_OPTS=$TESTOPTS}" + - $SETARCH make -s test-spec MSPECOPT=-ff # not using `-j` because sometimes `mspec -j` silently dies + +# Branch matrix. Not all branches are Travis-ready so we limit branches here. +branches: + only: + - trunk + - ruby_2_3 + - ruby_2_4 + - ruby_2_5 + - /^feature\// + - /^bug\// + - /^travis-/ + +# We want to be notified when something happens. +notifications: + irc: + channels: + - "chat.freenode.net#ruby-core" + - "chat.freenode.net#ruby-ja" + on_success: change # [always|never|change] # default: always + on_failure: always # [always|never|change] # default: always + template: + - "%{message} by @%{author}: See %{build_url}" + + slack: + rooms: + - secure: i1GLETSKye85ea6dGNA3MxI/5myChmMFiZtBd5C69xK+s1sBFqEgOSbaSf9KHc0CYrHVyNhQMaZRruieV7xS+6Pfs0Zvxf1DO6QQTWC2KhkqwFDLvZncAzjoyASdR90hbr+iRPOngQ+HJuE94zemALAwEqNAinzA74PMiJXktqY= # ruby:<token>#commits + - secure: ah7UEHBvncXT7bM5mvYIQAO+tIyV/wl7nXLb7wQD16dO2v8Gragy0mWjB79Q09hrrMGmp6H9bCDpdGS80boIA5EHaHoG4QaP0i9bsSt8U2AMWgZtfyIgQKJ4H2kXkGlrjO+AXTgnIkP7LNjdgAVUUTGQPb26T3QmoN2Splt+fIQ= # ruby:<token>#alerts + on_pull_requests: false + on_success: change + on_failure: always + + email: + - ko1c-failure@atdot.net + +# Local Variables: +# mode: YAML +# coding: utf-8-unix +# indent-tabs-mode: nil +# tab-width: 4 +# fill-column: 79 +# default-justification: full +# End: @@ -0,0 +1,22 @@ +Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..ffdf2dd4b8 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,4 @@ +Please see the [official issue tracker] and wiki [HowToContribute]. + +[official issue tracker]: https://bugs.ruby-lang.org +[HowToContribute]: https://bugs.ruby-lang.org/projects/ruby/wiki/HowToContribute @@ -1,6 +1,6 @@ Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>. -You can redistribute it and/or modify it under either the terms of the GPL -version 2 (see the file GPL), or the conditions below: +You can redistribute it and/or modify it under either the terms of the +2-clause BSDL (see the file BSDL), or the conditions below: 1. You may make and give away verbatim copies of the source form of the software without restriction, provided that you duplicate all of the @@ -11,8 +11,8 @@ version 2 (see the file GPL), or the conditions below: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said - modifications to Usenet or an equivalent medium, or by allowing - the author to include your modifications in the software. + modifications to Usenet or an equivalent medium, or by allowing + the author to include your modifications in the software. b) use the modified software only within your corporation or organization. @@ -26,11 +26,11 @@ version 2 (see the file GPL), or the conditions below: provided that you do at least ONE of the following: a) distribute the binaries and library files of the software, - together with instructions (in the manual page or equivalent) - on where to get the original distribution. + together with instructions (in the manual page or equivalent) + on where to get the original distribution. b) accompany the distribution with the machine-readable source of - the software. + the software. c) give non-standard binaries non-standard names, with instructions on where to get the original software distribution. @@ -44,9 +44,9 @@ version 2 (see the file GPL), or the conditions below: For the list of those files and their copying conditions, see the file LEGAL. - 5. The scripts and library files supplied as input to or produced as + 5. The scripts and library files supplied as input to or produced as output from the software do not automatically fall under the - copyright of the software, but belong to whomever generated them, + copyright of the software, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this software. diff --git a/COPYING.ja b/COPYING.ja index 933cc7cb9a..e50d01c8d1 100644 --- a/COPYING.ja +++ b/COPYING.ja @@ -1,51 +1,51 @@ -$BK\%W%m%0%i%`$O%U%j!<%=%U%H%&%'%"$G$9!%(BGPL(the GNU General -Public License)$B$^$?$O0J2<$K<($9>r7o$GK\%W%m%0%i%`$r:FG[I[$G(B -$B$-$^$9!%(BGPL$B$K$D$$$F$O(BGPL$B%U%!%$%k$r;2>H$7$F2<$5$$!%(B +本プログラムはフリーソフトウェアです.2-clause BSDL +または以下に示す条件で本プログラムを再配布できます +2-clause BSDLについてはBSDLファイルを参照して下さい. - 1. $BJ#@=$O@)8B$J$/<+M3$G$9!%(B + 1. 複製は制限なく自由です. - 2. $B0J2<$N>r7o$N$$$:$l$+$rK~$?$9;~$KK\%W%m%0%i%`$N%=!<%9$r(B - $B<+M3$KJQ99$G$-$^$9!%(B + 2. 以下の条件のいずれかを満たす時に本プログラムのソースを + 自由に変更できます. - (a) $B%M%C%H%K%e!<%:$K%]%9%H$7$?$j!$:n<T$KJQ99$rAwIU$9$k(B - $B$J$I$NJ}K!$G!$JQ99$r8x3+$9$k!%(B + (a) ネットニューズにポストしたり,作者に変更を送付する + などの方法で,変更を公開する. - (b) $BJQ99$7$?K\%W%m%0%i%`$r<+J,$N=jB0$9$kAH?%FbIt$@$1$G(B - $B;H$&!%(B + (b) 変更した本プログラムを自分の所属する組織内部だけで + 使う. - (c) $BJQ99E@$rL@<($7$?$&$(!$%=%U%H%&%'%"$NL>A0$rJQ99$9$k!%(B - $B$=$N%=%U%H%&%'%"$rG[I[$9$k;~$K$OJQ99A0$NK\%W%m%0%i(B - $B%`$bF1;~$KG[I[$9$k!%$^$?$OJQ99A0$NK\%W%m%0%i%`$N%=!<(B - $B%9$NF~<jK!$rL@<($9$k!%(B + (c) 変更点を明示したうえ,ソフトウェアの名前を変更する. + そのソフトウェアを配布する時には変更前の本プログラ + ムも同時に配布する.または変更前の本プログラムのソー + スの入手法を明示する. - (d) $B$=$NB>$NJQ99>r7o$r:n<T$H9g0U$9$k!%(B + (d) その他の変更条件を作者と合意する. - 3. $B0J2<$N>r7o$N$$$:$l$+$rK~$?$9;~$KK\%W%m%0%i%`$r%3%s%Q%$(B - $B%k$7$?%*%V%8%'%/%H%3!<%I$d<B9T7A<0$G$bG[I[$G$-$^$9!%(B + 3. 以下の条件のいずれかを満たす時に本プログラムをコンパイ + ルしたオブジェクトコードや実行形式でも配布できます. - (a) $B%P%$%J%j$r<u$1<h$C$??M$,%=!<%9$rF~<j$G$-$k$h$&$K!$(B - $B%=!<%9$NF~<jK!$rL@<($9$k!%(B + (a) バイナリを受け取った人がソースを入手できるように, + ソースの入手法を明示する. - (b) $B5!3#2DFI$J%=!<%9%3!<%I$rE:IU$9$k!%(B + (b) 機械可読なソースコードを添付する. - (c) $BJQ99$r9T$C$?%P%$%J%j$OL>A0$rJQ99$7$?$&$(!$%*%j%8%J(B - $B%k$N%=!<%9%3!<%I$NF~<jK!$rL@<($9$k!%(B + (c) 変更を行ったバイナリは名前を変更したうえ,オリジナ + ルのソースコードの入手法を明示する. - (d) $B$=$NB>$NG[I[>r7o$r:n<T$H9g0U$9$k!%(B + (d) その他の配布条件を作者と合意する. - 4. $BB>$N%W%m%0%i%`$X$N0zMQ$O$$$+$J$kL\E*$G$"$l<+M3$G$9!%$?(B - $B$@$7!$K\%W%m%0%i%`$K4^$^$l$kB>$N:n<T$K$h$k%3!<%I$O!$$=(B - $B$l$>$l$N:n<T$N0U8~$K$h$k@)8B$,2C$($i$l$k>l9g$,$"$j$^$9!%(B + 4. 他のプログラムへの引用はいかなる目的であれ自由です.た + だし,本プログラムに含まれる他の作者によるコードは,そ + れぞれの作者の意向による制限が加えられる場合があります. - $B$=$l$i%U%!%$%k$N0lMw$H$=$l$>$l$NG[I[>r7o$J$I$KIU$$$F$O(B - LEGAL$B%U%!%$%k$r;2>H$7$F$/$@$5$$!%(B + それらファイルの一覧とそれぞれの配布条件などに付いては + LEGALファイルを参照してください. - 5. $BK\%W%m%0%i%`$X$NF~NO$H$J$k%9%/%j%W%H$*$h$S!$K\%W%m%0%i(B - $B%`$+$i$N=PNO$N8"Mx$OK\%W%m%0%i%`$N:n<T$G$O$J$/!$$=$l$>(B - $B$l$NF~=PNO$r@8@.$7$??M$KB0$7$^$9!%$^$?!$K\%W%m%0%i%`$K(B - $BAH$_9~$^$l$k$?$a$N3HD%%i%$%V%i%j$K$D$$$F$bF1MM$G$9!%(B + 5. 本プログラムへの入力となるスクリプトおよび,本プログラ + ムからの出力の権利は本プログラムの作者ではなく,それぞ + れの入出力を生成した人に属します.また,本プログラムに + 組み込まれるための拡張ライブラリについても同様です. - 6. $BK\%W%m%0%i%`$OL5J]>Z$G$9!%:n<T$OK\%W%m%0%i%`$r%5%]!<%H(B - $B$9$k0U;V$O$"$j$^$9$,!$%W%m%0%i%`<+?H$N%P%0$"$k$$$OK\%W(B - $B%m%0%i%`$N<B9T$J$I$+$iH/@8$9$k$$$+$J$kB;32$KBP$7$F$b@U(B - $BG$$r;}$A$^$;$s!%(B + 6. 本プログラムは無保証です.作者は本プログラムをサポート + する意志はありますが,プログラム自身のバグあるいは本プ + ログラムの実行などから発生するいかなる損害に対しても責 + 任を持ちません. diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index c83e885980..0000000000 --- a/ChangeLog +++ /dev/null |