opal 0.10.0 → 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 (460) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.rspec +1 -2
  6. data/.travis.yml +28 -18
  7. data/.yardopts +3 -1
  8. data/CHANGELOG.md +139 -1
  9. data/Gemfile +16 -9
  10. data/HACKING.md +2 -0
  11. data/README.md +7 -6
  12. data/Rakefile +1 -1
  13. data/appveyor.yml +30 -0
  14. data/benchmark/bm_constant_lookup_big.rb +799 -0
  15. data/benchmark/bm_constant_lookup_small.rb +59 -0
  16. data/benchmark/bm_module_definition_big.rb +400 -0
  17. data/benchmark/bm_module_definition_small.rb +30 -0
  18. data/benchmark-ips/bm_case.rb +33 -0
  19. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  20. data/benchmark-ips/bm_is_number.rb +29 -0
  21. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  22. data/bin/opal +4 -2
  23. data/bin/opal-repl +23 -1
  24. data/docs/compiled_ruby.md +16 -14
  25. data/docs/faq.md +3 -3
  26. data/docs/rspec.md +2 -1
  27. data/docs/unsupported_features.md +6 -4
  28. data/examples/rack/Gemfile +1 -0
  29. data/examples/rack/Gemfile.lock +11 -7
  30. data/examples/rack/app/application.rb +14 -3
  31. data/examples/rack/app/user.rb +2 -0
  32. data/examples/rack/config.ru +1 -1
  33. data/examples/rack/index.html.erb +1 -0
  34. data/examples/sinatra/Gemfile +1 -1
  35. data/examples/sinatra/Gemfile.lock +8 -11
  36. data/examples/sinatra/app/application.rb +2 -0
  37. data/lib/opal/ast/builder.rb +17 -0
  38. data/lib/opal/ast/node.rb +30 -0
  39. data/lib/opal/builder.rb +14 -3
  40. data/lib/opal/builder_processors.rb +1 -0
  41. data/lib/opal/cli.rb +45 -59
  42. data/lib/opal/cli_options.rb +18 -11
  43. data/lib/opal/cli_runners/applescript.rb +3 -3
  44. data/lib/opal/cli_runners/nashorn.rb +1 -0
  45. data/lib/opal/cli_runners/nodejs.rb +4 -1
  46. data/lib/opal/cli_runners/phantom.js +1 -2
  47. data/lib/opal/cli_runners/phantomjs.rb +3 -2
  48. data/lib/opal/cli_runners/server.rb +1 -0
  49. data/lib/opal/cli_runners.rb +1 -0
  50. data/lib/opal/compiler.rb +145 -94
  51. data/lib/opal/config.rb +114 -36
  52. data/lib/opal/deprecations.rb +18 -0
  53. data/lib/opal/erb.rb +1 -0
  54. data/lib/opal/errors.rb +1 -0
  55. data/lib/opal/fragment.rb +1 -0
  56. data/lib/opal/hike_path_finder.rb +1 -0
  57. data/lib/opal/nodes/arglist.rb +2 -1
  58. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  59. data/lib/opal/nodes/args/kwarg.rb +7 -7
  60. data/lib/opal/nodes/args/kwoptarg.rb +6 -7
  61. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  62. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  63. data/lib/opal/nodes/args/normarg.rb +6 -7
  64. data/lib/opal/nodes/args/optarg.rb +5 -7
  65. data/lib/opal/nodes/args/post_args.rb +6 -5
  66. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  67. data/lib/opal/nodes/args/restarg.rb +7 -7
  68. data/lib/opal/nodes/array.rb +1 -0
  69. data/lib/opal/nodes/base.rb +24 -3
  70. data/lib/opal/nodes/call.rb +167 -155
  71. data/lib/opal/nodes/call_special.rb +31 -217
  72. data/lib/opal/nodes/case.rb +36 -22
  73. data/lib/opal/nodes/class.rb +4 -3
  74. data/lib/opal/nodes/constants.rb +28 -48
  75. data/lib/opal/nodes/csend.rb +25 -0
  76. data/lib/opal/nodes/def.rb +57 -17
  77. data/lib/opal/nodes/defined.rb +170 -60
  78. data/lib/opal/nodes/definitions.rb +40 -133
  79. data/lib/opal/nodes/defs.rb +29 -0
  80. data/lib/opal/nodes/for.rb +52 -25
  81. data/lib/opal/nodes/hash.rb +12 -35
  82. data/lib/opal/nodes/helpers.rb +27 -54
  83. data/lib/opal/nodes/if.rb +21 -32
  84. data/lib/opal/nodes/inline_args.rb +12 -13
  85. data/lib/opal/nodes/iter.rb +61 -36
  86. data/lib/opal/nodes/literal.rb +194 -114
  87. data/lib/opal/nodes/logic.rb +20 -25
  88. data/lib/opal/nodes/masgn.rb +20 -18
  89. data/lib/opal/nodes/module.rb +10 -11
  90. data/lib/opal/nodes/node_with_args.rb +14 -17
  91. data/lib/opal/nodes/rescue.rb +37 -70
  92. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  93. data/lib/opal/nodes/scope.rb +9 -5
  94. data/lib/opal/nodes/singleton_class.rb +4 -3
  95. data/lib/opal/nodes/super.rb +115 -87
  96. data/lib/opal/nodes/top.rb +7 -2
  97. data/lib/opal/nodes/variables.rb +46 -35
  98. data/lib/opal/nodes/while.rb +11 -1
  99. data/lib/opal/nodes/yield.rb +1 -17
  100. data/lib/opal/nodes.rb +3 -0
  101. data/lib/opal/parser.rb +28 -770
  102. data/lib/opal/path_reader.rb +5 -1
  103. data/lib/opal/paths.rb +10 -4
  104. data/lib/opal/regexp_anchors.rb +1 -0
  105. data/lib/opal/rewriter.rb +60 -0
  106. data/lib/opal/rewriters/base.rb +60 -0
  107. data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
  108. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  109. data/lib/opal/rewriters/break_finder.rb +34 -0
  110. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  111. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  112. data/lib/opal/rewriters/js_reserved_words.rb +111 -0
  113. data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
  114. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  115. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  116. data/lib/opal/server.rb +4 -0
  117. data/lib/opal/simple_server.rb +100 -0
  118. data/lib/opal/source_map.rb +1 -1
  119. data/lib/opal/util.rb +5 -5
  120. data/lib/opal/version.rb +2 -1
  121. data/lib/opal.rb +6 -1
  122. data/lib/tilt/opal.rb +1 -0
  123. data/opal/README.md +1 -1
  124. data/opal/corelib/array.rb +137 -83
  125. data/opal/corelib/basic_object.rb +6 -6
  126. data/opal/corelib/class.rb +14 -11
  127. data/opal/corelib/complex.rb +5 -1
  128. data/opal/corelib/constants.rb +3 -3
  129. data/opal/corelib/enumerable.rb +129 -11
  130. data/opal/corelib/error.rb +35 -17
  131. data/opal/corelib/file.rb +65 -170
  132. data/opal/corelib/hash.rb +128 -13
  133. data/opal/corelib/helpers.rb +12 -15
  134. data/opal/corelib/io.rb +1 -0
  135. data/opal/corelib/kernel.rb +40 -21
  136. data/opal/corelib/marshal/read_buffer.rb +1 -1
  137. data/opal/corelib/method.rb +33 -13
  138. data/opal/corelib/module.rb +134 -82
  139. data/opal/corelib/number.rb +141 -25
  140. data/opal/corelib/numeric.rb +0 -8
  141. data/opal/corelib/process.rb +44 -4
  142. data/opal/corelib/random/seedrandom.js.rb +15 -0
  143. data/opal/corelib/random.rb +117 -0
  144. data/opal/corelib/range.rb +133 -10
  145. data/opal/corelib/regexp.rb +37 -9
  146. data/opal/corelib/runtime.js +604 -394
  147. data/opal/corelib/string/encoding.rb +51 -7
  148. data/opal/corelib/string.rb +39 -8
  149. data/opal/corelib/struct.rb +20 -0
  150. data/opal/corelib/time.rb +2 -2
  151. data/opal/corelib/variables.rb +1 -1
  152. data/opal/opal.rb +1 -0
  153. data/opal.gemspec +9 -8
  154. data/spec/filters/bugs/array.rb +5 -1
  155. data/spec/filters/bugs/basicobject.rb +2 -5
  156. data/spec/filters/bugs/bigdecimal.rb +8 -22
  157. data/spec/filters/bugs/class.rb +2 -1
  158. data/spec/filters/bugs/comparable.rb +5 -0
  159. data/spec/filters/bugs/date.rb +3 -3
  160. data/spec/filters/bugs/enumerable.rb +4 -11
  161. data/spec/filters/bugs/enumerator.rb +2 -4
  162. data/spec/filters/bugs/exception.rb +16 -2
  163. data/spec/filters/bugs/file.rb +8 -0
  164. data/spec/filters/bugs/float.rb +7 -1
  165. data/spec/filters/bugs/hash.rb +6 -2
  166. data/spec/filters/bugs/integer.rb +2 -0
  167. data/spec/filters/bugs/io.rb +8 -0
  168. data/spec/filters/bugs/kernel.rb +9 -138
  169. data/spec/filters/bugs/language.rb +89 -174
  170. data/spec/filters/bugs/marshal.rb +33 -35
  171. data/spec/filters/bugs/method.rb +0 -24
  172. data/spec/filters/bugs/module.rb +19 -57
  173. data/spec/filters/bugs/numeric.rb +0 -119
  174. data/spec/filters/bugs/pathname.rb +2 -0
  175. data/spec/filters/bugs/proc.rb +5 -4
  176. data/spec/filters/bugs/random.rb +7 -0
  177. data/spec/filters/bugs/range.rb +12 -120
  178. data/spec/filters/bugs/rational.rb +1 -1
  179. data/spec/filters/bugs/regexp.rb +2 -40
  180. data/spec/filters/bugs/set.rb +0 -1
  181. data/spec/filters/bugs/string.rb +5 -8
  182. data/spec/filters/bugs/stringscanner.rb +11 -19
  183. data/spec/filters/bugs/time.rb +7 -1
  184. data/spec/filters/bugs/unboundmethod.rb +1 -11
  185. data/spec/filters/unsupported/array.rb +5 -1
  186. data/spec/filters/unsupported/basicobject.rb +1 -1
  187. data/spec/filters/unsupported/bignum.rb +4 -1
  188. data/spec/filters/unsupported/class.rb +1 -1
  189. data/spec/filters/unsupported/delegator.rb +1 -1
  190. data/spec/filters/unsupported/enumerable.rb +1 -1
  191. data/spec/filters/unsupported/enumerator.rb +1 -1
  192. data/spec/filters/unsupported/file.rb +4 -0
  193. data/spec/filters/unsupported/fixnum.rb +1 -1
  194. data/spec/filters/unsupported/float.rb +4 -1
  195. data/spec/filters/unsupported/freeze.rb +27 -5
  196. data/spec/filters/unsupported/hash.rb +7 -15
  197. data/spec/filters/unsupported/integer.rb +1 -1
  198. data/spec/filters/unsupported/kernel.rb +2 -1
  199. data/spec/filters/unsupported/language.rb +6 -1
  200. data/spec/filters/unsupported/marshal.rb +1 -1
  201. data/spec/filters/unsupported/matchdata.rb +4 -1
  202. data/spec/filters/unsupported/math.rb +1 -1
  203. data/spec/filters/unsupported/pathname.rb +1 -1
  204. data/spec/filters/unsupported/privacy.rb +141 -9
  205. data/spec/filters/unsupported/proc.rb +1 -1
  206. data/spec/filters/unsupported/random.rb +4 -0
  207. data/spec/filters/unsupported/range.rb +7 -0
  208. data/spec/filters/unsupported/regexp.rb +25 -15
  209. data/spec/filters/unsupported/set.rb +1 -1
  210. data/spec/filters/unsupported/singleton.rb +1 -1
  211. data/spec/filters/unsupported/string.rb +110 -101
  212. data/spec/filters/unsupported/struct.rb +1 -1
  213. data/spec/filters/unsupported/symbol.rb +2 -1
  214. data/spec/filters/unsupported/taint.rb +22 -7
  215. data/spec/filters/unsupported/thread.rb +1 -1
  216. data/spec/filters/unsupported/time.rb +1 -1
  217. data/spec/lib/builder_spec.rb +17 -0
  218. data/spec/lib/cli_runners/phantomjs_spec.rb +2 -2
  219. data/spec/lib/cli_spec.rb +37 -8
  220. data/spec/lib/compiler/call_spec.rb +98 -66
  221. data/spec/lib/compiler_spec.rb +41 -32
  222. data/spec/lib/config_spec.rb +97 -0
  223. data/spec/lib/dependency_resolver_spec.rb +2 -2
  224. data/spec/lib/deprecations_spec.rb +16 -0
  225. data/spec/lib/fixtures/source_location_test.rb +7 -0
  226. data/spec/lib/path_reader_spec.rb +3 -3
  227. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
  228. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  229. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  230. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  231. data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
  232. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  233. data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
  234. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
  235. data/spec/lib/simple_server_spec.rb +54 -0
  236. data/spec/lib/spec_helper.rb +88 -4
  237. data/spec/mspec-opal/formatters.rb +65 -17
  238. data/spec/mspec-opal/runner.rb +47 -67
  239. data/spec/opal/core/date_spec.rb +14 -0
  240. data/spec/opal/core/exception_spec.rb +10 -0
  241. data/spec/opal/core/hash/internals_spec.rb +10 -10
  242. data/spec/opal/core/kernel/rand_spec.rb +0 -4
  243. data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
  244. data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
  245. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  246. data/spec/opal/core/language/send_spec.rb +1 -9
  247. data/spec/opal/core/language/string_spec.rb +8 -8
  248. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
  249. data/spec/opal/core/language_spec.rb +32 -0
  250. data/spec/opal/core/module/const_get_spec.rb +1 -1
  251. data/spec/opal/core/runtime/is_a_spec.rb +36 -0
  252. data/spec/opal/core/runtime/rescue_spec.rb +35 -0
  253. data/spec/opal/core/runtime_spec.rb +4 -4
  254. data/spec/opal/core/string_spec.rb +8 -8
  255. data/spec/opal/core/time_spec.rb +38 -0
  256. data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
  257. data/spec/opal/stdlib/json/parse_spec.rb +4 -0
  258. data/spec/opal/stdlib/native/hash_spec.rb +16 -0
  259. data/spec/ruby_specs +2 -1
  260. data/spec/spec_helper.rb +1 -0
  261. data/spec/support/rewriters_helper.rb +24 -0
  262. data/stdlib/base64.rb +4 -2
  263. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  264. data/stdlib/date.rb +18 -19
  265. data/stdlib/json.rb +16 -4
  266. data/stdlib/nashorn/file.rb +15 -0
  267. data/stdlib/native.rb +21 -12
  268. data/stdlib/nodejs/dir.rb +1 -1
  269. data/stdlib/nodejs/file.rb +49 -20
  270. data/stdlib/nodejs/io.rb +22 -1
  271. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  272. data/stdlib/nodejs/kernel.rb +3 -1
  273. data/stdlib/nodejs/package.json +0 -1
  274. data/stdlib/nodejs/stacktrace.rb +163 -0
  275. data/stdlib/nodejs/yaml.rb +2 -1
  276. data/stdlib/opal/platform.rb +5 -13
  277. data/stdlib/opal-platform.rb +15 -0
  278. data/stdlib/pathname.rb +1 -1
  279. data/stdlib/strscan.rb +15 -1
  280. data/stdlib/yaml.rb +1 -1
  281. data/tasks/benchmarking.rake +9 -0
  282. data/tasks/building.rake +24 -20
  283. data/tasks/linting.rake +24 -13
  284. data/tasks/testing/mspec_special_calls.rb +44 -15
  285. data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
  286. data/tasks/testing.rake +322 -205
  287. data/test/nodejs/fixtures/hello.rb +1 -0
  288. data/test/nodejs/test_file.rb +57 -0
  289. data/test/nodejs/test_io.rb +18 -0
  290. data/test/nodejs/test_opal_builder.rb +12 -0
  291. data/test/opal/unsupported_and_bugs.rb +9 -0
  292. metadata +131 -242
  293. data/lib/opal/parser/grammar.rb +0 -6157
  294. data/lib/opal/parser/grammar.y +0 -2011
  295. data/lib/opal/parser/keywords.rb +0 -66
  296. data/lib/opal/parser/lexer.rb +0 -1352
  297. data/lib/opal/parser/parser_scope.rb +0 -28
  298. data/lib/opal/parser/sexp.rb +0 -90
  299. data/lib/opal/sprockets/environment.rb +0 -23
  300. data/lib/opal/sprockets/erb.rb +0 -23
  301. data/lib/opal/sprockets/path_reader.rb +0 -36
  302. data/lib/opal/sprockets/processor.rb +0 -145
  303. data/lib/opal/sprockets/server.rb +0 -133
  304. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  305. data/lib/opal/sprockets/source_map_server.rb +0 -115
  306. data/lib/opal/sprockets.rb +0 -91
  307. data/spec/filters/bugs/compiler_opal.rb +0 -5
  308. data/spec/filters/bugs/language_opal.rb +0 -88
  309. data/spec/filters/unsupported/module.rb +0 -8
  310. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  311. data/spec/lib/lexer_spec.rb +0 -110
  312. data/spec/lib/parser/alias_spec.rb +0 -26
  313. data/spec/lib/parser/and_spec.rb +0 -13
  314. data/spec/lib/parser/aref_spec.rb +0 -10
  315. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  316. data/spec/lib/parser/begin_spec.rb +0 -42
  317. data/spec/lib/parser/block_spec.rb +0 -12
  318. data/spec/lib/parser/break_spec.rb +0 -17
  319. data/spec/lib/parser/call_spec.rb +0 -201
  320. data/spec/lib/parser/class_spec.rb +0 -35
  321. data/spec/lib/parser/comments_spec.rb +0 -11
  322. data/spec/lib/parser/def_spec.rb +0 -109
  323. data/spec/lib/parser/if_spec.rb +0 -26
  324. data/spec/lib/parser/iter_spec.rb +0 -59
  325. data/spec/lib/parser/lambda_spec.rb +0 -219
  326. data/spec/lib/parser/literal_spec.rb +0 -118
  327. data/spec/lib/parser/masgn_spec.rb +0 -37
  328. data/spec/lib/parser/module_spec.rb +0 -27
  329. data/spec/lib/parser/not_spec.rb +0 -21
  330. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  331. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  332. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  333. data/spec/lib/parser/or_spec.rb +0 -13
  334. data/spec/lib/parser/return_spec.rb +0 -22
  335. data/spec/lib/parser/sclass_spec.rb +0 -21
  336. data/spec/lib/parser/string_spec.rb +0 -286
  337. data/spec/lib/parser/super_spec.rb +0 -20
  338. data/spec/lib/parser/unary_spec.rb +0 -52
  339. data/spec/lib/parser/undef_spec.rb +0 -19
  340. data/spec/lib/parser/unless_spec.rb +0 -13
  341. data/spec/lib/parser/variables_spec.rb +0 -116
  342. data/spec/lib/parser/while_spec.rb +0 -15
  343. data/spec/lib/parser/yield_spec.rb +0 -20
  344. data/spec/lib/sprockets/erb_spec.rb +0 -38
  345. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  346. data/spec/lib/sprockets/processor_spec.rb +0 -79
  347. data/spec/lib/sprockets/server_spec.rb +0 -102
  348. data/spec/lib/sprockets_spec.rb +0 -32
  349. data/spec/lib/tilt/opal_spec.rb +0 -37
  350. data/spec/opal/core/language/block_spec.rb +0 -538
  351. data/spec/opal/core/language/proc_spec.rb +0 -263
  352. data/spec/opal/core/language/variables_spec.rb +0 -1366
  353. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  354. data/spec/opal/core/runtime/send_spec.rb +0 -34
  355. data/spec/support/parser_helpers.rb +0 -37
  356. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  357. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
  358. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  359. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  360. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  361. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  362. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  363. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  364. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  365. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  366. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  367. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  368. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  369. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  370. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  371. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  372. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  373. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  374. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  375. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  376. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  377. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  378. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  379. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  380. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  381. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  382. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  383. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  384. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  385. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  386. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  387. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  388. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  389. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  390. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  391. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  392. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  393. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  394. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  395. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  396. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  397. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  398. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  399. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
  400. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  401. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  402. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  403. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  404. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  405. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  406. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  407. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  408. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  409. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  410. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  411. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  412. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  413. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  414. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  415. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  416. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  417. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  418. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  419. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  420. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  421. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  422. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  423. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  424. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  425. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  426. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  427. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  428. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  429. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  430. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  431. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  432. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  433. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  434. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  435. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  436. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  437. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  438. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  439. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  440. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  441. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  442. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  443. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  444. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  445. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  446. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  447. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  448. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  449. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  450. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  451. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  452. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  453. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  454. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  455. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  456. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  457. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  458. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  459. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
  460. /data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
