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,113 @@
1
+ class Array
2
+ def self.inherited(klass)
3
+ replace = Class.new(Array::Wrapper)
4
+
5
+ %x{
6
+ klass.$$proto = replace.$$proto;
7
+ klass.$$proto.$$class = klass;
8
+ klass.$$alloc = replace.$$alloc;
9
+ klass.$$parent = #{Array::Wrapper};
10
+
11
+ klass.$allocate = replace.$allocate;
12
+ klass.$new = replace.$new;
13
+ klass["$[]"] = replace["$[]"];
14
+ }
15
+ end
16
+ end
17
+
18
+ class Array::Wrapper
19
+ def self.allocate(array = [])
20
+ obj = super()
21
+ `obj.literal = array`
22
+ obj
23
+ end
24
+
25
+ def self.new(*args, &block)
26
+ obj = allocate
27
+ obj.initialize(*args, &block)
28
+ obj
29
+ end
30
+
31
+ def self.[](*objects)
32
+ allocate(objects)
33
+ end
34
+
35
+ def initialize(*args, &block)
36
+ @literal = Array.new(*args, &block)
37
+ end
38
+
39
+ def method_missing(*args, &block)
40
+ result = @literal.__send__(*args, &block)
41
+
42
+ if `result === #@literal`
43
+ self
44
+ else
45
+ result
46
+ end
47
+ end
48
+
49
+ def initialize_copy(other)
50
+ @literal = `other.literal`.clone
51
+ end
52
+
53
+ def respond_to?(name, *)
54
+ super || @literal.respond_to?(name)
55
+ end
56
+
57
+ def ==(other)
58
+ @literal == other
59
+ end
60
+
61
+ def eql?(other)
62
+ @literal.eql?(other)
63
+ end
64
+
65
+ def to_a
66
+ @literal
67
+ end
68
+
69
+ def to_ary
70
+ self
71
+ end
72
+
73
+ def inspect
74
+ @literal.inspect
75
+ end
76
+
77
+ # wrapped results
78
+ def *(other)
79
+ %x{
80
+ var result = #{@literal * other};
81
+
82
+ if (result.$$is_array) {
83
+ return #{self.class.allocate(`result`)}
84
+ }
85
+ else {
86
+ return result;
87
+ }
88
+ }
89
+ end
90
+
91
+ def [](index, length = undefined)
92
+ %x{
93
+ var result = #{@literal.slice(index, length)};
94
+
95
+ if (result.$$is_array && (index.$$is_range || length !== undefined)) {
96
+ return #{self.class.allocate(`result`)}
97
+ }
98
+ else {
99
+ return result;
100
+ }
101
+ }
102
+ end
103
+
104
+ alias slice []
105
+
106
+ def uniq
107
+ self.class.allocate(@literal.uniq)
108
+ end
109
+
110
+ def flatten(level = undefined)
111
+ self.class.allocate(@literal.flatten(level))
112
+ end
113
+ end
@@ -0,0 +1,73 @@
1
+ class BasicObject
2
+ def initialize(*)
3
+ end
4
+
5
+ def ==(other)
6
+ `self === other`
7
+ end
8
+
9
+ def __id__
10
+ `self.$$id || (self.$$id = Opal.uid())`
11
+ end
12
+
13
+ def __send__(symbol, *args, &block)
14
+ %x{
15
+ var func = self['$' + symbol]
16
+
17
+ if (func) {
18
+ if (block !== nil) {
19
+ func.$$p = block;
20
+ }
21
+
22
+ return func.apply(self, args);
23
+ }
24
+
25
+ if (block !== nil) {
26
+ self.$method_missing.$$p = block;
27
+ }
28
+
29
+ return self.$method_missing.apply(self, [symbol].concat(args));
30
+ }
31
+ end
32
+
33
+ def !
34
+ false
35
+ end
36
+
37
+ alias eql? ==
38
+ alias equal? ==
39
+
40
+ def instance_eval(&block)
41
+ Kernel.raise ArgumentError, "no block given" unless block
42
+
43
+ %x{
44
+ var old = block.$$s,
45
+ result;
46
+
47
+ block.$$s = null;
48
+ result = block.call(self, self);
49
+ block.$$s = old;
50
+
51
+ return result;
52
+ }
53
+ end
54
+
55
+ def instance_exec(*args, &block)
56
+ Kernel.raise ArgumentError, "no block given" unless block
57
+
58
+ %x{
59
+ var block_self = block.$$s,
60
+ result;
61
+
62
+ block.$$s = null;
63
+ result = block.apply(self, args);
64
+ block.$$s = block_self;
65
+
66
+ return result;
67
+ }
68
+ end
69
+
70
+ def method_missing(symbol, *args, &block)
71
+ Kernel.raise NoMethodError, "undefined method `#{symbol}' for BasicObject instance"
72
+ end
73
+ end
@@ -0,0 +1,41 @@
1
+ class Boolean
2
+ `def.$$is_boolean = true`
3
+
4
+ class << self
5
+ undef_method :new
6
+ end
7
+
8
+ def !
9
+ `self != true`
10
+ end
11
+
12
+ def &(other)
13
+ `(self == true) ? (other !== false && other !== nil) : false`
14
+ end
15
+
16
+ def |(other)
17
+ `(self == true) ? true : (other !== false && other !== nil)`
18
+ end
19
+
20
+ def ^(other)
21
+ `(self == true) ? (other === false || other === nil) : (other !== false && other !== nil)`
22
+ end
23
+
24
+ def ==(other)
25
+ `(self == true) === other.valueOf()`
26
+ end
27
+
28
+ alias equal? ==
29
+
30
+ alias singleton_class class
31
+
32
+ def to_s
33
+ `(self == true) ? 'true' : 'false'`
34
+ end
35
+ end
36
+
37
+ TrueClass = Boolean
38
+ FalseClass = Boolean
39
+
40
+ TRUE = true
41
+ FALSE = false
@@ -0,0 +1,55 @@
1
+ require 'corelib/module'
2
+
3
+ class Class
4
+ def self.new(sup = Object, &block)
5
+ %x{
6
+ if (!sup.$$is_class || sup.$$is_mod) {
7
+ #{raise TypeError, "superclass must be a Class"};
8
+ }
9
+
10
+ function AnonClass(){};
11
+ var klass = Opal.boot(sup, AnonClass)
12
+ klass.$$name = nil;
13
+ klass.$$parent = sup;
14
+
15
+ // inherit scope from parent
16
+ $opal.create_scope(sup.$$scope, klass);
17
+
18
+ sup.$inherited(klass);
19
+
20
+ if (block !== nil) {
21
+ var block_self = block.$$s;
22
+ block.$$s = null;
23
+ block.call(klass);
24
+ block.$$s = block_self;
25
+ }
26
+
27
+ return klass;
28
+ }
29
+ end
30
+
31
+ def allocate
32
+ %x{
33
+ var obj = new self.$$alloc;
34
+ obj.$$id = Opal.uid();
35
+ return obj;
36
+ }
37
+ end
38
+
39
+ def inherited(cls)
40
+ end
41
+
42
+ def new(*args, &block)
43
+ %x{
44
+ var obj = #{allocate};
45
+
46
+ obj.$initialize.$$p = block;
47
+ obj.$initialize.apply(obj, args);
48
+ return obj;
49
+ }
50
+ end
51
+
52
+ def superclass
53
+ `self.$$super || nil`
54
+ end
55
+ end
@@ -0,0 +1,56 @@
1
+ module Comparable
2
+ def self.normalize(what)
3
+ return what if Integer === what
4
+
5
+ return 1 if what > 0
6
+ return -1 if what < 0
7
+ return 0
8
+ end
9
+
10
+ def ==(other)
11
+ return true if equal?(other)
12
+
13
+ return false unless cmp = (self <=> other)
14
+ return Comparable.normalize(cmp) == 0
15
+ rescue StandardError
16
+ false
17
+ end
18
+
19
+ def >(other)
20
+ unless cmp = (self <=> other)
21
+ raise ArgumentError, "comparison of #{self.class} with #{other.class} failed"
22
+ end
23
+
24
+ Comparable.normalize(cmp) > 0
25
+ end
26
+
27
+ def >=(other)
28
+ unless cmp = (self <=> other)
29
+ raise ArgumentError, "comparison of #{self.class} with #{other.class} failed"
30
+ end
31
+
32
+ Comparable.normalize(cmp) >= 0
33
+ end
34
+
35
+ def <(other)
36
+ unless cmp = (self <=> other)
37
+ raise ArgumentError, "comparison of #{self.class} with #{other.class} failed"
38
+ end
39
+
40
+ Comparable.normalize(cmp) < 0
41
+ end
42
+
43
+ def <=(other)
44
+ unless cmp = (self <=> other)
45
+ raise ArgumentError, "comparison of #{self.class} with #{other.class} failed"
46
+ end
47
+
48
+ Comparable.normalize(cmp) <= 0
49
+ end
50
+
51
+ def between?(min, max)
52
+ return false if self < min
53
+ return false if self > max
54
+ return true
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ class Complex < Numeric
2
+
3
+ end
@@ -0,0 +1,20 @@
1
+ class Dir
2
+ class << self
3
+ def chdir(dir)
4
+ prev_cwd = `$opal.current_dir`
5
+ `$opal.current_dir = #{dir}`
6
+ yield
7
+ ensure
8
+ `$opal.current_dir = #{prev_cwd}`
9
+ end
10
+
11
+ def pwd
12
+ `$opal.current_dir` || '.'
13
+ end
14
+ alias getwd pwd
15
+
16
+ def home
17
+ ENV['HOME'] || '.'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,1132 @@
1
+ module Enumerable
2
+ def all?(&block)
3
+ %x{
4
+ var result = true;
5
+
6
+ if (block !== nil) {
7
+ self.$each.$$p = function() {
8
+ var value = $opal.$yieldX(block, arguments);
9
+
10
+ if (value === $breaker) {
11
+ result = $breaker.$v;
12
+ return $breaker;
13
+ }
14
+
15
+ if (#{Opal.falsy?(`value`)}) {
16
+ result = false;
17
+ return $breaker;
18
+ }
19
+ }
20
+ }
21
+ else {
22
+ self.$each.$$p = function(obj) {
23
+ if (arguments.length == 1 && #{Opal.falsy?(`obj`)}) {
24
+ result = false;
25
+ return $breaker;
26
+ }
27
+ }
28
+ }
29
+
30
+ self.$each();
31
+
32
+ return result;
33
+ }
34
+ end
35
+
36
+ def any?(&block)
37
+ %x{
38
+ var result = false;
39
+
40
+ if (block !== nil) {
41
+ self.$each.$$p = function() {
42
+ var value = $opal.$yieldX(block, arguments);
43
+
44
+ if (value === $breaker) {
45
+ result = $breaker.$v;
46
+ return $breaker;
47
+ }
48
+
49
+ if (#{Opal.truthy?(`value`)}) {
50
+ result = true;
51
+ return $breaker;
52
+ }
53
+ };
54
+ }
55
+ else {
56
+ self.$each.$$p = function(obj) {
57
+ if (arguments.length != 1 || #{Opal.truthy?(`obj`)}) {
58
+ result = true;
59
+ return $breaker;
60
+ }
61
+ }
62
+ }
63
+
64
+ self.$each();
65
+
66
+ return result;
67
+ }
68
+ end
69
+
70
+ def chunk(state = undefined, &block)
71
+ raise NotImplementedError
72
+ end
73
+
74
+ def collect(&block)
75
+ return enum_for :collect unless block_given?
76
+
77
+ %x{
78
+ var result = [];
79
+
80
+ self.$each.$$p = function() {
81
+ var value = $opal.$yieldX(block, arguments);
82
+
83
+ if (value === $breaker) {
84
+ result = $breaker.$v;
85
+ return $breaker;
86
+ }
87
+
88
+ result.push(value);
89
+ };
90
+
91
+ self.$each();
92
+
93
+ return result;
94
+ }
95
+ end
96
+
97
+ def collect_concat(&block)
98
+ return enum_for :collect_concat unless block_given?
99
+ map { |item| yield item }.flatten(1)
100
+ end
101
+
102
+ def count(object = undefined, &block)
103
+ %x{
104
+ var result = 0;
105
+
106
+ if (object != null) {
107
+ block = function() {
108
+ return #{Opal.destructure(`arguments`) == `object`};
109
+ };
110
+ }
111
+ else if (block === nil) {
112
+ block = function() { return true; };
113
+ }
114
+
115
+ self.$each.$$p = function() {
116
+ var value = $opal.$yieldX(block, arguments);
117
+
118
+ if (value === $breaker) {
119
+ result = $breaker.$v;
120
+ return $breaker;
121
+ }
122
+
123
+ if (#{Opal.truthy?(`value`)}) {
124
+ result++;
125
+ }
126
+ }
127
+
128
+ self.$each();
129
+
130
+ return result;
131
+ }
132
+ end
133
+
134
+ def cycle(n = nil, &block)
135
+ return enum_for :cycle, n unless block
136
+
137
+ unless n.nil?
138
+ n = Opal.coerce_to! n, Integer, :to_int
139
+
140
+ return if `n <= 0`
141
+ end
142
+
143
+ %x{
144
+ var result,
145
+ all = [];
146
+
147
+ self.$each.$$p = function() {
148
+ var param = #{Opal.destructure(`arguments`)},
149
+ value = $opal.$yield1(block, param);
150
+
151
+ if (value === $breaker) {
152
+ result = $breaker.$v;
153
+ return $breaker;
154
+ }
155
+
156
+ all.push(param);
157
+ }
158
+
159
+ self.$each();
160
+
161
+ if (result !== undefined) {
162
+ return result;
163
+ }
164
+
165
+ if (all.length === 0) {
166
+ return nil;
167
+ }
168
+ }
169
+
170
+ if n.nil?
171
+ %x{
172
+ while (true) {
173
+ for (var i = 0, length = all.length; i < length; i++) {
174
+ var value = $opal.$yield1(block, all[i]);
175
+
176
+ if (value === $breaker) {
177
+ return $breaker.$v;
178
+ }
179
+ }
180
+ }
181
+ }
182
+ else
183
+ %x{
184
+ while (n > 1) {
185
+ for (var i = 0, length = all.length; i < length; i++) {
186
+ var value = $opal.$yield1(block, all[i]);
187
+
188
+ if (value === $breaker) {
189
+ return $breaker.$v;
190
+ }
191
+ }
192
+
193
+ n--;
194
+ }
195
+ }
196
+ end
197
+ end
198
+
199
+ def detect(ifnone = undefined, &block)
200
+ return enum_for :detect, ifnone unless block_given?
201
+
202
+ %x{
203
+ var result = undefined;
204
+
205
+ self.$each.$$p = function() {
206
+ var params = #{Opal.destructure(`arguments`)},
207
+ value = $opal.$yield1(block, params);
208
+
209
+ if (value === $breaker) {
210
+ result = $breaker.$v;
211
+ return $breaker;
212
+ }
213
+
214
+ if (#{Opal.truthy?(`value`)}) {
215
+ result = params;
216
+ return $breaker;
217
+ }
218
+ };
219
+
220
+ self.$each();
221
+
222
+ if (result === undefined && ifnone !== undefined) {
223
+ if (typeof(ifnone) === 'function') {
224
+ result = ifnone();
225
+ }
226
+ else {
227
+ result = ifnone;
228
+ }
229
+ }
230
+
231
+ return result === undefined ? nil : result;
232
+ }
233
+ end
234
+
235
+ def drop(number)
236
+ number = Opal.coerce_to number, Integer, :to_int
237
+
238
+ if `number < 0`
239
+ raise ArgumentError, "attempt to drop negative size"
240
+ end
241
+
242
+ %x{
243
+ var result = [],
244
+ current = 0;
245
+
246
+ self.$each.$$p = function() {
247
+ if (number <= current) {
248
+ result.push(#{Opal.destructure(`arguments`)});
249
+ }
250
+
251
+ current++;
252
+ };
253
+
254
+ self.$each()
255
+
256
+ return result;
257
+ }
258
+ end
259
+
260
+ def drop_while(&block)
261
+ return enum_for :drop_while unless block_given?
262
+
263
+ %x{
264
+ var result = [],
265
+ dropping = true;
266
+
267
+ self.$each.$$p = function() {
268
+ var param = #{Opal.destructure(`arguments`)};
269
+
270
+ if (dropping) {
271
+ var value = $opal.$yield1(block, param);
272
+
273
+ if (value === $breaker) {
274
+ result = $breaker.$v;
275
+ return $breaker;
276
+ }
277
+
278
+ if (#{Opal.falsy?(`value`)}) {
279
+ dropping = false;
280
+ result.push(param);
281
+ }
282
+ }
283
+ else {
284
+ result.push(param);
285
+ }
286
+ };
287
+
288
+ self.$each();
289
+
290
+ return result;
291
+ }
292
+ end
293
+
294
+ def each_cons(n, &block)
295
+ raise NotImplementedError
296
+ end
297
+
298
+ def each_entry(&block)
299
+ raise NotImplementedError
300
+ end
301
+
302
+ def each_slice(n, &block)
303
+ n = Opal.coerce_to n, Integer, :to_int
304
+
305
+ if `n <= 0`
306
+ raise ArgumentError, 'invalid slice size'
307
+ end
308
+
309
+ return enum_for :each_slice, n unless block_given?
310
+
311
+ %x{
312
+ var result,
313
+ slice = []
314
+
315
+ self.$each.$$p = function() {
316
+ var param = #{Opal.destructure(`arguments`)};
317
+
318
+ slice.push(param);
319
+
320
+ if (slice.length === n) {
321
+ if ($opal.$yield1(block, slice) === $breaker) {
322
+ result = $breaker.$v;
323
+ return $breaker;
324
+ }
325
+
326
+ slice = [];
327
+ }
328
+ };
329
+
330
+ self.$each();
331
+
332
+ if (result !== undefined) {
333
+ return result;
334
+ }
335
+
336
+ // our "last" group, if smaller than n then won't have been yielded
337
+ if (slice.length > 0) {
338
+ if ($opal.$yield1(block, slice) === $breaker) {
339
+ return $breaker.$v;
340
+ }
341
+ }
342
+ }
343
+
344
+ nil
345
+ end
346
+
347
+ def each_with_index(*args, &block)
348
+ return enum_for :each_with_index, *args unless block_given?
349
+
350
+ %x{
351
+ var result,
352
+ index = 0;
353
+
354
+ self.$each.$$p = function() {
355
+ var param = #{Opal.destructure(`arguments`)},
356
+ value = block(param, index);
357
+
358
+ if (value === $breaker) {
359
+ result = $breaker.$v;
360
+ return $breaker;
361
+ }
362
+
363
+ index++;
364
+ };
365
+
366
+ self.$each.apply(self, args);
367
+
368
+ if (result !== undefined) {
369
+ return result;
370
+ }
371
+ }
372
+
373
+ self
374
+ end
375
+
376
+ def each_with_object(object, &block)
377
+ return enum_for :each_with_object, object unless block_given?
378
+
379
+ %x{
380
+ var result;
381
+
382
+ self.$each.$$p = function() {
383
+ var param = #{Opal.destructure(`arguments`)},
384
+ value = block(param, object);
385
+
386
+ if (value === $breaker) {
387
+ result = $breaker.$v;
388
+ return $breaker;
389
+ }
390
+ };
391
+
392
+ self.$each();
393
+
394
+ if (result !== undefined) {
395
+ return result;
396
+ }
397
+ }
398
+
399
+ object
400
+ end
401
+
402
+ def entries(*args)
403
+ %x{
404
+ var result = [];
405
+
406
+ self.$each.$$p = function() {
407
+ result.push(#{Opal.destructure(`arguments`)});
408
+ };
409
+
410
+ self.$each.apply(self, args);
411
+
412
+ return result;
413
+ }
414
+ end
415
+
416
+ alias find detect
417
+
418
+ def find_all(&block)
419
+ return enum_for :find_all unless block_given?
420
+
421
+ %x{
422
+ var result = [];
423
+
424
+ self.$each.$$p = function() {
425
+ var param = #{Opal.destructure(`arguments`)},
426
+ value = $opal.$yield1(block, param);
427
+
428
+ if (value === $breaker) {
429
+ result = $breaker.$v;
430
+ return $breaker;
431
+ }
432
+
433
+ if (#{Opal.truthy?(`value`)}) {
434
+ result.push(param);
435
+ }
436
+ };
437
+
438
+ self.$each();
439
+
440
+ return result;
441
+ }
442
+ end
443
+
444
+ def find_index(object = undefined, &block)
445
+ return enum_for :find_index if `object === undefined && block === nil`
446
+
447
+ %x{
448
+ var result = nil,
449
+ index = 0;
450
+
451
+ if (object != null) {
452
+ self.$each.$$p = function() {
453
+ var param = #{Opal.destructure(`arguments`)};
454
+
455
+ if (#{`param` == `object`}) {
456
+ result = index;
457
+ return $breaker;
458
+ }
459
+
460
+ index += 1;
461
+ };
462
+ }
463
+ else if (block !== nil) {
464
+ self.$each.$$p = function() {
465
+ var value = $opal.$yieldX(block, arguments);
466
+
467
+ if (value === $breaker) {
468
+ result = $breaker.$v;
469
+ return $breaker;
470
+ }
471
+
472
+ if (#{Opal.truthy?(`value`)}) {
473
+ result = index;
474
+ return $breaker;
475
+ }
476
+
477
+ index += 1;
478
+ };
479
+ }
480
+
481
+ self.$each();
482
+
483
+ return result;
484
+ }
485
+ end
486
+
487
+ def first(number = undefined)
488
+ if `number === undefined`
489
+ result = nil
490
+
491
+ %x{
492
+ self.$each.$$p = function() {
493
+ result = #{Opal.destructure(`arguments`)};
494
+
495
+ return $breaker;
496
+ };
497
+
498
+ self.$each();
499
+ }
500
+ else
501
+ result = []
502
+ number = Opal.coerce_to number, Integer, :to_int
503
+
504
+ if `number < 0`
505
+ raise ArgumentError, 'attempt to take negative size'
506
+ end
507
+
508
+ if `number == 0`
509
+ return []
510
+ end
511
+
512
+ %x{
513
+ var current = 0,
514
+ number = #{Opal.coerce_to number, Integer, :to_int};
515
+
516
+ self.$each.$$p = function() {
517
+ result.push(#{Opal.destructure(`arguments`)});
518
+
519
+ if (number <= ++current) {
520
+ return $breaker;
521
+ }
522
+ };
523
+
524
+ self.$each();
525
+ }
526
+ end
527
+
528
+ result
529
+ end
530
+
531
+ alias flat_map collect_concat
532
+
533
+ def grep(pattern, &block)
534
+ %x{
535
+ var result = [];
536
+
537
+ if (block !== nil) {
538
+ self.$each.$$p = function() {
539
+ var param = #{Opal.destructure(`arguments`)},
540
+ value = #{pattern === `param`};
541
+
542
+ if (#{Opal.truthy?(`value`)}) {
543
+ value = $opal.$yield1(block, param);
544
+
545
+ if (value === $breaker) {
546
+ result = $breaker.$v;
547
+ return $breaker;
548
+ }
549
+
550
+ result.push(value);
551
+ }
552
+ };
553
+ }
554
+ else {
555
+ self.$each.$$p = function() {
556
+ var param = #{Opal.destructure(`arguments`)},
557
+ value = #{pattern === `param`};
558
+
559
+ if (#{Opal.truthy?(`value`)}) {
560
+ result.push(param);
561
+ }
562
+ };
563
+ }
564
+
565
+ self.$each();
566
+
567
+ return result;
568
+ }
569
+ end
570
+
571
+ def group_by(&block)
572
+ return enum_for :group_by unless block_given?
573
+
574
+ hash = Hash.new
575
+
576
+ %x{
577
+ var result;
578
+
579
+ self.$each.$$p = function() {
580
+ var param = #{Opal.destructure(`arguments`)},
581
+ value = $opal.$yield1(block, param);
582
+
583
+ if (value === $breaker) {
584
+ result = $breaker.$v;
585
+ return $breaker;
586
+ }
587
+
588
+ #{(hash[`value`] ||= []) << `param`};
589
+ }
590
+
591
+ self.$each();
592
+
593
+ if (result !== undefined) {
594
+ return result;
595
+ }
596
+ }
597
+
598
+ hash
599
+ end
600
+
601
+ def include?(obj)
602
+ %x{
603
+ var result = false;
604
+
605
+ self.$each.$$p = function() {
606
+ var param = #{Opal.destructure(`arguments`)};
607
+
608
+ if (#{`param` == obj}) {
609
+ result = true;
610
+ return $breaker;
611
+ }
612
+ }
613
+
614
+ self.$each();
615
+
616
+ return result;
617
+ }
618
+ end
619
+
620
+ def inject(object = undefined, sym = undefined, &block)
621
+ %x{
622
+ var result = object;
623
+
624
+ if (block !== nil && sym === undefined) {
625
+ self.$each.$$p = function() {
626
+ var value = #{Opal.destructure(`arguments`)};
627
+
628
+ if (result === undefined) {
629
+ result = value;
630
+ return;
631
+ }
632
+
633
+ value = $opal.$yieldX(block, [result, value]);
634
+
635
+ if (value === $breaker) {
636
+ result = $breaker.$v;
637
+ return $breaker;
638
+ }
639
+
640
+ result = value;
641
+ };
642
+ }
643
+ else {
644
+ if (sym === undefined) {
645
+ if (!#{Symbol === object}) {
646
+ #{raise TypeError, "#{object.inspect} is not a Symbol"};
647
+ }
648
+
649
+ sym = object;
650
+ result = undefined;
651
+ }
652
+
653
+ self.$each.$$p = function() {
654
+ var value = #{Opal.destructure(`arguments`)};
655
+
656
+ if (result === undefined) {
657
+ result = value;
658
+ return;
659
+ }
660
+
661
+ result = #{`result`.__send__ sym, `value`};
662
+ };
663
+ }
664
+
665
+ self.$each();
666
+
667
+ return result == undefined ? nil : result;
668
+ }
669
+ end
670
+
671
+ def lazy
672
+ Enumerator::Lazy.new(self, enumerator_size) {|enum, *args|
673
+ enum.yield(*args)
674
+ }
675
+ end
676
+
677
+ def enumerator_size
678
+ respond_to?(:size) ? size : nil
679
+ end
680
+ private :enumerator_size
681
+
682
+ alias map collect
683
+
684
+ def max(&block)
685
+ %x{
686
+ var result;
687
+
688
+ if (block !== nil) {
689
+ self.$each.$$p = function() {
690
+ var param = #{Opal.destructure(`arguments`)};
691
+
692
+ if (result === undefined) {
693
+ result = param;
694
+ return;
695
+ }
696
+
697
+ var value = block(param, result);
698
+
699
+ if (value === $breaker) {
700
+ result = $breaker.$v;
701
+ return $breaker;
702
+ }
703
+
704
+ if (value === nil) {
705
+ #{raise ArgumentError, "comparison failed"};
706
+ }
707
+
708
+ if (value > 0) {
709
+ result = param;
710
+ }
711
+ };
712
+ }
713
+ else {
714
+ self.$each.$$p = function() {
715
+ var param = #{Opal.destructure(`arguments`)};
716
+
717
+ if (result === undefined) {
718
+ result = param;
719
+ return;
720
+ }
721
+
722
+ if (#{Opal.compare(`param`, `result`)} > 0) {
723
+ result = param;
724
+ }
725
+ };
726
+ }
727
+
728
+ self.$each();
729
+
730
+ return result === undefined ? nil : result;
731
+ }
732
+ end
733
+
734
+ def max_by(&block)
735
+ return enum_for :max_by unless block
736
+
737
+ %x{
738
+ var result,
739
+ by;
740
+
741
+ self.$each.$$p = function() {
742
+ var param = #{Opal.destructure(`arguments`)},
743
+ value = $opal.$yield1(block, param);
744
+
745
+ if (result === undefined) {
746
+ result = param;
747
+ by = value;
748
+ return;
749
+ }
750
+
751
+ if (value === $breaker) {
752
+ result = $breaker.$v;
753
+ return $breaker;
754
+ }
755
+
756
+ if (#{`value` <=> `by`} > 0) {
757
+ result = param
758
+ by = value;
759
+ }
760
+ };
761
+
762
+ self.$each();
763
+
764
+ return result === undefined ? nil : result;
765
+ }
766
+ end
767
+
768
+ alias member? include?
769
+
770
+ def min(&block)
771
+ %x{
772
+ var result;
773
+
774
+ if (block !== nil) {
775
+ self.$each.$$p = function() {
776
+ var param = #{Opal.destructure(`arguments`)};
777
+
778
+ if (result === undefined) {
779
+ result = param;
780
+ return;
781
+ }
782
+
783
+ var value = block(param, result);
784
+
785
+ if (value === $breaker) {
786
+ result = $breaker.$v;
787
+ return $breaker;
788
+ }
789
+
790
+ if (value === nil) {
791
+ #{raise ArgumentError, "comparison failed"};
792
+ }
793
+
794
+ if (value < 0) {
795
+ result = param;
796
+ }
797
+ };
798
+ }
799
+ else {
800
+ self.$each.$$p = function() {
801
+ var param = #{Opal.destructure(`arguments`)};
802
+
803
+ if (result === undefined) {
804
+ result = param;
805
+ return;
806
+ }
807
+
808
+ if (#{Opal.compare(`param`, `result`)} < 0) {
809
+ result = param;
810
+ }
811
+ };
812
+ }
813
+
814
+ self.$each();
815
+
816
+ return result === undefined ? nil : result;
817
+ }
818
+ end
819
+
820
+ def min_by(&block)
821
+ return enum_for :min_by unless block
822
+
823
+ %x{
824
+ var result,
825
+ by;
826
+
827
+ self.$each.$$p = function() {
828
+ var param = #{Opal.destructure(`arguments`)},
829
+ value = $opal.$yield1(block, param);
830
+
831
+ if (result === undefined) {
832
+ result = param;
833
+ by = value;
834
+ return;
835
+ }
836
+
837
+ if (value === $breaker) {
838
+ result = $breaker.$v;
839
+ return $breaker;
840
+ }
841
+
842
+ if (#{`value` <=> `by`} < 0) {
843
+ result = param
844
+ by = value;
845
+ }
846
+ };
847
+
848
+ self.$each();
849
+
850
+ return result === undefined ? nil : result;
851
+ }
852
+ end
853
+
854
+ def minmax(&block)
855
+ raise NotImplementedError
856
+ end
857
+
858
+ def minmax_by(&block)
859
+ raise NotImplementedError
860
+ end
861
+
862
+ def none?(&block)
863
+ %x{
864
+ var result = true;
865
+
866
+ if (block !== nil) {
867
+ self.$each.$$p = function() {
868
+ var value = $opal.$yieldX(block, arguments);
869
+
870
+ if (value === $breaker) {
871
+ result = $breaker.$v;
872
+ return $breaker;
873
+ }
874
+
875
+ if (#{Opal.truthy?(`value`)}) {
876
+ result = false;
877
+ return $breaker;
878
+ }
879
+ }
880
+ }
881
+ else {
882
+ self.$each.$$p = function() {
883
+ var value = #{Opal.destructure(`arguments`)};
884
+
885
+ if (#{Opal.truthy?(`value`)}) {
886
+ result = false;
887
+ return $breaker;
888
+ }
889
+ };
890
+ }
891
+
892
+ self.$each();
893
+
894
+ return result;
895
+ }
896
+ end
897
+
898
+ def one?(&block)
899
+ %x{
900
+ var result = false;
901
+
902
+ if (block !== nil) {
903
+ self.$each.$$p = function() {
904
+ var value = $opal.$yieldX(block, arguments);
905
+
906
+ if (value === $breaker) {
907
+ result = $breaker.$v;
908
+ return $breaker;
909
+ }
910
+
911
+ if (#{Opal.truthy?(`value`)}) {
912
+ if (result === true) {
913
+ result = false;
914
+ return $breaker;
915
+ }
916
+
917
+ result = true;
918
+ }
919
+ }
920
+ }
921
+ else {
922
+ self.$each.$$p = function() {
923
+ var value = #{Opal.destructure(`arguments`)};
924
+
925
+ if (#{Opal.truthy?(`value`)}) {
926
+ if (result === true) {
927
+ result = false;
928
+ return $breaker;
929
+ }
930
+
931
+ result = true;
932
+ }
933
+ }
934
+ }
935
+
936
+ self.$each();
937
+
938
+ return result;
939
+ }
940
+ end
941
+
942
+ def partition(&block)
943
+ return enum_for :partition unless block_given?
944
+
945
+ %x{
946
+ var truthy = [], falsy = [];
947
+
948
+ self.$each.$$p = function() {
949
+ var param = #{Opal.destructure(`arguments`)},
950
+ value = $opal.$yield1(block, param);
951
+
952
+ if (value === $breaker) {
953
+ result = $breaker.$v;
954
+ return $breaker;
955
+ }
956
+
957
+ if (#{Opal.truthy?(`value`)}) {
958
+ truthy.push(param);
959
+ }
960
+ else {
961
+ falsy.push(param);
962
+ }
963
+ };
964
+
965
+ self.$each();
966
+
967
+ return [truthy, falsy];
968
+ }
969
+ end
970
+
971
+ alias reduce inject
972
+
973
+ def reject(&block)
974
+ return enum_for :reject unless block_given?
975
+
976
+ %x{
977
+ var result = [];
978
+
979
+ self.$each.$$p = function() {
980
+ var param = #{Opal.destructure(`arguments`)},
981
+ value = $opal.$yield1(block, param);
982
+
983
+ if (value === $breaker) {
984
+ result = $breaker.$v;
985
+ return $breaker;
986
+ }
987
+
988
+ if (#{Opal.falsy?(`value`)}) {
989
+ result.push(param);
990
+ }
991
+ };
992
+
993
+ self.$each();
994
+
995
+ return result;
996
+ }
997
+ end
998
+
999
+ def reverse_each(&block)
1000
+ return enum_for :reverse_each unless block_given?
1001
+
1002
+ %x{
1003
+ var result = [];
1004
+
1005
+ self.$each.$$p = function() {
1006
+ result.push(arguments);
1007
+ };
1008
+
1009
+ self.$each();
1010
+
1011
+ for (var i = result.length - 1; i >= 0; i--) {
1012
+ $opal.$yieldX(block, result[i]);
1013
+ }
1014
+
1015
+ return result;
1016
+ }
1017
+ end
1018
+
1019
+ alias select find_all
1020
+
1021
+ def slice_before(pattern = undefined, &block)
1022
+ if `pattern === undefined && block === nil || arguments.length > 1`
1023
+ raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 1)"
1024
+ end
1025
+
1026
+ Enumerator.new {|e|
1027
+ %x{
1028
+ var slice = [];
1029
+
1030
+ if (block !== nil) {
1031
+ if (pattern === undefined) {
1032
+ self.$each.$$p = function() {
1033
+ var param = #{Opal.destructure(`arguments`)},
1034
+ value = $opal.$yield1(block, param);
1035
+
1036
+ if (#{Opal.truthy?(`value`)} && slice.length > 0) {
1037
+ #{e << `slice`};
1038
+ slice = [];
1039
+ }
1040
+
1041
+ slice.push(param);
1042
+ };
1043
+ }
1044
+ else {
1045
+ self.$each.$$p = function() {
1046
+ var param = #{Opal.destructure(`arguments`)},
1047
+ value = block(param, #{pattern.dup});
1048
+
1049
+ if (#{Opal.truthy?(`value`)} && slice.length > 0) {
1050
+ #{e << `slice`};
1051
+ slice = [];
1052
+ }
1053
+
1054
+ slice.push(param);
1055
+ };
1056
+ }
1057
+ }
1058
+ else {
1059
+ self.$each.$$p = function() {
1060
+ var param = #{Opal.destructure(`arguments`)},
1061
+ value = #{pattern === `param`};
1062
+
1063
+ if (#{Opal.truthy?(`value`)} && slice.length > 0) {
1064
+ #{e << `slice`};
1065
+ slice = [];
1066
+ }
1067
+
1068
+ slice.push(param);
1069
+ };
1070
+ }
1071
+
1072
+ self.$each();
1073
+
1074
+ if (slice.length > 0) {
1075
+ #{e << `slice`};
1076
+ }
1077
+ }
1078
+ }
1079
+ end
1080
+
1081
+ def sort(&block)
1082
+ raise NotImplementedError
1083
+ end
1084
+
1085
+ def sort_by(&block)
1086
+ return enum_for :sort_by unless block_given?
1087
+
1088
+ map {
1089
+ arg = Opal.destructure(`arguments`)
1090
+
1091
+ [block.call(arg), arg]
1092
+ }.sort { |a, b| a[0] <=> b[0] }.map { |arg| `arg[1]` }
1093
+ end
1094
+
1095
+ def take(num)
1096
+ first(num)
1097
+ end
1098
+
1099
+ def take_while(&block)
1100
+ return enum_for :take_while unless block
1101
+
1102
+ %x{
1103
+ var result = [];
1104
+
1105
+ self.$each.$$p = function() {
1106
+ var param = #{Opal.destructure(`arguments`)},
1107
+ value = $opal.$yield1(block, param);
1108
+
1109
+ if (value === $breaker) {
1110
+ result = $breaker.$v;
1111
+ return $breaker;
1112
+ }
1113
+
1114
+ if (#{Opal.falsy?(`value`)}) {
1115
+ return $breaker;
1116
+ }
1117
+
1118
+ result.push(param);
1119
+ };
1120
+
1121
+ self.$each();
1122
+
1123
+ return result;
1124
+ }
1125
+ end
1126
+
1127
+ alias to_a entries
1128
+
1129
+ def zip(*others, &block)
1130
+ to_a.zip(*others)
1131
+ end
1132
+ end