1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* object.c (rb_str_to_dbl): RString ptr might be NULL.

* object.c (rb_cstr_to_dbl): p pointer might be NULL.

* bignum.c (rb_str_to_inum): RString ptr might be NULL.

* bignum.c (rb_cstr_to_inum): str pointer might be NULL.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2965 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2002-10-17 07:27:00 +00:00
parent e6c0ea3e09
commit 66d1582c07
6 changed files with 59 additions and 23 deletions

View file

@ -17,11 +17,28 @@ Wed Oct 16 13:36:29 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* variable.c (rb_alias_variable): ditto. * variable.c (rb_alias_variable): ditto.
Wed Oct 16 01:03:54 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* object.c (rb_str_to_dbl): RString ptr might be NULL.
* object.c (rb_cstr_to_dbl): p pointer might be NULL.
* bignum.c (rb_str_to_inum): RString ptr might be NULL.
* bignum.c (rb_cstr_to_inum): str pointer might be NULL.
Sat Oct 12 23:44:11 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net> Sat Oct 12 23:44:11 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* win32/win32.c (rb_w32_putc): wrong condition to fill or flush on * win32/win32.c (rb_w32_putc): wrong condition to fill or flush on
bccwin32. [ruby-win32:408] bccwin32. [ruby-win32:408]
Fri Oct 11 15:58:06 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (arg): rescue modifier is now an operator with
precedence right below assignments. i.e. "a = b rescue c" now
parsed as "a = (b rescue c)", not as "(a = b) rescue c". [new]
[experimental]
Fri Oct 11 06:05:30 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net> Fri Oct 11 06:05:30 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* win32/win32.c (rb_w32_fclose, rb_w32_close): use closesocket() * win32/win32.c (rb_w32_fclose, rb_w32_close): use closesocket()

View file

@ -319,6 +319,10 @@ rb_cstr_to_inum(str, base, badcheck)
VALUE z; VALUE z;
BDIGIT *zds; BDIGIT *zds;
if (!str) {
if (badcheck) goto bad;
return INT2FIX(0);
}
if (badcheck) { if (badcheck) {
while (ISSPACE(*str)) str++; while (ISSPACE(*str)) str++;
} }
@ -501,16 +505,18 @@ rb_str_to_inum(str, base, badcheck)
StringValue(str); StringValue(str);
s = RSTRING(str)->ptr; s = RSTRING(str)->ptr;
len = RSTRING(str)->len; if (s) {
if (s[len]) { /* no sentinel somehow */ len = RSTRING(str)->len;
char *p = ALLOCA_N(char, len+1); if (s[len]) { /* no sentinel somehow */
char *p = ALLOCA_N(char, len+1);
MEMCPY(p, s, char, len); MEMCPY(p, s, char, len);
p[len] = '\0'; p[len] = '\0';
s = p; s = p;
} }
if (badcheck && len != strlen(s)) { if (badcheck && len != strlen(s)) {
rb_raise(rb_eArgError, "string for Integer contains null byte"); rb_raise(rb_eArgError, "string for Integer contains null byte");
}
} }
return rb_cstr_to_inum(s, base, badcheck); return rb_cstr_to_inum(s, base, badcheck);
} }

2
gc.c
View file

@ -991,7 +991,7 @@ gc_sweep()
} }
} }
} }
for (i = j = 0; j < heaps_used; i++) { for (i = j = 1; j < heaps_used; i++) {
if (heaps_limits[i] == 0) { if (heaps_limits[i] == 0) {
free(heaps[i]); free(heaps[i]);
heaps_used--; heaps_used--;

View file

@ -476,6 +476,11 @@ All arguments named KEY is case-insensitive.
: self[ key ] = val : self[ key ] = val
sets the header field corresponding to the case-insensitive key. sets the header field corresponding to the case-insensitive key.
: fetch( key [,default] )
returns the header field corresponding to the case-insensitive key.
returns the default value if there's no header field named key.
: key?( key ) : key?( key )
true if key exists. true if key exists.
KEY is case insensitive. KEY is case insensitive.
@ -923,6 +928,10 @@ module Net
@header.delete key.downcase @header.delete key.downcase
end end
def fetch(*args)
@header.fetch(*args)
end
def key?( key ) def key?( key )
@header.key? key.downcase @header.key? key.downcase
end end

View file

@ -1031,6 +1031,7 @@ rb_cstr_to_dbl(p, badcheck)
char *end; char *end;
double d; double d;
if (!p) return 0.0;
q = p; q = p;
if (badcheck) { if (badcheck) {
while (ISSPACE(*p)) p++; while (ISSPACE(*p)) p++;
@ -1093,15 +1094,17 @@ rb_str_to_dbl(str, badcheck)
StringValue(str); StringValue(str);
s = RSTRING(str)->ptr; s = RSTRING(str)->ptr;
len = RSTRING(str)->len; len = RSTRING(str)->len;
if (s[len]) { /* no sentinel somehow */ if (s) {
char *p = ALLOCA_N(char, len+1); if (s[len]) { /* no sentinel somehow */
char *p = ALLOCA_N(char, len+1);
MEMCPY(p, s, char, len); MEMCPY(p, s, char, len);
p[len] = '\0'; p[len] = '\0';
s = p; s = p;
} }
if (badcheck && len != strlen(s)) { if (badcheck && len != strlen(s)) {
rb_raise(rb_eArgError, "string for Float contains null byte"); rb_raise(rb_eArgError, "string for Float contains null byte");
}
} }
return rb_cstr_to_dbl(s, badcheck); return rb_cstr_to_dbl(s, badcheck);
} }

11
parse.y
View file

@ -282,11 +282,12 @@ static void top_local_setup();
* precedence table * precedence table
*/ */
%left kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD kRESCUE_MOD %left kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
%left kOR kAND %left kOR kAND
%right kNOT %right kNOT
%nonassoc kDEFINED %nonassoc kDEFINED
%right '=' tOP_ASGN %right '=' tOP_ASGN
%left kRESCUE_MOD
%right '?' ':' %right '?' ':'
%nonassoc tDOT2 tDOT3 %nonassoc tDOT2 tDOT3
%left tOROP %left tOROP
@ -423,10 +424,6 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
$$ = NEW_UNTIL(cond($3), $1, 1); $$ = NEW_UNTIL(cond($3), $1, 1);
} }
} }
| stmt kRESCUE_MOD stmt
{
$$ = NEW_RESCUE($1, NEW_RESBODY(0,$3,0), 0);
}
| klBEGIN | klBEGIN
{ {
if (in_def || in_single) { if (in_def || in_single) {
@ -1039,6 +1036,10 @@ arg : lhs '=' arg
{ {
$$ = logop(NODE_OR, $1, $3); $$ = logop(NODE_OR, $1, $3);
} }
| arg kRESCUE_MOD arg
{
$$ = NEW_RESCUE($1, NEW_RESBODY(0,$3,0), 0);
}
| kDEFINED opt_nl {in_defined = 1;} arg | kDEFINED opt_nl {in_defined = 1;} arg
{ {
in_defined = 0; in_defined = 0;