@@ -1,251 +1,65 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
  require 'opal/nodes/call'
3
4
 
4
5
  module Opal
5
6
  module Nodes
6
- # recv.mid = rhs
7
- # s(:recv, :mid=, s(:arglist, rhs))
8
- class AttrAssignNode < CallNode
9
- handle :attrasgn
7
+ # recvr.JS[:prop]
8
+ # => recvr.prop
9
+ class JsAttrNode < Base
10
+ handle :jsattr
11
+ children :recvr, :property
10
12
 
11
- children :recvr, :meth, :arglist
12
-
13
- def default_compile
14
- # Skip, for now, if the method has square brackets: []=
15
- return super if meth.to_s !~ /#{REGEXP_START}\w+=#{REGEXP_END}/
16
-
17
- with_temp do |args_tmp|
18
- with_temp do |recv_tmp|
19
- args = expr(arglist)
20
- mid = mid_to_jsid meth.to_s
21
- push "((#{args_tmp} = [", args, "]), "+
22
- "#{recv_tmp} = ", recv(recv_sexp), ", ",
23
- recv_tmp, mid, ".apply(#{recv_tmp}, #{args_tmp}), "+
24
- "#{args_tmp}[#{args_tmp}.length-1])"
25
- end
26
- end
13
+ def compile
14
+ push recv(recvr), '[', expr(property), ']'
27
15
  end
