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.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.await.js +6 -0
  3. data/.eslintrc.js +34 -0
  4. data/.github/workflows/build.yml +8 -0
  5. data/.rubocop.yml +9 -0
  6. data/CHANGELOG.md +4 -0
  7. data/README.md +1 -1
  8. data/Rakefile +1 -0
  9. data/UNRELEASED.md +64 -38
  10. data/docs/async.md +109 -0
  11. data/docs/roda-sprockets.md +0 -2
  12. data/exe/opal +2 -0
  13. data/exe/opal-repl +2 -2
  14. data/lib/opal/builder.rb +5 -1
  15. data/lib/opal/builder_processors.rb +7 -2
  16. data/lib/opal/cache/file_cache.rb +119 -0
  17. data/lib/opal/cache.rb +71 -0
  18. data/lib/opal/cli.rb +35 -1
  19. data/lib/opal/cli_options.rb +21 -0
  20. data/lib/opal/cli_runners/chrome.rb +21 -14
  21. data/lib/opal/cli_runners/chrome_cdp_interface.js +30285 -0
  22. data/lib/opal/cli_runners/{chrome.js → chrome_cdp_interface.rb} +27 -6
  23. data/lib/opal/cli_runners/compiler.rb +2 -1
  24. data/lib/opal/cli_runners/gjs.rb +27 -0
  25. data/lib/opal/cli_runners/mini_racer.rb +36 -0
  26. data/lib/opal/cli_runners/source-map-support-browser.js +276 -91
  27. data/lib/opal/cli_runners/source-map-support-node.js +276 -91
  28. data/lib/opal/cli_runners/source-map-support.js +60 -18
  29. data/lib/opal/cli_runners.rb +2 -0
  30. data/lib/opal/compiler.rb +99 -10
  31. data/lib/opal/fragment.rb +77 -14
  32. data/lib/opal/nodes/args/extract_kwrestarg.rb +6 -4
  33. data/lib/opal/nodes/args/extract_restarg.rb +10 -12
  34. data/lib/opal/nodes/args.rb +28 -0
  35. data/lib/opal/nodes/base.rb +29 -5
  36. data/lib/opal/nodes/call.rb +123 -2
  37. data/lib/opal/nodes/case.rb +7 -1
  38. data/lib/opal/nodes/class.rb +12 -2
  39. data/lib/opal/nodes/def.rb +3 -23
  40. data/lib/opal/nodes/definitions.rb +21 -4
  41. data/lib/opal/nodes/helpers.rb +2 -2
  42. data/lib/opal/nodes/if.rb +39 -9
  43. data/lib/opal/nodes/iter.rb +15 -3
  44. data/lib/opal/nodes/lambda.rb +3 -1
  45. data/lib/opal/nodes/literal.rb +13 -7
  46. data/lib/opal/nodes/logic.rb +2 -2
  47. data/lib/opal/nodes/module.rb +12 -2
  48. data/lib/opal/nodes/rescue.rb +59 -34
  49. data/lib/opal/nodes/scope.rb +88 -6
  50. data/lib/opal/nodes/super.rb +52 -25
  51. data/lib/opal/nodes/top.rb +13 -7
  52. data/lib/opal/nodes/while.rb +7 -1
  53. data/lib/opal/parser/patch.rb +2 -1
  54. data/lib/opal/repl.rb +137 -49
  55. data/lib/opal/rewriters/binary_operator_assignment.rb +10 -10
  56. data/lib/opal/rewriters/block_to_iter.rb +3 -3
  57. data/lib/opal/rewriters/for_rewriter.rb +7 -7
  58. data/lib/opal/rewriters/js_reserved_words.rb +5 -3
  59. data/lib/opal/source_map/file.rb +7 -4
  60. data/lib/opal/source_map/map.rb +17 -3
  61. data/lib/opal/version.rb +1 -1
  62. data/opal/corelib/array.rb +2 -2
  63. data/opal/corelib/binding.rb +46 -0
  64. data/opal/corelib/boolean.rb +54 -4
  65. data/opal/corelib/class.rb +2 -0
  66. data/opal/corelib/constants.rb +2 -2
  67. data/opal/corelib/error.rb +98 -12
  68. data/opal/corelib/io.rb +250 -38
  69. data/opal/corelib/kernel/format.rb +5 -2
  70. data/opal/corelib/kernel.rb +44 -23
  71. data/opal/corelib/main.rb +5 -0
  72. data/opal/corelib/method.rb +1 -0
  73. data/opal/corelib/module.rb +28 -0
  74. data/opal/corelib/number.rb +12 -1
  75. data/opal/corelib/random/seedrandom.js.rb +2 -2
  76. data/opal/corelib/regexp.rb +47 -3
  77. data/opal/corelib/runtime.js +152 -12
  78. data/opal/corelib/string/encoding.rb +17 -17
  79. data/opal/corelib/string.rb +2 -0
  80. data/opal/corelib/struct.rb +10 -3
  81. data/opal/corelib/trace_point.rb +57 -0
  82. data/opal/opal/full.rb +2 -0
  83. data/package.json +3 -2
  84. data/spec/filters/bugs/array.rb +0 -1
  85. data/spec/filters/bugs/basicobject.rb +0 -1
  86. data/spec/filters/bugs/binding.rb +27 -0
  87. data/spec/filters/bugs/enumerator.rb +132 -0
  88. data/spec/filters/bugs/exception.rb +70 -93
  89. data/spec/filters/bugs/float.rb +0 -1
  90. data/spec/filters/bugs/kernel.rb +3 -9
  91. data/spec/filters/bugs/language.rb +15 -58
  92. data/spec/filters/bugs/main.rb +16 -0
  93. data/spec/filters/bugs/matrix.rb +39 -0
  94. data/spec/filters/bugs/method.rb +0 -2
  95. data/spec/filters/bugs/module.rb +36 -79
  96. data/spec/filters/bugs/proc.rb +0 -1
  97. data/spec/filters/bugs/regexp.rb +0 -16
  98. data/spec/filters/bugs/trace_point.rb +12 -0
  99. data/spec/filters/bugs/warnings.rb +0 -4
  100. data/spec/filters/unsupported/freeze.rb +2 -0
  101. data/spec/filters/unsupported/privacy.rb +4 -0
  102. data/spec/lib/compiler_spec.rb +7 -1
  103. data/spec/lib/repl_spec.rb +4 -2
  104. data/spec/lib/source_map/file_spec.rb +1 -1
  105. data/spec/mspec-opal/formatters.rb +18 -4
  106. data/spec/mspec-opal/runner.rb +2 -2
  107. data/spec/opal/core/boolean_spec.rb +44 -0
  108. data/spec/opal/core/hash_spec.rb +8 -0
  109. data/spec/opal/core/number/to_s_spec.rb +11 -0
  110. data/spec/opal/stdlib/json/ext_spec.rb +3 -3
  111. data/spec/opal/stdlib/logger/logger_spec.rb +10 -1
  112. data/spec/ruby_specs +18 -0
  113. data/stdlib/await.rb +83 -0
  114. data/stdlib/base64.rb +4 -4
  115. data/stdlib/bigdecimal/bignumber.js.rb +4 -2
  116. data/stdlib/bigdecimal.rb +1 -0
  117. data/stdlib/gjs/io.rb +33 -0
  118. data/stdlib/gjs/kernel.rb +5 -0
  119. data/stdlib/gjs.rb +2 -0
  120. data/stdlib/js.rb +4 -0
  121. data/stdlib/json.rb +3 -3
  122. data/stdlib/logger.rb +1 -1
  123. data/stdlib/nashorn/file.rb +2 -0
  124. data/stdlib/nodejs/env.rb +7 -0
  125. data/stdlib/nodejs/file.rb +6 -41
  126. data/stdlib/nodejs/io.rb +21 -5
  127. data/stdlib/nodejs/js-yaml-3-6-1.js +2 -2
  128. data/stdlib/opal/miniracer.rb +6 -0
  129. data/stdlib/opal/platform.rb +4 -0
  130. data/stdlib/opal/repl_js.rb +5 -0
  131. data/stdlib/opal/replutils.rb +271 -0
  132. data/stdlib/opal-parser.rb +24 -11
  133. data/stdlib/opal-platform.rb +8 -0
  134. data/stdlib/promise/v2.rb +16 -4
  135. data/stdlib/promise.rb +14 -0
  136. data/stdlib/stringio.rb +13 -110
  137. data/stdlib/thread.rb +29 -0
  138. data/tasks/building.rake +10 -4
  139. data/tasks/linting-parse-eslint-results.js +39 -0
  140. data/tasks/linting.rake +38 -28
  141. data/tasks/performance/asciidoctor_test.rb.erb +6 -0
  142. data/tasks/performance/optimization_status.rb +77 -0
  143. data/tasks/performance.rake +149 -0
  144. data/tasks/testing.rake +9 -1
  145. data/test/nodejs/test_await.rb +169 -0
  146. data/test/opal/promisev2/test_error.rb +9 -3
  147. data/test/opal/unsupported_and_bugs.rb +5 -0
  148. data/vendored-minitest/minitest/benchmark.rb +9 -7
  149. data/vendored-minitest/minitest/test.rb +14 -12
  150. data/vendored-minitest/minitest.rb +19 -16
  151. data/yarn.lock +686 -117
  152. metadata +60 -23
  153. data/.jshintrc +0 -41
  154. data/spec/filters/unsupported/refinements.rb +0 -8
  155. data/vendored-minitest/minitest/hell.rb +0 -11
  156. data/vendored-minitest/minitest/parallel.rb +0 -65
  157. data/vendored-minitest/minitest/pride.rb +0 -4
  158. data/vendored-minitest/minitest/pride_plugin.rb +0 -142
  159. data/vendored-minitest/minitest/unit.rb +0 -45
