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.
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