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
@@ -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
 
@@ -86,7 +93,7 @@ module Opal
86
93
  # utf8_question = 'ʔ̣'
87
94
  # utf8_exclamation 'ǃ'
88
95
  #
89
- # For now we're just using $, to maintain compatibility with older IEs.
96
+ # For now we're just using $$, to maintain compatibility with older IEs.
90
97
  function_name = valid_name?(mid) ? " $$#{mid}" : ''
91
98
 
92
99
  unshift ") {"
@@ -101,19 +108,34 @@ module Opal
101
108
  push ", #{scope_name}.$$parameters = #{parameters_code}"
102
109
  end
103
110
 
104
- if recvr then unshift 'Opal.defs(', recv(recvr), ", '$#{mid}', "
105
- 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}', "
106
124
  elsif scope.module? || scope.class? then unshift "Opal.defn(self, '$#{mid}', "
107
- elsif scope.sclass? && scope.defs then unshift "Opal.defs(self, '$#{mid}', "
108
125
  elsif scope.sclass? then unshift "Opal.defn(self, '$#{mid}', "
109
126
  elsif compiler.eval? then unshift "Opal.def(self, '$#{mid}', "
110
127
  elsif scope.top? then unshift "Opal.defn(Opal.Object, '$#{mid}', "
111
128
  elsif scope.def? then unshift "Opal.def(self, '$#{mid}', "
112
129
  else raise "Unsupported use of `def`; please file a bug at https://github.com/opal/opal/issues/new reporting this message."
113
130
  end
131
+
114
132
  push ')'
115
133
 
116
- wrap '(', ", nil) && '#{mid}'" if expr?
134
+ if expr?
135
+ wrap '(', ", nil) && '#{mid}'"
136
+ else
137
+ unshift "\n#{current_indent}"
138
+ end
117
139
  end
118
140
 
119
141
  # Returns code used in debug mode to check arity of method call
@@ -124,6 +146,17 @@ module Opal
124
146
  push " if (#{arity_checks.join(' || ')}) { Opal.ac($arity, #{arity}, this, #{meth}); }"
125
147
  end
126
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
127
160
  end
128
161
  end
129
162
  end
@@ -1,111 +1,221 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
 
3
4
  module Opal
4
5
  module Nodes
5
6
  class DefinedNode < Base
6
- handle :defined
7
+ handle :defined?
7
8
 
8
9
  children :value
9
10
 
10
11
  def compile
11
- type = value.type
12
-
13
- case type
12
+ case value.type
14
13
  when :self, :nil, :false, :true
15
- push type.to_s.inspect
16
- when :lasgn, :iasgn, :gasgn, :cvdecl, :masgn, :op_asgn_or, :op_asgn_and
14
+ push value.type.to_s.inspect
15
+ when :lvasgn, :ivasgn, :gvasgn, :cvasgn, :casgn, :op_asgn, :or_asgn, :and_asgn
17
16
  push "'assignment'"
18
- when :paren, :not
19
- push expr(s(:defined, value[1]))
20
17
  when :lvar
21
18
  push "'local-variable'"
22
- else
23
- if respond_to? "compile_#{type}"
24
- __send__ "compile_#{type}"
19
+ when :begin
20
+ if value.children.size == 1 && value.children[0].type == :masgn
21
+ push "'assignment'"
25
22
  else
26
23
  push "'expression'"
27
24
  end