@@ -49,7 +49,13 @@ module Opal
49
49
 
50
50
  line '}'
51
51
 
52
- wrap '(function() { ', '; })()' if wrap_in_closure?
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
- push 'try {'
92
- indent do
93
- line stmt(body_code)
94
- end
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
- children[1..-1].each_with_index do |child, idx|
103
- # counting only rescue, ignoring rescue-else statement
104
- next unless child && child.type == :resbody
105
- _has_rescue_handlers = true
104
+ indent do
105
+ if has_rescue_else?
106
+ line '$no_errors = false;'
107
+ end
106
108
 
107
- push ' else ' unless idx == 0
108
- line process(child, @level)
109
- end
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
- # if no resbodys capture our error, then rethrow
112
- push ' else { throw $err; }'
113
- end
114
+ push ' else ' unless idx == 0
115
+ line process(child, @level)
116
+ end
114
117
 
115
- line '}'
118
+ # if no resbodys capture our error, then rethrow
119
+ push ' else { throw $err; }'
120
+ end
116
121
 
117
- if handle_rescue_else_manually?
118
- # here we must add 'finally' explicitly
119
- push 'finally {'
120
- indent do
121
- line 'if ($no_errors) { '
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 stmt(rescue_else_code)
128
+ line 'if ($no_errors) { '
129
+ indent do
130
+ line stmt(rescue_else_code)
131
+ end
132
+ line '}'
124
133
  end
