opal 0.10.6 → 0.11.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (450) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.travis.yml +26 -18
  6. data/CHANGELOG.md +89 -23
  7. data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
  8. data/Gemfile +19 -21
  9. data/HACKING.md +2 -0
  10. data/README.md +7 -6
  11. data/Rakefile +1 -1
  12. data/appveyor.yml +21 -4
  13. data/benchmark-ips/bm_case.rb +33 -0
  14. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  15. data/benchmark-ips/bm_is_number.rb +29 -0
  16. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  17. data/benchmark/bm_constant_lookup_big.rb +799 -0
  18. data/benchmark/bm_constant_lookup_small.rb +59 -0
  19. data/benchmark/bm_module_definition_big.rb +400 -0
  20. data/benchmark/bm_module_definition_small.rb +30 -0
  21. data/bin/opal-repl +23 -1
  22. data/docs/compiled_ruby.md +16 -14
  23. data/docs/faq.md +3 -3
  24. data/docs/rspec.md +2 -1
  25. data/docs/unsupported_features.md +6 -4
  26. data/examples/rack/Gemfile +1 -0
  27. data/examples/rack/app/application.rb +14 -3
  28. data/examples/rack/app/user.rb +2 -0
  29. data/examples/rack/config.ru +1 -1
  30. data/examples/rack/index.html.erb +1 -0
  31. data/lib/opal.rb +6 -1
  32. data/lib/opal/ast/builder.rb +17 -0
  33. data/lib/opal/ast/node.rb +30 -0
  34. data/lib/opal/builder.rb +14 -3
  35. data/lib/opal/builder_processors.rb +1 -0
  36. data/lib/opal/cli.rb +45 -59
  37. data/lib/opal/cli_options.rb +11 -7
  38. data/lib/opal/cli_runners.rb +1 -0
  39. data/lib/opal/cli_runners/applescript.rb +3 -3
  40. data/lib/opal/cli_runners/nashorn.rb +1 -0
  41. data/lib/opal/cli_runners/nodejs.rb +4 -1
  42. data/lib/opal/cli_runners/phantom.js +1 -2
  43. data/lib/opal/cli_runners/phantomjs.rb +3 -2
  44. data/lib/opal/cli_runners/server.rb +1 -0
  45. data/lib/opal/compiler.rb +145 -94
  46. data/lib/opal/config.rb +1 -0
  47. data/lib/opal/deprecations.rb +18 -0
  48. data/lib/opal/erb.rb +1 -0
  49. data/lib/opal/errors.rb +1 -0
  50. data/lib/opal/fragment.rb +1 -0
  51. data/lib/opal/hike_path_finder.rb +1 -0
  52. data/lib/opal/nodes.rb +3 -0
  53. data/lib/opal/nodes/arglist.rb +2 -1
  54. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  55. data/lib/opal/nodes/args/kwarg.rb +7 -7
  56. data/lib/opal/nodes/args/kwoptarg.rb +6 -7
  57. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  58. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  59. data/lib/opal/nodes/args/normarg.rb +6 -7
  60. data/lib/opal/nodes/args/optarg.rb +5 -7
  61. data/lib/opal/nodes/args/post_args.rb +6 -5
  62. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  63. data/lib/opal/nodes/args/restarg.rb +7 -7
  64. data/lib/opal/nodes/array.rb +1 -0
  65. data/lib/opal/nodes/base.rb +24 -3
  66. data/lib/opal/nodes/call.rb +167 -155
  67. data/lib/opal/nodes/call_special.rb +31 -217
  68. data/lib/opal/nodes/case.rb +36 -22
  69. data/lib/opal/nodes/class.rb +4 -3
  70. data/lib/opal/nodes/constants.rb +28 -48
  71. data/lib/opal/nodes/csend.rb +25 -0
  72. data/lib/opal/nodes/def.rb +49 -16
  73. data/lib/opal/nodes/defined.rb +170 -60
  74. data/lib/opal/nodes/definitions.rb +40 -133
  75. data/lib/opal/nodes/defs.rb +29 -0
  76. data/lib/opal/nodes/for.rb +52 -25
  77. data/lib/opal/nodes/hash.rb +12 -35
  78. data/lib/opal/nodes/helpers.rb +27 -54
  79. data/lib/opal/nodes/if.rb +21 -32
  80. data/lib/opal/nodes/inline_args.rb +12 -13
  81. data/lib/opal/nodes/iter.rb +61 -36
  82. data/lib/opal/nodes/literal.rb +189 -116
  83. data/lib/opal/nodes/logic.rb +20 -25
  84. data/lib/opal/nodes/masgn.rb +20 -18
  85. data/lib/opal/nodes/module.rb +10 -11
  86. data/lib/opal/nodes/node_with_args.rb +14 -17
  87. data/lib/opal/nodes/rescue.rb +37 -70
  88. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  89. data/lib/opal/nodes/scope.rb +9 -5
  90. data/lib/opal/nodes/singleton_class.rb +4 -3
  91. data/lib/opal/nodes/super.rb +115 -87
  92. data/lib/opal/nodes/top.rb +7 -2
  93. data/lib/opal/nodes/variables.rb +46 -35
  94. data/lib/opal/nodes/while.rb +11 -1
  95. data/lib/opal/nodes/yield.rb +1 -17
  96. data/lib/opal/parser.rb +28 -770
  97. data/lib/opal/path_reader.rb +5 -1
  98. data/lib/opal/paths.rb +10 -4
  99. data/lib/opal/regexp_anchors.rb +1 -0
  100. data/lib/opal/rewriter.rb +60 -0
  101. data/lib/opal/rewriters/base.rb +60 -0
  102. data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
  103. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  104. data/lib/opal/rewriters/break_finder.rb +34 -0
  105. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  106. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  107. data/lib/opal/rewriters/js_reserved_words.rb +111 -0
  108. data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
  109. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  110. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  111. data/lib/opal/server.rb +4 -0
  112. data/lib/opal/simple_server.rb +100 -0
  113. data/lib/opal/source_map.rb +1 -1
  114. data/lib/opal/util.rb +5 -5
  115. data/lib/opal/version.rb +2 -1
  116. data/lib/tilt/opal.rb +1 -0
  117. data/opal.gemspec +8 -7
  118. data/opal/README.md +1 -1
  119. data/opal/corelib/array.rb +137 -83
  120. data/opal/corelib/basic_object.rb +6 -6
  121. data/opal/corelib/class.rb +14 -11
  122. data/opal/corelib/complex.rb +5 -1
  123. data/opal/corelib/constants.rb +3 -3
  124. data/opal/corelib/enumerable.rb +129 -11
  125. data/opal/corelib/error.rb +35 -17
  126. data/opal/corelib/file.rb +65 -170
  127. data/opal/corelib/hash.rb +128 -13
  128. data/opal/corelib/helpers.rb +12 -15
  129. data/opal/corelib/io.rb +1 -0
  130. data/opal/corelib/kernel.rb +40 -21
  131. data/opal/corelib/marshal/read_buffer.rb +1 -1
  132. data/opal/corelib/method.rb +33 -13
  133. data/opal/corelib/module.rb +133 -81
  134. data/opal/corelib/number.rb +141 -25
  135. data/opal/corelib/numeric.rb +0 -8
  136. data/opal/corelib/process.rb +44 -4
  137. data/opal/corelib/random.rb +117 -0
  138. data/opal/corelib/random/seedrandom.js.rb +15 -0
  139. data/opal/corelib/range.rb +133 -10
  140. data/opal/corelib/regexp.rb +37 -9
  141. data/opal/corelib/runtime.js +601 -390
  142. data/opal/corelib/string.rb +39 -8
  143. data/opal/corelib/string/encoding.rb +51 -7
  144. data/opal/corelib/struct.rb +20 -0
  145. data/opal/corelib/time.rb +3 -3
  146. data/opal/corelib/variables.rb +1 -1
  147. data/opal/opal.rb +1 -0
  148. data/spec/filters/bugs/array.rb +5 -1
  149. data/spec/filters/bugs/basicobject.rb +2 -5
  150. data/spec/filters/bugs/bigdecimal.rb +8 -22
  151. data/spec/filters/bugs/class.rb +2 -1
  152. data/spec/filters/bugs/comparable.rb +5 -0
  153. data/spec/filters/bugs/date.rb +3 -3
  154. data/spec/filters/bugs/enumerable.rb +4 -11
  155. data/spec/filters/bugs/enumerator.rb +2 -4
  156. data/spec/filters/bugs/exception.rb +16 -2
  157. data/spec/filters/bugs/file.rb +8 -0
  158. data/spec/filters/bugs/float.rb +7 -1
  159. data/spec/filters/bugs/hash.rb +6 -2
  160. data/spec/filters/bugs/integer.rb +2 -0
  161. data/spec/filters/bugs/io.rb +8 -0
  162. data/spec/filters/bugs/kernel.rb +9 -138
  163. data/spec/filters/bugs/language.rb +89 -174
  164. data/spec/filters/bugs/marshal.rb +33 -35
  165. data/spec/filters/bugs/method.rb +0 -24
  166. data/spec/filters/bugs/module.rb +19 -55
  167. data/spec/filters/bugs/numeric.rb +0 -119
  168. data/spec/filters/bugs/pathname.rb +2 -0
  169. data/spec/filters/bugs/proc.rb +5 -4
  170. data/spec/filters/bugs/random.rb +7 -0
  171. data/spec/filters/bugs/range.rb +12 -120
  172. data/spec/filters/bugs/rational.rb +1 -1
  173. data/spec/filters/bugs/regexp.rb +2 -40
  174. data/spec/filters/bugs/set.rb +0 -1
  175. data/spec/filters/bugs/string.rb +5 -8
  176. data/spec/filters/bugs/stringscanner.rb +11 -19
  177. data/spec/filters/bugs/time.rb +7 -1
  178. data/spec/filters/bugs/unboundmethod.rb +1 -11
  179. data/spec/filters/unsupported/array.rb +5 -1
  180. data/spec/filters/unsupported/basicobject.rb +1 -1
  181. data/spec/filters/unsupported/bignum.rb +4 -1
  182. data/spec/filters/unsupported/class.rb +1 -1
  183. data/spec/filters/unsupported/delegator.rb +1 -1
  184. data/spec/filters/unsupported/enumerable.rb +1 -1
  185. data/spec/filters/unsupported/enumerator.rb +1 -1
  186. data/spec/filters/unsupported/file.rb +4 -0
  187. data/spec/filters/unsupported/fixnum.rb +1 -1
  188. data/spec/filters/unsupported/float.rb +4 -1
  189. data/spec/filters/unsupported/freeze.rb +27 -5
  190. data/spec/filters/unsupported/hash.rb +7 -15
  191. data/spec/filters/unsupported/integer.rb +1 -1
  192. data/spec/filters/unsupported/kernel.rb +2 -1
  193. data/spec/filters/unsupported/language.rb +6 -1
  194. data/spec/filters/unsupported/marshal.rb +1 -1
  195. data/spec/filters/unsupported/matchdata.rb +4 -1
  196. data/spec/filters/unsupported/math.rb +1 -1
  197. data/spec/filters/unsupported/pathname.rb +1 -1
  198. data/spec/filters/unsupported/privacy.rb +141 -9
  199. data/spec/filters/unsupported/proc.rb +1 -1
  200. data/spec/filters/unsupported/random.rb +4 -0
  201. data/spec/filters/unsupported/range.rb +7 -0
  202. data/spec/filters/unsupported/regexp.rb +25 -15
  203. data/spec/filters/unsupported/set.rb +1 -1
  204. data/spec/filters/unsupported/singleton.rb +1 -1
  205. data/spec/filters/unsupported/string.rb +110 -101
  206. data/spec/filters/unsupported/struct.rb +1 -1
  207. data/spec/filters/unsupported/symbol.rb +2 -1
  208. data/spec/filters/unsupported/taint.rb +22 -7
  209. data/spec/filters/unsupported/thread.rb +1 -1
  210. data/spec/filters/unsupported/time.rb +1 -1
  211. data/spec/lib/builder_spec.rb +17 -0
  212. data/spec/lib/cli_spec.rb +37 -8
  213. data/spec/lib/compiler/call_spec.rb +98 -66
  214. data/spec/lib/compiler_spec.rb +39 -30
  215. data/spec/lib/dependency_resolver_spec.rb +2 -2
  216. data/spec/lib/deprecations_spec.rb +16 -0
  217. data/spec/lib/fixtures/source_location_test.rb +7 -0
  218. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
  219. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  220. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  221. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  222. data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
  223. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  224. data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
  225. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
  226. data/spec/lib/simple_server_spec.rb +54 -0
  227. data/spec/mspec-opal/formatters.rb +65 -17
  228. data/spec/mspec-opal/runner.rb +47 -67
  229. data/spec/opal/core/date_spec.rb +14 -0
  230. data/spec/opal/core/exception_spec.rb +10 -0
  231. data/spec/opal/core/hash/internals_spec.rb +10 -10
  232. data/spec/opal/core/kernel/rand_spec.rb +0 -4
  233. data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
  234. data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
  235. data/spec/opal/core/language/predefined_spec.rb +1 -1
  236. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  237. data/spec/opal/core/language/send_spec.rb +1 -9
  238. data/spec/opal/core/language/string_spec.rb +8 -8
  239. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
  240. data/spec/opal/core/language_spec.rb +32 -0
  241. data/spec/opal/core/module/const_get_spec.rb +1 -1
  242. data/spec/opal/core/runtime/is_a_spec.rb +36 -0
  243. data/spec/opal/core/runtime/rescue_spec.rb +35 -0
  244. data/spec/opal/core/runtime_spec.rb +4 -4
  245. data/spec/opal/core/string_spec.rb +8 -8
  246. data/spec/opal/core/time_spec.rb +26 -17
  247. data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
  248. data/spec/opal/stdlib/json/parse_spec.rb +4 -0
  249. data/spec/opal/stdlib/native/hash_spec.rb +16 -0
  250. data/spec/ruby_specs +2 -1
  251. data/spec/spec_helper.rb +1 -0
  252. data/spec/support/rewriters_helper.rb +24 -0
  253. data/stdlib/base64.rb +4 -2
  254. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  255. data/stdlib/date.rb +18 -19
  256. data/stdlib/json.rb +16 -4
  257. data/stdlib/nashorn/file.rb +15 -0
  258. data/stdlib/native.rb +21 -12
  259. data/stdlib/nodejs/dir.rb +1 -1
  260. data/stdlib/nodejs/file.rb +49 -20
  261. data/stdlib/nodejs/io.rb +22 -1
  262. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  263. data/stdlib/nodejs/kernel.rb +3 -1
  264. data/stdlib/nodejs/package.json +0 -1
  265. data/stdlib/nodejs/stacktrace.rb +163 -0
  266. data/stdlib/nodejs/yaml.rb +2 -1
  267. data/stdlib/opal-platform.rb +15 -0
  268. data/stdlib/opal/platform.rb +5 -13
  269. data/stdlib/pathname.rb +1 -1
  270. data/stdlib/strscan.rb +15 -1
  271. data/stdlib/yaml.rb +1 -1
  272. data/tasks/benchmarking.rake +9 -0
  273. data/tasks/building.rake +24 -20
  274. data/tasks/linting.rake +24 -13
  275. data/tasks/testing.rake +322 -205
  276. data/tasks/testing/mspec_special_calls.rb +44 -15
  277. data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
  278. data/test/nodejs/fixtures/hello.rb +1 -0
  279. data/test/nodejs/test_file.rb +57 -0
  280. data/test/nodejs/test_io.rb +18 -0
  281. data/test/nodejs/test_opal_builder.rb +12 -0
  282. data/test/opal/unsupported_and_bugs.rb +9 -0
  283. metadata +127 -240
  284. data/lib/opal/parser/grammar.rb +0 -6157
  285. data/lib/opal/parser/grammar.y +0 -2011
  286. data/lib/opal/parser/keywords.rb +0 -66
  287. data/lib/opal/parser/lexer.rb +0 -1352
  288. data/lib/opal/parser/parser_scope.rb +0 -28
  289. data/lib/opal/parser/sexp.rb +0 -90
  290. data/lib/opal/sprockets.rb +0 -77
  291. data/lib/opal/sprockets/environment.rb +0 -23
  292. data/lib/opal/sprockets/erb.rb +0 -28
  293. data/lib/opal/sprockets/path_reader.rb +0 -36
  294. data/lib/opal/sprockets/processor.rb +0 -173
  295. data/lib/opal/sprockets/server.rb +0 -133
  296. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  297. data/lib/opal/sprockets/source_map_server.rb +0 -117
  298. data/spec/filters/bugs/compiler_opal.rb +0 -5
  299. data/spec/filters/bugs/language_opal.rb +0 -88
  300. data/spec/filters/unsupported/module.rb +0 -8
  301. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  302. data/spec/lib/lexer_spec.rb +0 -110
  303. data/spec/lib/parser/alias_spec.rb +0 -26
  304. data/spec/lib/parser/and_spec.rb +0 -13
  305. data/spec/lib/parser/aref_spec.rb +0 -10
  306. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  307. data/spec/lib/parser/begin_spec.rb +0 -42
  308. data/spec/lib/parser/block_spec.rb +0 -12
  309. data/spec/lib/parser/break_spec.rb +0 -17
  310. data/spec/lib/parser/call_spec.rb +0 -201
  311. data/spec/lib/parser/class_spec.rb +0 -35
  312. data/spec/lib/parser/comments_spec.rb +0 -11
  313. data/spec/lib/parser/def_spec.rb +0 -109
  314. data/spec/lib/parser/if_spec.rb +0 -26
  315. data/spec/lib/parser/iter_spec.rb +0 -59
  316. data/spec/lib/parser/lambda_spec.rb +0 -219
  317. data/spec/lib/parser/literal_spec.rb +0 -118
  318. data/spec/lib/parser/masgn_spec.rb +0 -37
  319. data/spec/lib/parser/module_spec.rb +0 -27
  320. data/spec/lib/parser/not_spec.rb +0 -21
  321. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  322. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  323. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  324. data/spec/lib/parser/or_spec.rb +0 -13
  325. data/spec/lib/parser/return_spec.rb +0 -22
  326. data/spec/lib/parser/sclass_spec.rb +0 -21
  327. data/spec/lib/parser/string_spec.rb +0 -286
  328. data/spec/lib/parser/super_spec.rb +0 -20
  329. data/spec/lib/parser/unary_spec.rb +0 -52
  330. data/spec/lib/parser/undef_spec.rb +0 -19
  331. data/spec/lib/parser/unless_spec.rb +0 -13
  332. data/spec/lib/parser/variables_spec.rb +0 -112
  333. data/spec/lib/parser/while_spec.rb +0 -15
  334. data/spec/lib/parser/yield_spec.rb +0 -20
  335. data/spec/lib/sprockets/erb_spec.rb +0 -38
  336. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  337. data/spec/lib/sprockets/processor_spec.rb +0 -79
  338. data/spec/lib/sprockets/server_spec.rb +0 -102
  339. data/spec/lib/sprockets_spec.rb +0 -39
  340. data/spec/lib/tilt/opal_spec.rb +0 -37
  341. data/spec/opal/core/language/block_spec.rb +0 -538
  342. data/spec/opal/core/language/proc_spec.rb +0 -263
  343. data/spec/opal/core/language/variables_spec.rb +0 -1366
  344. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  345. data/spec/opal/core/runtime/send_spec.rb +0 -34
  346. data/spec/support/parser_helpers.rb +0 -37
  347. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  348. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
  349. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  350. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  351. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  352. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  353. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  354. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  355. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  356. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  357. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  358. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  359. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  360. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  361. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  362. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  363. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  364. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  365. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  366. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  367. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  368. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  369. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  370. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  371. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  372. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  373. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  374. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  375. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  376. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  377. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  378. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  379. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  380. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  381. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  382. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  383. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  384. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  385. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  386. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  387. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  388. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  389. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  390. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
  391. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  392. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  393. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  394. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  395. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  396. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  397. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  398. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  399. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  400. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  401. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  402. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  403. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  404. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  405. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  406. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  407. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  408. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  409. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  410. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  411. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  412. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  413. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  414. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  415. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  416. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  417. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  418. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  419. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  420. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  421. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  422. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  423. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  424. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  425. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  426. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  427. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  428. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  429. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  430. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  431. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  432. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  433. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  434. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  435. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  436. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  437. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  438. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  439. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  440. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  441. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  442. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  443. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  444. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  445. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  446. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  447. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  448. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  449. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  450. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
 