25
+ when :send
26
+ compile_defined_send(value)
27
+ wrap "(", " ? 'method' : nil)"
28
+ when :ivar
29
+ compile_defined_ivar(value)
30
+ wrap "(", " ? 'instance-variable' : nil)"
31
+ when :zsuper, :super
32
+ compile_defined_super(value)
33
+ when :yield
34
+ compile_defined_yield(value)
35
+ wrap "(", " ? 'yield' : nil)"
36
+ when :xstr
37
+ compile_defined_xstr(value)
38
+ when :const
39
+ compile_defined_const(value)
40
+ wrap "(", " ? 'constant' : nil)"
41
+ when :cvar
42
+ compile_defined_cvar(value)
43
+ wrap "(", " ? 'class variable' : nil)"
44
+ when :gvar
45
+ compile_defined_gvar(value)
46
+ wrap "(", " ? 'global-variable' : nil)"
47
+ when :back_ref
48
+ compile_defined_back_ref(value)
49
+ wrap "(", " ? 'global-variable' : nil)"
50
+ when :nth_ref
51
+ compile_defined_nth_ref(value)
52
+ wrap "(", " ? 'global-variable' : nil)"
53
+ when :array
54
+ compile_defined_array(value)
55
+ wrap "(", " ? 'expression' : nil)"
56
+ else
57
+ push "'expression'"
58
+ end
59
+ end
60
+
61
+ def compile_defined(node)
62
+ type = node.type
63
+
64
+ if respond_to? "compile_defined_#{type}"
65
+ __send__("compile_defined_#{type}", node)
66
+ else
67
+ node_tmp = scope.new_temp
68
+ push "(#{node_tmp} = ", expr(node), ")"
69
+ node_tmp
28
70
  end
29
71
  end
30
72
 
31
- def compile_call
32
- mid = mid_to_jsid value[2].to_s
33
- recv = value[1] ? expr(value[1]) : 'self'
73
+ def wrap_with_try_catch(code)
74
+ returning_tmp = scope.new_temp
75
+
76
+ push "(#{returning_tmp} = (function() { try {"
77
+ push " return #{code};"
78
+ push "} catch ($err) {"
79
+ push " if (Opal.rescue($err, [Opal.Exception])) {"
80
+ push " try {"
81
+ push " return false;"
82
+ push " } finally { Opal.pop_exception() }"
83
+ push " } else { throw $err; }"
84
+ push "}})())"
85
+
86
+ returning_tmp
87
+ end
88
+
89
+ def compile_send_recv_doesnt_raise(recv_code)
90
+ wrap_with_try_catch(recv_code)
91
+ end
92
+
93
+ def compile_defined_send(node)
94
+ recv, method_name, *args = *node
95
+ mid = mid_to_jsid(method_name.to_s)
96
+
97
+ if recv
98
+ recv_code = compile_defined(recv)
99
+ push " && "
100
+
101
+ if recv.type == :send
102
+ recv_code = compile_send_recv_doesnt_raise(recv_code)
103
+ push " && "
104
+ end
105
+
106
+ recv_tmp = scope.new_temp
107
+ push "(#{recv_tmp} = ", recv_code, ", #{recv_tmp}) && "
108
+ else
109
+ recv_tmp = "self"
110
+ end
111
+
112
+ recv_value_tmp = scope.new_temp
113
+ push "(#{recv_value_tmp} = #{recv_tmp}) && "
114
+
115
+ meth_tmp = scope.new_temp
116
+ push "(((#{meth_tmp} = #{recv_value_tmp}#{mid}) && !#{meth_tmp}.$$stub)"
117
+
118
+ push " || #{recv_value_tmp}['$respond_to_missing?']('#{method_name}'))"
34
119
 
35
- with_temp do |tmp|
36
- push "(((#{tmp} = ", recv, "#{mid}) && !#{tmp}.$$stub) || ", recv
37
- push "['$respond_to_missing?']('#{value[2].to_s}') ? 'method' : nil)"
120
+ args.each do |arg|
121
+ case arg.type
122
+ when :block_pass
123
+ # ignoring
124
+ else
125
+ push " && "
126
+ compile_defined(arg)
127
+ end
38
128
  end
129
+
130
+ wrap '(', ')'
131
+ "#{meth_tmp}()"
39
132
  end
40
133
 
41
- def compile_ivar
134
+ def compile_defined_ivar(node)
135
+ name = node.children[0].to_s[1..-1]
42
136
  # FIXME: this check should be positive for ivars initialized as nil too.
43
137
  # Since currently all known ivars are inialized to nil in the constructor
