opal-cj 0.7.0.beta1

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 (470) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +27 -0
  4. data/.rspec +3 -0
  5. data/.spectator +2 -0
  6. data/.spectator-mspec +3 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.md +406 -0
  9. data/CONTRIBUTING.md +41 -0
  10. data/Gemfile +27 -0
  11. data/Guardfile +77 -0
  12. data/LICENSE +19 -0
  13. data/README.md +178 -0
  14. data/Rakefile +116 -0
  15. data/benchmarks/operators.rb +11 -0
  16. data/bin/opal +22 -0
  17. data/bin/opal-build +77 -0
  18. data/bin/opal-mspec +10 -0
  19. data/bin/opal-repl +72 -0
  20. data/config.ru +14 -0
  21. data/examples/rack/Gemfile +3 -0
  22. data/examples/rack/app/application.rb +13 -0
  23. data/examples/rack/app/user.rb +21 -0
  24. data/examples/rack/config.ru +7 -0
  25. data/examples/rack/index.html.erb +10 -0
  26. data/examples/sinatra/Gemfile +4 -0
  27. data/examples/sinatra/app/application.rb +7 -0
  28. data/examples/sinatra/config.ru +28 -0
  29. data/lib/mspec/opal/main.rb.erb +9 -0
  30. data/lib/mspec/opal/rake_task.rb +278 -0
  31. data/lib/mspec/opal/runner.rb +206 -0
  32. data/lib/mspec/opal/sprockets.js +57 -0
  33. data/lib/opal.rb +11 -0
  34. data/lib/opal/builder.rb +135 -0
  35. data/lib/opal/builder_processors.rb +165 -0
  36. data/lib/opal/cli.rb +145 -0
  37. data/lib/opal/cli_options.rb +149 -0
  38. data/lib/opal/cli_runners.rb +10 -0
  39. data/lib/opal/cli_runners/nodejs.rb +56 -0
  40. data/lib/opal/cli_runners/phantom.js +35 -0
  41. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  42. data/lib/opal/cli_runners/server.rb +54 -0
  43. data/lib/opal/compiler.rb +307 -0
  44. data/lib/opal/erb.rb +64 -0
  45. data/lib/opal/fragment.rb +41 -0
  46. data/lib/opal/hike_path_finder.rb +18 -0
  47. data/lib/opal/nodes.rb +26 -0
  48. data/lib/opal/nodes/arglist.rb +56 -0
  49. data/lib/opal/nodes/array.rb +54 -0
  50. data/lib/opal/nodes/base.rb +151 -0
  51. data/lib/opal/nodes/call.rb +283 -0
  52. data/lib/opal/nodes/call_special.rb +178 -0
  53. data/lib/opal/nodes/case.rb +96 -0
  54. data/lib/opal/nodes/class.rb +42 -0
  55. data/lib/opal/nodes/constants.rb +78 -0
  56. data/lib/opal/nodes/def.rb +157 -0
  57. data/lib/opal/nodes/defined.rb +113 -0
  58. data/lib/opal/nodes/definitions.rb +168 -0
  59. data/lib/opal/nodes/for.rb +35 -0
  60. data/lib/opal/nodes/hash.rb +67 -0
  61. data/lib/opal/nodes/helpers.rb +114 -0
  62. data/lib/opal/nodes/if.rb +67 -0
  63. data/lib/opal/nodes/iter.rb +131 -0
  64. data/lib/opal/nodes/literal.rb +230 -0
  65. data/lib/opal/nodes/logic.rb +217 -0
  66. data/lib/opal/nodes/masgn.rb +62 -0
  67. data/lib/opal/nodes/module.rb +46 -0
  68. data/lib/opal/nodes/rescue.rb +135 -0
  69. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  70. data/lib/opal/nodes/scope.rb +293 -0
  71. data/lib/opal/nodes/singleton_class.rb +25 -0
  72. data/lib/opal/nodes/super.rb +97 -0
  73. data/lib/opal/nodes/top.rb +101 -0
  74. data/lib/opal/nodes/variables.rb +158 -0
  75. data/lib/opal/nodes/while.rb +65 -0
  76. data/lib/opal/nodes/yield.rb +95 -0
  77. data/lib/opal/parser.rb +658 -0
  78. data/lib/opal/parser/grammar.rb +5452 -0
  79. data/lib/opal/parser/grammar.y +1684 -0
  80. data/lib/opal/parser/keywords.rb +66 -0
  81. data/lib/opal/parser/lexer.rb +1208 -0
  82. data/lib/opal/parser/parser_scope.rb +25 -0
  83. data/lib/opal/parser/sexp.rb +75 -0
  84. data/lib/opal/path_reader.rb +28 -0
  85. data/lib/opal/paths.rb +38 -0
  86. data/lib/opal/source_map.rb +70 -0
  87. data/lib/opal/sprockets.rb +4 -0
  88. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  89. data/lib/opal/sprockets/environment.rb +37 -0
  90. data/lib/opal/sprockets/erb.rb +37 -0
  91. data/lib/opal/sprockets/path_reader.rb +34 -0
  92. data/lib/opal/sprockets/processor.rb +124 -0
  93. data/lib/opal/sprockets/server.rb +180 -0
  94. data/lib/opal/util.rb +64 -0
  95. data/lib/opal/version.rb +3 -0
  96. data/opal.gemspec +36 -0
  97. data/opal/README.md +6 -0
  98. data/opal/corelib/array.rb +1556 -0
  99. data/opal/corelib/array/inheritance.rb +113 -0
  100. data/opal/corelib/basic_object.rb +73 -0
  101. data/opal/corelib/boolean.rb +41 -0
  102. data/opal/corelib/class.rb +55 -0
  103. data/opal/corelib/comparable.rb +56 -0
  104. data/opal/corelib/complex.rb +3 -0
  105. data/opal/corelib/dir.rb +20 -0
  106. data/opal/corelib/enumerable.rb +1132 -0
  107. data/opal/corelib/enumerator.rb +422 -0
  108. data/opal/corelib/error.rb +63 -0
  109. data/opal/corelib/file.rb +56 -0
  110. data/opal/corelib/hash.rb +728 -0
  111. data/opal/corelib/helpers.rb +102 -0
  112. data/opal/corelib/io.rb +59 -0
  113. data/opal/corelib/kernel.rb +569 -0
  114. data/opal/corelib/main.rb +7 -0
  115. data/opal/corelib/match_data.rb +114 -0
  116. data/opal/corelib/method.rb +58 -0
  117. data/opal/corelib/module.rb +462 -0
  118. data/opal/corelib/nil_class.rb +62 -0
  119. data/opal/corelib/numeric.rb +532 -0
  120. data/opal/corelib/proc.rb +52 -0
  121. data/opal/corelib/range.rb +116 -0
  122. data/opal/corelib/rational.rb +3 -0
  123. data/opal/corelib/regexp.rb +133 -0
  124. data/opal/corelib/runtime.js +1240 -0
  125. data/opal/corelib/string.rb +1212 -0
  126. data/opal/corelib/string/inheritance.rb +78 -0
  127. data/opal/corelib/struct.rb +141 -0
  128. data/opal/corelib/time.rb +584 -0
  129. data/opal/corelib/variables.rb +24 -0
  130. data/opal/opal.rb +32 -0
  131. data/package.json +9 -0
  132. data/spec/filters/bugs/array.rb +232 -0
  133. data/spec/filters/bugs/basic_object.rb +14 -0
  134. data/spec/filters/bugs/class.rb +21 -0
  135. data/spec/filters/bugs/enumerable.rb +69 -0
  136. data/spec/filters/bugs/enumerator.rb +3 -0
  137. data/spec/filters/bugs/hash.rb +128 -0
  138. data/spec/filters/bugs/kernel.rb +10 -0
  139. data/spec/filters/bugs/language.rb +415 -0
  140. data/spec/filters/bugs/math.rb +95 -0
  141. data/spec/filters/bugs/module.rb +14 -0
  142. data/spec/filters/bugs/nil.rb +7 -0
  143. data/spec/filters/bugs/numeric.rb +20 -0
  144. data/spec/filters/bugs/opal.rb +14 -0
  145. data/spec/filters/bugs/regexp.rb +11 -0
  146. data/spec/filters/bugs/set.rb +7 -0
  147. data/spec/filters/bugs/singleton.rb +6 -0
  148. data/spec/filters/bugs/string.rb +360 -0
  149. data/spec/filters/bugs/stringscanner.rb +22 -0
  150. data/spec/filters/bugs/struct.rb +45 -0
  151. data/spec/filters/bugs/time.rb +177 -0
  152. data/spec/filters/bugs/unknown.rb +11 -0
  153. data/spec/filters/unsupported/encoding.rb +95 -0
  154. data/spec/filters/unsupported/enumerator.rb +14 -0
  155. data/spec/filters/unsupported/float.rb +5 -0
  156. data/spec/filters/unsupported/frozen.rb +90 -0
  157. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  158. data/spec/filters/unsupported/integer_size.rb +7 -0
  159. data/spec/filters/unsupported/method_added.rb +10 -0
  160. data/spec/filters/unsupported/mutable_strings.rb +361 -0
  161. data/spec/filters/unsupported/private_constants.rb +30 -0
  162. data/spec/filters/unsupported/private_methods.rb +44 -0
  163. data/spec/filters/unsupported/random.rb +4 -0
  164. data/spec/filters/unsupported/ruby_exe.rb +5 -0
  165. data/spec/filters/unsupported/tainted.rb +155 -0
  166. data/spec/filters/unsupported/time.rb +21 -0
  167. data/spec/filters/unsupported/trusted.rb +80 -0
  168. data/spec/lib/builder_processors_spec.rb +27 -0
  169. data/spec/lib/builder_spec.rb +66 -0
  170. data/spec/lib/cli_spec.rb +134 -0
  171. data/spec/lib/compiler_spec.rb +197 -0
  172. data/spec/lib/dependency_resolver_spec.rb +40 -0
  173. data/spec/lib/fixtures/no_requires.rb +1 -0
  174. data/spec/lib/fixtures/opal_file.rb +2 -0
  175. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  176. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  177. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  178. data/spec/lib/fixtures/requires.rb +7 -0
  179. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  180. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  181. data/spec/lib/hike_path_finder_spec.rb +23 -0
  182. data/spec/lib/lexer_spec.rb +110 -0
  183. data/spec/lib/parser/alias_spec.rb +26 -0
  184. data/spec/lib/parser/and_spec.rb +13 -0
  185. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  186. data/spec/lib/parser/begin_spec.rb +42 -0
  187. data/spec/lib/parser/block_spec.rb +12 -0
  188. data/spec/lib/parser/break_spec.rb +17 -0
  189. data/spec/lib/parser/call_spec.rb +139 -0
  190. data/spec/lib/parser/class_spec.rb +35 -0
  191. data/spec/lib/parser/comments_spec.rb +11 -0
  192. data/spec/lib/parser/def_spec.rb +61 -0
  193. data/spec/lib/parser/if_spec.rb +26 -0
  194. data/spec/lib/parser/iter_spec.rb +59 -0
  195. data/spec/lib/parser/lambda_spec.rb +64 -0
  196. data/spec/lib/parser/literal_spec.rb +118 -0
  197. data/spec/lib/parser/masgn_spec.rb +37 -0
  198. data/spec/lib/parser/module_spec.rb +27 -0
  199. data/spec/lib/parser/not_spec.rb +27 -0
  200. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  201. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  202. data/spec/lib/parser/or_spec.rb +13 -0
  203. data/spec/lib/parser/return_spec.rb +17 -0
  204. data/spec/lib/parser/sclass_spec.rb +21 -0
  205. data/spec/lib/parser/string_spec.rb +276 -0
  206. data/spec/lib/parser/super_spec.rb +20 -0
  207. data/spec/lib/parser/unary_spec.rb +48 -0
  208. data/spec/lib/parser/undef_spec.rb +15 -0
  209. data/spec/lib/parser/unless_spec.rb +13 -0
  210. data/spec/lib/parser/variables_spec.rb +92 -0
  211. data/spec/lib/parser/while_spec.rb +15 -0
  212. data/spec/lib/parser/yield_spec.rb +20 -0
  213. data/spec/lib/path_reader_spec.rb +24 -0
  214. data/spec/lib/shared/path_finder_shared.rb +19 -0
  215. data/spec/lib/shared/path_reader_shared.rb +31 -0
  216. data/spec/lib/spec_helper.rb +9 -0
  217. data/spec/lib/sprockets/environment_spec.rb +30 -0
  218. data/spec/lib/sprockets/erb_spec.rb +25 -0
  219. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  220. data/spec/lib/sprockets/processor_spec.rb +35 -0
  221. data/spec/lib/sprockets/server_spec.rb +20 -0
  222. data/spec/opal/compiler/irb_spec.rb +44 -0
  223. data/spec/opal/core/array/select_spec.rb +14 -0
  224. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  225. data/spec/opal/core/date_spec.rb +122 -0
  226. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  227. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  228. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  229. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  230. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  231. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  232. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  233. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  234. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  235. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  246. data/spec/opal/core/fixtures/class.rb +124 -0
  247. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  248. data/spec/opal/core/fixtures/constants.rb +33 -0
  249. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  250. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  251. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  252. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  253. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  254. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  255. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  256. data/spec/opal/core/kernel/class_spec.rb +6 -0
  257. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  258. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  259. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  260. data/spec/opal/core/kernel/format_spec.rb +122 -0
  261. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  262. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  263. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  264. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  265. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  266. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  267. data/spec/opal/core/kernel/match_spec.rb +5 -0
  268. data/spec/opal/core/kernel/method_spec.rb +31 -0
  269. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  270. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  271. data/spec/opal/core/kernel/p_spec.rb +15 -0
  272. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  273. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  274. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  275. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  276. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  277. data/spec/opal/core/kernel/send_spec.rb +56 -0
  278. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  279. data/spec/opal/core/language/block_spec.rb +538 -0
  280. data/spec/opal/core/language/fixtures/array.rb +11 -0
  281. data/spec/opal/core/language/fixtures/block.rb +57 -0
  282. data/spec/opal/core/language/fixtures/break.rb +240 -0
  283. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  284. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  285. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  286. data/spec/opal/core/language/fixtures/module.rb +24 -0
  287. data/spec/opal/core/language/fixtures/next.rb +128 -0
  288. data/spec/opal/core/language/fixtures/return.rb +118 -0
  289. data/spec/opal/core/language/fixtures/send.rb +110 -0
  290. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  291. data/spec/opal/core/language/fixtures/super.rb +308 -0
  292. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  293. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  294. data/spec/opal/core/language/predefined_spec.rb +85 -0
  295. data/spec/opal/core/language/proc_spec.rb +263 -0
  296. data/spec/opal/core/language/regexp_spec.rb +20 -0
  297. data/spec/opal/core/language/send_spec.rb +225 -0
  298. data/spec/opal/core/language/string_spec.rb +44 -0
  299. data/spec/opal/core/language/symbol_spec.rb +40 -0
  300. data/spec/opal/core/language/variables_spec.rb +1366 -0
  301. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  302. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  303. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  304. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  305. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  306. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  307. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  308. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  309. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  310. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  311. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  312. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  313. data/spec/opal/core/module/append_features_spec.rb +14 -0
  314. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  315. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  316. data/spec/opal/core/module/const_get_spec.rb +85 -0
  317. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  318. data/spec/opal/core/module/const_set_spec.rb +64 -0
  319. data/spec/opal/core/module/constants_spec.rb +49 -0
  320. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  321. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  322. data/spec/opal/core/module/module_function_spec.rb +25 -0
  323. data/spec/opal/core/module/name_spec.rb +52 -0
  324. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  325. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  326. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  327. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  328. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  329. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  330. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  331. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  332. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  333. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  334. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  335. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  336. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  337. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  338. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  339. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  340. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  341. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  342. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  343. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  344. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  345. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  346. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  347. data/spec/opal/core/numeric/next_spec.rb +9 -0
  348. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  349. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  350. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  351. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  352. data/spec/opal/core/numeric/step_spec.rb +11 -0
  353. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  354. data/spec/opal/core/numeric/times_spec.rb +36 -0
  355. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  356. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  357. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  358. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  359. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  360. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  361. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  362. data/spec/opal/core/proc/call_spec.rb +21 -0
  363. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  364. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  365. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  366. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  367. data/spec/opal/core/runtime/block_spec.rb +23 -0
  368. data/spec/opal/core/runtime/bridged_classes_spec.rb +64 -0
  369. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  370. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  371. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  372. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  373. data/spec/opal/core/runtime/method_spec.rb +31 -0
  374. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  375. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  376. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  377. data/spec/opal/core/runtime/return_spec.rb +38 -0
  378. data/spec/opal/core/runtime/send_spec.rb +34 -0
  379. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  380. data/spec/opal/core/runtime/super_spec.rb +212 -0
  381. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  382. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  383. data/spec/opal/core/source_map_spec.rb +15 -0
  384. data/spec/opal/core/string_spec.rb +11 -0
  385. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  386. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  387. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  388. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  389. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  390. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  391. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  392. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  393. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  394. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  395. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  396. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  397. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  398. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  399. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  400. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  401. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  402. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  403. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  404. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  405. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  406. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  407. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  408. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  409. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  410. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  411. data/spec/rubyspecs +329 -0
  412. data/spec/spec_helper.rb +42 -0
  413. data/spec/support/mspec_rspec_adapter.rb +33 -0
  414. data/spec/support/parser_helpers.rb +37 -0
  415. data/stdlib/README.md +3 -0
  416. data/stdlib/base64.rb +152 -0
  417. data/stdlib/benchmark.rb +10 -0
  418. data/stdlib/buffer.rb +40 -0
  419. data/stdlib/buffer/array.rb +66 -0
  420. data/stdlib/buffer/view.rb +70 -0
  421. data/stdlib/date.rb +170 -0
  422. data/stdlib/delegate.rb +29 -0
  423. data/stdlib/dir.rb +1 -0
  424. data/stdlib/encoding.rb +166 -0
  425. data/stdlib/enumerator.rb +1 -0
  426. data/stdlib/erb.rb +16 -0
  427. data/stdlib/file.rb +1 -0
  428. data/stdlib/forwardable.rb +71 -0
  429. data/stdlib/json.rb +182 -0
  430. data/stdlib/math.rb +370 -0
  431. data/stdlib/native.rb +530 -0
  432. data/stdlib/nodejs.rb +5 -0
  433. data/stdlib/nodejs/dir.rb +13 -0
  434. data/stdlib/nodejs/file.rb +98 -0
  435. data/stdlib/nodejs/fileutils.rb +26 -0
  436. data/stdlib/nodejs/io.rb +2 -0
  437. data/stdlib/nodejs/irb.rb +45 -0
  438. data/stdlib/nodejs/process.rb +16 -0
  439. data/stdlib/nodejs/require.rb +32 -0
  440. data/stdlib/nodejs/rubygems.rb +68 -0
  441. data/stdlib/nodejs/runtime.rb +25 -0
  442. data/stdlib/nodejs/yaml.rb +11 -0
  443. data/stdlib/observer.rb +202 -0
  444. data/stdlib/opal-parser.rb +53 -0
  445. data/stdlib/opal-source-maps.rb +2 -0
  446. data/stdlib/ostruct.rb +69 -0
  447. data/stdlib/pathname.rb +31 -0
  448. data/stdlib/phantomjs.rb +8 -0
  449. data/stdlib/pp.rb +12 -0
  450. data/stdlib/process.rb +10 -0
  451. data/stdlib/promise.rb +300 -0
  452. data/stdlib/racc/parser.rb +215 -0
  453. data/stdlib/rbconfig.rb +20 -0
  454. data/stdlib/securerandom.rb +12 -0
  455. data/stdlib/set.rb +116 -0
  456. data/stdlib/singleton.rb +40 -0
  457. data/stdlib/source_map.rb +5 -0
  458. data/stdlib/source_map/map.rb +220 -0
  459. data/stdlib/source_map/mapping.rb +26 -0
  460. data/stdlib/source_map/offset.rb +88 -0
  461. data/stdlib/source_map/version.rb +3 -0
  462. data/stdlib/source_map/vlq.rb +98 -0
  463. data/stdlib/sourcemap.rb +1 -0
  464. data/stdlib/stringio.rb +181 -0
  465. data/stdlib/strscan.rb +155 -0
  466. data/stdlib/template.rb +46 -0
  467. data/stdlib/thread.rb +160 -0
  468. data/stdlib/time.rb +9 -0
  469. data/tasks/github.rake +19 -0
  470. metadata +690 -0