28
16
  end
29
17
 
30
- # recv.JS[1] = rhs
31
- class JsAttrAssignNode < CallNode
18
+ # recvr.JS[:prop] = value
19
+ # => recvr.prop = value
20
+ class JsAttrAsgnNode < Base
32
21
  handle :jsattrasgn
33
22
 
34
- def record_method?
35
- false
36
- end
23
+ children :recvr, :property, :value
37
24
 
38
- def default_compile
39
- push recv(recv_sexp), '[', expr(arglist[1]), ']', '=', expr(arglist[2])
25
+ def compile
26
+ push recv(recvr), '[', expr(property), '] = ', expr(value)
40
27
  end
41
28
  end
42
29
 
43
- # recv.JS.prop
44
- # recv.JS[1]
45
- # recv.JS.meth(arg1, arg2)
46
30
  class JsCallNode < CallNode
47
31
  handle :jscall
48
32
 
49
- def record_method?
50
- false
51
- end
52
-
53
- def default_compile
54
- if meth == :[]
55
- push recv(recv_sexp), '[', expr(arglist), ']'
56
- else
57
- mid = ".#{meth}"
58
-
59
- splat = arglist[1..-1].any? { |a| a.first == :splat }
60
-
61
- if Sexp === arglist.last and arglist.last.type == :block_pass
62
- block = arglist.pop
63
- elsif iter
64
- block = iter
65
- end
33
+ def initialize(*)
34
+ super
66
35
 