44
138
  # we can't tell if it was the user that put nil and made the ivar #defined?
45
139
  # or not.
46
- with_temp do |tmp|
47
- name = value[1].to_s[1..-1]
140
+ tmp = scope.new_temp
141
+ push "(#{tmp} = self['#{name}'], #{tmp} != null && #{tmp} !== nil)"
48
142
 
49
- push "((#{tmp} = self['#{name}'], #{tmp} != null && #{tmp} !== nil) ? "
50
- push "'instance-variable' : nil)"
51
- end
143
+ tmp
52
144
  end
53
145
 
54
- def compile_super
55
- push expr(s(:defined_super, value))
146
+ def compile_defined_super(node)
147
+ push expr s(:defined_super)
56
148
  end
57
149
 
58
- def compile_yield
59
- push compiler.handle_block_given_call(@sexp)
60
- wrap '((', ') != null ? "yield" : nil)'
150
+ def compile_defined_yield(node)
151
+ scope.uses_block!
152
+ block_name = scope.block_name || (parent = scope.find_parent_def && parent.block_name)
153
+ push "(#{block_name} != null && #{block_name} !== nil)"
154
+ block_name
61
155
  end
62
156
 
63
- def compile_xstr
64
- push expr(value)
65
- wrap '(typeof(', ') !== "undefined")'
157
+ def compile_defined_xstr(node)
158
+ push '(typeof(', expr(node), ') !== "undefined")'
66
159
  end
67
- alias compile_dxstr compile_xstr
68
160
 
69
- def compile_const
70
- push "($scope.#{value[1]} != null)"
71
- end
161
+ def compile_defined_const(node)
162
+ const_scope, const_name = *node
72
163
 
73
- def compile_colon2
74
- # TODO: avoid try/catch, probably a #process_colon2 alternative that
75
- # does not raise errors is needed
76
- push "(function(){ try { return (("
77
- push expr(value)
78
- push ") != null ? 'constant' : nil); } catch (err) { if (err.$$class"
79
- push " === Opal.NameError) { return nil; } else { throw(err); }}; })()"
80
- end
164
+ const_tmp = scope.new_temp
81
165
 
82
- def compile_colon3
83
- push "(Opal.Object.$$scope.#{value[1]} == null ? nil : 'constant')"
166
+ if const_scope.nil?
167
+ push "(#{const_tmp} = Opal.const_get_relative($nesting, '#{const_name}', 'skip_raise'))"
168
+ elsif const_scope == s(:cbase)
169
+ push "(#{const_tmp} = Opal.const_get_qualified('::', '#{const_name}', 'skip_raise'))"
170
+ else
171
+ const_scope_tmp = compile_defined(const_scope)
172
+ push " && (#{const_tmp} = Opal.const_get_qualified(#{const_scope_tmp}, '#{const_name}', 'skip_raise'))"
173
+ end
174
+ const_tmp
84
175
  end
85
176
 
86
- def compile_cvar
87
- push "(Opal.cvars['#{value[1]}'] != null ? 'class variable' : nil)"
177
+
178
+ def compile_defined_cvar(node)
179
+ cvar_name, _ = *node
180
+ cvar_tmp = scope.new_temp
181
+ push "(#{cvar_tmp} = #{class_variable_owner}.$$cvars['#{cvar_name}'], #{cvar_tmp} != null)"
182
+ cvar_tmp
88
183
  end
89
184
 
90
- def compile_gvar
91
- name = value[1].to_s[1..-1]
185
+ def compile_defined_gvar(node)
186
+ helper :gvars
187
+
188
+ name = node.children[0].to_s[1..-1]
189
+ gvar_temp = scope.new_temp
92
190
 
93
191
  if %w[~ !].include? name
