summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--eval.c15
-rw-r--r--ext/extmk.rb12
-rw-r--r--lib/optparse.rb18
-rw-r--r--parse.y8
-rw-r--r--sample/test.rb32
6 files changed, 60 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 48ec64f5fd..030383e94b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Wed Jun 21 14:35:06 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * parse.y (block_param): do not use multiple assignment for a sole
+ block parameter. [ruby-dev:28710]
+
+ * eval.c (rb_yield_0): pass a raw yielded value to a sole block
+ parameter if a value is passed by yield.
+
+ * eval.c (proc_invoke): args may not be an array.
+
+ * eval.c (rb_proc_yield): pass original value without wrapping
+ it in an array.
+
Wed Jun 21 14:06:47 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (method_call): remove (fn)(args) style lambda
diff --git a/eval.c b/eval.c
index 7ca5469129..f675463032 100644
--- a/eval.c
+++ b/eval.c
@@ -4739,6 +4739,9 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags)
massign(self, var, val, pcall);
}
else {
+ if (pcall) {
+ val = RARRAY(val)->ptr[0];
+ }
assign(self, var, val, pcall);
}
if (bvar) {
@@ -8367,7 +8370,7 @@ proc_invoke(VALUE proc, VALUE args /* OK */, VALUE self, VALUE klass, int call)
_block.block_obj = bvar;
if (self != Qundef) _block.frame.self = self;
if (klass) _block.frame.this_class = klass;
- _block.frame.argc = RARRAY(args)->len;
+ _block.frame.argc = call ? RARRAY(args)->len : 1;
_block.frame.flags = ruby_frame->flags;
if (_block.frame.argc && (ruby_frame->flags & FRAME_DMETH)) {
NEWOBJ(scope, struct SCOPE);
@@ -8473,10 +8476,14 @@ rb_proc_call(VALUE proc, VALUE args /* OK */)
VALUE
rb_proc_yield(int argc, VALUE *argv, VALUE proc)
{
- if (argc == 1)
- return proc_invoke(proc, svalue_to_avalue(argv[0]), Qundef, 0, 0);
- else
+ switch (argc) {
+ case 0:
+ return proc_invoke(proc, Qnil, Qundef, 0, 0);
+ case 1:
+ return proc_invoke(proc, argv[0], Qundef, 0, 0);
+ default:
return proc_invoke(proc, rb_ary_new4(argc, argv), Qundef, 0, 0);
+ }
}
/* :nodoc: */
diff --git a/ext/extmk.rb b/ext/extmk.rb
index a799544f04..5cd7f498cc 100644
--- a/ext/extmk.rb
+++ b/ext/extmk.rb
@@ -213,14 +213,10 @@ def parse_args()
opts = nil
$optparser ||= OptionParser.new do |opts|
opts.on('-n') {$dryrun = true}
- opts.on('--[no-]extension [EXTS]', Array) do |*v|
- v.compact!
- v = v[0] if v.size == 1 and !v[0]
+ opts.on('--[no-]extension [EXTS]', Array) do |v|
$extension = (v == false ? [] : v)
end
- opts.on('--[no-]extstatic [STATIC]', Array) do |*v|
- v.compact!
- v = v[0] if v.size == 1 and !v[0]
+ opts.on('--[no-]extstatic [STATIC]', Array) do |v|
if ($extstatic = v) == false
$extstatic = []
elsif v
@@ -237,7 +233,7 @@ def parse_args()
opts.on('--make=MAKE') do |v|
$make = v || 'make'
end
- opts.on('--make-flags=FLAGS', '--mflags', Shellwords) do |*v|
+ opts.on('--make-flags=FLAGS', '--mflags', Shellwords) do |v|
v.grep(/\A([-\w]+)=(.*)/) {$configure_args["--#{$1}"] = $2}
if arg = v.first
arg.insert(0, '-') if /\A[^-][^=]*\Z/ =~ arg
@@ -358,7 +354,7 @@ end unless $extstatic
ext_prefix = "#{$top_srcdir}/ext"
exts = $static_ext.sort_by {|t, i| i}.collect {|t, i| t}
-if $extension && $extension.size > 0
+if $extension
exts |= $extension.select {|d| File.directory?("#{ext_prefix}/#{d}")}
else
withes, withouts = %w[--with --without].collect {|w|
diff --git a/lib/optparse.rb b/lib/optparse.rb
index 6ecd7e3203..7e5fcba1ca 100644
--- a/lib/optparse.rb
+++ b/lib/optparse.rb
@@ -352,12 +352,12 @@ class OptionParser
# : (({block}))
# (({yields})) at semi-error condition, instead of raises exception.
#
- def conv_arg(arg, val = [])
+ def conv_arg(arg, val = nil)
if block
if conv
- val = conv.yield(*val)
+ val = conv.yield(val)
else
- val = val[0]
+ val = *val
end
return arg, block, val
else
@@ -453,12 +453,12 @@ class OptionParser
#
# Raises an exception if argument is not present.
#
- def parse(arg, argv)
+ def parse(arg, argv, &error)
unless arg
raise MissingArgument if argv.empty?
arg = argv.shift
end
- conv_arg(*parse_arg(arg) {|*exc| raise(*exc)})
+ conv_arg(*parse_arg(arg), &error)
end
end
@@ -622,7 +622,7 @@ class OptionParser
if list = __send__(id)
val = list.fetch(key) {return nil}
return val unless block_given?
- yield(*val)
+ yield(val)
end
end
@@ -700,7 +700,7 @@ class OptionParser
# Completion for hash key.
#
def match(key)
- return key, fetch(key) {
+ return key, *fetch(key) {
raise AmbiguousArgument, catch(:ambiguous) {return complete(key)}
}
end
@@ -1495,9 +1495,9 @@ class OptionParser
yielded with the found value when succeeded.
=end #'#"#`#
def search(id, key)
- visit(:search, id, key) do |*k|
+ visit(:search, id, key) do |k|
return k unless block_given?
- return yield(*k)
+ return yield(k)
end
end
private :search
diff --git a/parse.y b/parse.y
index 3af47099ff..53b4df983a 100644
--- a/parse.y
+++ b/parse.y
@@ -2900,7 +2900,13 @@ block_param0 : mlhs_item
block_param : block_param0
{
/*%%%*/
- $$ = NEW_MASGN($1, 0);
+ if ($1->nd_alen == 1) {
+ $$ = $1->nd_head;
+ rb_gc_force_recycle((VALUE)$1);
+ }
+ else {
+ $$ = NEW_MASGN($1, 0);
+ }
/*%
$$ = blockvar_new($1);
%*/
diff --git a/sample/test.rb b/sample/test.rb
index 8005538d0e..29c0383043 100644
--- a/sample/test.rb
+++ b/sample/test.rb
@@ -127,13 +127,13 @@ a,b,*c = *[*[1,2]]; test_ok([a,b,c] == [1,2,[]])
def f; yield nil; end; f {|a| test_ok(a == nil)}
def f; yield 1; end; f {|a| test_ok(a == 1)}
-def f; yield *[]; end; f {|a| test_ok(a == nil)}
-def f; yield *[1]; end; f {|a| test_ok(a == 1)}
-def f; yield *[nil]; end; f {|a| test_ok(a == nil)}
-def f; yield *[[]]; end; f {|a| test_ok(a == [])}
-def f; yield *[*[]]; end; f {|a| test_ok(a == nil)}
-def f; yield *[*[1]]; end; f {|a| test_ok(a == 1)}
-def f; yield *[*[1,2]]; end; f {|a| test_ok(a == 1)}
+def f; yield *[]; end; f {|a| test_ok(a == [])}
+def f; yield *[1]; end; f {|a| test_ok(a == [1])}
+def f; yield *[nil]; end; f {|a| test_ok(a == [nil])}
+def f; yield *[[]]; end; f {|a| test_ok(a == [[]])}
+def f; yield *[*[]]; end; f {|a| test_ok(a == [])}
+def f; yield *[*[1]]; end; f {|a| test_ok(a == [1])}
+def f; yield *[*[1,2]]; end; f {|a| test_ok(a == [1,2])}
def f; yield; end; f {|a,| test_ok(a == nil)}
def f; yield nil; end; f {|a,| test_ok(a == nil)}
@@ -957,23 +957,23 @@ IterTest.new([1]).each1 {|x| test_ok(x == 1)}
IterTest.new([2]).each2 {|x| test_ok(x == [2])}
#IterTest.new([3]).each3 {|x| test_ok(x == 3)}
IterTest.new([4]).each4 {|x| test_ok(x == 4)}
-IterTest.new([5]).each5 {|x| test_ok(x == 5)}
-IterTest.new([6]).each6 {|x| test_ok(x == 6)}
+IterTest.new([5]).each5 {|x| test_ok(x == [5])}
+IterTest.new([6]).each6 {|x| test_ok(x == [6])}
#IterTest.new([7]).each7 {|x| test_ok(x == 7)}
IterTest.new([8]).each8 {|x| test_ok(x == 8)}
-IterTest.new([[0]]).each0 {|x| test_ok(x == 0)}
+IterTest.new([[0]]).each0 {|x| test_ok(x == [0])}
IterTest.new([[1]]).each1 {|x| test_ok(x == 1)}
IterTest.new([[2]]).each2 {|x| test_ok(x == [2])}
IterTest.new([[3]]).each3 {|x| test_ok(x == 3)}
-IterTest.new([[4]]).each4 {|x| test_ok(x == 4)}
-IterTest.new([[5]]).each5 {|x| test_ok(x == 5)}
-IterTest.new([[6]]).each6 {|x| test_ok(x == 6)}
-IterTest.new([[7]]).each7 {|x| test_ok(x == 7)}
-IterTest.new([[8]]).each8 {|x| test_ok(x == 8)}
+IterTest.new([[4]]).each4 {|x| test_ok(x == [4])}
+IterTest.new([[5]]).each5 {|x| test_ok(x == [5])}
+IterTest.new([[6]]).each6 {|x| test_ok(x == [6])}
+IterTest.new([[7]]).each7 {|x| test_ok(x == [7])}
+IterTest.new([[8]]).each8 {|x| test_ok(x == [8])}
IterTest.new([[0,0]]).each0 {|*x| test_ok(x == [0,0])}
-IterTest.new([[8,8]]).each8 {|*x| test_ok(x == [8])}
+IterTest.new([[8,8]]).each8 {|*x| test_ok(x == [8,8])}
def m0(v)
v