opal 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -3
- data/README.md +3 -1
- data/lib/opal/nodes/base.rb +4 -0
- data/lib/opal/nodes/helpers.rb +12 -6
- data/lib/opal/nodes/literal.rb +8 -0
- data/lib/opal/parser/grammar.rb +1827 -1829
- data/lib/opal/parser/grammar.y +1 -1
- data/lib/opal/sprockets/server.rb +1 -9
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/constants.rb +2 -2
- data/spec/lib/compiler_spec.rb +117 -0
- data/spec/opal/core/runtime/rescue_spec.rb +23 -0
- data/spec/opal/core/runtime/truthy_spec.rb +14 -0
- metadata +2 -2
data/lib/opal/parser/grammar.y
CHANGED
@@ -1220,7 +1220,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1220
1220
|
exc = val[1] || s(:array)
|
1221
1221
|
exc << new_assign(val[2], val[2], s(:gvar, '$!'.intern)) if val[2]
|
1222
1222
|
result = [s(:resbody, exc, val[4])]
|
1223
|
-
result.
|
1223
|
+
result.concat val[5] if val[5]
|
1224
1224
|
}
|
1225
1225
|
| # none
|
1226
1226
|
{
|
@@ -1,10 +1,4 @@
|
|
1
|
-
require 'rack
|
2
|
-
require 'rack/static'
|
3
|
-
require 'rack/urlmap'
|
4
|
-
require 'rack/builder'
|
5
|
-
require 'rack/deflater'
|
6
|
-
require 'rack/directory'
|
7
|
-
require 'rack/showexceptions'
|
1
|
+
require 'rack'
|
8
2
|
require 'opal/source_map'
|
9
3
|
require 'sprockets'
|
10
4
|
require 'sourcemap'
|
@@ -79,8 +73,6 @@ module Opal
|
|
79
73
|
use Index, server if server.use_index
|
80
74
|
if source_map_enabled
|
81
75
|
map(maps_prefix) do
|
82
|
-
require 'rack/conditionalget'
|
83
|
-
require 'rack/etag'
|
84
76
|
use Rack::ConditionalGet
|
85
77
|
use Rack::ETag
|
86
78
|
run maps_app
|
data/lib/opal/version.rb
CHANGED
data/opal/corelib/constants.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
RUBY_PLATFORM = 'opal'
|
2
2
|
RUBY_ENGINE = 'opal'
|
3
3
|
RUBY_VERSION = '2.2.3'
|
4
|
-
RUBY_ENGINE_VERSION = '0.9.
|
5
|
-
RUBY_RELEASE_DATE = '
|
4
|
+
RUBY_ENGINE_VERSION = '0.9.2'
|
5
|
+
RUBY_RELEASE_DATE = '2016-01-10'
|
6
6
|
RUBY_PATCHLEVEL = 0
|
7
7
|
RUBY_REVISION = 0
|
8
8
|
RUBY_COPYRIGHT = 'opal - Copyright (C) 2013-2015 Adam Beynon'
|
data/spec/lib/compiler_spec.rb
CHANGED
@@ -133,6 +133,123 @@ describe Opal::Compiler do
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
end
|
136
|
+
|
137
|
+
describe 'truthy check' do
|
138
|
+
context 'no parentheses' do
|
139
|
+
context 'with operators' do
|
140
|
+
it 'excludes nil check for primitives' do
|
141
|
+
expect_compiled('foo = 42 if 2 > 3').to include('if ($rb_gt(2, 3))')
|
142
|
+
expect_compiled('foo = 42 if 2.5 > 3.5').to include('if ($rb_gt(2.5, 3.5))')
|
143
|
+
expect_compiled('foo = 42 if true > false').to include('if ($rb_gt(true, false))')
|
144
|
+
|
145
|
+
expect_compiled('foo = 42 if 2 == 3').to include("if ((2)['$=='](3))")
|
146
|
+
expect_compiled('foo = 42 if 2.5 == 3.5').to include("if ((2.5)['$=='](3.5))")
|
147
|
+
expect_compiled('foo = 42 if true == false').to include("if (true['$=='](false))")
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'adds nil check for strings' do
|
151
|
+
expect_compiled('foo = 42 if "test" > "bar"').to include('if ((($a = $rb_gt("test", "bar")) !== nil && (!$a.$$is_boolean || $a == true)))')
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'specifically == excludes nil check for strings' do
|
155
|
+
expect_compiled('foo = 42 if "test" == "bar"').to include("if (\"test\"['$=='](\"bar\"))")
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'adds nil check for lvars' do
|
159
|
+
expect_compiled("bar = 4\nfoo = 42 if bar > 5").to include('if ((($a = $rb_gt(bar, 5)) !== nil && (!$a.$$is_boolean || $a == true)))')
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'specifically == excludes nil check for lvars' do
|
163
|
+
expect_compiled("bar = 4\nfoo = 42 if bar == 5").to include("if (bar['$=='](5))")
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'adds nil check for constants' do
|
167
|
+
expect_compiled("foo = 42 if Test > 4").to include("if ((($a = $rb_gt($scope.get('Test'), 4)) !== nil && (!$a.$$is_boolean || $a == true))) ")
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'specifically == excludes nil check for constants' do
|
171
|
+
expect_compiled("foo = 42 if Test == 4").to include("if ($scope.get('Test')['$=='](4))")
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context 'without operators' do
|
176
|
+
it 'adds nil check for primitives' do
|
177
|
+
expect_compiled('foo = 42 if 2').to include('if ((($a = 2) !== nil && (!$a.$$is_boolean || $a == true)))')
|
178
|
+
expect_compiled('foo = 42 if 2.5').to include('if ((($a = 2.5) !== nil && (!$a.$$is_boolean || $a == true)))')
|
179
|
+
expect_compiled('foo = 42 if true').to include('if ((($a = true) !== nil && (!$a.$$is_boolean || $a == true)))')
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'adds nil check for boolean method calls' do
|
183
|
+
expect_compiled('foo = 42 if true.something').to include('if ((($a = true.$something()) !== nil && (!$a.$$is_boolean || $a == true)))')
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'adds nil check for strings' do
|
187
|
+
expect_compiled('foo = 42 if "test"').to include('if ((($a = "test") !== nil && (!$a.$$is_boolean || $a == true)))')
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'adds nil check for lvars' do
|
191
|
+
expect_compiled("bar = 4\nfoo = 42 if bar").to include('if (bar !== false && bar !== nil)')
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'adds nil check for constants' do
|
195
|
+
expect_compiled("foo = 42 if Test").to include("if ((($a = $scope.get('Test')) !== nil && (!$a.$$is_boolean || $a == true)))")
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'parentheses' do
|
201
|
+
context 'with operators' do
|
202
|
+
it 'adds nil check for primitives' do
|
203
|
+
expect_compiled('foo = 42 if (2 > 3)').to include('if ((($a = ($rb_gt(2, 3))) !== nil && (!$a.$$is_boolean || $a == true)))')
|
204
|
+
expect_compiled('foo = 42 if (2.5 > 3.5)').to include('if ((($a = ($rb_gt(2.5, 3.5))) !== nil && (!$a.$$is_boolean || $a == true)))')
|
205
|
+
expect_compiled('foo = 42 if (true > false)').to include('if ((($a = ($rb_gt(true, false))) !== nil && (!$a.$$is_boolean || $a == true)))')
|
206
|
+
|
207
|
+
expect_compiled('foo = 42 if (2 == 3)').to include("if ((($a = ((2)['$=='](3))) !== nil && (!$a.$$is_boolean || $a == true)))")
|
208
|
+
expect_compiled('foo = 42 if (2.5 == 3.5)').to include("if ((($a = ((2.5)['$=='](3.5))) !== nil && (!$a.$$is_boolean || $a == true)))")
|
209
|
+
expect_compiled('foo = 42 if (true == false)').to include("if ((($a = (true['$=='](false))) !== nil && (!$a.$$is_boolean || $a == true)))")
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'adds nil check for strings' do
|
213
|
+
expect_compiled('foo = 42 if ("test" > "bar")').to include('if ((($a = ($rb_gt("test", "bar"))) !== nil && (!$a.$$is_boolean || $a == true)))')
|
214
|
+
expect_compiled('foo = 42 if ("test" == "bar")').to include("if ((($a = (\"test\"['$=='](\"bar\"))) !== nil && (!$a.$$is_boolean || $a == true)))")
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'adds nil check for lvars' do
|
218
|
+
expect_compiled("bar = 4\nfoo = 42 if (bar > 5)").to include('if ((($a = ($rb_gt(bar, 5))) !== nil && (!$a.$$is_boolean || $a == true)))')
|
219
|
+
expect_compiled("bar = 4\nfoo = 42 if (bar == 5)").to include("if ((($a = (bar['$=='](5))) !== nil && (!$a.$$is_boolean || $a == true))) ")
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'adds nil check for constants' do
|
223
|
+
expect_compiled("foo = 42 if (Test > 4)").to include("if ((($a = ($rb_gt($scope.get('Test'), 4))) !== nil && (!$a.$$is_boolean || $a == true)))")
|
224
|
+
expect_compiled("foo = 42 if (Test == 4)").to include("if ((($a = ($scope.get('Test')['$=='](4))) !== nil && (!$a.$$is_boolean || $a == true)))")
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'without operators' do
|
229
|
+
it 'adds nil check for primitives' do
|
230
|
+
expect_compiled('foo = 42 if (2)').to include('if ((($a = (2)) !== nil && (!$a.$$is_boolean || $a == true)))')
|
231
|
+
expect_compiled('foo = 42 if (2.5)').to include('if ((($a = (2.5)) !== nil && (!$a.$$is_boolean || $a == true)))')
|
232
|
+
expect_compiled('foo = 42 if (true)').to include('if ((($a = (true)) !== nil && (!$a.$$is_boolean || $a == true)))')
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'adds nil check for boolean method calls' do
|
236
|
+
expect_compiled('foo = 42 if (true.something)').to include('if ((($a = (true.$something())) !== nil && (!$a.$$is_boolean || $a == true)))')
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'adds nil check for strings' do
|
240
|
+
expect_compiled('foo = 42 if ("test")').to include('if ((($a = ("test")) !== nil && (!$a.$$is_boolean || $a == true)))')
|
241
|
+
end
|
242
|
+
|
243
|
+
it 'adds nil check for lvars' do
|
244
|
+
expect_compiled("bar = 4\nfoo = 42 if (bar)").to include('if ((($a = (bar)) !== nil && (!$a.$$is_boolean || $a == true)))')
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'adds nil check for constants' do
|
248
|
+
expect_compiled("foo = 42 if (Test)").to include("if ((($a = ($scope.get('Test'))) !== nil && (!$a.$$is_boolean || $a == true)))")
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
136
253
|
|
137
254
|
def expect_compiled(*args)
|
138
255
|
expect(Opal::Compiler.new(*args).compile)
|
@@ -35,4 +35,27 @@ describe "The rescue keyword" do
|
|
35
35
|
it "returns nil if no expr given in rescue body" do
|
36
36
|
RescueReturningSpec.new.empty_rescue.should be_nil
|
37
37
|
end
|
38
|
+
|
39
|
+
it 'Fix using more than two "rescue" in sequence #1269' do
|
40
|
+
# As a statement
|
41
|
+
begin
|
42
|
+
raise IOError, 'foo'
|
43
|
+
rescue RangeError # this one is correct
|
44
|
+
rescue TypeError # miss a return
|
45
|
+
rescue IOError # following two lines disappear in js
|
46
|
+
$ScratchPad << "I got #{$!.message}"
|
47
|
+
end
|
48
|
+
$ScratchPad.last.should == "I got foo"
|
49
|
+
|
50
|
+
# As an expression
|
51
|
+
a = begin
|
52
|
+
raise IOError, 'foo'
|
53
|
+
rescue RangeError # this one is correct
|
54
|
+
rescue TypeError # miss a return
|
55
|
+
rescue IOError # following two lines disappear in js
|
56
|
+
"I got #{$!.message}"
|
57
|
+
end
|
58
|
+
a.should == "I got foo"
|
59
|
+
end
|
60
|
+
|
38
61
|
end
|
@@ -4,6 +4,14 @@ class Boolean
|
|
4
4
|
end
|
5
5
|
end
|
6
6
|
|
7
|
+
class JsNil
|
8
|
+
def <(other)
|
9
|
+
%x{
|
10
|
+
return nil;
|
11
|
+
}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
7
15
|
describe "Opal truthyness" do
|
8
16
|
it "should evaluate to true using js `true` as an object" do
|
9
17
|
if true.self_as_an_object
|
@@ -20,4 +28,10 @@ describe "Opal truthyness" do
|
|
20
28
|
|
21
29
|
called.should be_nil
|
22
30
|
end
|
31
|
+
|
32
|
+
it "should evaluate to false if js `nil` is used with an operator" do
|
33
|
+
is_falsey = JsNil.new < 2 ? false : true
|
34
|
+
|
35
|
+
is_falsey.should be_true
|
36
|
+
end
|
23
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Beynon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sourcemap
|