67
- blktmp = scope.new_temp if block
68
- tmprecv = scope.new_temp if splat
69
-
70
- # must do this after assigning temp variables
71
- block = expr(block) if block
72
-
73
- recv_code = recv(recv_sexp)
74
- call_recv = s(:js_tmp, blktmp || recv_code)
75
-
76
- if blktmp
77
- arglist.push call_recv
78
- end
79
-
80
- args = expr(arglist)
81
-
82
- if tmprecv
83
- push "(#{tmprecv} = ", recv_code, ")#{mid}"
84
- else
85
- push recv_code, mid
86
- end
87
-
88
- if blktmp
89
- unshift "(#{blktmp} = ", block, ", "
90
- push ")"
91
- end
92
-
93
- if splat
94
- push ".apply(", tmprecv, ", ", args, ")"
95
- else
96
- push "(", args, ")"
97
- end
98
-
99
- scope.queue_temp blktmp if blktmp
36
+ # For .JS. call we pass a block
37
+ # as a plain JS callback
38
+ if @iter
39
+ @arglist = @arglist << @iter
100
40
  end
41
+ @iter = nil
101
42
  end
102
- end
103
-
104
- # lhs =~ rhs
105
- # s(:match3, lhs, rhs)
106
- class Match3Node < Base
107
- handle :match3
108
-
109
- children :lhs, :rhs
110
-
111
- def compile
112
- sexp = s(:call, lhs, :=~, s(:arglist, rhs))
113
- push process(sexp, @level)
114
- end
115
- end
116
-
117
- # a ||= rhs
118
- # s(:op_asgn_or, s(:lvar, :a), s(:lasgn, :a, rhs))
119
- class OpAsgnOrNode < Base
120
- handle :op_asgn_or
121
-
122
- children :recvr, :rhs
123
43
 
