summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-01-31 03:15:33 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-01-31 03:15:33 +0000
commitf758195486cbe49c647140a9e1c5623eeebbeaac (patch)
tree7d2c78d56467677cf1787452c3e630229c9bf4bb
parente13bfb15096a9d12e93055fbe6526d15bc54e20c (diff)
* parse.y (yylex): remove EXPR_CMDARG according to the RHG book.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3425 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--error.c3
-rw-r--r--parse.y25
-rw-r--r--random.c5
-rw-r--r--string.c21
5 files changed, 31 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index f30373b9e4..31b151aa57 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -82,6 +82,10 @@ Sun Jan 26 03:37:18 2003 Akinori MUSHA <knu@iDaemons.org>
is used with extra arguments given. Tested with FreeBSD and
Linux by me and mswin32, bccwin32 and mingw by usa.
+Sat Jan 25 21:04:57 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * parse.y (yylex): remove EXPR_CMDARG according to the RHG book.
+
Fri Jan 24 18:15:33 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y: tMINUS should have lower precedence than tPOW.
diff --git a/error.c b/error.c
index fc4e08ff07..1121c8fdfd 100644
--- a/error.c
+++ b/error.c
@@ -490,7 +490,8 @@ set_syserr(n, name)
}
static VALUE
-get_syserr(int n)
+get_syserr(n)
+ int n;
{
VALUE error;
diff --git a/parse.y b/parse.y
index 3adbecf502..00be37375f 100644
--- a/parse.y
+++ b/parse.y
@@ -68,7 +68,6 @@ static enum lex_state {
EXPR_BEG, /* ignore newline, +/- is a sign. */
EXPR_END, /* newline significant, +/- is a operator. */
EXPR_ARG, /* newline significant, +/- is a operator. */
- EXPR_CMDARG, /* newline significant, +/- is a operator. */
EXPR_ENDARG, /* newline significant, +/- is a operator. */
EXPR_MID, /* newline significant, +/- is a operator. */
EXPR_FNAME, /* ignore newline, no reserved words. */
@@ -3240,7 +3239,7 @@ arg_ambiguous()
rb_warning("ambiguous first argument; make sure");
}
-#define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG)
+#define IS_ARG() (lex_state == EXPR_ARG)
static int
yylex()
@@ -3464,10 +3463,7 @@ yylex()
return c;
}
if (lex_state == EXPR_DOT) {
- if (cmd_state)
- lex_state = EXPR_CMDARG;
- else
- lex_state = EXPR_ARG;
+ lex_state = EXPR_ARG;
return c;
}
lex_strterm = NEW_STRTERM(str_xquote, '`', 0);
@@ -3998,10 +3994,7 @@ yylex()
c = tLPAREN;
}
else if (space_seen) {
- if (lex_state == EXPR_CMDARG) {
- c = tLPAREN_ARG;
- }
- else if (lex_state == EXPR_ARG) {
+ if (lex_state == EXPR_ARG) {
c = tLPAREN_ARG;
yylval.id = last_id;
}
@@ -4350,7 +4343,7 @@ yylex()
}
if (kw->id[0] == kDO) {
if (COND_P()) return kDO_COND;
- if (CMDARG_P() && state != EXPR_CMDARG)
+ if (CMDARG_P())
return kDO_BLOCK;
if (state == EXPR_ENDARG)
return kDO_BLOCK;
@@ -4369,14 +4362,8 @@ yylex()
if (lex_state == EXPR_BEG ||
lex_state == EXPR_MID ||
lex_state == EXPR_DOT ||
- lex_state == EXPR_ARG ||
- lex_state == EXPR_CMDARG) {
- if (cmd_state) {
- lex_state = EXPR_CMDARG;
- }
- else {
- lex_state = EXPR_ARG;
- }
+ lex_state == EXPR_ARG) {
+ lex_state = EXPR_ARG;
}
else {
lex_state = EXPR_END;
diff --git a/random.c b/random.c
index b202a0244f..72fb4545ba 100644
--- a/random.c
+++ b/random.c
@@ -214,6 +214,8 @@ rb_f_rand(argc, argv, obj)
}
vmax = rb_dbl2big(RFLOAT(vmax)->value);
/* fall through */
+ case T_BIGNUM:
+ bignum:
{
long len = RBIGNUM(vmax)->len;
double *buf = ALLOCA_N(double, len);
@@ -227,6 +229,9 @@ rb_f_rand(argc, argv, obj)
max = 0;
break;
default:
+ vmax = rb_Integer(vmax);
+ if (TYPE(vmax) == T_BIGNUM) goto bignum:
+ case T_FIXNUM:
max = NUM2LONG(vmax);
break;
}
diff --git a/string.c b/string.c
index 47026d40f3..cc82c7fb57 100644
--- a/string.c
+++ b/string.c
@@ -892,10 +892,6 @@ rb_str_index_m(argc, argv, str)
pos = rb_reg_search(sub, str, pos, 0);
break;
- case T_STRING:
- pos = rb_str_index(str, sub, pos);
- break;
-
case T_FIXNUM:
{
int c = FIX2INT(sub);
@@ -908,9 +904,20 @@ rb_str_index_m(argc, argv, str)
return Qnil;
}
- default:
- rb_raise(rb_eTypeError, "type mismatch: %s given",
- rb_class2name(CLASS_OF(sub)));
+ default: {
+ VALUE tmp;
+
+ tmp = rb_check_string_type(sub);
+ if (NIL_P(tmp)) {
+ rb_raise(rb_eTypeError, "type mismatch: %s given",
+ rb_class2name(CLASS_OF(sub)));
+ }
+ sub = tmp;
+ }
+ /* fall through */
+ case T_STRING:
+ pos = rb_str_index(str, sub, pos);
+ break;
}
if (pos == -1) return Qnil;