@@ -0,0 +1,67 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class IfNode < Base
6
+ handle :if
7
+
8
+ children :test, :true_body, :false_body
9
+
10
+ RUBY_ENGINE_CHECK = [:call, [:const, :RUBY_ENGINE],
11
+ :==, [:arglist, [:str, "opal"]]]
12
+
13
+ RUBY_PLATFORM_CHECK = [:call, [:const, :RUBY_PLATFORM],
14
+ :==, [:arglist, [:str, "opal"]]]
15
+
16
+ def compile
17
+ truthy, falsy = self.truthy, self.falsy
18
+
19
+ if skip_check_present?
20
+ falsy = nil
21
+ end
22
+
23
+ push "if (", js_truthy(test), ") {"
24
+
25
+ # skip if-body if no truthy sexp
26
+ indent { line stmt(truthy) } if truthy
27
+
28
+ if falsy
29
+ if falsy.type == :if
30
+ line "} else ", stmt(falsy)
31
+ else
32
+ indent do
33
+ line "} else {"
34
+ line stmt(falsy)
35
+ end
36
+
37
+ line "}"
38
+ end
39
+ else
40
+ push "}"
41
+ end
42
+
43
+ wrap "(function() {", "; return nil; })()" if needs_wrapper?
44
+ end
45
+
46
+ # pre-processing only effects falsy blocks. If engine is
47
+ # opal, then falsy block gets generated as normal. Unless
48
+ # engine is opal then that code gets generated as the
49
+ # falsy block
50
+ def skip_check_present?
51
+ test == RUBY_ENGINE_CHECK or test == RUBY_PLATFORM_CHECK
52
+ end
53
+
54
+ def truthy
55
+ needs_wrapper? ? compiler.returns(true_body || s(:nil)) : true_body
56
+ end
57
+
58
+ def falsy
59
+ needs_wrapper? ? compiler.returns(false_body || s(:nil)) : false_body
60
+ end
61
+
62
+ def needs_wrapper?
63
+ expr? or recv?
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,131 @@
1
+ require 'opal/nodes/scope'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class IterNode < ScopeNode
6
+ handle :iter
7
+
8
+ children :args_sexp, :body_sexp
9
+
10
+ def compile
11
+ opt_args = extract_opt_args
12
+ block_arg = extract_block_arg
13
+
14
+ # find any splat args
15
+ if args.last.is_a?(Sexp) and args.last.type == :splat
16
+ splat = args.last[1][1]
17
+ args.pop
18
+ len = args.length
19
+ end
20
+
21
+ params = args_to_params(args[1..-1])
22
+ params << splat if splat
23
+
24
+ to_vars = identity = body_code = nil
25
+
26
+ in_scope do
27
+ identity = scope.identify!
28
+ add_temp "self = #{identity}.$$s || this"
29
+
30
+ compile_args(args[1..-1], opt_args, params)
31
+
32
+ if splat
33
+ scope.add_arg splat
34
+ push "#{splat} = $slice.call(arguments, #{len - 1});"
35
+ end
36
+
37
+ if block_arg
38
+ scope.block_name = block_arg
39
+ scope.add_temp block_arg
40
+ scope_name = scope.identify!
41
+
42
+ line "#{block_arg} = #{scope_name}.$$p || nil, #{scope_name}.$$p = null;"
43
+ end
44
+
45
+ body_code = stmt(body)
46
+ to_vars = scope.to_vars
47
+ end
48
+
49
+ line body_code
50
+
51
+ unshift to_vars
52
+
53
+ unshift "(#{identity} = function(#{params.join ', '}){"
54
+ push "}, #{identity}.$$s = self, #{identity})"
55
+ end
56
+
57
+ def compile_args(args, opt_args, params)
58
+ args.each_with_index do |arg, idx|
59
+ if arg.type == :lasgn
60
+ arg = variable(arg[1])
61
+
62
+ if opt_args and current_opt = opt_args.find { |s| s[1] == arg.to_sym }
63
+ push "if (#{arg} == null) #{arg} = ", expr(current_opt[2]), ";"
64
+ else
65
+ push "if (#{arg} == null) #{arg} = nil;"
66
+ end
67
+ elsif arg.type == :array
68
+ arg[1..-1].each_with_index do |_arg, _idx|
69
+ _arg = variable(_arg[1])
70
+ push "#{_arg} = #{params[idx]}[#{_idx}];"
71
+ end
72
+ else
73
+ raise "Bad block arg type"
74
+ end
75
+ end
76
+ end
77
+
78
+ # opt args are last (if present) and are a s(:block)
79
+ def extract_opt_args
80
+ if args.last.is_a?(Sexp) and args.last.type == :block
81
+ opt_args = args.pop
82
+ opt_args.shift
83
+ opt_args
84
+ end
85
+ end
86
+
87
+ # does this iter define a block_pass
88
+ def extract_block_arg
89
+ if args.last.is_a?(Sexp) and args.last.type == :block_pass
90
+ block_arg = args.pop
91
+ block_arg = block_arg[1][1].to_sym
92
+ end
93
+ end
94
+
95
+ def args
96
+ if Fixnum === args_sexp or args_sexp.nil?
97
+ s(:array)
98
+ elsif args_sexp.type == :lasgn
99
+ s(:array, args_sexp)
100
+ else
101
+ args_sexp[1]
102
+ end
103
+ end
104
+
105
+ def body
106
+ compiler.returns(body_sexp || s(:nil))
107
+ end
108
+
109
+ # Maps block args into array of jsid. Adds $ suffix to invalid js
110
+ # identifiers.
111
+ #
112
+ # s(:args, parts...) => ["a", "b", "break$"]
113
+ def args_to_params(sexp)
114
+ result = []
115
+ sexp.each do |arg|
116
+ if arg[0] == :lasgn
117
+ ref = variable(arg[1])
118
+ scope.add_arg ref
119
+ result << ref
120
+ elsif arg[0] == :array
121
+ result << scope.next_temp
122
+ else
123
+ raise "Bad js_block_arg: #{arg[0]}"
124
+ end
125
+ end
126
+
127
+ result
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,230 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class ValueNode < Base
6
+ handle :true, :false, :self, :nil
7
+
8
+ def compile
9
+ push type.to_s
10
+ end
11
+ end
12
+
13
+ class NumericNode < Base
14
+ handle :int, :float
15
+
16
+ children :value
17
+
18
+ def compile
19
+ push value.to_s
20
+ wrap '(', ')' if recv?
21
+ end
22
+ end
23
+
24
+ class StringNode < Base
25
+ handle :str
26
+
27
+ children :value
28
+
29
+ def compile
30
+ push value.inspect
31
+ end
32
+ end
33
+
34
+ class SymbolNode < Base
35
+ handle :sym
36
+
37
+ children :value
38
+
39
+ def compile
40
+ push value.to_s.inspect
41
+ end
42
+ end
43
+
44
+ class RegexpNode < Base
45
+ handle :regexp
46
+
47
+ children :value, :flags
48
+
49
+ def compile
50
+ case value
51
+ when ''
52
+ push('/^/')
53
+ when %r{\?\<\w+\>}
54
+ message = "named captures are not supported in javascript: #{value.inspect}"
55
+ raise SyntaxError, message
56
+ else
57
+ push "#{Regexp.new(value).inspect}#{flags}"
58
+ end
59
+ end
60
+ end
61
+
62
+ module XStringLineSplitter
63
+ def compile_split_lines(value, sexp)
64
+ idx = 0
65
+ value.each_line do |line|
66
+ if idx == 0
67
+ push line
68
+ else
69
+ line_sexp = s()
70
+ line_sexp.source = [sexp.line + idx, 0]
71
+ frag = Fragment.new(line, line_sexp)
72
+ push frag
73
+ end
74
+
75
+ idx += 1
76
+ end
77
+ end
78
+ end
79
+
80
+ class XStringNode < Base
81
+ include XStringLineSplitter
82
+
83
+ handle :xstr
84
+
85
+ children :value
86
+
87
+ def needs_semicolon?
88
+ stmt? and !value.to_s.include?(';')
89
+ end
90
+
91
+ def compile
92
+ compile_split_lines(value.to_s, @sexp)
93
+
94
+ push ';' if needs_semicolon?
95
+
96
+ wrap '(', ')' if recv?
97
+ end
98
+
99
+ def start_line
100
+ @sexp.line
101
+ end
102
+ end
103
+
104
+ class DynamicStringNode < Base
105
+ handle :dstr
106
+
107
+ def compile
108
+ children.each_with_index do |part, idx|
109
+ push " + " unless idx == 0
110
+
111
+ if String === part
112
+ push part.inspect
113
+ elsif part.type == :evstr
114
+ push "("
115
+ push expr(part[1])
116
+ push ")"
117
+ elsif part.type == :str
118
+ push part[1].inspect
119
+ elsif part.type == :dstr
120
+ push "("
121
+ push expr(part)
122
+ push ")"
123
+ else
124
+ raise "Bad dstr part #{part.inspect}"
125
+ end
126
+
127
+ wrap '(', ')' if recv?
128
+ end
129
+ end
130
+ end
131
+
132
+ class DynamicSymbolNode < Base
133
+ handle :dsym
134
+
135
+ def compile
136
+ children.each_with_index do |part, idx|
137
+ push " + " unless idx == 0
138
+
139
+ if String === part
140
+ push part.inspect
141
+ elsif part.type == :evstr
142
+ push expr(s(:call, part.last, :to_s, s(:arglist)))
143
+ elsif part.type == :str
144
+ push part.last.inspect
145
+ else
146
+ raise "Bad dsym part"
147
+ end
148
+ end
149
+
150
+ wrap '(', ')'
151
+ end
152
+ end
153
+
154
+ class DynamicXStringNode < Base
155
+ include XStringLineSplitter
156
+
157
+ handle :dxstr
158
+
159
+ def requires_semicolon(code)
160
+ stmt? and !code.include?(';')
161
+ end
162
+
163
+ def compile
164
+ needs_semicolon = false
165
+
166
+ children.each do |part|
167
+ if String === part
168
+ compile_split_lines(part.to_s, @sexp)
169
+
170
+ needs_semicolon = true if requires_semicolon(part.to_s)
171
+ elsif part.type == :evstr
172
+ push expr(part[1])
173
+ elsif part.type == :str
174
+ compile_split_lines(part.last.to_s, part)
175
+ needs_semicolon = true if requires_semicolon(part.last.to_s)
176
+ else
177
+ raise "Bad dxstr part"
178
+ end
179
+ end
180
+
181
+ push ';' if needs_semicolon
182
+ wrap '(', ')' if recv?
183
+ end
184
+ end
185
+
186
+ class DynamicRegexpNode < Base
187
+ handle :dregx
188
+
189
+ def compile
190
+ children.each_with_index do |part, idx|
191
+ push " + " unless idx == 0
192
+
193
+ if String === part
194
+ push part.inspect
195
+ elsif part.type == :str
196
+ push part[1].inspect
197
+ else
198
+ push expr(part[1])
199
+ end
200
+ end
201
+
202
+ wrap '(new RegExp(', '))'
203
+ end
204
+ end
205
+
206
+ class InclusiveRangeNode < Base
207
+ handle :irange
208
+
209
+ children :start, :finish
210
+
211
+ def compile
212
+ helper :range
213
+
214
+ push '$range(', expr(start), ', ', expr(finish), ', false)'
215
+ end
216
+ end
217
+
218
+ class ExclusiveRangeNode < Base
219
+ handle :erange
220
+
221
+ children :start, :finish
222
+
223
+ def compile
224
+ helper :range
225
+
226
+ push '$range(', expr(start), ', ', expr(finish), ', true)'
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,217 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class NextNode < Base
6
+ handle :next
7
+
8
+ children :value
9
+
10
+ def compile
11
+ return push "continue;" if in_while?
12
+
13
+ push expr_or_nil(value)
14
+ wrap "return ", ";"
15
+ end
16
+ end
17
+
18
+ class BreakNode < Base
19
+ handle :break
20
+
21
+ children :value
22
+
23
+ def compile
24
+ if in_while?
25
+ compile_while
26
+ elsif scope.iter?
27
+ compile_iter
28
+ else
29
+ error "void value expression: cannot use break outside of iter/while"
30
+ end
31
+ end
32
+
33
+ def compile_while
34
+ if while_loop[:closure]
35
+ push "return ", expr_or_nil(value)
36
+ else
37
+ push "break;"
38
+ end
39
+ end
40
+
41
+ def compile_iter
42
+ error "break must be used as a statement" unless stmt?
43
+ push expr_or_nil(value)
44
+ wrap "return ($breaker.$v = ", ", $breaker)"
45
+ end
46
+ end
47
+
48
+ class RedoNode < Base
49
+ handle :redo
50
+
51
+ def compile
52
+ if in_while?
53
+ compile_while
54
+ elsif scope.iter?
55
+ compile_iter
56
+ else
57
+ push "REDO()"
58
+ end
59
+ end
60
+
61
+ def compile_while
62
+ while_loop[:use_redo] = true
63
+ push "#{while_loop[:redo_var]} = true"
64
+ end
65
+
66
+ def compile_iter
67
+ push "return #{scope.identity}.apply(null, $slice.call(arguments))"
68
+ end
69
+ end
70
+
71
+ class NotNode < Base
72
+ handle :not
73
+
74
+ children :value
75
+
76
+ def compile
77
+ with_temp do |tmp|
78
+ push expr(value)
79
+ wrap "(#{tmp} = ", ", (#{tmp} === nil || #{tmp} === false))"
80
+ end
81
+ end
82
+ end
83
+
84
+ class SplatNode < Base
85
+ handle :splat
86
+
87
+ children :value
88
+
89
+ def empty_splat?
90
+ value == [:nil] or value == [:paren, [:nil]]
91
+ end
92
+
93
+ def compile
94
+ if empty_splat?
95
+ push '[]'
96
+ elsif value.type == :sym
97
+ push '[', expr(value), ']'
98
+ else
99
+ push recv(value)
100
+ end
101
+ end
102
+ end
103
+
104
+ class OrNode < Base
105
+ handle :or
106
+
107
+ children :lhs, :rhs
108
+
109
+ def compile
110
+ with_temp do |tmp|
111
+ push "(((#{tmp} = "
112
+ push expr(lhs)
113
+ push ") !== false && #{tmp} !== nil) ? #{tmp} : "
114
+ push expr(rhs)
115
+ push ")"
116
+ end
117
+ end
118
+ end
119
+
120
+ class AndNode < Base
121
+ handle :and
122
+
123
+ children :lhs, :rhs
124
+
125
+ def compile
126
+ truthy_opt = nil
127
+
128
+ with_temp do |tmp|
129
+ if truthy_opt = js_truthy_optimize(lhs)
130
+ push "((#{tmp} = ", truthy_opt
131
+ push ") ? "
132
+ push expr(rhs)
133
+ push " : #{tmp})"
134
+ else
135
+ push "(#{tmp} = "
136
+ push expr(lhs)
137
+ push ", #{tmp} !== false && #{tmp} !== nil ?"
138
+ push expr(rhs)
139
+ push " : #{tmp})"
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ class ReturnNode < Base
146
+ handle :return
147
+
148
+ children :value
149
+
150
+ def return_val
151
+ if value.nil?
152
+ expr(s(:nil))
153
+ elsif children.size > 1
154
+ expr(s(:array, *children))
155
+ else
156
+ expr(value)
157
+ end
158
+ end
159
+
160
+ def return_in_iter?
161
+ if scope.iter? and parent_def = scope.find_parent_def
162
+ parent_def
163
+ end
164
+ end
165
+
166
+ def return_expr_in_def?
167
+ return scope if expr? and scope.def?
168
+ end
169
+
170
+ def scope_to_catch_return
171
+ return_in_iter? or return_expr_in_def?
172
+ end
173
+
174
+ def compile
175
+ if def_scope = scope_to_catch_return
176
+ def_scope.catch_return = true
177
+ push '$opal.$return(', return_val, ')'
178
+ elsif stmt?
179
+ push 'return ', return_val
180
+ else
181
+ raise SyntaxError, "void value expression: cannot return as an expression"
182
+ end
183
+ end
184
+ end
185
+
186
+ class JSReturnNode < Base
187
+ handle :js_return
188
+
189
+ children :value
190
+
191
+ def compile
192
+ push "return "
193
+ push expr(value)
194
+ end
195
+ end
196
+
197
+ class JSTempNode < Base
198
+ handle :js_tmp
199
+
200
+ children :value
201
+
202
+ def compile
203
+ push value.to_s
204
+ end
205
+ end
206
+
207
+ class BlockPassNode < Base
208
+ handle :block_pass
209
+
210
+ children :value
211
+
212
+ def compile
213
+ push expr(s(:call, value, :to_proc, s(:arglist)))
214
+ end
215
+ end
216
+ end
217
+ end