124
44
  def compile
125
- sexp = s(:or, recvr, rhs)
126
- push expr(sexp)
45
+ default_compile
127
46
  end
128
- end
129
-
130
- # a &&= rhs
131
- # s(:op_asgn_and, s(:lvar, :a), s(:lasgn, a:, rhs))
132
- class OpAsgnAndNode < Base
133
- handle :op_asgn_and
134
-
135
- children :recvr, :rhs
136
47
 
137
- def compile
138
- sexp = s(:and, recvr, rhs)
139
- push expr(sexp)
48
+ def method_jsid
49
+ "." + meth.to_s
140
50
  end
141
51
  end
142
52
 
143
- # lhs[args] ||= rhs
144
- # s(:op_asgn1, lhs, args, :||, rhs)
145
- class OpAsgn1Node < Base
146
- handle :op_asgn1
147
-
148
- children :lhs, :args, :op, :rhs
149
-
150
- def first_arg
151
- args[1]
152
- end
153
-
154
- def compile
155
- case op.to_s
156
- when '||' then compile_or
157
- when '&&' then compile_and
158
- else compile_operator
159
- end
160
- end
161
-
162
- def compile_operator
163
- with_temp do |a| # args
164
- with_temp do |r| # recv
165
- cur = s(:call, s(:js_tmp, r), :[], s(:arglist, s(:js_tmp, a)))
166
- rhs = s(:call, cur, op.to_sym, s(:arglist, self.rhs))
167
- call = s(:call, s(:js_tmp, r), :[]=, s(:arglist, s(:js_tmp, a), rhs))
168
-
169
- push "(#{a} = ", expr(first_arg), ", #{r} = ", expr(lhs)
170
- push ", ", expr(call), ")"
171
- end
172
- end
173
- end
174
-
175
- def compile_or
176
- with_temp do |a| # args
177
- with_temp do |r| # recv
178
- aref = s(:call, s(:js_tmp, r), :[], s(:arglist, s(:js_tmp, a)))
179
- aset = s(:call, s(:js_tmp, r), :[]=, s(:arglist, s(:js_tmp, a), rhs))
180
- orop = s(:or, aref, aset)
181
-
182
- push "(#{a} = ", expr(first_arg), ", #{r} = ", expr(lhs)
183
- push ", ", expr(orop), ")"
184
- end
185
- end
186
- end
187
-
188
- def compile_and
189
- with_temp do |a| # args
190
- with_temp do |r| # recv
191
- aref = s(:call, s(:js_tmp, r), :[], s(:arglist, s(:js_tmp, a)))
192
- aset = s(:call, s(:js_tmp, r), :[]=, s(:arglist, s(:js_tmp, a), rhs))
193
- andop = s(:and, aref, aset)
194
-
195
- push "(#{a} = ", expr(first_arg), ", #{r} = ", expr(lhs)
196
- push ", ", expr(andop), ")"
197
- end
198
- end
199
- end
200
- end
201
-
202
- # lhs.b += rhs
203
- # s(:op_asgn2, lhs, :b=, :+, rhs)
204
- class OpAsgn2Node < Base
205
- handle :op_asgn2
206
-
207
- children :lhs, :mid, :op, :rhs
53
+ # /regexp/ =~ rhs
54
+ # s(:match_with_lvasgn, lhs, rhs)
55
+ class Match3Node < Base
56
+ handle :match_with_lvasgn
208
57
 