94
- push "'global-variable'"
95
- elsif %w[` ' + &].include? name
96
- with_temp do |tmp|
97
- push "((#{tmp} = $gvars['~'], #{tmp} != null && #{tmp} !== nil) ? "
98
- push "'global-variable' : nil)"
99
- end
192
+ push "(#{gvar_temp} = ", expr(node), " || true)"
100
193
  else
101
- push "($gvars[#{name.inspect}] != null ? 'global-variable' : nil)"
194
+ push "(#{gvar_temp} = $gvars[#{name.inspect}], #{gvar_temp} != null)"
102
195
  end
196
+
197
+ gvar_temp
198
+ end
199
+
200
+ def compile_defined_back_ref(node)
201
+ helper :gvars
202
+ back_ref_temp = scope.new_temp
203
+ push "(#{back_ref_temp} = $gvars['~'], #{back_ref_temp} != null && #{back_ref_temp} !== nil)"
204
+ back_ref_temp
205
+ end
206
+
207
+ def compile_defined_nth_ref(node)
208
+ helper :gvars
209
+
210
+ nth_ref_tmp = scope.new_temp
211
+ push "(#{nth_ref_tmp} = $gvars['~'], #{nth_ref_tmp} != null && #{nth_ref_tmp} != nil)"
212
+ nth_ref_tmp
103
213
  end
104
214
 
105
- def compile_nth_ref
106
- with_temp do |tmp|
107
- push "((#{tmp} = $gvars['~'], #{tmp} != null && #{tmp} != nil) ? "
108
- push "'global-variable' : nil)"
215
+ def compile_defined_array(node)
216
+ node.children.each_with_index do |child, idx|
217
+ push " && " unless idx == 0
218
+ compile_defined(child)
109
219
  end
110
220
  end
111
221
  end
@@ -1,35 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/nodes/base'
2
3
 
3
4
  module Opal
4
5
  module Nodes
5
-
6
- class SvalueNode < Base
7
- handle :svalue
8
-
9
- children :value
10
-
11
- def compile
12
- push process(value, @level)
13
- end
14
- end
15
-
16
6
  class UndefNode < Base
17
7
  handle :undef
18
8
 
9
+ children :value
10
+
19
11
  def compile
20
12
  children.each do |child|
21
- value = child[1]
22
- statements = []
23
- if child[0] == :js_return
24
- value = value[1]
25
- statements << expr(s(:js_return))
26
- end
27
- statements << "Opal.udef(self, '$#{value.to_s}');"
28
- if children.length > 1 && child != children.first
29
- line *statements
30
- else
31
- push *statements
32
- end
13
+ line "Opal.udef(self, '$' + ", expr(child), ");"
33
14
  end
34
15
  end
35
16
  end
@@ -39,139 +20,65 @@ module Opal
39
20
 
40
21
  children :new_name, :old_name
41
22
 
42
- def new_mid
43
- mid_to_jsid new_name[1].to_s
44
- end
45
-
46
- def old_mid
47
- mid_to_jsid old_name[1].to_s
48
- end
49
-
50
23
  def compile
51
- if scope.class? or scope.module?
52
- scope.methods << "$#{new_name[1]}"
53
- end
54
-
55
- push "Opal.alias(self, '#{new_name[1]}', '#{old_name[1]}')"
24
+ push "Opal.alias(self, ", expr(new_name), ", ", expr(old_name), ")"
56
25
  end
57
26
  end
58
27
 
59
- class BeginNode < Base
28
+ class BeginNode < ScopeNode
60
29
  handle :begin
61
30
 
62
- children :body
63
-
64
31
  def compile
65
- if !stmt? and body.type == :block
66
- push stmt(compiler.returns(body))
67
- wrap '(function() {', '})()'
68
- else
69
- push process(body, @level)
70
- end
71
- end
72
- end
73
-
74
- class ParenNode < Base
75
- handle :paren
76
-
77
- children :body
78
-
79
- def compile
80
- if body.type == :block
81
- body.children.each_with_index do |child, idx|
82
- push ', ' unless idx == 0
83
- push expr(child)
84
- end
32
+ return push "nil" if children.empty?
85
33
 
86
- wrap '(', ')'
34
+ if stmt?
35
+ compile_children(children, @level)
36
+ elsif simple_children?
37
+ compile_inline_children(children, @level)
38
+ wrap '(', ')' if children.size > 1
39
+ elsif children.size == 1
40
+ compile_inline_children(returned_children, @level)
87
41
  else
88
- push process(body, @level)
89
- wrap '(', ')' unless stmt?
42
+ compile_children(returned_children, @level)
43
+ wrap '(function() {', '})()'
90
44
  end
91
45
  end
92
- end
93
-
94
- class BlockNode < Base
95
- handle :block
96
46
 
97
- def compile
98
- return push "nil" if children.empty?
99
-
100
- children.each_with_index do |child, idx|
101
- push stmt_join unless idx == 0
102
-
103
- if yasgn = find_inline_yield(child)
104
- push compiler.process(yasgn, @level)
105
- push ";"
47
+ def returned_children
48
+ @returned_children ||= begin
49
+ *rest, last_child = *children
50
+ if last_child
51
+ rest + [compiler.returns(last_child)]
52
+ else
53
+ [s(:nil)]
106
54
  end
107
-
108
- push compiler.process(child, @level)
109
- push ";" if child_is_expr?(child)
110
55
  end
111
56
  end
112
57
 
113
- def stmt_join
114
- scope.class_scope? ? "\n\n#{current_indent}" : "\n#{current_indent}"
115
- end
116
-
117
- def child_is_expr?(child)
118
- raw_expression?(child) and [:stmt, :stmt_closure].include?(@level)
58
+ def compile_children(children, level)
59
+ children.each do |child|
60
+ line process(child, level), ";"
61
+ end
119
62
  end
120
63
 
121
- def raw_expression?(child)
122
- ![:xstr, :dxstr].include?(child.type)
123
- end
64
+ COMPLEX_CHILDREN = [:while, :while_post, :until, :until_post, :until, :js_return]
124
65
 
125
- # When a block sexp gets generated, any inline yields (i.e. yield
126
- # statements that are not direct members of the block) need to be
127
- # generated as a top level member. This is because if a yield
128
- # is returned by a break statement, then the method must return.
129
- #
130
- # As inline expressions in javascript cannot return, the block
131
- # must be rewritten.
132
- #
133
- # For example, a yield inside an array:
134
- #
135
- # [1, 2, 3, yield(4)]
136
- #
137
- # Must be rewitten into:
138
- #
139
- # tmp = yield 4
140
- # [1, 2, 3, tmp]
141
- #
142
- # This rewriting happens on sexps directly.
143
- #
144
- # @param [Sexp] stmt sexps to (maybe) rewrite
145
- # @return [Sexp]
146
- def find_inline_yield(stmt)
147
- found = nil
148
- case stmt.first
149
- when :js_return
150
- if found = find_inline_yield(stmt[1])
151
- found = found[2]
152
- end
153
- when :array
154
- stmt[1..-1].each_with_index do |el, idx|
155
- if el.first == :yield
156
- found = el
157
- stmt[idx+1] = s(:js_tmp, '$yielded')
158
- end
159
- end
160
- when :call
161
- arglist = stmt[3]
162
- arglist[1..-1].each_with_index do |el, idx|
163
- if el.first == :yield
164
- found = el
165
- arglist[idx+1] = s(:js_tmp, '$yielded')
166
- end
167
- end
66
+ def simple_children?
67
+ children.none? do |child|
68
+ COMPLEX_CHILDREN.include?(child.type)
168
69
  end
70
+ end
169
71
 
170
- if found
171
- scope.add_temp '$yielded' unless scope.has_temp? '$yielded'
172
- s(:yasgn, '$yielded', found)
72
+ def compile_inline_children(children, level)
73
+ children.each_with_index do |child, idx|
74
+ push ', ' unless idx == 0
75
+ push process(child, level)
173
76
  end
174
77
  end
175
78
  end
79
+
80
+ class KwBeginNode < BeginNode
81
+ handle :kwbegin
82
+ end
176
83
  end
177
84
  end