3
4
  module Opal
@@ -5,13 +6,24 @@ module Opal
5
6
  class NextNode < Base
6
7
  handle :next
7
8
 
8
- children :value
9
-
10
9
  def compile
11
- return push "continue;" if in_while?
10
+ if in_while?
11
+ push "continue;"
12
+ else
13
+ push expr_or_nil(value)
14
+ wrap "return ", ";"
15
+ end
16
+ end
12
17
 
13
- push expr_or_nil(value)
14
- wrap "return ", ";"
18
+ def value
19
+ case children.size
20
+ when 0
21
+ s(:nil)
22
+ when 1
23
+ children.first
24
+ else
25
+ s(:array, *children)
26
+ end
15
27
  end
16
28
  end
17
29
 
@@ -40,15 +52,13 @@ module Opal
40
52
 
41
53
  def compile_iter
42
54
  error "break must be used as a statement" unless stmt?
43
- compiler.has_break!
55
+
44
56
  line 'Opal.brk(', break_val, ', $brk)'
45
57
  end
46
58
 
47
59
  def break_val
48
60
  if value.nil?
49
61
  expr(s(:nil))
50
- elsif children.size > 1
51
- expr(s(:array, *children))
52
62
  else
53
63
  expr(value)
54
64
  end
@@ -78,33 +88,18 @@ module Opal
78
88
  end
