Skip to content

Commit aa4f272

Browse files
committedJul 30, 2013
Parse operator calls as normal method calls
1 parent 99f51d1 commit aa4f272

File tree

5 files changed

+28
-58
lines changed

5 files changed

+28
-58
lines changed
 

Diff for: ‎corelib/opal/array.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ def ==(other)
231231
}
232232
}
233233
234-
if (!#{`#{self}[i]` == `other[i]`}) {
234+
if (!(#{`#{self}[i]` == `other[i]`})) {
235235
return false;
236236
}
237237

Diff for: ‎lib/opal/grammar.rb

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: ‎lib/opal/grammar.y

+4-4
Original file line numberDiff line numberDiff line change
@@ -450,19 +450,19 @@ arg:
450450
}
451451
| arg '+' arg
452452
{
453-
result = s(:operator, :"+", val[0], val[2])
453+
result = new_call val[0], :"+", s(:arglist, val[2])
454454
}
455455
| arg '-' arg
456456
{
457-
result = s(:operator, :"-", val[0], val[2])
457+
result = new_call val[0], :"-", s(:arglist, val[2])
458458
}
459459
| arg '*' arg
460460
{
461-
result = s(:operator, :"*", val[0], val[2])
461+
result = new_call val[0], :"*", s(:arglist, val[2])
462462
}
463463
| arg '/' arg
464464
{
465-
result = s(:operator, :"/", val[0], val[2])
465+
result = new_call val[0], :"/", s(:arglist, val[2])
466466
}
467467
| arg '%' arg
468468
{

Diff for: ‎lib/opal/parser.rb

-27
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ def parse(source, options = {})
6969
@source_file = options[:source_file] || @file
7070
@method_missing = (options[:method_missing] != false)
7171
@stub_methods = (options[:stub_methods] != true)
72-
@optimized_operators = (options[:optimized_operators] == false)
7372
@arity_check = options[:arity_check]
7473
@const_missing = (options[:const_missing] != false)
7574
@irb_vars = (options[:irb] == true)
@@ -536,32 +535,6 @@ def process_js_tmp(sexp, level)
536535
fragment(sexp.shift.to_s, sexp)
537536
end
538537

539-
def process_operator(sexp, level)
540-
meth, recv, arg = sexp
541-
mid = mid_to_jsid meth.to_s
542-
result = []
543-
544-
if @optimized_operators
545-
with_temp do |a|
546-
with_temp do |b|
547-
l = process recv, :expr
548-
r = process arg, :expr
549-
550-
result << fragment("(#{a} = ", sexp)
551-
result << l
552-
result << fragment(", #{b} = ", sexp)
553-
result << r
554-
result << fragment(", typeof(#{a}) === 'number' ? #{a} #{meth} #{b} ", sexp)
555-
result << fragment(": #{a}#{mid}(#{b}))", sexp)
556-
end
557-
end
558-
else
559-
result = [process(recv, :recv), fragment("#{mid}(", sexp), process(arg, :expr), fragment(")", sexp)]
560-
end
561-
562-
result
563-
end
564-
565538
def js_block_given(sexp, level)
566539
@scope.uses_block!
567540
if @scope.block_name

Diff for: ‎spec/parser/call_spec.rb

+19-22
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@
2626
end
2727

2828
describe "Operator calls" do
29-
it "should optimize math ops into operator calls" do
30-
opal_parse("1 + 2").should == [:operator, :+, [:lit, 1], [:lit, 2]]
31-
opal_parse("1 - 2").should == [:operator, :-, [:lit, 1], [:lit, 2]]
32-
opal_parse("1 / 2").should == [:operator, :/, [:lit, 1], [:lit, 2]]
33-
opal_parse("1 * 2").should == [:operator, :*, [:lit, 1], [:lit, 2]]
34-
end
35-
3629
it "should parse all other operators into method calls" do
3730
opal_parse("1 % 2").should == [:call, [:lit, 1], :%, [:arglist, [:lit, 2]]]
3831
opal_parse("1 ** 2").should == [:call, [:lit, 1], :**, [:arglist, [:lit, 2]]]
@@ -67,17 +60,17 @@
6760

6861
describe "Optional paren calls" do
6962
it "should correctly parse - and -@" do
70-
opal_parse("x - 1").should == [:operator, :-, [:call, nil, :x, [:arglist]], [:lit, 1]]
63+
opal_parse("x - 1").should == [:call, [:call, nil, :x, [:arglist]], :-, [:arglist, [:lit, 1]]]
7164
opal_parse("x -1").should == [:call, nil, :x, [:arglist, [:lit, -1]]]
7265
end
7366

7467
it "should correctly parse + and +@" do
75-
opal_parse("x + 1").should == [:operator, :+, [:call, nil, :x, [:arglist]], [:lit, 1]]
68+
opal_parse("x + 1").should == [:call, [:call, nil, :x, [:arglist]], :+, [:arglist, [:lit, 1]]]
7669
opal_parse("x +1").should == [:call, nil, :x, [:arglist, [:lit, 1]]]
7770
end
7871

7972
it "should correctly parse / and regexps" do
80-
opal_parse("x / 500").should == [:operator, :/, [:call, nil, :x, [:arglist]], [:lit, 500]]
73+
opal_parse("x / 500").should == [:call, [:call, nil, :x, [:arglist]], :/, [:arglist, [:lit, 500]]]
8174
opal_parse("x /foo/").should == [:call, nil, :x, [:arglist, [:lit, /foo/]]]
8275
end
8376

@@ -89,21 +82,25 @@
8982

9083
describe "Operator precedence" do
9184
it "should be raised with parentheses" do
92-
opal_parse("(1 + 2) + (3 - 4)").should == [:operator, :+,
93-
[:operator, :+, [:lit, 1], [:lit, 2]],
94-
[:operator, :-, [:lit, 3], [:lit, 4]],
85+
opal_parse("(1 + 2) + (3 - 4)").should == [:call,
86+
[:call, [:lit, 1], :+, [:arglist, [:lit, 2]]],
87+
:+,
88+
[:arglist, [:call, [:lit, 3], :-, [:arglist, [:lit, 4]]]],
9589
]
96-
opal_parse("(1 + 2) - (3 - 4)").should == [:operator, :-,
97-
[:operator, :+, [:lit, 1], [:lit, 2]],
98-
[:operator, :-, [:lit, 3], [:lit, 4]],
90+
opal_parse("(1 + 2) - (3 - 4)").should == [:call,
91+
[:call, [:lit, 1], :+, [:arglist, [:lit, 2]]],
92+
:-,
93+
[:arglist, [:call, [:lit, 3], :-, [:arglist, [:lit, 4]]]],
9994
]
100-
opal_parse("(1 + 2) * (3 - 4)").should == [:operator, :*,
101-
[:operator, :+, [:lit, 1], [:lit, 2]],
102-
[:operator, :-, [:lit, 3], [:lit, 4]],
95+
opal_parse("(1 + 2) * (3 - 4)").should == [:call,
96+
[:call, [:lit, 1], :+, [:arglist, [:lit, 2]]],
97+
:*,
98+
[:arglist, [:call, [:lit, 3], :-, [:arglist, [:lit, 4]]]],
10399
]
104-
opal_parse("(1 + 2) / (3 - 4)").should == [:operator, :/,
105-
[:operator, :+, [:lit, 1], [:lit, 2]],
106-
[:operator, :-, [:lit, 3], [:lit, 4]],
100+
opal_parse("(1 + 2) / (3 - 4)").should == [:call,
101+
[:call, [:lit, 1], :+, [:arglist, [:lit, 2]]],
102+
:/,
103+
[:arglist, [:call, [:lit, 3], :-, [:arglist, [:lit, 4]]]],
107104
]
108105
end
109106
end

0 commit comments

Comments
 (0)
Please sign in to comment.