1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1075 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2000-12-25 06:29:27 +00:00
parent 8f6673c2d4
commit 99020d6e50
16 changed files with 164 additions and 83 deletions

View file

@ -10,6 +10,36 @@ Mon Dec 25 04:43:02 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
* lib/net/http.rb: does not send HEAD on closing socket. * lib/net/http.rb: does not send HEAD on closing socket.
Mon Dec 25 00:44:48 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* hash.c (rb_any_cmp): should use rb_str_cmp() if TYPE == T_STRING
and CLASS_OF == rb_cString.
* string.c (rb_str_new4): should copy class of original too.
Mon Dec 25 00:04:54 2000 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* eval.c (rb_thread_schedule): initial value of `max' changed to -1.
Fri Dec 22 17:59:30 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* stable version 1.6.2 released.
Mon Dec 25 00:16:14 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* string.c (rb_str_replace_m): copy-on-write replace.
* parse.y (yylex): should handle => after identifier as well as ==
and =~.
Sat Dec 23 23:55:57 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* bignum.c (rb_cstr2inum): Integer("") should not return 0.
Sat Dec 23 11:55:57 2000 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (rb_ary_and): Array#& should preverve original order.
Sat Dec 23 03:44:16 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp> Sat Dec 23 03:44:16 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
* lib/net/protocol.rb: set @closed false in Socket#reopen. * lib/net/protocol.rb: set @closed false in Socket#reopen.
@ -22,9 +52,9 @@ Sat Dec 23 03:44:16 2000 Minero Aoki <aamine@dp.u-netsurf.ne.jp>
* lib/net/http.rb: refactoring. * lib/net/http.rb: refactoring.
Fri Dec 22 17:59:30 2000 Yukihiro Matsumoto <matz@ruby-lang.org> Fri Dec 22 23:11:12 2000 Ueno Katsuhiro <unnie@blue.sky.or.jp>
* stable version 1.6.2 released. * eval.c (rb_feature_p): ext might be null.
Fri Dec 22 17:04:12 2000 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp> Fri Dec 22 17:04:12 2000 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>

View file

@ -237,21 +237,21 @@ win32.@OBJEXT@: $(srcdir)/win32/win32.c
### ###
parse.@OBJEXT@: parse.y ruby.h config.h defines.h intern.h env.h node.h st.h regex.h util.h lex.c parse.@OBJEXT@: parse.y ruby.h config.h defines.h intern.h env.h node.h st.h regex.h util.h lex.c
### ###
array.@OBJEXT@: array.c ruby.h config.h defines.h intern.h st.h array.@OBJEXT@: array.c ruby.h config.h defines.h intern.h util.h st.h
bignum.@OBJEXT@: bignum.c ruby.h config.h defines.h intern.h bignum.@OBJEXT@: bignum.c ruby.h config.h defines.h intern.h
class.@OBJEXT@: class.c ruby.h config.h defines.h intern.h node.h st.h class.@OBJEXT@: class.c ruby.h config.h defines.h intern.h rubysig.h node.h st.h
compar.@OBJEXT@: compar.c ruby.h config.h defines.h intern.h compar.@OBJEXT@: compar.c ruby.h config.h defines.h intern.h
dir.@OBJEXT@: dir.c ruby.h config.h defines.h intern.h dir.@OBJEXT@: dir.c ruby.h config.h defines.h intern.h
dln.@OBJEXT@: dln.c config.h defines.h dln.h dln.@OBJEXT@: dln.c config.h defines.h dln.h
dmyext.@OBJEXT@: dmyext.c dmyext.@OBJEXT@: dmyext.c
enum.@OBJEXT@: enum.c ruby.h config.h defines.h intern.h enum.@OBJEXT@: enum.c ruby.h config.h defines.h intern.h node.h
error.@OBJEXT@: error.c ruby.h config.h defines.h intern.h env.h version.h error.@OBJEXT@: error.c ruby.h config.h defines.h intern.h env.h version.h
eval.@OBJEXT@: eval.c ruby.h config.h defines.h intern.h node.h env.h rubysig.h st.h dln.h eval.@OBJEXT@: eval.c ruby.h config.h defines.h intern.h node.h env.h rubysig.h st.h dln.h
file.@OBJEXT@: file.c ruby.h config.h defines.h intern.h rubyio.h rubysig.h file.@OBJEXT@: file.c ruby.h config.h defines.h intern.h rubyio.h rubysig.h dln.h
gc.@OBJEXT@: gc.c ruby.h config.h defines.h intern.h rubysig.h st.h node.h env.h re.h regex.h gc.@OBJEXT@: gc.c ruby.h config.h defines.h intern.h rubysig.h st.h node.h env.h re.h regex.h
hash.@OBJEXT@: hash.c ruby.h config.h defines.h intern.h st.h rubysig.h util.h hash.@OBJEXT@: hash.c ruby.h config.h defines.h intern.h st.h rubysig.h util.h
inits.@OBJEXT@: inits.c ruby.h config.h defines.h intern.h inits.@OBJEXT@: inits.c ruby.h config.h defines.h intern.h
io.@OBJEXT@: io.c ruby.h config.h defines.h intern.h rubyio.h rubysig.h env.h io.@OBJEXT@: io.c ruby.h config.h defines.h intern.h rubyio.h rubysig.h env.h util.h
main.@OBJEXT@: main.c ruby.h config.h defines.h intern.h main.@OBJEXT@: main.c ruby.h config.h defines.h intern.h
marshal.@OBJEXT@: marshal.c ruby.h config.h defines.h intern.h rubyio.h st.h marshal.@OBJEXT@: marshal.c ruby.h config.h defines.h intern.h rubyio.h st.h
prec.@OBJEXT@: prec.c ruby.h config.h defines.h intern.h prec.@OBJEXT@: prec.c ruby.h config.h defines.h intern.h
@ -263,8 +263,8 @@ process.@OBJEXT@: process.c ruby.h config.h defines.h intern.h rubysig.h st.h
random.@OBJEXT@: random.c ruby.h config.h defines.h intern.h random.@OBJEXT@: random.c ruby.h config.h defines.h intern.h
range.@OBJEXT@: range.c ruby.h config.h defines.h intern.h range.@OBJEXT@: range.c ruby.h config.h defines.h intern.h
re.@OBJEXT@: re.c ruby.h config.h defines.h intern.h re.h regex.h re.@OBJEXT@: re.c ruby.h config.h defines.h intern.h re.h regex.h
regex.@OBJEXT@: regex.c config.h regex.h util.h regex.@OBJEXT@: regex.c config.h regex.h
ruby.@OBJEXT@: ruby.c ruby.h config.h defines.h intern.h dln.h util.h ruby.@OBJEXT@: ruby.c ruby.h config.h defines.h intern.h dln.h node.h util.h
signal.@OBJEXT@: signal.c ruby.h config.h defines.h intern.h rubysig.h signal.@OBJEXT@: signal.c ruby.h config.h defines.h intern.h rubysig.h
sprintf.@OBJEXT@: sprintf.c ruby.h config.h defines.h intern.h sprintf.@OBJEXT@: sprintf.c ruby.h config.h defines.h intern.h
st.@OBJEXT@: st.c config.h st.h st.@OBJEXT@: st.c config.h st.h

1
ToDo
View file

@ -51,6 +51,7 @@ Hacking Interpreter
* export rb_io_{addstr,printf,puts,print} * export rb_io_{addstr,printf,puts,print}
* autoload should work with threads [ruby-talk:4589] * autoload should work with threads [ruby-talk:4589]
* remove stdio dependency from IOs. * remove stdio dependency from IOs.
* warn for inconsistent local variable usage (lv m and method m at the same time).
Standard Libraries Standard Libraries

View file

@ -1463,9 +1463,6 @@ rb_ary_and(ary1, ary2)
long i; long i;
ary2 = to_ary(ary2); ary2 = to_ary(ary2);
if (RARRAY(ary1)->len < RARRAY(ary2)->len) { /* swap */
VALUE tmp = ary1; ary1 = ary2; ary2 = tmp;
}
hash = ary_make_hash(ary2, 0); hash = ary_make_hash(ary2, 0);
for (i=0; i<RARRAY(ary1)->len; i++) { for (i=0; i<RARRAY(ary1)->len; i++) {

View file

@ -219,12 +219,8 @@ rb_cstr2inum(str, base)
} }
else { else {
base = 8; base = 8;
if (!str[1]) return INT2FIX(0);
} }
} }
else if (str[0] == 0) {
return INT2FIX(0);
}
else { else {
base = 10; base = 10;
} }
@ -256,7 +252,7 @@ rb_cstr2inum(str, base)
while (*end && ISSPACE(*end)) end++; while (*end && ISSPACE(*end)) end++;
if (*end) { /* trailing garbage */ if (*end) { /* trailing garbage */
bad: bad:
rb_raise(rb_eArgError, "invalid literal for Integer: %s", s); rb_raise(rb_eArgError, "invalid value for Integer: \"%s\"", s);
} }
} }
@ -282,28 +278,28 @@ rb_cstr2inum(str, base)
for (i=len;i--;) zds[i]=0; for (i=len;i--;) zds[i]=0;
while (c = *str++) { while (c = *str++) {
switch (c) { switch (c) {
case '8': case '9':
if (base == 8) {
c = base;
break;
}
case '0': case '1': case '2': case '3': case '4': case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case '5': case '6': case '7':
c = c - '0'; c = c - '0';
break; break;
case 'a': case 'b': case 'c': case 'a': case 'b': case 'c':
case 'd': case 'e': case 'f': case 'd': case 'e': case 'f':
c = c - 'a' + 10; if (base != 16) c = base;
else c = c - 'a' + 10;
break; break;
case 'A': case 'B': case 'C': case 'A': case 'B': case 'C':
case 'D': case 'E': case 'F': case 'D': case 'E': case 'F':
c = c - 'A' + 10; if (base != 16) c = base;
else c = c - 'A' + 10;
break; break;
case '_': case '_':
continue; continue;
default: default:
if (badcheck) {
if (ISSPACE(c)) {
while (*str && ISSPACE(*str)) str++;
if (!*str) break;
}
rb_raise(rb_eArgError, "invalid literal for Integer: %s", s);
}
c = base; c = base;
break; break;
} }
@ -323,7 +319,14 @@ rb_cstr2inum(str, base)
break; break;
} }
} }
if (badcheck && s+2 < str && str[-2] == '_') goto bad; if (badcheck) {
str--;
if (s+1 < str && str[-1] == '_') goto bad;
if (ISSPACE(c)) {
while (*str && ISSPACE(*str)) str++;
}
if (*str) goto bad;
}
return bignorm(z); return bignorm(z);
} }

6
eval.c
View file

@ -5162,7 +5162,7 @@ rb_feature_p(feature, wait)
load_wait: load_wait:
if (loading_tbl) { if (loading_tbl) {
char *ext = strrchr(f, '.'); char *ext = strrchr(f, '.');
if (strcmp(ext, ".rb") == 0) { if (ext && strcmp(ext, ".rb") == 0) {
rb_thread_t th; rb_thread_t th;
while (st_lookup(loading_tbl, f, &th)) { while (st_lookup(loading_tbl, f, &th)) {
@ -7177,7 +7177,7 @@ rb_thread_schedule()
} }
again: again:
max = 0; max = -1;
FD_ZERO(&readfds); FD_ZERO(&readfds);
FD_ZERO(&writefds); FD_ZERO(&writefds);
FD_ZERO(&exceptfds); FD_ZERO(&exceptfds);
@ -8332,6 +8332,7 @@ rb_thread_inspect(thread)
void void
rb_thread_atfork() rb_thread_atfork()
{ {
#if 0 /* enable on 1.7 */
rb_thread_t th; rb_thread_t th;
if (rb_thread_alone()) return; if (rb_thread_alone()) return;
@ -8344,6 +8345,7 @@ rb_thread_atfork()
main_thread = curr_thread; main_thread = curr_thread;
curr_thread->next = curr_thread; curr_thread->next = curr_thread;
curr_thread->prev = curr_thread; curr_thread->prev = curr_thread;
#endif
} }
static VALUE rb_cCont; static VALUE rb_cCont;

13
hash.c
View file

@ -59,11 +59,15 @@ rb_any_cmp(a, b)
VALUE a, b; VALUE a, b;
{ {
VALUE args[2]; VALUE args[2];
if (FIXNUM_P(a)) { if (FIXNUM_P(a) && FIXNUM_P(b)) {
if (FIXNUM_P(b)) return a != b; return a != b;
} }
else if (TYPE(a) == T_STRING) { if (TYPE(a) == T_STRING && RBASIC(a)->klass == rb_cString &&
if (TYPE(b) == T_STRING) return rb_str_cmp(a, b); TYPE(b) == T_STRING && RBASIC(b)->klass == rb_cString) {
return rb_str_cmp(a, b);
}
if (SYMBOL_P(a) && SYMBOL_P(b)) {
return a != b;
} }
args[0] = a; args[0] = a;
@ -79,6 +83,7 @@ rb_any_hash(a)
switch (TYPE(a)) { switch (TYPE(a)) {
case T_FIXNUM: case T_FIXNUM:
case T_SYMBOL:
hval = a; hval = a;
break; break;

View file

@ -202,6 +202,7 @@ class Date
for id in ids for id in ids
module_eval <<-"end;" module_eval <<-"end;"
alias_method :__#{id.to_i}__, :#{id.id2name} alias_method :__#{id.to_i}__, :#{id.id2name}
private :__#{id.to_i}__
def #{id.id2name}(*args, &block) def #{id.id2name}(*args, &block)
(@__#{id.to_i}__ ||= [__#{id.to_i}__(*args, &block)])[0] (@__#{id.to_i}__ ||= [__#{id.to_i}__(*args, &block)])[0]
end end

View file

@ -44,7 +44,7 @@ else
end end
LINK = "#{CONFIG['CC']} -o conftest -I#{$hdrdir} #{CFLAGS} -I#{CONFIG['includedir']} %s #{CONFIG['LDFLAGS']} %s conftest.c %s %s #{CONFIG['LIBS']}" LINK = "#{CONFIG['CC']} -o conftest -I#{$hdrdir} #{CFLAGS} -I#{CONFIG['includedir']} %s #{CONFIG['LDFLAGS']} %s conftest.c %s %s #{CONFIG['LIBS']}"
CPP = "#{CONFIG['CPP']} -E -I#{$hdrdir} #{CFLAGS} -I#{CONFIG['includedir']} %s %s conftest.c" CPP = "#{CONFIG['CPP']} -E %s -I#{$hdrdir} #{CFLAGS} -I#{CONFIG['includedir']} %s %s conftest.c"
def rm_f(*files) def rm_f(*files)
targets = [] targets = []
@ -104,7 +104,7 @@ def try_cpp(src, opt="")
cfile.print src cfile.print src
cfile.close cfile.close
begin begin
xsystem(format(CPP, $CFLAGS, opt)) xsystem(format(CPP, $CPPFLAGS, $CFLAGS, opt))
ensure ensure
rm_f "conftest*" rm_f "conftest*"
end end
@ -115,7 +115,7 @@ def egrep_cpp(pat, src, opt="")
cfile.print src cfile.print src
cfile.close cfile.close
begin begin
xsystem(format(CPP+"|egrep #{pat}", $CFLAGS, opt)) xsystem(format(CPP+"|egrep #{pat}", $CPPFLAGS, $CFLAGS, opt))
ensure ensure
rm_f "conftest*" rm_f "conftest*"
end end

View file

@ -16,10 +16,10 @@ module Singleton
klass.instance_eval %{ klass.instance_eval %{
@__instance__ = nil @__instance__ = nil
def instance def instance
Thread.critical = true
unless @__instance__ unless @__instance__
Thread.critical = true
begin begin
@__instance__ = new @__instance__ ||= new
ensure ensure
Thread.critical = false Thread.critical = false
end end

View file

@ -663,13 +663,14 @@ An end of a defun is found by moving forward from the beginning of one."
(or (boundp 'font-lock-variable-name-face) (or (boundp 'font-lock-variable-name-face)
(setq font-lock-variable-name-face font-lock-type-face)) (setq font-lock-variable-name-face font-lock-type-face))
(add-hook 'ruby-mode-hook (add-hook 'ruby-mode-hook
'(lambda () '(lambda ()
(make-local-variable 'font-lock-syntactic-keywords) (make-local-variable 'font-lock-syntactic-keywords)
(setq font-lock-syntactic-keywords (setq font-lock-syntactic-keywords
'(("\\$\\([#\"'`$\\]\\)" 1 (1 . nil)) '(("\\$\\([#\"'`$\\]\\)" 1 (1 . nil))
("\\(#\\)[{$@]" 1 (1 . nil)) ("\\(#\\)[{$@]" 1 (1 . nil))
("\\(/\\)\\([^/]\\|\\\\/\\)*\\(/\\)" ("\\(/\\)\\([^/\n]\\|\\\\/\\)*\\(/\\)"
(1 (7 . ?')) (1 (7 . ?'))
(3 (7 . ?'))))) (3 (7 . ?')))))
(make-local-variable 'font-lock-defaults) (make-local-variable 'font-lock-defaults)

View file

@ -15,6 +15,7 @@
#include "ruby.h" #include "ruby.h"
#include "st.h" #include "st.h"
#include <stdio.h> #include <stdio.h>
#include <errno.h>
VALUE rb_mKernel; VALUE rb_mKernel;
VALUE rb_cObject; VALUE rb_cObject;
@ -946,6 +947,48 @@ rb_Float(val)
case T_BIGNUM: case T_BIGNUM:
return rb_float_new(rb_big2dbl(val)); return rb_float_new(rb_big2dbl(val));
case T_STRING:
{
char *q, *p, *end;
double d;
q = p = STR2CSTR(val);
while (*p && ISSPACE(*p)) p++;
again:
d = strtod(p, &end);
if (p == end) {
bad:
rb_raise(rb_eArgError, "invalid value for Float: \"%s\"", q);
}
if (*end) {
if (*end == '_') {
char *buf = ALLOCA_N(char, strlen(p));
char *n = buf, *last;
while (*p) {
if (*p == '_') {
last = ++p;
continue;
}
*n++ = *p++;
}
while (*last && (*last == '_' || ISSPACE(*last)))
last++;
if (!*last) goto bad;
*n = '\0';
p = buf;
goto again;
}
while (*end && ISSPACE(*end)) end++;
if (*end) goto bad;
}
if (errno == ERANGE) {
errno = 0;
rb_raise(rb_eArgError, "Float %s out of range", p);
}
return rb_float_new(d);
}
case T_NIL: case T_NIL:
return rb_float_new(0.0); return rb_float_new(0.0);

11
parse.y
View file

@ -3244,7 +3244,9 @@ yylex()
tokadd(c); tokadd(c);
seen_e++; seen_e++;
is_float++; is_float++;
if ((c = nextc()) == '-' || c == '+') while ((c = nextc()) == '_')
seen_uc = 1;
if (c == '-' || c == '+')
tokadd(c); tokadd(c);
else else
continue; continue;
@ -3628,7 +3630,12 @@ yylex()
} }
else { else {
if (lex_state == EXPR_FNAME) { if (lex_state == EXPR_FNAME) {
if ((c = nextc()) == '=' && !peek('=') && !peek('~')) { #if 0
if ((c = nextc()) == '=' && !peek('=') && !peek('~') && !peek('>')) {
#else
if ((c = nextc()) == '=' && !peek('~') && !peek('>') &&
(!peek('=') || lex_p + 1 < lex_pend && lex_p[1] == '>')) {
#endif
result = tIDENTIFIER; result = tIDENTIFIER;
tokadd(c); tokadd(c);
} }

View file

@ -530,21 +530,6 @@ rb_f_exec(argc, argv)
return Qnil; /* dummy */ return Qnil; /* dummy */
} }
static VALUE
fork_rescue(data, errinfo)
VALUE data, errinfo;
{
int status = 1;
if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
VALUE st = rb_iv_get(errinfo, "status");
status = NUM2INT(st);
}
ruby_finalize();
_exit(status);
}
static VALUE static VALUE
rb_f_fork(obj) rb_f_fork(obj)
VALUE obj; VALUE obj;
@ -560,15 +545,10 @@ rb_f_fork(obj)
#endif #endif
rb_thread_atfork(); rb_thread_atfork();
if (rb_block_given_p()) { if (rb_block_given_p()) {
#if 0
rb_rescue2(rb_yield, Qnil, fork_rescue, 0, rb_eException, 0);
_exit(0);
#else
int status; int status;
rb_protect(rb_yield, Qnil, &status); rb_protect(rb_yield, Qnil, &status);
ruby_stop(status); ruby_stop(status);
#endif
} }
return Qnil; return Qnil;

View file

@ -97,19 +97,29 @@ VALUE
rb_str_new4(orig) rb_str_new4(orig)
VALUE orig; VALUE orig;
{ {
if (OBJ_FROZEN(orig)) return orig; VALUE klass;
if (RSTRING(orig)->orig) {
if (FL_TEST(orig, STR_NO_ORIG)) { klass = CLASS_OF(orig);
orig = rb_str_new(RSTRING(orig)->ptr, RSTRING(orig)->len); while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) {
OBJ_FREEZE(orig); klass = (VALUE)RCLASS(klass)->super;
return orig;
} }
OBJ_FREEZE(RSTRING(orig)->orig);
return RSTRING(orig)->orig; if (RSTRING(orig)->orig) {
VALUE str;
if (FL_TEST(orig, STR_NO_ORIG)) {
str = rb_str_new(RSTRING(orig)->ptr, RSTRING(orig)->len);
}
else {
str = rb_str_new3(RSTRING(orig)->orig);
}
OBJ_FREEZE(str);
RBASIC(str)->klass = klass;
return str;
} }
else { else {
NEWOBJ(str, struct RString); NEWOBJ(str, struct RString);
OBJSETUP(str, rb_cString, T_STRING); OBJSETUP(str, klass, T_STRING);
str->len = RSTRING(orig)->len; str->len = RSTRING(orig)->len;
str->ptr = RSTRING(orig)->ptr; str->ptr = RSTRING(orig)->ptr;
@ -203,14 +213,7 @@ rb_str_dup(str)
str2 = rb_str_new3(RSTRING(str)->orig); str2 = rb_str_new3(RSTRING(str)->orig);
} }
else { else {
NEWOBJ(dup, struct RString); str2 = rb_str_new3(rb_str_new4(str));
OBJSETUP(dup, klass, T_STRING);
str2 = rb_str_new4(str);
dup->len = RSTRING(str2)->len;
dup->ptr = RSTRING(str2)->ptr;
dup->orig = str2;
str2 = (VALUE)dup;
} }
OBJ_INFECT(str2, str); OBJ_INFECT(str2, str);
RBASIC(str2)->klass = klass; RBASIC(str2)->klass = klass;
@ -1315,10 +1318,18 @@ rb_str_replace_m(str, str2)
{ {
if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2); if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2);
rb_str_modify(str); rb_str_modify(str);
if (RSTRING(str2)->orig && FL_TEST(str2, STR_NO_ORIG)) {
RSTRING(str)->len = RSTRING(str2)->len;
RSTRING(str)->ptr = RSTRING(str2)->ptr;
RSTRING(str)->orig = RSTRING(str2)->orig;
}
else {
rb_str_resize(str, RSTRING(str2)->len); rb_str_resize(str, RSTRING(str2)->len);
memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len); memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len);
if (OBJ_TAINTED(str2)) OBJ_TAINT(str); }
if (OBJ_TAINTED(str2)) OBJ_TAINT(str);
return str; return str;
} }

View file

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.6.2" #define RUBY_VERSION "1.6.2"
#define RUBY_RELEASE_DATE "2000-12-22" #define RUBY_RELEASE_DATE "2000-12-25"
#define RUBY_VERSION_CODE 162 #define RUBY_VERSION_CODE 162
#define RUBY_RELEASE_CODE 20001222 #define RUBY_RELEASE_CODE 20001225