Skip to content

Commit 97e6c98

Browse files
committedJul 29, 2013
Allow blocks to accept default arguments (fixes #286)
1 parent cc8e942 commit 97e6c98

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed
 

Diff for: ‎lib/opal/parser.rb

+12-1
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,12 @@ def process_iter(sexp, level)
711711
args ||= s(:masgn, s(:array))
712712
args = args.first == :lasgn ? s(:array, args) : args[1]
713713

714+
# opt args are last, if present, and are a [:block]
715+
if args.last.is_a?(Array) and args.last[0] == :block
716+
opt_args = args.pop
717+
opt_args.shift
718+
end
719+
714720
if args.last.is_a?(Array) and args.last[0] == :block_pass
715721
block_arg = args.pop
716722
block_arg = block_arg[1][1].to_sym
@@ -730,7 +736,12 @@ def process_iter(sexp, level)
730736
args[1..-1].each do |arg|
731737
arg = arg[1]
732738
arg = "#{arg}$" if RESERVED.include? arg.to_s
733-
code << fragment("if (#{arg} == null) #{arg} = nil;\n", sexp)
739+
740+
if opt_args and current_opt = opt_args.find { |s| s[1] == arg.to_sym }
741+
code << [fragment("if (#{arg} == null) #{arg} = ", sexp), process(current_opt[2], :expr), fragment(";\n", sexp)]
742+
else
743+
code << fragment("if (#{arg} == null) #{arg} = nil;\n", sexp)
744+
end
734745
end
735746

736747
params = js_block_args(args[1..-1])

Diff for: ‎spec/opal/language/block_spec.rb

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require 'spec_helper'
2+
3+
describe "Blocks" do
4+
it "accept default arguments" do
5+
proc { |a, b = 100| [a, b] }.call(:foo, :bar).should == [:foo, :bar]
6+
proc { |a, b = 100| [a, b] }.call(:foo).should == [:foo, 100]
7+
end
8+
end

0 commit comments

Comments
 (0)
Please sign in to comment.