79
89
  end
80
90
 
81
- class NotNode < Base
82
- handle :not
83
-
84
- children :value
85
-
86
- def compile
87
- with_temp do |tmp|
88
- push expr(value)
89
- wrap "(#{tmp} = ", ", (#{tmp} === nil || #{tmp} === false || #{tmp} == null))"
90
- end
91
- end
92
- end
93
-
94
91
  class SplatNode < Base
95
92
  handle :splat
96
93
 
97
94
  children :value
98
95
 
99
96
  def empty_splat?
100
- value == [:nil] or value == [:paren, [:nil]]
97
+ value == s(:array)
101
98
  end
102
99
 
103
100
  def compile
104
101
  if empty_splat?
105
102
  push '[]'
106
- elsif value.type == :sym
107
- push '[', expr(value), ']'
108
103
  else
109
104
  push "Opal.to_a(", recv(value), ")"
110
105
  end
@@ -270,7 +265,7 @@ module Opal
270
265
  children :value
271
266
 
272
267
  def compile
273
- push expr(s(:call, value, :to_proc, s(:arglist)))
268
+ push expr(s(:send, value, :to_proc, s(:arglist)))
274
269
  end
275
270
  end
276
271
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
 
3
4
  module Opal
4
5
  module Nodes
5
6
  class MassAssignNode < Base
