opal 1.2.0 → 1.3.0.alpha1
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/.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
|