opal 0.10.6 → 0.11.0.rc1

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