6
- SIMPLE_ASSIGNMENT = [:lasgn, :iasgn, :lvar, :gasgn, :cdecl]
7
+ SIMPLE_ASSIGNMENT = [:lvasgn, :ivasgn, :lvar, :gvasgn, :cdecl, :casgn]
7
8
 
8
9
  handle :masgn
9
10
  children :lhs, :rhs
@@ -13,21 +14,23 @@ module Opal
13
14
 
14
15
  if rhs.type == :array
15
16
  push "#{array} = ", expr(rhs)
16
- compile_masgn(lhs.children, array, rhs.size - 1)
17
+ rhs_len = rhs.children.any? { |c| c.type == :splat } ? nil : rhs.children.size
18
+ compile_masgn(lhs.children, array, rhs_len)
17
19
  push ", #{array}" # a mass assignment evaluates to the RHS
18
- elsif rhs.type == :to_ary
20
+ elsif rhs.type == :begin
19
21
  retval = scope.new_temp
20
- push "#{retval} = ", expr(rhs[1])
22
+ push "#{retval} = ", expr(rhs)
21
23
  push ", #{array} = Opal.to_ary(#{retval})"
22
24
  compile_masgn(lhs.children, array)
23
25
  push ", #{retval}"
24
26
  scope.queue_temp(retval)