209
- def meth
210
- mid.to_s[0..-2]
211
- end
58
+ children :lhs, :rhs
212
59
 
213
60
  def compile
214
- case op.to_s
215
- when '||' then compile_or
216
- when '&&' then compile_and
217
- else compile_operator
218
- end
219
- end
220
-
221
- def compile_or
222
- with_temp do |tmp|
223
- getr = s(:call, s(:js_tmp, tmp), meth, s(:arglist))
224
- asgn = s(:call, s(:js_tmp, tmp), mid, s(:arglist, rhs))
225
- orop = s(:or, getr, asgn)
226
-
227
- push "(#{tmp} = ", expr(lhs), ", ", expr(orop), ")"
228
- end
229
- end
230
-
231
- def compile_and
232
- with_temp do |tmp|
233
- getr = s(:call, s(:js_tmp, tmp), meth, s(:arglist))
234
- asgn = s(:call, s(:js_tmp, tmp), mid, s(:arglist, rhs))
235
- andop = s(:and, getr, asgn)
236
-
237
- push "(#{tmp} = ", expr(lhs), ", ", expr(andop), ")"
238
- end
239
- end
240
-
241
- def compile_operator
242
- with_temp do |tmp|
243
- getr = s(:call, s(:js_tmp, tmp), meth, s(:arglist))
244
- oper = s(:call, getr, op, s(:arglist, rhs))
245
- asgn = s(:call, s(:js_tmp, tmp), mid, s(:arglist, oper))
246
-
247
- push "(#{tmp} = ", expr(lhs), ", ", expr(asgn), ")"
248
- end
61
+ sexp = s(:send, lhs, :=~, rhs)
62
+ push process(sexp, @level)
249
63
  end
250
64
  end
251
65
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
 
3
4
  module Opal
@@ -8,34 +9,43 @@ module Opal
8
9
  children :condition
9
10
 
10
11
  def compile
12
+ compiler.in_case do
13
+ compile_code
14
+
15
+ wrap '(function() {', '})()' if needs_closure?
16
+ end
17
+ end
18
+
19
+ def compile_code
11
20
  handled_else = false
12
21
 
13
- compiler.in_case do
14
- if condition
15
- case_stmt[:cond] = true
16
- add_local '$case'
22
+ if condition
23
+ case_stmt[:cond] = true
24
+ add_local '$case'
17
25
 
18
- push "$case = ", expr(condition), ";"
19
- end
26
+ push "$case = ", expr(condition), ";"
27
+ end
20
28
 
21
- case_parts.each_with_index do |wen, idx|
22
- if wen and wen.type == :when
23
- compiler.returns(wen) if needs_closure?
29
+ case_parts.each_with_index do |wen, idx|
30
+ if wen
31
+ line
32
+ case wen.type
33
+ when :when
34
+ wen = compiler.returns(wen) if needs_closure?
24
35
  push "else " unless idx == 0
25
36
  push stmt(wen)
26
- elsif wen # s(:else)
37
+ else # s(:else)
27
38
  handled_else = true
28
39
  wen = compiler.returns(wen) if needs_closure?
29
40
  push "else {", stmt(wen), "}"
30
41
  end
31
42
  end
43
+ end
32
44
 
33
- # if we are having a closure, we must return a usable value
34
- if needs_closure? and !handled_else
35
- push "else { return nil }"
36
- end
37
-
38
- wrap '(function() {', '})()' if needs_closure?
45
+ # if we are having a closure, we must return a usable value
46
+ if needs_closure? and !handled_else
47
+ line
48
+ push "else { return nil }"
39
49
  end
40
50
  end
41
51
 
@@ -64,12 +74,16 @@ module Opal
64
74
  push ' || ' unless idx == 0
65
75
 
66
76
  if check.type == :splat
67
- push "(function($splt) { for (var i = 0; i < $splt.length; i++) {"
68
- push "if ($splt[i]['$===']($case)) { return true; }"
69
- push "} return false; })(", expr(check[1]), ")"
77
+ push "(function($splt) { for (var i = 0, ii = $splt.length; i < ii; i++) {"
78
+ if case_stmt[:cond]
79
+ push "if ($splt[i]['$===']($case)) { return true; }"
80
+ else
81
+ push "if (", js_truthy(check), ")) { return true; }"
82
+ end
83
+ push "} return false; })(", expr(check.children[0]), ")"
70
84
  else
