opal 0.10.0.beta3 → 0.10.0.beta4
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/.travis.yml +3 -0
- data/CHANGELOG.md +9 -1
- data/HACKING.md +2 -2
- data/docs/compiled_ruby.md +6 -6
- data/lib/opal/cli_runners/nodejs.rb +3 -1
- data/lib/opal/nodes/args/mlhsarg.rb +1 -3
- data/lib/opal/nodes/def.rb +18 -54
- data/lib/opal/nodes/helpers.rb +3 -3
- data/lib/opal/nodes/iter.rb +32 -3
- data/lib/opal/nodes/logic.rb +5 -5
- data/lib/opal/nodes/node_with_args.rb +31 -0
- data/lib/opal/parser/lexer.rb +9 -7
- data/lib/opal/sprockets/processor.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +16 -0
- data/opal/corelib/basic_object.rb +1 -1
- data/opal/corelib/class.rb +15 -0
- data/opal/corelib/constants.rb +1 -1
- data/opal/corelib/enumerable.rb +32 -62
- data/opal/corelib/file.rb +2 -0
- data/opal/corelib/helpers.rb +41 -1
- data/opal/corelib/module.rb +26 -10
- data/opal/corelib/runtime.js +47 -12
- data/spec/filters/bugs/date.rb +0 -9
- data/spec/filters/bugs/hash.rb +0 -2
- data/spec/filters/bugs/kernel.rb +0 -5
- data/spec/filters/bugs/language.rb +4 -19
- data/spec/filters/bugs/module.rb +0 -30
- data/spec/filters/bugs/pathname.rb +5 -0
- data/spec/filters/bugs/proc.rb +0 -6
- data/spec/filters/unsupported/thread.rb +1 -0
- data/spec/lib/compiler_spec.rb +29 -29
- data/spec/opal/core/runtime/truthy_spec.rb +26 -0
- data/spec/ruby_specs +0 -3
- data/stdlib/date.rb +21 -0
- data/stdlib/native.rb +1 -1
- data/stdlib/nodejs/file.rb +36 -11
- data/stdlib/nodejs/io.rb +55 -0
- data/stdlib/pathname.rb +43 -0
- data/stdlib/promise.rb +1 -1
- data/tasks/testing.rake +55 -31
- data/test/nodejs/test_file.rb +30 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39c814d73a4610d5d13c3d5ce1c8c969cb9fe910
|
4
|
+
data.tar.gz: e7e498becdff47976088a5a02bc98451f959d4a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: baf8e4f7a5b411c3cfefb5c1da61d1fb3c5ce73fd0c102c8d46a3cb1968f75fd8cb2b421f55c74ba8e317a61980040cd5ca88971465d1ff660e2e98641f2a0e1
|
7
|
+
data.tar.gz: cb776c46e913187cc3581029256f8ca1ffca2139315dce2ee0d8e014a6858b7ea19445948a06a3be16bb7ef6e054357723308b6bbb6ca3f13f2da733870b8ed8
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -26,6 +26,7 @@ Whitespace conventions:
|
|
26
26
|
|
27
27
|
### Added
|
28
28
|
|
29
|
+
- Pathname#relative_path_from
|
29
30
|
- Source maps now include method names
|
30
31
|
- `Module#included_modules` works
|
31
32
|
- Internal runtime cleanup (#1241)
|
@@ -40,18 +41,22 @@ Whitespace conventions:
|
|
40
41
|
* `Enumerable#max`
|
41
42
|
* `Enumerable#each_entry` (#1303)
|
42
43
|
* `Module#const_set`
|
44
|
+
* `Module#module_eval` with a string
|
43
45
|
- Add `-L` / `--library` option to compile only the code of the library (#1281)
|
44
46
|
- Implement `Kernel.open` method (#1218)
|
45
47
|
- Generate meaningful names for functions representing Ruby methods
|
46
48
|
- Implement `Pathname#join` and `Pathname#+` methods (#1301)
|
47
49
|
- Added support for `begin;rescue;else;end`.
|
48
50
|
- Implement `File.extname` method (#1219)
|
49
|
-
- Implement File.extname method (#1219)
|
50
51
|
- Added support for keyword arguments as lambda parameters.
|
51
52
|
- Super works with define_method blocks
|
52
53
|
- Added support for kwsplats.
|
53
54
|
- Added support for squiggly heredoc.
|
54
55
|
- Implement `Method#parameters` and `Proc#parameters`.
|
56
|
+
- Implement `File.new("path").mtime`, `File.mtime("path")`, `File.stat("path").mtime`.
|
57
|
+
- if-conditions now support `null` and `undefined` as falsy values (#867)
|
58
|
+
- Implement IO.read method for Node.js (#1332)
|
59
|
+
- Implement IO.each_line method for Node.js (#1221)
|
55
60
|
|
56
61
|
|
57
62
|
### Changed
|
@@ -78,6 +83,8 @@ Whitespace conventions:
|
|
78
83
|
|
79
84
|
### Fixed
|
80
85
|
|
86
|
+
- `Module#ancestors` and shared code like `====` and `is_a?` deal with singleton class modules better (#1449)
|
87
|
+
- `Class#to_s` now shows correct names for singleton classes
|
81
88
|
- `Pathname#absolute?` and `Pathname#relative?` now work properly
|
82
89
|
- `File::dirname` and `File::basename` are now Rubyspec compliant
|
83
90
|
- `SourceMap::VLQ` patch (#1075)
|
@@ -114,6 +121,7 @@ Whitespace conventions:
|
|
114
121
|
- Fixed Base64 and enabled specs
|
115
122
|
- Fixed method definition in method body.
|
116
123
|
- Partially implemented `Marshal.load`/`Marshal.dump`. In order to use it require `opal/full`.
|
124
|
+
- Fixed docs for Compiled Ruby - Native section. Rename opal variable to win since window was causing error
|
117
125
|
|
118
126
|
|
119
127
|
### Removed
|
data/HACKING.md
CHANGED
@@ -51,7 +51,7 @@ $ bundle exec rake mspec_ruby_nodejs PATTERN=spec/ruby/core/string/sub_spec.rb
|
|
51
51
|
This will make sure that only `spec/ruby/core/string/sub_spec.rb` is run, and no other specs are executed. Globs can be used too:
|
52
52
|
|
53
53
|
```
|
54
|
-
$ bundle exec rake mspec_ruby_nodejs PATTERN=spec/ruby/core/string/*_spec.rb
|
54
|
+
$ bundle exec rake mspec_ruby_nodejs PATTERN="spec/ruby/core/string/*_spec.rb"
|
55
55
|
```
|
56
56
|
|
57
57
|
Another way to quickly validate ideas and play with your changes is to use `opal-repl`, a tool similar to `irb`. Running `opal-repl` drops you into an interactive environment with your current version of Opal loaded, including any changes you have made.
|
@@ -82,7 +82,7 @@ Comment out any of the `fail` lines in any of the files in the `spec/filters/bug
|
|
82
82
|
Core classes use each other and your changes may fix other bugs in `spec/filters/bugs`. If you think it's possible, run an inverted test suite by providing environment variable `INVERT_RUNNING_MODE=true`:
|
83
83
|
|
84
84
|
```
|
85
|
-
$ env INVERT_RUNNING_MODE=true RUBYSPECS=true PATTERN=spec/ruby/core/string/*_spec.rb rake mspec_ruby_nodejs
|
85
|
+
$ env INVERT_RUNNING_MODE=true RUBYSPECS=true PATTERN="spec/ruby/core/string/*_spec.rb" rake mspec_ruby_nodejs
|
86
86
|
```
|
87
87
|
|
88
88
|
This command will execute tests marked as "bugs" from every file in the `spec/ruby/core/string` directory. After running it you will get a list of specs that in fact are passing. Feel free to remove them from `spec/filters/bugs`.
|
data/docs/compiled_ruby.md
CHANGED
@@ -275,26 +275,26 @@ Let's see how it works and wrap `window`:
|
|
275
275
|
```ruby
|
276
276
|
require 'native'
|
277
277
|
|
278
|
-
|
278
|
+
win = Native(`window`) # equivalent to Native::Object.new(`window`)
|
279
279
|
```
|
280
280
|
|
281
281
|
Now what if we want to access one of its properties?
|
282
282
|
|
283
283
|
```ruby
|
284
|
-
|
285
|
-
|
284
|
+
win[:location][:href] # => "http://dev.mikamai.com/"
|
285
|
+
win[:location][:href] = "http://mikamai.com/" # will bring you to mikamai.com
|
286
286
|
```
|
287
287
|
|
288
288
|
And what about methods?
|
289
289
|
|
290
290
|
```ruby
|
291
|
-
|
291
|
+
win.alert('hey there!')
|
292
292
|
```
|
293
293
|
|
294
294
|
So let’s do something more interesting:
|
295
295
|
|
296
296
|
```ruby
|
297
|
-
class <<
|
297
|
+
class << win
|
298
298
|
# A cross-browser window close method (works in IE!)
|
299
299
|
def close!
|
300
300
|
%x{
|
@@ -314,7 +314,7 @@ end
|
|
314
314
|
That’s all for now, bye!
|
315
315
|
|
316
316
|
```ruby
|
317
|
-
|
317
|
+
win.close!
|
318
318
|
```
|
319
319
|
|
320
320
|
### Calling JavaScript Methods
|
@@ -4,6 +4,8 @@ require 'opal/paths'
|
|
4
4
|
module Opal
|
5
5
|
module CliRunners
|
6
6
|
class Nodejs
|
7
|
+
NODE_PATH = File.expand_path('../stdlib/nodejs/node_modules', ::Opal.gem_dir)
|
8
|
+
|
7
9
|
def initialize(options)
|
8
10
|
@output = options.fetch(:output, $stdout)
|
9
11
|
end
|
@@ -14,7 +16,7 @@ module Opal
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def node_modules
|
17
|
-
|
19
|
+
NODE_PATH
|
18
20
|
end
|
19
21
|
|
20
22
|
def run(code, argv)
|
data/lib/opal/nodes/def.rb
CHANGED
@@ -48,16 +48,13 @@ module Opal
|
|
48
48
|
compile_post_args
|
49
49
|
|
50
50
|
scope.identify!
|
51
|
-
|
52
|
-
if compiler.arity_check?
|
53
|
-
arity_code = arity_check(mid)
|
54
|
-
end
|
55
|
-
|
56
51
|
scope_name = scope.identity
|
57
52
|
|
58
53
|
compile_block_arg
|
59
54
|
|
60
|
-
|
55
|
+
if compiler.arity_check?
|
56
|
+
compile_arity_check
|
57
|
+
end
|
61
58
|
|
62
59
|
if scope.uses_zuper
|
63
60
|
add_local '$zuper'
|
@@ -97,60 +94,27 @@ module Opal
|
|
97
94
|
push ", #{scope_name}.$$parameters = #{parameters_code}"
|
98
95
|
end
|
99
96
|
|
100
|
-
if recvr
|
101
|
-
|
102
|
-
|
103
|
-
elsif scope.
|
104
|
-
|
105
|
-
elsif
|
106
|
-
|
107
|
-
elsif scope.
|
108
|
-
|
109
|
-
unshift "Opal.defs(self, '$#{mid}', "
|
110
|
-
else
|
111
|
-
unshift "Opal.defn(self, '$#{mid}', "
|
112
|
-
end
|
113
|
-
push ')'
|
114
|
-
elsif compiler.eval?
|
115
|
-
unshift "Opal.def(self, '$#{mid}', "
|
116
|
-
push ')'
|
117
|
-
elsif scope.top?
|
118
|
-
unshift "Opal.defn(Opal.Object, '$#{mid}', "
|
119
|
-
push ')'
|
120
|
-
elsif scope.def?
|
121
|
-
wrap "Opal.def(self, '$#{mid}', ", ')'
|
122
|
-
else
|
123
|
-
raise "Unsupported use of `def`; please file a bug at https://github.com/opal/opal reporting this message."
|
97
|
+
if recvr then unshift 'Opal.defs(', recv(recvr), ", '$#{mid}', "
|
98
|
+
elsif scope.iter? then unshift "Opal.def(self, '$#{mid}', "
|
99
|
+
elsif scope.module? || scope.class? then unshift "Opal.defn(self, '$#{mid}', "
|
100
|
+
elsif scope.sclass? && scope.defs then unshift "Opal.defs(self, '$#{mid}', "
|
101
|
+
elsif scope.sclass? then unshift "Opal.defn(self, '$#{mid}', "
|
102
|
+
elsif compiler.eval? then unshift "Opal.def(self, '$#{mid}', "
|
103
|
+
elsif scope.top? then unshift "Opal.defn(Opal.Object, '$#{mid}', "
|
104
|
+
elsif scope.def? then unshift "Opal.def(self, '$#{mid}', "
|
105
|
+
else raise "Unsupported use of `def`; please file a bug at https://github.com/opal/opal/issues/new reporting this message."
|
124
106
|
end
|
107
|
+
push ')'
|
125
108
|
|
126
109
|
wrap '(', ", nil) && '#{mid}'" if expr?
|
127
110
|
end
|
128
111
|
|
129
112
|
# Returns code used in debug mode to check arity of method call
|
130
|
-
def
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
arity -= 1 if rest_arg
|
137
|
-
|
138
|
-
arity -= (keyword_args.size)
|
139
|
-
|
140
|
-
arity = -arity - 1 if !opt_args.empty? or !keyword_args.empty? or rest_arg
|
141
|
-
|
142
|
-
# $arity will point to our received arguments count
|
143
|
-
aritycode = "var $arity = arguments.length;"
|
144
|
-
|
145
|
-
if arity < 0 # splat or opt args
|
146
|
-
min_arity = -(arity + 1)
|
147
|
-
max_arity = args.size - 1
|
148
|
-
checks = []
|
149
|
-
checks << "$arity < #{min_arity}" if min_arity > 0
|
150
|
-
checks << "$arity > #{max_arity}" if max_arity and not(rest_arg)
|
151
|
-
aritycode + "if (#{checks.join(' || ')}) { Opal.ac($arity, #{arity}, this, #{meth}); }" if checks.size > 0
|
152
|
-
else
|
153
|
-
aritycode + "if ($arity !== #{arity}) { Opal.ac($arity, #{arity}, this, #{meth}); }"
|
113
|
+
def compile_arity_check
|
114
|
+
if arity_checks.size > 0
|
115
|
+
meth = scope.mid.to_s.inspect
|
116
|
+
line "var $arity = arguments.length;"
|
117
|
+
push " if (#{arity_checks.join(' || ')}) { Opal.ac($arity, #{arity}, this, #{meth}); }"
|
154
118
|
end
|
155
119
|
end
|
156
120
|
end
|
data/lib/opal/nodes/helpers.rb
CHANGED
@@ -95,7 +95,7 @@ module Opal
|
|
95
95
|
end
|
96
96
|
|
97
97
|
with_temp do |tmp|
|
98
|
-
[fragment("((#{tmp} = "), expr(sexp), fragment(") !== nil && (!#{tmp}.$$is_boolean || #{tmp} == true))")]
|
98
|
+
[fragment("((#{tmp} = "), expr(sexp), fragment(") !== nil && #{tmp} != null && (!#{tmp}.$$is_boolean || #{tmp} == true))")]
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
@@ -109,7 +109,7 @@ module Opal
|
|
109
109
|
end
|
110
110
|
|
111
111
|
with_temp do |tmp|
|
112
|
-
[fragment("((#{tmp} = "), expr(sexp), fragment(") === nil || (#{tmp}.$$is_boolean && #{tmp} == false))")]
|
112
|
+
[fragment("((#{tmp} = "), expr(sexp), fragment(") === nil || #{tmp} == null || (#{tmp}.$$is_boolean && #{tmp} == false))")]
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
@@ -131,7 +131,7 @@ module Opal
|
|
131
131
|
expr(sexp)
|
132
132
|
end
|
133
133
|
elsif [:lvar, :self].include? sexp.type
|
134
|
-
[expr(sexp.dup), fragment(" !== false && "), expr(sexp.dup), fragment(" !== nil")]
|
134
|
+
[expr(sexp.dup), fragment(" !== false && "), expr(sexp.dup), fragment(" !== nil && "), expr(sexp.dup), fragment(" != null")]
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
data/lib/opal/nodes/iter.rb
CHANGED
@@ -23,14 +23,16 @@ module Opal
|
|
23
23
|
identity = scope.identify!
|
24
24
|
add_temp "self = #{identity}.$$s || this"
|
25
25
|
|
26
|
+
compile_block_arg
|
26
27
|
compile_shadow_args
|
27
|
-
|
28
28
|
compile_inline_args
|
29
29
|
compile_post_args
|
30
|
-
|
31
|
-
compile_block_arg
|
32
30
|
compile_norm_args
|
33
31
|
|
32
|
+
if compiler.arity_check?
|
33
|
+
compile_arity_check
|
34
|
+
end
|
35
|
+
|
34
36
|
body_code = stmt(body)
|
35
37
|
to_vars = scope.to_vars
|
36
38
|
end
|
@@ -150,6 +152,33 @@ module Opal
|
|
150
152
|
def has_trailing_comma_in_args?
|
151
153
|
args.meta[:has_trailing_comma]
|
152
154
|
end
|
155
|
+
|
156
|
+
# Returns code used in debug mode to check arity of method call
|
157
|
+
def compile_arity_check
|
158
|
+
if arity_checks.size > 0
|
159
|
+
parent_scope = scope
|
160
|
+
while !(parent_scope.top? || parent_scope.def? || parent_scope.class_scope?)
|
161
|
+
parent_scope = parent_scope.parent
|
162
|
+
end
|
163
|
+
|
164
|
+
context = if parent_scope.top?
|
165
|
+
"'<main>'"
|
166
|
+
elsif parent_scope.def?
|
167
|
+
"'#{parent_scope.mid}'"
|
168
|
+
elsif parent_scope.class?
|
169
|
+
"'<class:#{parent_scope.name}>'"
|
170
|
+
elsif parent_scope.module?
|
171
|
+
"'<module:#{parent_scope.name}>'"
|
172
|
+
end
|
173
|
+
|
174
|
+
identity = scope.identity
|
175
|
+
|
176
|
+
line "if (#{identity}.$$is_lambda || #{identity}.$$define_meth) {"
|
177
|
+
line " var $arity = arguments.length;"
|
178
|
+
line " if (#{arity_checks.join(' || ')}) { Opal.block_ac($arity, #{arity}, #{context}); }"
|
179
|
+
line "}"
|
180
|
+
end
|
181
|
+
end
|
153
182
|
end
|
154
183
|
end
|
155
184
|
end
|
data/lib/opal/nodes/logic.rb
CHANGED
@@ -86,7 +86,7 @@ module Opal
|
|
86
86
|
def compile
|
87
87
|
with_temp do |tmp|
|
88
88
|
push expr(value)
|
89
|
-
wrap "(#{tmp} = ", ", (#{tmp} === nil || #{tmp} === false))"
|
89
|
+
wrap "(#{tmp} = ", ", (#{tmp} === nil || #{tmp} === false || #{tmp} == null))"
|
90
90
|
end
|
91
91
|
end
|
92
92
|
end
|
@@ -138,7 +138,7 @@ module Opal
|
|
138
138
|
with_temp do |tmp|
|
139
139
|
push "(((#{tmp} = "
|
140
140
|
push expr(lhs)
|
141
|
-
push ") !== false && #{tmp} !== nil) ? #{tmp} : "
|
141
|
+
push ") !== false && #{tmp} !== nil && #{tmp} != null) ? #{tmp} : "
|
142
142
|
push expr(rhs)
|
143
143
|
push ")"
|
144
144
|
end
|
@@ -146,7 +146,7 @@ module Opal
|
|
146
146
|
|
147
147
|
def compile_if
|
148
148
|
with_temp do |tmp|
|
149
|
-
push "if (#{tmp} = ", expr(lhs), ", #{tmp} !== false && #{tmp} !== nil) {"
|
149
|
+
push "if (#{tmp} = ", expr(lhs), ", #{tmp} !== false && #{tmp} !== nil && #{tmp} != null) {"
|
150
150
|
indent do
|
151
151
|
line tmp
|
152
152
|
end
|
@@ -176,7 +176,7 @@ module Opal
|
|
176
176
|
else
|
177
177
|
push "(#{tmp} = "
|
178
178
|
push expr(lhs)
|
179
|
-
push ", #{tmp} !== false && #{tmp} !== nil ?"
|
179
|
+
push ", #{tmp} !== false && #{tmp} !== nil && #{tmp} != null ?"
|
180
180
|
push expr(rhs)
|
181
181
|
push " : #{tmp})"
|
182
182
|
end
|
@@ -188,7 +188,7 @@ module Opal
|
|
188
188
|
if truthy_opt = js_truthy_optimize(lhs)
|
189
189
|
push "if (#{tmp} = ", truthy_opt, ") {"
|
190
190
|
else
|
191
|
-
push "if (#{tmp} = ", expr(lhs), ", #{tmp} !== false && #{tmp} !== nil) {"
|
191
|
+
push "if (#{tmp} = ", expr(lhs), ", #{tmp} !== false && #{tmp} !== nil && #{tmp} != null) {"
|
192
192
|
end
|
193
193
|
indent do
|
194
194
|
line expr(rhs)
|
@@ -208,6 +208,37 @@ module Opal
|
|
208
208
|
|
209
209
|
"[#{stringified_parameters.join(', ')}]"
|
210
210
|
end
|
211
|
+
|
212
|
+
# Returns an array of JS conditions for raising and argument
|
213
|
+
# error caused by arity check
|
214
|
+
def arity_checks
|
215
|
+
return @arity_checks if @arity_checks
|
216
|
+
|
217
|
+
arity = args.size - 1
|
218
|
+
arity -= (opt_args.size)
|
219
|
+
|
220
|
+
arity -= 1 if rest_arg
|
221
|
+
|
222
|
+
arity -= (keyword_args.size)
|
223
|
+
|
224
|
+
arity = -arity - 1 if !opt_args.empty? or !keyword_args.empty? or rest_arg
|
225
|
+
|
226
|
+
# $arity will point to our received arguments count
|
227
|
+
aritycode = "var $arity = arguments.length;"
|
228
|
+
|
229
|
+
@arity_checks = []
|
230
|
+
|
231
|
+
if arity < 0 # splat or opt args
|
232
|
+
min_arity = -(arity + 1)
|
233
|
+
max_arity = args.size - 1
|
234
|
+
@arity_checks << "$arity < #{min_arity}" if min_arity > 0
|
235
|
+
@arity_checks << "$arity > #{max_arity}" if max_arity and not(rest_arg)
|
236
|
+
else
|
237
|
+
@arity_checks << "$arity !== #{arity}"
|
238
|
+
end
|
239
|
+
|
240
|
+
@arity_checks
|
241
|
+
end
|
211
242
|
end
|
212
243
|
end
|
213
244
|
end
|
data/lib/opal/parser/lexer.rb
CHANGED
@@ -70,7 +70,8 @@ module Opal
|
|
70
70
|
@scanner_stack = [@scanner]
|
71
71
|
|
72
72
|
@case_stmt = nil
|
73
|
-
@
|
73
|
+
@paren_nest = 0
|
74
|
+
@lambda_stack = []
|
74
75
|
end
|
75
76
|
|
76
77
|
# Returns next token from source input stream.
|
@@ -643,8 +644,8 @@ module Opal
|
|
643
644
|
return :tIDENTIFIER
|
644
645
|
end
|
645
646
|
|
646
|
-
if @
|
647
|
-
@
|
647
|
+
if @lambda_stack.last == @paren_nest
|
648
|
+
@lambda_stack.pop
|
648
649
|
@lex_state = :expr_beg
|
649
650
|
return :kDO_LAMBDA
|
650
651
|
elsif cond?
|
@@ -1010,12 +1011,14 @@ module Opal
|
|
1010
1011
|
@lex_state = :expr_beg
|
1011
1012
|
cond_push 0
|
1012
1013
|
cmdarg_push 0
|
1014
|
+
@paren_nest += 1
|
1013
1015
|
|
1014
1016
|
return result
|
1015
1017
|
|
1016
1018
|
elsif scan(/\)/)
|
1017
1019
|
cond_lexpop
|
1018
1020
|
cmdarg_lexpop
|
1021
|
+
@paren_nest -= 1
|
1019
1022
|
@lex_state = :expr_end
|
1020
1023
|
@lparen_arg_seen = false
|
1021
1024
|
return :tRPAREN
|
@@ -1176,9 +1179,8 @@ module Opal
|
|
1176
1179
|
end
|
1177
1180
|
|
1178
1181
|
elsif scan(/->/)
|
1179
|
-
# FIXME: # should be :expr_arg, but '(' breaks it...
|
1180
1182
|
@lex_state = :expr_end
|
1181
|
-
@
|
1183
|
+
@lambda_stack.push(@paren_nest)
|
1182
1184
|
return :tLAMBDA
|
1183
1185
|
|
1184
1186
|
elsif scan(/[+-]/)
|
@@ -1289,8 +1291,8 @@ module Opal
|
|
1289
1291
|
return :tCOMMA
|
1290
1292
|
|
1291
1293
|
elsif scan(/\{/)
|
1292
|
-
if @
|
1293
|
-
@
|
1294
|
+
if @lambda_stack.last == @paren_nest
|
1295
|
+
@lambda_stack.pop
|
1294
1296
|
@lex_state = :expr_beg
|
1295
1297
|
cond_push 0
|
1296
1298
|
cmdarg_push 0
|