25
- elsif rhs.type == :splat
26
- push "#{array} = Opal.to_a(", expr(rhs[1]), ")"
27
- compile_masgn(lhs.children, array)
28
- push ", #{array}"
29
27
  else
30
- raise "unsupported mlhs type"
28
+ retval = scope.new_temp
29
+ push "#{retval} = ", expr(rhs)
30
+ push ", #{array} = Opal.to_ary(#{retval})"
31
+ compile_masgn(lhs.children, array)
32
+ push ", #{retval}"
33
+ scope.queue_temp(retval)
31
34
  end
32
35
 
33
36
  scope.queue_temp(array)
@@ -46,7 +49,7 @@ module Opal
46
49
  splat = post_splat.shift
47
50
 
48
51
  if post_splat.empty? # trailing splat
49
- if part = splat[1]
52
+ if part = splat.children[0]
50
53
  part = part.dup << s(:js_tmp, "$slice.call(#{array}, #{pre_splat.size})")
51
54
  push ', '
52
55
  push expr(part)
@@ -56,7 +59,7 @@ module Opal
56
59
  push ", #{tmp} = #{array}.length - #{post_splat.size}"
57
60
  push ", #{tmp} = (#{tmp} < #{pre_splat.size}) ? #{pre_splat.size} : #{tmp}"