71
85
  if case_stmt[:cond]
72
- call = s(:call, check, :===, s(:arglist, s(:js_tmp, '$case')))
86
+ call = s(:send, check, :===, s(:arglist, s(:js_tmp, '$case')))
73
87
  push expr(call)
74
88
  else
75
89
  push js_truthy(check)
@@ -81,7 +95,7 @@ module Opal
81
95
  end
82
96
 
83
97
  def when_checks
84
- whens.children
98
+ children[0..-2]
85
99
  end
86
100
 
87
101
  def case_stmt
@@ -89,7 +103,7 @@ module Opal
89
103
  end
90
104
 
91
105
  def body_code
92
- body || s(:nil)
106
+ children.last || s(:nil)
93
107
  end
94
108
  end
95
109
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/module'
2
3
 
3
4
  module Opal
@@ -11,14 +12,14 @@ module Opal
11
12
  name, base = name_and_base
12
13
  helper :klass
13
14
 
14
- push "(function($base, $super) {"
15
+ push "(function($base, $super, $parent_nesting) {"
15
16
  line " function $#{name}(){};"
16
17
  line " var self = $#{name} = $klass($base, $super, '#{name}', $#{name});"
17
18
 
18
19
  in_scope do
19
20
  scope.name = name
20
21
  add_temp "#{scope.proto} = self.$$proto"
21
- add_temp "$scope = self.$$scope"
22
+ add_temp '$nesting = [self].concat($parent_nesting)'
22
23
 
23
24
  body_code = self.body_code
24
25
  empty_line
@@ -27,7 +28,7 @@ module Opal
27
28
  line body_code
28
29
  end
29
30
 
30
- line "})(", base, ", ", self.super_code, ")"
31
+ line "})(", base, ", ", self.super_code, ", $nesting)"
31
32
  end
32
33
 
33
34
  def super_code
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
 
3
4
  module Opal
@@ -5,25 +6,38 @@ module Opal
5
6
  class ConstNode < Base
6
7
  handle :const
7
8
 
8
- children :name
9
+ children :const_scope, :name
9
10
 
10
11
  def compile
11
- if name == :DATA and compiler.eof_content
12
+ if magical_data_const?
12
13
  push("$__END__")
14
+ elsif const_scope
15
+ push "Opal.const_get_qualified(", recv(const_scope), ", '#{name}')"
16
+ elsif compiler.eval?
17
+ push "Opal.const_get_relative($nesting, '#{name}')"
13
18
  else
14
- push "$scope.get('#{name}')"
19
+ push "Opal.const_get_relative($nesting, '#{name}')"
15
20
  end
16
21
  end
17
- end
18
22
 
19
- class ConstDeclarationNode < Base
20
- handle :cdecl
23
+ # Ruby has a magical const DATA
24
+ # that should be processed in a different way:
25
+ # 1. When current file contains __END__ in the end of the file
26
+ # DATA const should be resolved to the string located after __END__
27
+ # 2. When current file doesn't have __END__ section
28
+ # DATA const should be resolved to a regular ::DATA constant
29
+ def magical_data_const?
30
+ const_scope.nil? && name == :DATA and compiler.eof_content
31
+ end
32
+ end
21
33
 
22
- children :name, :base
34
+ # ::CONST
35
+ # s(:const, s(:cbase), :CONST)
36
+ class CbaseNode < Base
37
+ handle :cbase
23
38
 
24
39
  def compile
25
- push expr(base)
26
- wrap "Opal.cdecl($scope, '#{name}', ", ")"
40
+ push "'::'"
27
41
  end
28
42
  end
29
43
 
@@ -33,45 +47,11 @@ module Opal
33
47
  children :base, :name, :value
34
48
 
35
49
  def compile
36
- push "Opal.casgn("
37
- push expr(base)
38
- push ", '#{name}', "
39
- push expr(value)
40
- push ")"
41
- end
42
- end
43
-
44
- class ConstGetNode < Base
45
- handle :colon2
46
-
47
- children :base, :name
48
-
49
- def compile
50
- push "(("
51
- push expr(base)
52
- push ").$$scope.get('#{name}'))"
53
- end
54
- end
55
-
56
- class TopConstNode < Base
57
- handle :colon3
58
-
59
- children :name
60
-
61
- def compile
62
- push "Opal.get('#{name}')"
63
- end
64
- end
65
-
66
- class TopConstAssignNode < Base
67
- handle :casgn3
68
-
69
- children :name, :value
70
-
71
- def compile
72
- push "Opal.casgn(Opal.Object, '#{name}', "
73
- push expr(value)
74
- push ")"
50
+ if base
51
+ push "Opal.const_set(", expr(base), ", '#{name}', ", expr(value), ")"
52
+ else
53
+ push "Opal.const_set($nesting[0], '#{name}', ", expr(value), ")"
54
+ end
75
55
  end
76
56
  end
77
57
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/nodes/call'
3
+
4
+ module Opal
5
+ module Nodes
6
+
7
+ # Safe navigator recv&.meth(arglist, &block)
8
+ class CSendNode < CallNode
9
+ handle :csend
10
+
11
+ def default_compile
12
+ helper :send
13
+
14
+ conditional_send(recv(receiver_sexp)) do |receiver_temp|
15
+ push "$send(", receiver_temp
16
+ compile_method_name
17
+ compile_arguments
18
+ compile_block_pass
19
+ push ')'
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/node_with_args'
2
3
 
3
4
  module Opal
@@ -6,13 +7,19 @@ module Opal
6
7
  class DefNode < NodeWithArgs
7
8
  handle :def
8
9
 