125
- line '}'
134
+ push '}'
126
135
  end
127
- push '}'
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
- wrap '(function() { ', '})()' if expr? || recv?
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
- !scope.in_ensure? && scope.has_rescue_else?
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
- line stmt(rescue_body)
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
- push stmt(s(:send, nil, :retry))
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
@@ -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
- # uses parents super method
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
@@ -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
- raise_exception? ? 'true' : 'false'
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
- implicit_args? ? 'true' : 'false'
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
- "Opal.find_super_dispatcher(self, '#{method_id}', #{def_scope_identity}, #{defined_check_param}, #{allow_stubs})"
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
- "Opal.find_iter_super_dispatcher(self, #{mid}, (#{trys} || #{cur_defn}), #{defined_check_param}, #{implicit_arguments_param})"
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 implicit args
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 explicit args
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
- def_scope.uses_zuper = true
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 compile_arguments
176
- push ', '
177
-
178
- if arglist.children.empty?
179
- push '[]'
180
- else
181
- push expr(arglist)
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
@@ -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
- line "Opal.modules[#{Opal::Compiler.module_name(compiler.file).inspect}] = function(Opal) {"
55
+ unshift "Opal.modules[#{Opal::Compiler.module_name(compiler.file).inspect}] = #{as}function(Opal) {"
52
56
  elsif compiler.eval?
53
- line '(function(Opal, self) {'
57
+ unshift "(#{as}function(Opal, self) {"
58
+ elsif compiler.esm?
59
+ unshift "export default Opal.queue(#{as}function(Opal) {"
54
60
  else
55
- line '(function(Opal) {'
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 '})(Opal, self)'
69
+ line "})(Opal, self);"
64
70
  else
65
- line "})(Opal);\n"
71
+ line "});\n"
66
72
  end
67
73
  end
68
74
 
@@ -26,7 +26,13 @@ module Opal
26
26
  end
27
27
  end
28
28
 
29
- wrap '(function() {', '; return nil; })()' if wrap_in_closure?
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
@@ -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
- if name =~ `/^[\p{Ll}|_][\p{L}\p{Nl}\p{Nd}_]*$/u`
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