58
61
 
59
- if part = splat[1]
62
+ if part = splat.children[0]
60
63
  part = part.dup << s(:js_tmp, "$slice.call(#{array}, #{pre_splat.size}, #{tmp})")
61
64
  push ', '
62
65
  push expr(part)
@@ -82,18 +85,17 @@ module Opal
82
85
  assign = s(:js_tmp, "#{array}[#{idx}]")
83
86
  end
84
87
 
85
- part = child.dup
88
+ part = child.updated
86
89
  if SIMPLE_ASSIGNMENT.include?(child.type)
87
- part << assign
88
- elsif child.type == :call
89
- part[2] = "#{part[2]}=".to_sym
90
- part.last << assign
90
+ part = part.updated(nil, part.children + [assign])
91
+ elsif child.type == :send
92
+ part = part.updated(nil, part.children + [assign])
91
93
  elsif child.type == :attrasgn
92
94
  part.last << assign
93
- elsif child.type == :array
95
+ elsif child.type == :mlhs
94
96
  # nested destructuring
95
97
  tmp = scope.new_temp
96
- push ", (#{tmp} = Opal.to_ary(#{assign[1]})"
98
+ push ", (#{tmp} = Opal.to_ary(#{assign.children[0]})"
97
99
  compile_masgn(child.children, tmp)
98
100
  push ')'
99
101
  scope.queue_temp(tmp)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/scope'
2
3
 
3
4
  module Opal
@@ -11,13 +12,13 @@ module Opal
11
12
  name, base = name_and_base
12
13
  helper :module
13
14
 
14
- push "(function($base) {"
15
+ push "(function($base, $parent_nesting) {"
15
16
  line " var $#{name}, self = $#{name} = $module($base, '#{name}');"
16
17
 
17
18
  in_scope do
18
19
  scope.name = name
19
20
  add_temp "#{scope.proto} = self.$$proto"
20
- add_temp '$scope = self.$$scope'
21
+ add_temp '$nesting = [self].concat($parent_nesting)'
21
22
 
22
23
  body_code = stmt(body || s(:nil))
23
24
  empty_line
@@ -26,19 +27,17 @@ module Opal
26
27
  line body_code
27
28
  end
28
29
 
29
- line "})(", base, ")"
30
+ line "})(", base, ", $nesting)"
30
31
  end
31
32
 
33
+ # cid is always s(:const, scope_sexp_or_nil, :ConstName)
32
34
  def name_and_base
33
- if cid.type == :const
34
- # Using $scope.base, not self in case a class is created inside an anonymous class or block
35
- [cid[1].to_s, '$scope.base']
36
- elsif cid.type == :colon2
37
- [cid[2].to_s, expr(cid[1])]
38
- elsif cid.type == :colon3
39
- [cid[1].to_s, 'Opal.Object']
35
+ base, name = cid.children
36
+
37
+ if base.nil?
38
+ [name, '$nesting[0]']
40
39
  else
41
- raise "Bad receiver in module"
40
+ [name, expr(base)]
42
41
  end
43
42
  end
44
43
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/scope'
2
3
 
3
4
  module Opal
@@ -29,9 +30,8 @@ module Opal
29
30
  end
30
31
 
31
32
  def split_args
32
- args = self.args[1..-1]
33
+ args = self.args.children
33
34
  args.each_with_index do |arg, idx|
34
- last_argument = (idx == args.length - 1)
35
35
  case arg.type
36
36
  when :arg, :mlhs, :kwarg, :kwoptarg, :kwrestarg
37
37
  if @post_args_started
@@ -59,29 +59,29 @@ module Opal
59
59
  end
60
60
  end
61
61
 
62
- inline_args.each do |inline_arg|
63
- inline_arg.meta[:inline] = true
62
+ inline_args.map! do |inline_arg|
63
+ inline_arg.updated(nil, nil, meta: { inline: true })
64
64
  end
65
65
 
66
66
  optimize_args!
67
67
  end
68
68
 
69
69
  def opt_args
