opal 1.2.0 → 1.3.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.eslintrc.await.js +6 -0
- data/.eslintrc.js +34 -0
- data/.github/workflows/build.yml +8 -0
- data/.rubocop.yml +9 -0
- data/CHANGELOG.md +4 -0
- data/README.md +1 -1
- data/Rakefile +1 -0
- data/UNRELEASED.md +64 -38
- data/docs/async.md +109 -0
- data/docs/roda-sprockets.md +0 -2
- data/exe/opal +2 -0
- data/exe/opal-repl +2 -2
- data/lib/opal/builder.rb +5 -1
- data/lib/opal/builder_processors.rb +7 -2
- data/lib/opal/cache/file_cache.rb +119 -0
- data/lib/opal/cache.rb +71 -0
- data/lib/opal/cli.rb +35 -1
- data/lib/opal/cli_options.rb +21 -0
- data/lib/opal/cli_runners/chrome.rb +21 -14
- data/lib/opal/cli_runners/chrome_cdp_interface.js +30285 -0
- data/lib/opal/cli_runners/{chrome.js → chrome_cdp_interface.rb} +27 -6
- data/lib/opal/cli_runners/compiler.rb +2 -1
- data/lib/opal/cli_runners/gjs.rb +27 -0
- data/lib/opal/cli_runners/mini_racer.rb +36 -0
- data/lib/opal/cli_runners/source-map-support-browser.js +276 -91
- data/lib/opal/cli_runners/source-map-support-node.js +276 -91
- data/lib/opal/cli_runners/source-map-support.js +60 -18
- data/lib/opal/cli_runners.rb +2 -0
- data/lib/opal/compiler.rb +99 -10
- data/lib/opal/fragment.rb +77 -14
- data/lib/opal/nodes/args/extract_kwrestarg.rb +6 -4
- data/lib/opal/nodes/args/extract_restarg.rb +10 -12
- data/lib/opal/nodes/args.rb +28 -0
- data/lib/opal/nodes/base.rb +29 -5
- data/lib/opal/nodes/call.rb +123 -2
- data/lib/opal/nodes/case.rb +7 -1
- data/lib/opal/nodes/class.rb +12 -2
- data/lib/opal/nodes/def.rb +3 -23
- data/lib/opal/nodes/definitions.rb +21 -4
- data/lib/opal/nodes/helpers.rb +2 -2
- data/lib/opal/nodes/if.rb +39 -9
- data/lib/opal/nodes/iter.rb +15 -3
- data/lib/opal/nodes/lambda.rb +3 -1
- data/lib/opal/nodes/literal.rb +13 -7
- data/lib/opal/nodes/logic.rb +2 -2
- data/lib/opal/nodes/module.rb +12 -2
- data/lib/opal/nodes/rescue.rb +59 -34
- data/lib/opal/nodes/scope.rb +88 -6
- data/lib/opal/nodes/super.rb +52 -25
- data/lib/opal/nodes/top.rb +13 -7
- data/lib/opal/nodes/while.rb +7 -1
- data/lib/opal/parser/patch.rb +2 -1
- data/lib/opal/repl.rb +137 -49
- data/lib/opal/rewriters/binary_operator_assignment.rb +10 -10
- data/lib/opal/rewriters/block_to_iter.rb +3 -3
- data/lib/opal/rewriters/for_rewriter.rb +7 -7
- data/lib/opal/rewriters/js_reserved_words.rb +5 -3
- data/lib/opal/source_map/file.rb +7 -4
- data/lib/opal/source_map/map.rb +17 -3
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +2 -2
- data/opal/corelib/binding.rb +46 -0
- data/opal/corelib/boolean.rb +54 -4
- data/opal/corelib/class.rb +2 -0
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/error.rb +98 -12
- data/opal/corelib/io.rb +250 -38
- data/opal/corelib/kernel/format.rb +5 -2
- data/opal/corelib/kernel.rb +44 -23
- data/opal/corelib/main.rb +5 -0
- data/opal/corelib/method.rb +1 -0
- data/opal/corelib/module.rb +28 -0
- data/opal/corelib/number.rb +12 -1
- data/opal/corelib/random/seedrandom.js.rb +2 -2
- data/opal/corelib/regexp.rb +47 -3
- data/opal/corelib/runtime.js +152 -12
- data/opal/corelib/string/encoding.rb +17 -17
- data/opal/corelib/string.rb +2 -0
- data/opal/corelib/struct.rb +10 -3
- data/opal/corelib/trace_point.rb +57 -0
- data/opal/opal/full.rb +2 -0
- data/package.json +3 -2
- data/spec/filters/bugs/array.rb +0 -1
- data/spec/filters/bugs/basicobject.rb +0 -1
- data/spec/filters/bugs/binding.rb +27 -0
- data/spec/filters/bugs/enumerator.rb +132 -0
- data/spec/filters/bugs/exception.rb +70 -93
- data/spec/filters/bugs/float.rb +0 -1
- data/spec/filters/bugs/kernel.rb +3 -9
- data/spec/filters/bugs/language.rb +15 -58
- data/spec/filters/bugs/main.rb +16 -0
- data/spec/filters/bugs/matrix.rb +39 -0
- data/spec/filters/bugs/method.rb +0 -2
- data/spec/filters/bugs/module.rb +36 -79
- data/spec/filters/bugs/proc.rb +0 -1
- data/spec/filters/bugs/regexp.rb +0 -16
- data/spec/filters/bugs/trace_point.rb +12 -0
- data/spec/filters/bugs/warnings.rb +0 -4
- data/spec/filters/unsupported/freeze.rb +2 -0
- data/spec/filters/unsupported/privacy.rb +4 -0
- data/spec/lib/compiler_spec.rb +7 -1
- data/spec/lib/repl_spec.rb +4 -2
- data/spec/lib/source_map/file_spec.rb +1 -1
- data/spec/mspec-opal/formatters.rb +18 -4
- data/spec/mspec-opal/runner.rb +2 -2
- data/spec/opal/core/boolean_spec.rb +44 -0
- data/spec/opal/core/hash_spec.rb +8 -0
- data/spec/opal/core/number/to_s_spec.rb +11 -0
- data/spec/opal/stdlib/json/ext_spec.rb +3 -3
- data/spec/opal/stdlib/logger/logger_spec.rb +10 -1
- data/spec/ruby_specs +18 -0
- data/stdlib/await.rb +83 -0
- data/stdlib/base64.rb +4 -4
- data/stdlib/bigdecimal/bignumber.js.rb +4 -2
- data/stdlib/bigdecimal.rb +1 -0
- data/stdlib/gjs/io.rb +33 -0
- data/stdlib/gjs/kernel.rb +5 -0
- data/stdlib/gjs.rb +2 -0
- data/stdlib/js.rb +4 -0
- data/stdlib/json.rb +3 -3
- data/stdlib/logger.rb +1 -1
- data/stdlib/nashorn/file.rb +2 -0
- data/stdlib/nodejs/env.rb +7 -0
- data/stdlib/nodejs/file.rb +6 -41
- data/stdlib/nodejs/io.rb +21 -5
- data/stdlib/nodejs/js-yaml-3-6-1.js +2 -2
- data/stdlib/opal/miniracer.rb +6 -0
- data/stdlib/opal/platform.rb +4 -0
- data/stdlib/opal/repl_js.rb +5 -0
- data/stdlib/opal/replutils.rb +271 -0
- data/stdlib/opal-parser.rb +24 -11
- data/stdlib/opal-platform.rb +8 -0
- data/stdlib/promise/v2.rb +16 -4
- data/stdlib/promise.rb +14 -0
- data/stdlib/stringio.rb +13 -110
- data/stdlib/thread.rb +29 -0
- data/tasks/building.rake +10 -4
- data/tasks/linting-parse-eslint-results.js +39 -0
- data/tasks/linting.rake +38 -28
- data/tasks/performance/asciidoctor_test.rb.erb +6 -0
- data/tasks/performance/optimization_status.rb +77 -0
- data/tasks/performance.rake +149 -0
- data/tasks/testing.rake +9 -1
- data/test/nodejs/test_await.rb +169 -0
- data/test/opal/promisev2/test_error.rb +9 -3
- data/test/opal/unsupported_and_bugs.rb +5 -0
- data/vendored-minitest/minitest/benchmark.rb +9 -7
- data/vendored-minitest/minitest/test.rb +14 -12
- data/vendored-minitest/minitest.rb +19 -16
- data/yarn.lock +686 -117
- metadata +60 -23
- data/.jshintrc +0 -41
- data/spec/filters/unsupported/refinements.rb +0 -8
- data/vendored-minitest/minitest/hell.rb +0 -11
- data/vendored-minitest/minitest/parallel.rb +0 -65
- data/vendored-minitest/minitest/pride.rb +0 -4
- data/vendored-minitest/minitest/pride_plugin.rb +0 -142
- data/vendored-minitest/minitest/unit.rb +0 -45
data/lib/opal/nodes/rescue.rb
CHANGED
@@ -49,7 +49,13 @@ module Opal
|
|
49
49
|
|
50
50
|
line '}'
|
51
51
|
|
52
|
-
|
52
|
+
if wrap_in_closure?
|
53
|
+
if scope.await_encountered
|
54
|
+
wrap '(await (async function() { ', '; })())'
|
55
|
+
else
|
56
|
+
wrap '(function() { ', '; })()'
|
57
|
+
end
|
58
|
+
end
|
53
59
|
end
|
54
60
|
|
55
61
|
def body_sexp
|
@@ -88,49 +94,59 @@ module Opal
|
|
88
94
|
line 'var $no_errors = true;'
|
89
95
|
end
|
90
96
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
line '} catch ($err) {'
|
96
|
-
|
97
|
-
indent do
|
98
|
-
if has_rescue_else?
|
99
|
-
line '$no_errors = false;'
|
97
|
+
in_rescue(self) do
|
98
|
+
push 'try {'
|
99
|
+
indent do
|
100
|
+
line stmt(body_code)
|
100
101
|
end
|
102
|
+
line '} catch ($err) {'
|
101
103
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
104
|
+
indent do
|
105
|
+
if has_rescue_else?
|
106
|
+
line '$no_errors = false;'
|
107
|
+
end
|
106
108
|
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
children[1..-1].each_with_index do |child, idx|
|
110
|
+
# counting only rescue, ignoring rescue-else statement
|
111
|
+
next unless child && child.type == :resbody
|
112
|
+
_has_rescue_handlers = true
|
110
113
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
+
push ' else ' unless idx == 0
|
115
|
+
line process(child, @level)
|
116
|
+
end
|
114
117
|
|
115
|
-
|
118
|
+
# if no resbodys capture our error, then rethrow
|
119
|
+
push ' else { throw $err; }'
|
120
|
+
end
|
116
121
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
+
line '}'
|
123
|
+
|
124
|
+
if handle_rescue_else_manually?
|
125
|
+
# here we must add 'finally' explicitly
|
126
|
+
push 'finally {'
|
122
127
|
indent do
|
123
|
-
line
|
128
|
+
line 'if ($no_errors) { '
|
129
|
+
indent do
|
130
|
+
line stmt(rescue_else_code)
|
131
|
+
end
|
132
|
+
line '}'
|
124
133
|
end
|
125
|
-
|
134
|
+
push '}'
|
126
135
|
end
|
127
|
-
|
136
|
+
|
137
|
+
wrap "#{retry_id}: do { ", ' break; } while(1)' if retry_id
|
128
138
|
end
|
129
139
|
|
130
140
|
# Wrap a try{} catch{} into a function
|
131
141
|
# when it's an expression
|
132
142
|
# or when there's a method call after begin;rescue;end
|
133
|
-
|
143
|
+
if expr? || recv?
|
144
|
+
if scope.await_encountered
|
145
|
+
wrap '(await (async function() { ', '})())'
|
146
|
+
else
|
147
|
+
wrap '(function() { ', '})()'
|
148
|
+
end
|
149
|
+
end
|
134
150
|
end
|
135
151
|
|
136
152
|
def body_code
|
@@ -149,8 +165,14 @@ module Opal
|
|
149
165
|
# wrapping current rescue.
|
150
166
|
#
|
151
167
|
def handle_rescue_else_manually?
|
152
|
-
!
|
168
|
+
!in_ensure? && has_rescue_else?
|
153
169
|
end
|
170
|
+
|
171
|
+
def gen_retry_id
|
172
|
+
@retry_id ||= scope.gen_retry_id
|
173
|
+
end
|
174
|
+
|
175
|
+
attr_reader :retry_id
|
154
176
|
end
|
155
177
|
|
156
178
|
class ResBodyNode < Base
|
@@ -168,9 +190,11 @@ module Opal
|
|
168
190
|
# Need to ensure we clear the current exception out after the rescue block ends
|
169
191
|
line 'try {'
|
170
192
|
indent do
|
171
|
-
|
193
|
+
in_resbody do
|
194
|
+
line stmt(rescue_body)
|
195
|
+
end
|
172
196
|
end
|
173
|
-
line '} finally { Opal.pop_exception() }'
|
197
|
+
line '} finally { Opal.pop_exception(); }'
|
174
198
|
end
|
175
199
|
line '}'
|
176
200
|
end
|
@@ -190,7 +214,8 @@ module Opal
|
|
190
214
|
handle :retry
|
191
215
|
|
192
216
|
def compile
|
193
|
-
|
217
|
+
error 'Invalid retry' unless in_resbody?
|
218
|
+
push "continue #{scope.current_rescue.gen_retry_id}"
|
194
219
|
end
|
195
220
|
end
|
196
221
|
end
|
data/lib/opal/nodes/scope.rb
CHANGED
@@ -27,11 +27,7 @@ module Opal
|
|
27
27
|
# used by modules to know what methods to donate to includees
|
28
28
|
attr_reader :methods
|
29
29
|
|
30
|
-
|
31
|
-
attr_accessor :uses_super
|
32
|
-
attr_accessor :uses_zuper
|
33
|
-
|
34
|
-
attr_accessor :catch_return, :has_break
|
30
|
+
attr_accessor :catch_return, :has_break, :has_retry
|
35
31
|
|
36
32
|
attr_accessor :rescue_else_sexp
|
37
33
|
|
@@ -92,6 +88,11 @@ module Opal
|
|
92
88
|
@type == :top
|
93
89
|
end
|
94
90
|
|
91
|
+
# Traverses to the top scope.
|
92
|
+
def top_scope
|
93
|
+
top? ? self : parent.top_scope
|
94
|
+
end
|
95
|
+
|
95
96
|
# True if a block/iter scope
|
96
97
|
def iter?
|
97
98
|
@type == :iter
|
@@ -101,6 +102,24 @@ module Opal
|
|
101
102
|
@type == :def || @type == :defs
|
102
103
|
end
|
103
104
|
|
105
|
+
def lambda?
|
106
|
+
iter? && @is_lambda
|
107
|
+
end
|
108
|
+
|
109
|
+
def is_lambda! # rubocop:disable Naming/PredicateName
|
110
|
+
@is_lambda = true
|
111
|
+
end
|
112
|
+
|
113
|
+
def defines_lambda
|
114
|
+
@lambda_definition = true
|
115
|
+
yield
|
116
|
+
@lambda_definition = false
|
117
|
+
end
|
118
|
+
|
119
|
+
def lambda_definition?
|
120
|
+
@lambda_definition
|
121
|
+
end
|
122
|
+
|
104
123
|
# Is this a normal def method directly inside a class? This is
|
105
124
|
# used for optimizing ivars as we can set them to nil in the
|
106
125
|
# class body
|
@@ -170,6 +189,10 @@ module Opal
|
|
170
189
|
false
|
171
190
|
end
|
172
191
|
|
192
|
+
def scope_locals
|
193
|
+
@locals | @args | (@parent && @type == :iter ? @parent.scope_locals : [])
|
194
|
+
end
|
195
|
+
|
173
196
|
def add_scope_temp(tmp)
|
174
197
|
return if has_temp?(tmp)
|
175
198
|
|
@@ -241,7 +264,7 @@ module Opal
|
|
241
264
|
def find_parent_def
|
242
265
|
scope = self
|
243
266
|
while scope = scope.parent
|
244
|
-
if scope.def?
|
267
|
+
if scope.def? || scope.lambda?
|
245
268
|
return scope
|
246
269
|
end
|
247
270
|
end
|
@@ -277,6 +300,34 @@ module Opal
|
|
277
300
|
!rescue_else_sexp.nil?
|
278
301
|
end
|
279
302
|
|
303
|
+
def in_rescue(node)
|
304
|
+
@rescues ||= []
|
305
|
+
|
306
|
+
@rescues.push(node)
|
307
|
+
result = yield
|
308
|
+
@rescues.pop
|
309
|
+
|
310
|
+
result
|
311
|
+
end
|
312
|
+
|
313
|
+
def current_rescue
|
314
|
+
@rescues.last
|
315
|
+
end
|
316
|
+
|
317
|
+
def in_resbody
|
318
|
+
return unless block_given?
|
319
|
+
|
320
|
+
@in_resbody = true
|
321
|
+
result = yield
|
322
|
+
@in_resbody = false
|
323
|
+
|
324
|
+
result
|
325
|
+
end
|
326
|
+
|
327
|
+
def in_resbody?
|
328
|
+
@in_resbody
|
329
|
+
end
|
330
|
+
|
280
331
|
def in_ensure
|
281
332
|
return unless block_given?
|
282
333
|
|
@@ -290,6 +341,37 @@ module Opal
|
|
290
341
|
def in_ensure?
|
291
342
|
@in_ensure
|
292
343
|
end
|
344
|
+
|
345
|
+
def gen_retry_id
|
346
|
+
@next_retry_id ||= 'retry_0'
|
347
|
+
@next_retry_id = @next_retry_id.succ
|
348
|
+
end
|
349
|
+
|
350
|
+
def accepts_using?
|
351
|
+
# IterNode of a special kind of Module.new {} is accepted...
|
352
|
+
# though we don't check for it that thoroughly.
|
353
|
+
[TopNode, ModuleNode, ClassNode, IterNode].include? self.class
|
354
|
+
end
|
355
|
+
|
356
|
+
def collect_refinements_temps(temps = [])
|
357
|
+
temps << @refinements_temp if @refinements_temp
|
358
|
+
return parent.collect_refinements_temps(temps) if parent
|
359
|
+
temps
|
360
|
+
end
|
361
|
+
|
362
|
+
def new_refinements_temp
|
363
|
+
var = compiler.unique_temp("$refn")
|
364
|
+
add_scope_local(var)
|
365
|
+
var
|
366
|
+
end
|
367
|
+
|
368
|
+
def refinements_temp
|
369
|
+
prev, curr = @refinements_temp, new_refinements_temp
|
370
|
+
@refinements_temp = curr
|
371
|
+
[prev, curr]
|
372
|
+
end
|
373
|
+
|
374
|
+
attr_accessor :await_encountered
|
293
375
|
end
|
294
376
|
end
|
295
377
|
end
|
data/lib/opal/nodes/super.rb
CHANGED
@@ -48,20 +48,12 @@ module Opal
|
|
48
48
|
@def_scope ||= scope.def? ? scope : scope.find_parent_def
|
49
49
|
end
|
50
50
|
|
51
|
-
def raise_exception?
|
52
|
-
@sexp.type == :defined_super
|
53
|
-
end
|
54
|
-
|
55
51
|
def defined_check_param
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
def implicit_args?
|
60
|
-
@sexp.type == :zsuper
|
52
|
+
'false'
|
61
53
|
end
|
62
54
|
|
63
55
|
def implicit_arguments_param
|
64
|
-
|
56
|
+
'false'
|
65
57
|
end
|
66
58
|
|
67
59
|
def method_id
|
@@ -73,17 +65,19 @@ module Opal
|
|
73
65
|
end
|
74
66
|
|
75
67
|
def allow_stubs
|
76
|
-
true
|
68
|
+
'true'
|
77
69
|
end
|
78
70
|
|
79
71
|
def super_method_invocation
|
80
|
-
|
72
|
+
helper :find_super
|
73
|
+
"$find_super(self, '#{method_id}', #{def_scope_identity}, #{defined_check_param}, #{allow_stubs})"
|
81
74
|
end
|
82
75
|
|
83
76
|
def super_block_invocation
|
77
|
+
helper :find_block_super
|
84
78
|
chain, cur_defn, mid = scope.super_chain
|
85
79
|
trys = chain.map { |c| "#{c}.$$def" }.join(' || ')
|
86
|
-
"
|
80
|
+
"$find_block_super(self, #{mid}, (#{trys} || #{cur_defn}), #{defined_check_param}, #{implicit_arguments_param})"
|
87
81
|
end
|
88
82
|
|
89
83
|
def compile_method_body
|
@@ -111,7 +105,11 @@ module Opal
|
|
111
105
|
handle :defined_super
|
112
106
|
|
113
107
|
def allow_stubs
|
114
|
-
false
|
108
|
+
'false'
|
109
|
+
end
|
110
|
+
|
111
|
+
def defined_check_param
|
112
|
+
'true'
|
115
113
|
end
|
116
114
|
|
117
115
|
def compile
|
@@ -122,7 +120,7 @@ module Opal
|
|
122
120
|
end
|
123
121
|
end
|
124
122
|
|
125
|
-
# super with
|
123
|
+
# super with explicit args
|
126
124
|
class SuperNode < BaseSuperNode
|
127
125
|
handle :super
|
128
126
|
|
@@ -139,10 +137,14 @@ module Opal
|
|
139
137
|
end
|
140
138
|
end
|
141
139
|
|
142
|
-
# super with
|
140
|
+
# super with implicit args
|
143
141
|
class ZsuperNode < SuperNode
|
144
142
|
handle :zsuper
|
145
143
|
|
144
|
+
def implicit_arguments_param
|
145
|
+
'true'
|
146
|
+
end
|
147
|
+
|
146
148
|
def initialize(*)
|
147
149
|
super
|
148
150
|
|
@@ -157,8 +159,7 @@ module Opal
|
|
157
159
|
|
158
160
|
def compile
|
159
161
|
if def_scope
|
160
|
-
|
161
|
-
implicit_args = [s(:js_tmp, '$zuper')]
|
162
|
+
implicit_args = implicit_arglist
|
162
163
|
# If the method we're in has a block and we're using a default super call with no args, we need to grab the block
|
163
164
|
# If an iter (block via braces) is provided, that takes precedence
|
164
165
|
if block_name && !iter
|
@@ -172,14 +173,40 @@ module Opal
|
|
172
173
|
compile_using_send
|
173
174
|
end
|
174
175
|
|
175
|
-
def
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
176
|
+
def implicit_arglist
|
177
|
+
args = []
|
178
|
+
kwargs = []
|
179
|
+
same_arg_counter = Hash.new(0)
|
180
|
+
|
181
|
+
def_scope.original_args.children.each do |sexp|
|
182
|
+
arg_name = sexp.meta[:arg_name]
|
183
|
+
|
184
|
+
case sexp.type
|
185
|
+
when :arg, :optarg
|
186
|
+
arg_node = s(:lvar, arg_name)
|
187
|
+
# def m(_, _)
|
188
|
+
# is compiled to
|
189
|
+
# function $$m(_, __$2)
|
190
|
+
# See Opal::Node::ArgsNode
|
191
|
+
if arg_name[0] == '_'
|
192
|
+
same_arg_counter[arg_name] += 1
|
193
|
+
arg_node = s(:js_tmp, "#{arg_name}_$#{same_arg_counter[arg_name]}") if same_arg_counter[arg_name] > 1
|
194
|
+
end
|
195
|
+
|
196
|
+
args << arg_node
|
197
|
+
when :restarg
|
198
|
+
arg_node = arg_name ? s(:lvar, arg_name) : s(:js_tmp, '$rest_arg')
|
199
|
+
args << s(:splat, arg_node)
|
200
|
+
when :kwarg, :kwoptarg
|
201
|
+
kwargs << s(:pair, s(:sym, arg_name), s(:lvar, arg_name))
|
202
|
+
when :kwrestarg
|
203
|
+
arg_node = arg_name ? s(:lvar, arg_name) : s(:js_tmp, '$kw_rest_arg')
|
204
|
+
kwargs << s(:kwsplat, arg_node)
|
205
|
+
end
|
182
206
|
end
|
207
|
+
|
208
|
+
args << s(:hash, *kwargs) unless kwargs.empty?
|
209
|
+
args
|
183
210
|
end
|
184
211
|
|
185
212
|
def block_name
|
data/lib/opal/nodes/top.rb
CHANGED
@@ -15,7 +15,6 @@ module Opal
|
|
15
15
|
def compile
|
16
16
|
push version_comment
|
17
17
|
|
18
|
-
opening
|
19
18
|
in_scope do
|
20
19
|
line '"use strict";' if compiler.use_strict?
|
21
20
|
|
@@ -42,17 +41,24 @@ module Opal
|
|
42
41
|
|
43
42
|
line body_code
|
44
43
|
end
|
45
|
-
|
44
|
+
opening
|
46
45
|
closing
|
47
46
|
end
|
48
47
|
|
49
48
|
def opening
|
49
|
+
as = ""
|
50
|
+
if await_encountered
|
51
|
+
as = "async "
|
52
|
+
end
|
53
|
+
|
50
54
|
if compiler.requirable?
|
51
|
-
|
55
|
+
unshift "Opal.modules[#{Opal::Compiler.module_name(compiler.file).inspect}] = #{as}function(Opal) {"
|
52
56
|
elsif compiler.eval?
|
53
|
-
|
57
|
+
unshift "(#{as}function(Opal, self) {"
|
58
|
+
elsif compiler.esm?
|
59
|
+
unshift "export default Opal.queue(#{as}function(Opal) {"
|
54
60
|
else
|
55
|
-
|
61
|
+
unshift "Opal.queue(#{as}function(Opal) {"
|
56
62
|
end
|
57
63
|
end
|
58
64
|
|
@@ -60,9 +66,9 @@ module Opal
|
|
60
66
|
if compiler.requirable?
|
61
67
|
line "};\n"
|
62
68
|
elsif compiler.eval?
|
63
|
-
line
|
69
|
+
line "})(Opal, self);"
|
64
70
|
else
|
65
|
-
line "})
|
71
|
+
line "});\n"
|
66
72
|
end
|
67
73
|
end
|
68
74
|
|
data/lib/opal/nodes/while.rb
CHANGED
@@ -26,7 +26,13 @@ module Opal
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
if wrap_in_closure?
|
30
|
+
if scope.await_encountered
|
31
|
+
wrap '(await (async function() {', '; return nil; })())'
|
32
|
+
else
|
33
|
+
wrap '(function() {', '; return nil; })()'
|
34
|
+
end
|
35
|
+
end
|
30
36
|
end
|
31
37
|
|
32
38
|
private
|
data/lib/opal/parser/patch.rb
CHANGED
@@ -41,7 +41,8 @@ if RUBY_ENGINE == 'opal'
|
|
41
41
|
|
42
42
|
class Parser::Builders::Default
|
43
43
|
def check_lvar_name(name, loc)
|
44
|
-
|
44
|
+
# https://javascript.info/regexp-unicode
|
45
|
+
if name =~ `new RegExp('^[\\p{Ll}|_][\\p{L}\\p{Nl}\\p{Nd}_]*$', 'u')`
|
45
46
|
# OK
|
46
47
|
else
|
47
48
|
diagnostic :error, :lvar_name, { name: name }, loc
|