9
- children :recvr, :mid, :args, :stmts
10
+ children :mid, :args, :stmts
10
11
 
11
12
  attr_accessor :block_arg
12
13
 
13
14
  def extract_block_arg
14
- if args.last.is_a?(Sexp) && args.last.type == :blockarg
15
- @block_arg = args.pop[1]
15
+ *regular_args, last_arg = args.children
16
+ if last_arg && last_arg.type == :blockarg
17
+ @block_arg = last_arg.children[0]
18
+ @sexp = @sexp.updated(nil, [
19
+ mid,
20
+ s(:args, *regular_args),
21
+ stmts
22
+ ])
16
23
  end
17
24
  end
18
25
 
@@ -25,12 +32,12 @@ module Opal
25
32
 
26
33
  # block name (&block)
27
34
  if block_arg
28
- block_name = variable(block_arg).to_sym
35
+ block_name = block_arg
29
36
  end
30
37
 
31
38
  in_scope do
32
39
  scope.mid = mid
33
- scope.defs = true if recvr
40
+ scope.defs = true if @sexp.type == :defs
34
41
 
35
42
  if block_name
36
43
  scope.uses_block!
@@ -40,6 +47,7 @@ module Opal
40
47
  scope.block_name = block_name || '$yield'
41
48
 
42
49
  inline_params = process(inline_args_sexp)
50
+
43
51
  stmt_code = stmt(compiler.returns(stmts))
44
52
 
45
53
  add_temp 'self = this'
@@ -58,13 +66,12 @@ module Opal
58
66
 
59
67
  if scope.uses_zuper
60
68
  add_local '$zuper'
61
- add_local '$zuper_index'
62
- add_local '$zuper_length'
69
+ add_local '$zuper_i'
70
+ add_local '$zuper_ii'
63
71
 
64
- line "$zuper = [];"
65
- line
66
- line "for($zuper_index = 0; $zuper_index < arguments.length; $zuper_index++) {"
67
- line " $zuper[$zuper_index] = arguments[$zuper_index];"
72
+ line "// Prepare super implicit arguments"
73
+ line "for($zuper_i = 0, $zuper_ii = arguments.length, $zuper = new Array($zuper_ii); $zuper_i < $zuper_ii; $zuper_i++) {"
74
+ line " $zuper[$zuper_i] = arguments[$zuper_i];"
68
75
  line "}"
69
76
  end
70
77
 
@@ -79,8 +86,15 @@ module Opal
79
86
  end
80
87
  end
81
88
 
82
- # This is a special utf8 char ---v
83
- function_name = valid_name?(mid) ? " ː#{mid}" : ''
89
+ # There are some special utf8 chars that can be used as valid JS
90
+ # identifiers, some examples:
91
+ #
92
+ # utf8_pond = 'ⵌ'
93
+ # utf8_question = 'ʔ̣'
94
+ # utf8_exclamation 'ǃ'
95
+ #
96
+ # For now we're just using $$, to maintain compatibility with older IEs.
97
+ function_name = valid_name?(mid) ? " $$#{mid}" : ''
84
98
 
85
99
  unshift ") {"
86
100
  unshift(inline_params)
@@ -94,19 +108,34 @@ module Opal
94
108
  push ", #{scope_name}.$$parameters = #{parameters_code}"
95
109
  end
96
110
 
97
- if recvr then unshift 'Opal.defs(', recv(recvr), ", '$#{mid}', "
98
- elsif scope.iter? then unshift "Opal.def(self, '$#{mid}', "
111
+ if compiler.parse_comments?
112
+ push ", #{scope_name}.$$comments = #{comments_code}"
113
+ end
114
+
115
+ if compiler.enable_source_location?
116
+ push ", #{scope_name}.$$source_location = #{source_location}"
117
+ end
118
+
119
+ wrap_with_definition
120
+ end
121
+
122
+ def wrap_with_definition
123
+ if scope.iter? then unshift "Opal.def(self, '$#{mid}', "
99
124
  elsif scope.module? || scope.class? then unshift "Opal.defn(self, '$#{mid}', "
100
- elsif scope.sclass? && scope.defs then unshift "Opal.defs(self, '$#{mid}', "
101
125
  elsif scope.sclass? then unshift "Opal.defn(self, '$#{mid}', "
102
126
  elsif compiler.eval? then unshift "Opal.def(self, '$#{mid}', "
103
127
  elsif scope.top? then unshift "Opal.defn(Opal.Object, '$#{mid}', "
104
128
  elsif scope.def? then unshift "Opal.def(self, '$#{mid}', "
105
129
  else raise "Unsupported use of `def`; please file a bug at https://github.com/opal/opal/issues/new reporting this message."
106
130
  end
131
+
107
132
  push ')'
108
133
 
109
- wrap '(', ", nil) && '#{mid}'" if expr?
134
+ if expr?
135
+ wrap '(', ", nil) && '#{mid}'"
136
+ else
137
+ unshift "\n#{current_indent}"
138
+ end
110
139
  end
111
140
 
112
141
  # Returns code used in debug mode to check arity of method call
@@ -117,6 +146,17 @@ module Opal
117
146
  push " if (#{arity_checks.join(' || ')}) { Opal.ac($arity, #{arity}, this, #{meth}); }"
118
147
  end
119
148
  end
149
+
150
+ def source_location
151
+ file = @sexp.loc.expression.source_buffer.name
152
+ line = @sexp.loc.line
153
+
154
+ "['#{file}.rb', #{line}]"
155
+ end
156
+
157
+ def comments_code
158
+ '[' + comments.map { |comment| comment.text.inspect }.join(', ') + ']'
159
+ end
120
160
  end
121
161
  end
122
162
  end