70
- @opt_args ||= args[1..-1].select { |arg| arg.first == :optarg }
70
+ @opt_args ||= args.children.select { |arg| arg.type == :optarg }
71
71
  end
72
72
 
73
73
  def rest_arg
74
- @rest_arg ||= args[1..-1].find { |arg| arg.first == :restarg }
74
+ @rest_arg ||= args.children.find { |arg| arg.type == :restarg }
75
75
  end
76
76
 
77
77
  def keyword_args
78
- @keyword_args ||= args[1..-1].select do |arg|
79
- [:kwarg, :kwoptarg, :kwrestarg].include? arg.first
78
+ @keyword_args ||= args.children.select do |arg|
79
+ [:kwarg, :kwoptarg, :kwrestarg].include? arg.type
80
80
  end
81
81
  end
82
82
 
83
83
  def inline_args_sexp
84
- s(:inline_args, *args[1..-1])
84
+ s(:inline_args, *args.children)
85
85
  end
86
86
 
87
87
  def post_args_sexp
@@ -106,7 +106,7 @@ module Opal
106
106
  add_temp "$iter = #{scope_name}.$$p"
107
107
  add_temp "#{yielder} = $iter || nil"
108
108
 
109
- line "#{scope_name}.$$p = null;"
109
+ line "if ($iter) #{scope_name}.$$p = null;"
110
110
  end
111
111
  end
112
112
 
@@ -170,7 +170,7 @@ module Opal
170
170
  end
171
171
 
172
172
  def positive_arity
173
- result = args.size - 1
173
+ result = args.children.size
174
174
 
175
175
  result -= keyword_args.size
176
176
  result += 1 if keyword_args.any?
@@ -198,7 +198,7 @@ module Opal
198
198
 
199
199
  def parameters_code
200
200
  stringified_parameters = args.children.map do |arg|
201
- value = arg.type == :mlhs ? nil : arg[1]
201
+ value = arg.type == :mlhs ? nil : arg.children[0]
202
202
  build_parameter(SEXP_TO_PARAMETERS[arg.type], value)
203
203
  end
204
204
 
@@ -214,7 +214,7 @@ module Opal
214
214
  def arity_checks
215
215
  return @arity_checks if @arity_checks
216
216
 
217
- arity = args.size - 1
217
+ arity = args.children.size
218
218
  arity -= (opt_args.size)
219
219
 
220
220
  arity -= 1 if rest_arg
@@ -223,14 +223,11 @@ module Opal
223
223
 
224
224
  arity = -arity - 1 if !opt_args.empty? or !keyword_args.empty? or rest_arg
225
225
 
226
- # $arity will point to our received arguments count
227
- aritycode = "var $arity = arguments.length;"
228
-
229
226
  @arity_checks = []
230
227
 
231
228
  if arity < 0 # splat or opt args
232
229
  min_arity = -(arity + 1)
233
- max_arity = args.size - 1
230
+ max_arity = args.children.size
234
231
  @arity_checks << "$arity < #{min_arity}" if min_arity > 0
235
232
  @arity_checks << "$arity > #{max_arity}" if max_arity and not(rest_arg)
236
233
  else
@@ -1,33 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
 
3
4
  module Opal
4
5
  module Nodes
5
- class RescueModNode < Base
6
- handle :rescue_mod
7
-
8
- children :lhs, :rhs
9
-
10
- def body
11
- stmt? ? lhs : compiler.returns(lhs)
12
- end
13
-
14
- def rescue_val
15
- stmt? ? rhs : compiler.returns(rhs)
16
- end
17
-
18
- def compile
19
- line "try {", expr(body), " } catch ($err) { "
20
-
21
- indent do
22
- line "if (Opal.rescue($err, [", expr(Sexp.new([:const, :StandardError])), "])) {"
23
- line expr(rescue_val)
24
- line "} else { throw $err; } }"
25
- end
26
-
27
- wrap '(function() {', '})()' unless stmt?
28
- end
29
- end
30
-
31
6
  class EnsureNode < Base
32
7
  handle :ensure
33
8
 
@@ -37,7 +12,7 @@ module Opal
37
12
  push "try {"
38
13
 
39
14
  in_ensure do
40
- line compiler.process(body_sexp, @level)
15
+ line stmt(body_sexp)
41
16
  end
42
17
 
43
18
  line "} finally {"
@@ -59,7 +34,7 @@ module Opal
59
34
  indent do
60
35
  line "$rescue_else_result = (function() {"
61
36
  indent do
62
- line compiler.process(compiler.returns(scope.rescue_else_sexp), @level)
37
+ line stmt(rescue_else_code)
63
38
  end
64
39
  line "})();"
65
40
  end
@@ -78,12 +53,9 @@ module Opal
78
53
 
79
54
  def body_sexp
80
55
  if wrap_in_closure?
81
- sexp = compiler.returns(begn)
82
- # 'rescue' is an edge case that should be compiled to
83
- # try { return function(){ ..rescue through try/catch.. }() }
84
- sexp.type == :rescue ? s(:js_return, sexp) : sexp
56
+ compiler.returns(begn)
85
57
  else
