summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-26 07:43:11 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-26 07:43:11 +0000
commiteeb804f153eff4bde9fc528414bfd9c8c8e343a1 (patch)
tree07f08eec5e3161b54324f0bdbe38f9ac4ed42f1c
parentba2d46829afada0ecc878df16b04078b13c6cfd9 (diff)
*** empty log message ***
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@92 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--lib/thread.rb48
-rw-r--r--parse.y28
-rw-r--r--version.h2
3 files changed, 66 insertions, 12 deletions
diff --git a/lib/thread.rb b/lib/thread.rb
index 5262ec539d..c33333f5f3 100644
--- a/lib/thread.rb
+++ b/lib/thread.rb
@@ -69,9 +69,37 @@ class Mutex
unlock
end
end
+end
- def num_waiting
- @waiting.size
+class ConditionVariable
+ def initialize
+ @waiters = []
+ @waiters_mutex = Mutex.new
+ end
+
+ def wait(mutex)
+ mutex.unlock
+ @waiters_mutex.synchronize {
+ @waiters.push(Thread.current)
+ }
+ Thread.stop
+ mutex.lock
+ end
+
+ def signal
+ @waiters_mutex.synchronize {
+ t = @waiters.shift
+ t.run if t
+ }
+ end
+
+ def broadcast
+ @waiters_mutex.synchronize {
+ for t in @waiters
+ t.run
+ end
+ @waiters.clear
+ }
end
end
@@ -116,6 +144,11 @@ class Queue
@que.length
end
alias size length
+
+
+ def num_waiting
+ @waiting.size
+ end
end
class SizedQueue<Queue
@@ -130,19 +163,20 @@ class SizedQueue<Queue
end
def max=(max)
+ Thread.critical = TRUE
if @max >= max
@max = max
+ Thread.critical = FALSE
else
- Thread.critical = TRUE
diff = max - @max
@max = max
+ Thread.critical = FALSE
diff.times do
t = @queue_wait.shift
t.run if t
end
- Thread.critical = FALSE
- @max
end
+ max
end
def push(obj)
@@ -150,6 +184,7 @@ class SizedQueue<Queue
while @que.length >= @max
@queue_wait.push Thread.current
Thread.stop
+ Thread.critical = true
end
super
end
@@ -160,8 +195,7 @@ class SizedQueue<Queue
t = @queue_wait.shift
t.run if t
end
- pop = super
- pop
+ super
end
def num_waiting
diff --git a/parse.y b/parse.y
index d36c3f7f54..e34eb57c6f 100644
--- a/parse.y
+++ b/parse.y
@@ -485,6 +485,11 @@ fname : IDENTIFIER
lex_state = EXPR_END;
$$ = $1;
}
+ | reswords
+ {
+ lex_state = EXPR_END;
+ $$ = $<id>1;
+ }
undef_list : fname
{
@@ -523,6 +528,14 @@ op : DOT2 { $$ = DOT2; }
| ASET { $$ = ASET; }
| '`' { $$ = '`'; }
+reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND
+ | kALIAS | kAND | kBEGIN | kBREAK | kCASE | kCLASS | kDEF
+ | kDEFINED | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE
+ | kFOR | kIF_MOD | kIN | kMODULE | kNEXT | kNIL | kNOT
+ | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF | kSUPER
+ | kTHEN | kTRUE | kUNDEF | kUNLESS_MOD | kUNTIL_MOD | kWHEN
+ | kWHILE_MOD | kYIELD
+
arg : variable '=' arg
{
value_expr($3);
@@ -2586,12 +2599,16 @@ retry:
case ':':
c = nextc();
if (c == ':') {
- if (lex_state == EXPR_BEG ||
- (lex_state == EXPR_ARG && space_seen)) {
+ if (lex_state == EXPR_BEG) {
lex_state = EXPR_BEG;
return COLON3;
}
- lex_state = EXPR_BEG;
+ if (lex_state == EXPR_ARG && space_seen) {
+ arg_ambiguous();
+ lex_state = EXPR_BEG;
+ return COLON3;
+ }
+ lex_state = EXPR_DOT;
return COLON2;
}
pushback(c);
@@ -2877,12 +2894,15 @@ retry:
result = IVAR;
break;
default:
- if (lex_state != EXPR_FNAME && lex_state != EXPR_DOT) {
+ if (lex_state != EXPR_DOT) {
/* See if it is a reserved word. */
kw = rb_reserved_word(tok(), toklen());
if (kw) {
enum lex_state state = lex_state;
lex_state = kw->state;
+ if (lex_state == EXPR_FNAME) {
+ yylval.id = rb_intern(kw->name);
+ }
return kw->id[state != EXPR_BEG];
}
}
diff --git a/version.h b/version.h
index 35baa59bd0..37659375ac 100644
--- a/version.h
+++ b/version.h
@@ -1,2 +1,2 @@
-#define RUBY_VERSION "1.1b8"
+#define RUBY_VERSION "1.1b8_00"
#define VERSION_DATE "98/02/20"