86
- sexp = begn
58
+ begn
87
59
  end
88
60
  end
89
61
 
@@ -94,6 +66,12 @@ module Opal
94
66
  def wrap_in_closure?
95
67
  recv? or expr? or has_rescue_else?
96
68
  end
69
+
70
+ def rescue_else_code
71
+ rescue_else_code = scope.rescue_else_sexp
72
+ rescue_else_code = compiler.returns(rescue_else_code) unless stmt?
73
+ rescue_else_code
74
+ end
97
75
  end
98
76
 
99
77
  class RescueNode < Base
@@ -102,7 +80,7 @@ module Opal
102
80
  children :body
103
81
 
104
82
  def compile
105
- scope.rescue_else_sexp = children[1..-1].detect { |sexp| sexp.type != :resbody }
83
+ scope.rescue_else_sexp = children[1..-1].detect { |sexp| sexp && sexp.type != :resbody }
106
84
  has_rescue_handlers = false
107
85
 
108
86
  if handle_rescue_else_manually?
@@ -111,7 +89,7 @@ module Opal
111
89
 
112
90
  push "try {"
113
91
  indent do
114
- line process(body_code, @level)
92
+ line stmt(body_code)
115
93
  end
116
94
  line "} catch ($err) {"
117
95
 
@@ -122,7 +100,7 @@ module Opal
122
100
 
123
101
  children[1..-1].each_with_index do |child, idx|
124
102
  # counting only rescue, ignoring rescue-else statement
125
- if child.type == :resbody
103
+ if child && child.type == :resbody
126
104
  has_rescue_handlers = true
127
105
 
128
106
  push " else " unless idx == 0
@@ -142,11 +120,7 @@ module Opal
142
120
  indent do
143
121
  line "if ($no_errors) { "
144
122
  indent do
145
- line "return (function() {"
146
- indent do
147
- line compiler.process(compiler.returns(scope.rescue_else_sexp), @level)
148
- end
149
- line "})();"
123
+ line stmt(rescue_else_code)
150
124
  end
151
125
  line "}"
152
126
  end
@@ -161,10 +135,16 @@ module Opal
161
135
 
162
136
  def body_code
163
137
  body_code = (body.type == :resbody ? s(:nil) : body)
164
- body_code = compiler.returns body_code unless stmt?
138
+ body_code = compiler.returns(body_code) unless stmt?
165
139
  body_code
166
140
  end
167
141
 
142
+ def rescue_else_code
143
+ rescue_else_code = scope.rescue_else_sexp
144
+ rescue_else_code = compiler.returns(rescue_else_code) unless stmt?
145
+ rescue_else_code
146
+ end
147
+
168
148
  # Returns true when there's no 'ensure' statement
169
149
  # wrapping current rescue.
170
150
  #
@@ -176,48 +156,27 @@ module Opal
176
156
  class ResBodyNode < Base
177
157
  handle :resbody
178
158
 
179
- children :args, :body
159
+ children :klasses_sexp, :lvar, :body
180
160
 
181
161
  def compile
182
- push "if (Opal.rescue($err, ["
183
- if rescue_exprs.empty?
184
- # if no expressions are given, then catch StandardError only
185
- push expr(Sexp.new([:const, :StandardError]))
186
- else
187
- rescue_exprs.each_with_index do |rexpr, idx|
188
- push ', ' unless idx == 0
189
- push expr(rexpr)
190
- end
191
- end
192
- push "])) {"
162
+ push "if (Opal.rescue($err, ", expr(klasses), ")) {"
193
163
  indent do
194
- if variable = rescue_variable
195
- variable[2] = s(:js_tmp, '$err')
196
- push expr(variable), ';'
164
+ if lvar
165
+ push expr(lvar), '$err;'
197
166
  end
198
167
 
199
168
  # Need to ensure we clear the current exception out after the rescue block ends
200
169
  line "try {"
201
170
  indent do
202
- line process(rescue_body, @level)
171
+ line stmt(rescue_body)
203
172
  end
204
173
  line '} finally { Opal.pop_exception() }'
205
174
  end
206
175
  line "}"
207
176
  end
208
177
 
209
- def rescue_variable?(variable)
210
- Sexp === variable and [:lasgn, :iasgn].include?(variable.type)
211
- end
212
-
213
- def rescue_variable
214
- rescue_variable?(args.last) ? args.last.dup : nil
215
- end
216
-
217
- def rescue_exprs
218
- exprs = args.dup
219
- exprs.pop if rescue_variable?(exprs.last)
220
- exprs.children
178
+ def klasses
179
+ klasses_sexp || s(:array, s(:const, nil, :StandardError))
221
180
  end
222
181
 
223
182
  def rescue_body
@@ -226,5 +185,13 @@ module Opal
226
185
  body_code
227
186
  end
228
187
  end
188
+
189
+ class RetryNode < Base
190
+ handle :retry
191
+
192
+ def compile
193
+ push stmt(s(:send, nil, :retry))
194
+ end
195
+ end
229
196
  end
230
197
  end