opal 0.4.4 → 0.5.0

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 (796) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +8 -0
  5. data/CONTRIBUTING.md +46 -2
  6. data/Gemfile +17 -0
  7. data/README.md +13 -4
  8. data/Rakefile +22 -119
  9. data/bin/opal +11 -2
  10. data/bin/opal-repl +71 -0
  11. data/corelib/array.rb +554 -356
  12. data/corelib/basic_object.rb +22 -18
  13. data/corelib/boolean.rb +15 -6
  14. data/corelib/class.rb +12 -6
  15. data/corelib/comparable.rb +40 -9
  16. data/corelib/encoding.rb +164 -0
  17. data/corelib/enumerable.rb +532 -300
  18. data/corelib/enumerator.rb +31 -6
  19. data/corelib/error.rb +14 -3
  20. data/corelib/hash.rb +108 -97
  21. data/corelib/io.rb +30 -0
  22. data/corelib/kernel.rb +151 -82
  23. data/corelib/main.rb +7 -0
  24. data/corelib/match_data.rb +118 -0
  25. data/corelib/method.rb +58 -0
  26. data/corelib/module.rb +145 -77
  27. data/corelib/native.rb +144 -22
  28. data/corelib/nil_class.rb +2 -0
  29. data/corelib/numeric.rb +259 -61
  30. data/corelib/opal.rb +43 -28
  31. data/corelib/proc.rb +21 -9
  32. data/corelib/range.rb +42 -23
  33. data/corelib/regexp.rb +51 -9
  34. data/corelib/runtime.js +470 -129
  35. data/corelib/string.rb +170 -246
  36. data/corelib/struct.rb +13 -1
  37. data/corelib/time.rb +414 -43
  38. data/doc/compiler.md +42 -0
  39. data/doc/compiler_options.md +5 -0
  40. data/doc/examples/node_http_server.rb +49 -0
  41. data/doc/external_libraries.md +9 -0
  42. data/doc/generated_javascript.md +272 -0
  43. data/doc/home.md +17 -0
  44. data/doc/method_missing.md +58 -0
  45. data/doc/static_applications.md +60 -0
  46. data/doc/using_ruby_from_javascript.md +18 -0
  47. data/doc/using_sprockets.md +65 -0
  48. data/lib/opal.rb +18 -15
  49. data/lib/opal/builder.rb +26 -9
  50. data/lib/opal/cli.rb +143 -90
  51. data/lib/opal/cli_options.rb +19 -13
  52. data/lib/opal/compiler.rb +307 -0
  53. data/lib/opal/erb.rb +3 -3
  54. data/lib/opal/fragment.rb +34 -0
  55. data/lib/opal/nodes.rb +25 -0
  56. data/lib/opal/nodes/arglist.rb +56 -0
  57. data/lib/opal/nodes/array.rb +54 -0
  58. data/lib/opal/nodes/base.rb +150 -0
  59. data/lib/opal/nodes/base_scope.rb +11 -0
  60. data/lib/opal/nodes/call.rb +195 -0
  61. data/lib/opal/nodes/call_special.rb +153 -0
  62. data/lib/opal/nodes/case.rb +96 -0
  63. data/lib/opal/nodes/class.rb +43 -0
  64. data/lib/opal/nodes/constants.rb +91 -0
  65. data/lib/opal/nodes/def.rb +157 -0
  66. data/lib/opal/nodes/defined.rb +113 -0
  67. data/lib/opal/nodes/definitions.rb +182 -0
  68. data/lib/opal/nodes/hash.rb +67 -0
  69. data/lib/opal/nodes/helpers.rb +105 -0
  70. data/lib/opal/nodes/if.rb +60 -0
  71. data/lib/opal/nodes/iter.rb +118 -0
  72. data/lib/opal/nodes/literal.rb +193 -0
  73. data/lib/opal/nodes/logic.rb +211 -0
  74. data/lib/opal/nodes/masgn.rb +62 -0
  75. data/lib/opal/nodes/module.rb +46 -0
  76. data/lib/opal/nodes/rescue.rb +134 -0
  77. data/lib/opal/nodes/singleton_class.rb +26 -0
  78. data/lib/opal/nodes/super.rb +97 -0
  79. data/lib/opal/nodes/top.rb +63 -0
  80. data/lib/opal/nodes/variables.rb +155 -0
  81. data/lib/opal/nodes/while.rb +65 -0
  82. data/lib/opal/nodes/yield.rb +84 -0
  83. data/lib/opal/parser.rb +294 -2169
  84. data/lib/opal/parser/grammar.rb +5326 -0
  85. data/lib/opal/{grammar.y → parser/grammar.y} +180 -113
  86. data/lib/opal/parser/keywords.rb +64 -0
  87. data/lib/opal/{lexer.rb → parser/lexer.rb} +278 -327
  88. data/lib/opal/{lexer_scope.rb → parser/parser_scope.rb} +2 -5
  89. data/lib/opal/parser/sexp.rb +63 -0
  90. data/lib/opal/source_map.rb +6 -5
  91. data/lib/opal/target_scope.rb +15 -17
  92. data/lib/opal/version.rb +1 -1
  93. data/mri_spec/cli_spec.rb +67 -6
  94. data/opal.gemspec +4 -4
  95. data/spec/config.ru +2 -1
  96. data/spec/corelib/enumerable/all_break_spec.rb +5 -0
  97. data/spec/corelib/enumerable/any_break_spec.rb +5 -0
  98. data/spec/corelib/enumerable/collect_break_spec.rb +13 -0
  99. data/spec/corelib/enumerable/count_break_spec.rb +5 -0
  100. data/spec/corelib/enumerable/detect_break_spec.rb +5 -0
  101. data/spec/corelib/enumerable/drop_while_break_spec.rb +5 -0
  102. data/spec/corelib/enumerable/each_slice_break.rb +6 -0
  103. data/spec/corelib/enumerable/each_with_index_break_spec.rb +5 -0
  104. data/spec/corelib/enumerable/each_with_object_break_spec.rb +5 -0
  105. data/spec/corelib/enumerable/find_all_break_spec.rb +5 -0
  106. data/spec/corelib/enumerable/find_index_break_spec.rb +5 -0
  107. data/spec/corelib/enumerable/grep_break_spec.rb +5 -0
  108. data/spec/corelib/enumerable/max_break_spec.rb +5 -0
  109. data/spec/corelib/enumerable/max_by_break_spec.rb +5 -0
  110. data/spec/corelib/enumerable/min_break_spec.rb +5 -0
  111. data/spec/corelib/enumerable/min_by_break_spec.rb +5 -0
  112. data/spec/corelib/enumerable/none_break_spec.rb +5 -0
  113. data/spec/corelib/enumerable/one_break_spec.rb +5 -0
  114. data/spec/corelib/enumerable/reduce_break_spec.rb +5 -0
  115. data/spec/corelib/enumerable/take_while_break_spec.rb +5 -0
  116. data/spec/{rubyspec → corelib}/fixtures/class.rb +0 -0
  117. data/spec/{rubyspec → corelib}/fixtures/class_variables.rb +0 -0
  118. data/spec/{rubyspec → corelib}/fixtures/constants.rb +0 -0
  119. data/spec/{rubyspec/core → corelib}/kernel/Array_spec.rb +0 -0
  120. data/spec/{opal → corelib}/kernel/block_given_spec.rb +0 -0
  121. data/spec/{opal → corelib}/kernel/class_spec.rb +0 -0
  122. data/spec/{rubyspec/core → corelib}/kernel/define_singleton_method_spec.rb +0 -0
  123. data/spec/{rubyspec/core → corelib}/kernel/equal_value_spec.rb +0 -0
  124. data/spec/{opal → corelib}/kernel/extend_spec.rb +0 -0
  125. data/spec/{opal → corelib}/kernel/format_spec.rb +0 -0
  126. data/spec/{opal → corelib}/kernel/freeze_spec.rb +0 -0
  127. data/spec/{rubyspec/core → corelib}/kernel/instance_eval_spec.rb +0 -0
  128. data/spec/{opal → corelib}/kernel/instance_variable_defined_spec.rb +0 -0
  129. data/spec/{rubyspec/core → corelib}/kernel/instance_variable_get_spec.rb +0 -0
  130. data/spec/{rubyspec/core → corelib}/kernel/instance_variable_set_spec.rb +0 -0
  131. data/spec/{rubyspec/core → corelib}/kernel/loop_spec.rb +0 -0
  132. data/spec/{opal → corelib}/kernel/match_spec.rb +0 -0
  133. data/spec/{opal → corelib}/kernel/method_spec.rb +0 -0
  134. data/spec/{opal → corelib}/kernel/methods_spec.rb +0 -0
  135. data/spec/{opal → corelib}/kernel/nil_spec.rb +0 -0
  136. data/spec/{opal → corelib}/kernel/p_spec.rb +8 -6
  137. data/spec/{opal → corelib}/kernel/printf_spec.rb +4 -2
  138. data/spec/{opal → corelib}/kernel/proc_spec.rb +0 -0
  139. data/spec/{opal → corelib}/kernel/rand_spec.rb +0 -0
  140. data/spec/{opal → corelib}/kernel/respond_to_spec.rb +0 -0
  141. data/spec/{rubyspec/core → corelib}/kernel/send_spec.rb +0 -0
  142. data/spec/{opal → corelib}/kernel/sprintf_spec.rb +0 -0
  143. data/spec/corelib/kernel/warn_spec.rb +83 -0
  144. data/spec/{rubyspec → corelib}/language/block_spec.rb +17 -18
  145. data/spec/{rubyspec → corelib}/language/fixtures/array.rb +0 -0
  146. data/spec/{rubyspec → corelib}/language/fixtures/block.rb +0 -0
  147. data/spec/{rubyspec → corelib}/language/fixtures/break.rb +0 -0
  148. data/spec/{rubyspec → corelib}/language/fixtures/ensure.rb +0 -0
  149. data/spec/{rubyspec → corelib}/language/fixtures/literal_lambda.rb +0 -0
  150. data/spec/{rubyspec → corelib}/language/fixtures/metaclass.rb +0 -0
  151. data/spec/{rubyspec → corelib}/language/fixtures/module.rb +0 -0
  152. data/spec/{rubyspec → corelib}/language/fixtures/next.rb +0 -0
  153. data/spec/{rubyspec → corelib}/language/fixtures/return.rb +0 -0
  154. data/spec/{rubyspec → corelib}/language/fixtures/send.rb +1 -1
  155. data/spec/{rubyspec → corelib}/language/fixtures/send_1.9.rb +0 -0
  156. data/spec/{rubyspec → corelib}/language/fixtures/super.rb +0 -0
  157. data/spec/{rubyspec → corelib}/language/fixtures/variables.rb +0 -0
  158. data/spec/{rubyspec → corelib}/language/fixtures/yield.rb +0 -0
  159. data/spec/{rubyspec → corelib}/language/numbers_spec.rb +0 -2
  160. data/spec/{rubyspec → corelib}/language/predefined_spec.rb +0 -0
  161. data/spec/{rubyspec → corelib}/language/proc_spec.rb +0 -2
  162. data/spec/{rubyspec → corelib}/language/regexp_spec.rb +0 -0
  163. data/spec/{rubyspec → corelib}/language/send_spec.rb +6 -7
  164. data/spec/{rubyspec → corelib}/language/string_spec.rb +0 -0
  165. data/spec/{rubyspec → corelib}/language/symbol_spec.rb +0 -0
  166. data/spec/{rubyspec → corelib}/language/variables_spec.rb +1 -2
  167. data/spec/{rubyspec → corelib}/language/versions/array_1.9.rb +0 -0
  168. data/spec/{rubyspec → corelib}/language/versions/block_1.9.rb +0 -0
  169. data/spec/{rubyspec → corelib}/language/versions/break_1.9.rb +0 -0
  170. data/spec/{rubyspec → corelib}/language/versions/case_1.9.rb +0 -0
  171. data/spec/{rubyspec → corelib}/language/versions/hash_1.9.rb +0 -0
  172. data/spec/{rubyspec → corelib}/language/versions/literal_lambda_1.9.rb +0 -0
  173. data/spec/{rubyspec → corelib}/language/versions/not_1.9.rb +0 -0
  174. data/spec/{rubyspec → corelib}/language/versions/send_1.9.rb +0 -0
  175. data/spec/{rubyspec → corelib}/language/versions/symbol_1.9.rb +0 -0
  176. data/spec/{rubyspec → corelib}/language/versions/variables_1.9.rb +1 -1
  177. data/spec/corelib/module/alias_method_spec.rb +28 -0
  178. data/spec/{opal → corelib}/module/ancestors_spec.rb +0 -0
  179. data/spec/{opal → corelib}/module/append_features_spec.rb +0 -0
  180. data/spec/corelib/module/attr_accessor_spec.rb +26 -0
  181. data/spec/{rubyspec/core → corelib}/module/const_defined_spec.rb +1 -2
  182. data/spec/{rubyspec/core → corelib}/module/const_get_spec.rb +1 -2
  183. data/spec/{rubyspec/core → corelib}/module/const_missing_spec.rb +1 -2
  184. data/spec/{rubyspec/core → corelib}/module/const_set_spec.rb +1 -2
  185. data/spec/{opal → corelib}/module/constants_spec.rb +0 -0
  186. data/spec/{rubyspec/core → corelib}/module/fixtures/classes.rb +0 -0
  187. data/spec/{rubyspec/core → corelib}/module/method_defined_spec.rb +0 -1
  188. data/spec/{opal → corelib}/module/module_function_spec.rb +0 -2
  189. data/spec/corelib/module/name_spec.rb +52 -0
  190. data/spec/{rubyspec/core → corelib}/module/public_method_defined_spec.rb +0 -1
  191. data/spec/{rubyspec/core → corelib}/module/remove_const_spec.rb +0 -1
  192. data/spec/{rubyspec/core → corelib}/module/undef_method_spec.rb +0 -1
  193. data/spec/{opal → corelib}/native/alias_native_spec.rb +7 -0
  194. data/spec/{opal → corelib}/native/each_spec.rb +2 -5
  195. data/spec/{opal → corelib}/native/element_reference_spec.rb +0 -0
  196. data/spec/{rubyspec/core/hash/to_native_spec.rb → corelib/native/ext_spec.rb} +0 -0
  197. data/spec/corelib/native/initialize_spec.rb +17 -0
  198. data/spec/{opal → corelib}/native/method_missing_spec.rb +0 -0
  199. data/spec/corelib/native/new_spec.rb +6 -0
  200. data/spec/{rubyspec/core → corelib}/numeric/abs_spec.rb +0 -0
  201. data/spec/{rubyspec/core → corelib}/numeric/bit_and_spec.rb +0 -0
  202. data/spec/{rubyspec/core → corelib}/numeric/bit_or_spec.rb +0 -0
  203. data/spec/{rubyspec/core → corelib}/numeric/bit_xor_spec.rb +0 -0
  204. data/spec/{rubyspec/core → corelib}/numeric/ceil_spec.rb +0 -0
  205. data/spec/{rubyspec/core → corelib}/numeric/chr_spec.rb +0 -0
  206. data/spec/{rubyspec/core → corelib}/numeric/comparison_spec.rb +0 -0
  207. data/spec/{rubyspec/core → corelib}/numeric/complement_spec.rb +0 -0
  208. data/spec/{rubyspec/core → corelib}/numeric/divide_spec.rb +0 -0
  209. data/spec/{rubyspec/core → corelib}/numeric/downto_spec.rb +0 -0
  210. data/spec/{rubyspec/core → corelib}/numeric/eql_spec.rb +0 -0
  211. data/spec/{rubyspec/core → corelib}/numeric/equal_value_spec.rb +0 -0
  212. data/spec/{rubyspec/core → corelib}/numeric/even_spec.rb +0 -0
  213. data/spec/{rubyspec/core → corelib}/numeric/exponent_spec.rb +0 -0
  214. data/spec/{rubyspec/core → corelib}/numeric/floor_spec.rb +0 -0
  215. data/spec/{rubyspec/core → corelib}/numeric/gt_spec.rb +0 -0
  216. data/spec/{rubyspec/core → corelib}/numeric/gte_spec.rb +0 -0
  217. data/spec/{rubyspec/core → corelib}/numeric/integer_spec.rb +0 -0
  218. data/spec/{rubyspec/core → corelib}/numeric/left_shift_spec.rb +0 -0
  219. data/spec/{rubyspec/core → corelib}/numeric/lt_spec.rb +0 -0
  220. data/spec/{rubyspec/core → corelib}/numeric/lte_spec.rb +0 -0
  221. data/spec/{rubyspec/core → corelib}/numeric/magnitude_spec.rb +0 -0
  222. data/spec/{rubyspec/core → corelib}/numeric/minus_spec.rb +0 -0
  223. data/spec/{rubyspec/core → corelib}/numeric/modulo_spec.rb +0 -0
  224. data/spec/{rubyspec/core → corelib}/numeric/multiply_spec.rb +0 -0
  225. data/spec/{rubyspec/core → corelib}/numeric/next_spec.rb +0 -0
  226. data/spec/{rubyspec/core → corelib}/numeric/odd_spec.rb +0 -0
  227. data/spec/{rubyspec/core → corelib}/numeric/ord_spec.rb +0 -0
  228. data/spec/{rubyspec/core → corelib}/numeric/plus_spec.rb +0 -0
  229. data/spec/{rubyspec/core → corelib}/numeric/pred_spec.rb +0 -0
  230. data/spec/{rubyspec/core → corelib}/numeric/right_shift_spec.rb +0 -0
  231. data/spec/{rubyspec/core → corelib}/numeric/step_spec.rb +0 -3
  232. data/spec/{rubyspec/core → corelib}/numeric/succ_spec.rb +0 -0
  233. data/spec/{rubyspec/core → corelib}/numeric/times_spec.rb +0 -0
  234. data/spec/{rubyspec/core → corelib}/numeric/to_f_spec.rb +0 -0
  235. data/spec/{rubyspec/core → corelib}/numeric/to_i_spec.rb +0 -0
  236. data/spec/{rubyspec/core → corelib}/numeric/to_json_spec.rb +0 -0
  237. data/spec/corelib/numeric/to_s_spec.rb +26 -0
  238. data/spec/{rubyspec/core → corelib}/numeric/uminus_spec.rb +0 -0
  239. data/spec/{rubyspec/core → corelib}/numeric/upto_spec.rb +0 -0
  240. data/spec/{rubyspec/core → corelib}/numeric/zero_spec.rb +0 -0
  241. data/spec/{rubyspec/core → corelib}/proc/call_spec.rb +0 -0
  242. data/spec/{rubyspec/core → corelib}/proc/element_reference_spec.rb +0 -0
  243. data/spec/{opal → corelib}/proc/proc_tricks_spec.rb +0 -0
  244. data/spec/corelib/runtime/begin_spec.rb +39 -0
  245. data/spec/{opal → corelib}/runtime/block_send_spec.rb +0 -0
  246. data/spec/{opal/language → corelib/runtime}/block_spec.rb +10 -0
  247. data/spec/corelib/runtime/bridged_classes_spec.rb +64 -0
  248. data/spec/{opal → corelib/runtime}/constants_spec.rb +0 -0
  249. data/spec/{opal → corelib}/runtime/eval_spec.rb +0 -0
  250. data/spec/{opal → corelib}/runtime/main_methods_spec.rb +0 -0
  251. data/spec/{opal → corelib/runtime}/method_missing_spec.rb +0 -0
  252. data/spec/corelib/runtime/method_spec.rb +31 -0
  253. data/spec/corelib/runtime/paren_spec.rb +14 -0
  254. data/spec/{opal/language → corelib/runtime}/rescue_spec.rb +11 -0
  255. data/spec/{opal/language → corelib/runtime}/return_spec.rb +0 -0
  256. data/spec/{opal → corelib}/runtime/send_spec.rb +0 -0
  257. data/spec/{opal/language → corelib/runtime}/singleton_class_spec.rb +0 -0
  258. data/spec/{opal/language → corelib/runtime}/super_spec.rb +113 -0
  259. data/spec/{opal/language → corelib/runtime}/variables_spec.rb +0 -0
  260. data/spec/{opal → corelib}/source_map_spec.rb +3 -3
  261. data/spec/{rubyspec/core → corelib}/string/chop_spec.rb +0 -0
  262. data/spec/{rubyspec/core → corelib}/string/chr_spec.rb +0 -0
  263. data/spec/{rubyspec/core → corelib}/string/clone_spec.rb +0 -0
  264. data/spec/{rubyspec/core → corelib}/string/comparison_spec.rb +0 -0
  265. data/spec/{rubyspec/core → corelib}/string/dup_spec.rb +0 -0
  266. data/spec/{rubyspec/core → corelib}/string/element_reference_spec.rb +0 -1
  267. data/spec/{rubyspec/core → corelib}/string/fixtures/classes.rb +0 -0
  268. data/spec/{rubyspec/core → corelib}/string/format_spec.rb +0 -0
  269. data/spec/{opal → corelib}/string/freeze_spec.rb +0 -0
  270. data/spec/{rubyspec/core → corelib}/string/gsub_spec.rb +0 -0
  271. data/spec/{rubyspec/core → corelib}/string/lines_spec.rb +0 -0
  272. data/spec/{rubyspec/core → corelib}/string/ljust_spec.rb +0 -1
  273. data/spec/{rubyspec/core → corelib}/string/lstrip_spec.rb +0 -0
  274. data/spec/{rubyspec/core → corelib}/string/match_spec.rb +0 -0
  275. data/spec/{rubyspec/core → corelib}/string/next_spec.rb +0 -0
  276. data/spec/{rubyspec/core → corelib}/string/ord_spec.rb +0 -0
  277. data/spec/{rubyspec/core → corelib}/string/partition_spec.rb +0 -0
  278. data/spec/{rubyspec/core → corelib}/string/rindex_spec.rb +0 -0
  279. data/spec/{rubyspec/core → corelib}/string/rjust_spec.rb +0 -1
  280. data/spec/{rubyspec/core → corelib}/string/rstrip_spec.rb +0 -0
  281. data/spec/{rubyspec/core → corelib}/string/scan_spec.rb +0 -0
  282. data/spec/{rubyspec/core → corelib}/string/slice_spec.rb +1 -2
  283. data/spec/{rubyspec/core → corelib}/string/split_spec.rb +0 -0
  284. data/spec/{rubyspec/core → corelib}/string/strip_spec.rb +0 -0
  285. data/spec/{rubyspec/core → corelib}/string/sub_spec.rb +0 -0
  286. data/spec/{rubyspec/core → corelib}/string/succ_spec.rb +0 -0
  287. data/spec/{rubyspec/core → corelib}/string/sum_spec.rb +0 -0
  288. data/spec/{rubyspec/core → corelib}/string/to_f_spec.rb +0 -0
  289. data/spec/{rubyspec/core → corelib}/string/to_i_spec.rb +0 -0
  290. data/spec/{rubyspec/core → corelib}/string/tr_s_spec.rb +0 -0
  291. data/spec/{rubyspec/core → corelib}/string/tr_spec.rb +0 -0
  292. data/spec/filters/bugs/array.rb +236 -4
  293. data/spec/filters/bugs/basic_object.rb +4 -0
  294. data/spec/filters/bugs/class.rb +4 -0
  295. data/spec/filters/bugs/enumerable.rb +58 -0
  296. data/spec/filters/bugs/enumerator.rb +6 -0
  297. data/spec/filters/bugs/hash.rb +146 -0
  298. data/spec/filters/bugs/kernel.rb +10 -0
  299. data/spec/filters/bugs/language.rb +366 -0
  300. data/spec/filters/bugs/module.rb +14 -0
  301. data/spec/filters/bugs/regexp.rb +7 -0
  302. data/spec/filters/bugs/set.rb +7 -0
  303. data/spec/filters/bugs/{singleton/instance.rb → singleton.rb} +3 -1
  304. data/spec/filters/bugs/string.rb +37 -0
  305. data/spec/filters/bugs/stringscanner.rb +18 -0
  306. data/spec/filters/bugs/struct.rb +11 -0
  307. data/spec/filters/bugs/symbol.rb +5 -0
  308. data/spec/filters/bugs/time.rb +28 -0
  309. data/spec/filters/bugs/unknown.rb +11 -0
  310. data/spec/filters/unsupported/array_subclasses.rb +32 -0
  311. data/spec/filters/unsupported/encoding.rb +14 -0
  312. data/spec/filters/unsupported/float.rb +4 -0
  313. data/spec/filters/unsupported/frozen.rb +57 -0
  314. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  315. data/spec/filters/unsupported/immutable_strings.rb +6 -0
  316. data/spec/filters/unsupported/mutable_strings.rb +49 -0
  317. data/spec/filters/unsupported/private_methods.rb +26 -0
  318. data/spec/filters/{mspec → unsupported}/ruby_exe.rb +0 -0
  319. data/spec/filters/unsupported/string_subclasses.rb +8 -0
  320. data/spec/filters/unsupported/tainted.rb +46 -0
  321. data/spec/filters/unsupported/time.rb +21 -0
  322. data/spec/filters/unsupported/trusted.rb +26 -0
  323. data/spec/opal/{parser → compiler}/irb_spec.rb +9 -9
  324. data/spec/{parser → opal/parser}/alias_spec.rb +0 -0
  325. data/spec/{parser → opal/parser}/and_spec.rb +0 -0
  326. data/spec/{parser → opal/parser}/array_spec.rb +0 -0
  327. data/spec/{parser → opal/parser}/attrasgn_spec.rb +0 -0
  328. data/spec/{parser → opal/parser}/begin_spec.rb +0 -0
  329. data/spec/{parser → opal/parser}/block_spec.rb +0 -0
  330. data/spec/{parser → opal/parser}/break_spec.rb +0 -0
  331. data/spec/{parser → opal/parser}/call_spec.rb +33 -8
  332. data/spec/{parser → opal/parser}/class_spec.rb +0 -0
  333. data/spec/{parser → opal/parser}/const_spec.rb +0 -0
  334. data/spec/{parser → opal/parser}/cvar_spec.rb +0 -0
  335. data/spec/{parser → opal/parser}/def_spec.rb +17 -17
  336. data/spec/{parser → opal/parser}/false_spec.rb +0 -0
  337. data/spec/{parser → opal/parser}/file_spec.rb +0 -0
  338. data/spec/{parser → opal/parser}/gvar_spec.rb +0 -0
  339. data/spec/{parser → opal/parser}/hash_spec.rb +0 -0
  340. data/spec/opal/parser/heredoc_spec.rb +30 -0
  341. data/spec/{parser → opal/parser}/iasgn_spec.rb +0 -0
  342. data/spec/{parser → opal/parser}/if_spec.rb +0 -0
  343. data/spec/{parser → opal/parser}/int_spec.rb +0 -0
  344. data/spec/opal/parser/iter_spec.rb +59 -0
  345. data/spec/{parser → opal/parser}/ivar_spec.rb +0 -0
  346. data/spec/opal/parser/lambda_spec.rb +64 -0
  347. data/spec/{parser → opal/parser}/lasgn_spec.rb +0 -0
  348. data/spec/{parser → opal/parser}/line_spec.rb +0 -0
  349. data/spec/{parser → opal/parser}/lvar_spec.rb +6 -6
  350. data/spec/{parser → opal/parser}/masgn_spec.rb +0 -0
  351. data/spec/{parser → opal/parser}/module_spec.rb +0 -0
  352. data/spec/{parser → opal/parser}/nil_spec.rb +0 -0
  353. data/spec/{parser → opal/parser}/not_spec.rb +0 -0
  354. data/spec/{parser → opal/parser}/nth_ref_spec.rb +0 -0
  355. data/spec/{parser → opal/parser}/op_asgn1_spec.rb +0 -0
  356. data/spec/{parser → opal/parser}/op_asgn2_spec.rb +0 -0
  357. data/spec/{parser → opal/parser}/or_spec.rb +0 -0
  358. data/spec/{parser → opal/parser}/parse_spec.rb +17 -17
  359. data/spec/{parser → opal/parser}/regexp_spec.rb +0 -0
  360. data/spec/{parser → opal/parser}/return_spec.rb +0 -0
  361. data/spec/{parser → opal/parser}/sclass_spec.rb +0 -0
  362. data/spec/{parser → opal/parser}/self_spec.rb +0 -0
  363. data/spec/{parser → opal/parser}/str_spec.rb +1 -12
  364. data/spec/{parser → opal/parser}/string_spec.rb +0 -0
  365. data/spec/opal/parser/super_spec.rb +20 -0
  366. data/spec/{parser → opal/parser}/true_spec.rb +0 -0
  367. data/spec/{parser → opal/parser}/undef_spec.rb +0 -0
  368. data/spec/{parser → opal/parser}/unless_spec.rb +0 -0
  369. data/spec/{parser → opal/parser}/while_spec.rb +0 -0
  370. data/spec/{parser → opal/parser}/xstr_spec.rb +2 -2
  371. data/spec/{parser → opal/parser}/yield_spec.rb +0 -0
  372. data/spec/ospec/main.rb.erb +1 -13
  373. data/spec/ospec/mspec_fixes.rb +87 -0
  374. data/spec/ospec/runner.rb +188 -0
  375. data/spec/rubyspecs +351 -0
  376. data/spec/spec_helper.rb +8 -198
  377. data/spec/{opal → stdlib}/erb/erb_spec.rb +3 -3
  378. data/spec/{opal → stdlib}/erb/inline_block.opalerb +0 -0
  379. data/spec/{opal → stdlib}/erb/quoted.opalerb +0 -0
  380. data/spec/{opal → stdlib}/erb/simple.opalerb +0 -0
  381. data/spec/stdlib/json/ext_spec.rb +48 -0
  382. data/spec/{opal → stdlib}/json/parse_spec.rb +0 -0
  383. data/spec/stdlib/template/paths_spec.rb +10 -0
  384. data/stdlib/delegate.rb +29 -0
  385. data/stdlib/dir.rb +5 -0
  386. data/stdlib/file.rb +7 -0
  387. data/stdlib/json.rb +82 -27
  388. data/stdlib/opal-parser.rb +46 -0
  389. data/stdlib/opal-source-maps.js.erb +1 -1
  390. data/stdlib/pathname.rb +31 -0
  391. data/stdlib/{racc.rb → racc/parser.rb} +0 -0
  392. data/stdlib/securerandom.rb +12 -0
  393. data/stdlib/set.rb +89 -0
  394. data/stdlib/stringio.rb +12 -4
  395. data/stdlib/strscan.rb +19 -0
  396. data/stdlib/template.rb +4 -0
  397. data/stdlib/thread.rb +20 -0
  398. data/tasks/mspec.rake +147 -0
  399. metadata +650 -1266
  400. data/lib/opal/core_ext.rb +0 -5
  401. data/lib/opal/grammar.rb +0 -5137
  402. data/lib/opal/grammar_helpers.rb +0 -364
  403. data/lib/opal/require_parser.rb +0 -77
  404. data/spec/filters/bugs/alias.rb +0 -6
  405. data/spec/filters/bugs/ancestors.rb +0 -4
  406. data/spec/filters/bugs/array/combination.rb +0 -11
  407. data/spec/filters/bugs/array/count.rb +0 -3
  408. data/spec/filters/bugs/array/delete_if.rb +0 -3
  409. data/spec/filters/bugs/array/drop.rb +0 -3
  410. data/spec/filters/bugs/array/drop_while.rb +0 -5
  411. data/spec/filters/bugs/array/eql.rb +0 -3
  412. data/spec/filters/bugs/array/flatten.rb +0 -9
  413. data/spec/filters/bugs/array/minus.rb +0 -5
  414. data/spec/filters/bugs/array/multipliy.rb +0 -9
  415. data/spec/filters/bugs/array/new.rb +0 -3
  416. data/spec/filters/bugs/array/pop.rb +0 -6
  417. data/spec/filters/bugs/array/rassoc.rb +0 -4
  418. data/spec/filters/bugs/array/rindex.rb +0 -6
  419. data/spec/filters/bugs/array/select.rb +0 -3
  420. data/spec/filters/bugs/array/shift.rb +0 -7
  421. data/spec/filters/bugs/array/shuffle.rb +0 -11
  422. data/spec/filters/bugs/array/slice.rb +0 -7
  423. data/spec/filters/bugs/array/take.rb +0 -3
  424. data/spec/filters/bugs/array/to_a.rb +0 -3
  425. data/spec/filters/bugs/array/try_convert.rb +0 -7
  426. data/spec/filters/bugs/array/uniq.rb +0 -10
  427. data/spec/filters/bugs/array/zip.rb +0 -4
  428. data/spec/filters/bugs/array_delete.rb +0 -4
  429. data/spec/filters/bugs/array_fetch.rb +0 -3
  430. data/spec/filters/bugs/array_first.rb +0 -3
  431. data/spec/filters/bugs/array_flatten.rb +0 -14
  432. data/spec/filters/bugs/array_intersection.rb +0 -5
  433. data/spec/filters/bugs/array_join.rb +0 -6
  434. data/spec/filters/bugs/break.rb +0 -10
  435. data/spec/filters/bugs/case.rb +0 -4
  436. data/spec/filters/bugs/coerce_integer.rb +0 -9
  437. data/spec/filters/bugs/enumerable_sort_by.rb +0 -3
  438. data/spec/filters/bugs/kernel/instance_variables.rb +0 -3
  439. data/spec/filters/bugs/kernel/rand.rb +0 -4
  440. data/spec/filters/bugs/language/array.rb +0 -3
  441. data/spec/filters/bugs/language/block.rb +0 -6
  442. data/spec/filters/bugs/language/break.rb +0 -3
  443. data/spec/filters/bugs/language/class.rb +0 -12
  444. data/spec/filters/bugs/language/class_variables.rb +0 -12
  445. data/spec/filters/bugs/language/def.rb +0 -27
  446. data/spec/filters/bugs/language/defined.rb +0 -3
  447. data/spec/filters/bugs/language/ensure.rb +0 -4
  448. data/spec/filters/bugs/language/execution.rb +0 -4
  449. data/spec/filters/bugs/language/for.rb +0 -18
  450. data/spec/filters/bugs/language/if.rb +0 -13
  451. data/spec/filters/bugs/language/loop.rb +0 -4
  452. data/spec/filters/bugs/language/metaclass.rb +0 -14
  453. data/spec/filters/bugs/language/module.rb +0 -6
  454. data/spec/filters/bugs/language/next.rb +0 -3
  455. data/spec/filters/bugs/language/or.rb +0 -3
  456. data/spec/filters/bugs/language/order.rb +0 -4
  457. data/spec/filters/bugs/language/precedence.rb +0 -10
  458. data/spec/filters/bugs/language/proc.rb +0 -24
  459. data/spec/filters/bugs/language/redo.rb +0 -5
  460. data/spec/filters/bugs/language/rescue.rb +0 -9
  461. data/spec/filters/bugs/language/retry.rb +0 -5
  462. data/spec/filters/bugs/language/send.rb +0 -10
  463. data/spec/filters/bugs/language/super.rb +0 -9
  464. data/spec/filters/bugs/language/until.rb +0 -8
  465. data/spec/filters/bugs/language/variables.rb +0 -37
  466. data/spec/filters/bugs/language/while.rb +0 -6
  467. data/spec/filters/bugs/language/yield.rb +0 -5
  468. data/spec/filters/bugs/module/class_variables.rb +0 -6
  469. data/spec/filters/bugs/module/method_defined.rb +0 -6
  470. data/spec/filters/bugs/public_methods.rb +0 -4
  471. data/spec/filters/bugs/return.rb +0 -7
  472. data/spec/filters/bugs/source_map.rb +0 -3
  473. data/spec/filters/bugs/string/center.rb +0 -4
  474. data/spec/filters/bugs/string/lines.rb +0 -3
  475. data/spec/filters/mspec/mocks.rb +0 -3
  476. data/spec/filters/mspec/should_receive.rb +0 -5
  477. data/spec/filters/parser/block_args.rb +0 -51
  478. data/spec/mspec/guards/block_device.rb +0 -0
  479. data/spec/mspec/guards/endian.rb +0 -0
  480. data/spec/mspec/helpers/environment.rb +0 -0
  481. data/spec/mspec/helpers/language_version.rb +0 -0
  482. data/spec/mspec/helpers/tmp.rb +0 -0
  483. data/spec/opal/array/element_reference_spec.rb +0 -206
  484. data/spec/opal/array/equal_value_spec.rb +0 -19
  485. data/spec/opal/array/fill_spec.rb +0 -26
  486. data/spec/opal/array/reduce_spec.rb +0 -31
  487. data/spec/opal/array/to_json_spec.rb +0 -9
  488. data/spec/opal/basic_object/send_spec.rb +0 -28
  489. data/spec/opal/boolean/singleton_class_spec.rb +0 -9
  490. data/spec/opal/boolean/to_json_spec.rb +0 -11
  491. data/spec/opal/browser/local_storage_spec.rb +0 -55
  492. data/spec/opal/class/constants_spec.rb +0 -7
  493. data/spec/opal/class/extend_spec.rb +0 -47
  494. data/spec/opal/class/instance_methods_spec.rb +0 -13
  495. data/spec/opal/class/last_value_spec.rb +0 -67
  496. data/spec/opal/class/proc_methods_spec.rb +0 -23
  497. data/spec/opal/class/singleton_methods_spec.rb +0 -41
  498. data/spec/opal/hash/allocate_spec.rb +0 -16
  499. data/spec/opal/hash/new_spec.rb +0 -10
  500. data/spec/opal/hash/to_s_spec.rb +0 -9
  501. data/spec/opal/kernel/to_json_spec.rb +0 -7
  502. data/spec/opal/module/alias_method_spec.rb +0 -10
  503. data/spec/opal/module/attr_accessor_spec.rb +0 -8
  504. data/spec/opal/native/new_spec.rb +0 -19
  505. data/spec/opal/native/nil_spec.rb +0 -14
  506. data/spec/opal/nil/to_json_spec.rb +0 -7
  507. data/spec/opal/numeric/equal_spec.rb +0 -9
  508. data/spec/opal/runtime2/call_spec.rb +0 -16
  509. data/spec/opal/runtime2/class_hierarchy_spec.rb +0 -21
  510. data/spec/opal/runtime2/defined_spec.rb +0 -11
  511. data/spec/opal/runtime2/super_spec.rb +0 -16
  512. data/spec/opal/string/to_json_spec.rb +0 -8
  513. data/spec/parser/iter_spec.rb +0 -59
  514. data/spec/parser/lambda_spec.rb +0 -64
  515. data/spec/parser/parser_spec.rb +0 -41
  516. data/spec/parser/strscan/check_spec.rb +0 -13
  517. data/spec/parser/strscan/get_byte_spec.rb +0 -29
  518. data/spec/parser/strscan/scan_spec.rb +0 -33
  519. data/spec/parser/strscan/skip_spec.rb +0 -40
  520. data/spec/parser/super_spec.rb +0 -20
  521. data/spec/rubyspec/core/array/allocate_spec.rb +0 -19
  522. data/spec/rubyspec/core/array/append_spec.rb +0 -43
  523. data/spec/rubyspec/core/array/array_spec.rb +0 -7
  524. data/spec/rubyspec/core/array/assoc_spec.rb +0 -40
  525. data/spec/rubyspec/core/array/at_spec.rb +0 -56
  526. data/spec/rubyspec/core/array/choice_spec.rb +0 -20
  527. data/spec/rubyspec/core/array/clear_spec.rb +0 -61
  528. data/spec/rubyspec/core/array/clone_spec.rb +0 -15
  529. data/spec/rubyspec/core/array/collect_spec.rb +0 -53
  530. data/spec/rubyspec/core/array/combination_spec.rb +0 -55
  531. data/spec/rubyspec/core/array/compact_spec.rb +0 -111
  532. data/spec/rubyspec/core/array/comparison_spec.rb +0 -16
  533. data/spec/rubyspec/core/array/concat_spec.rb +0 -19
  534. data/spec/rubyspec/core/array/constructor_spec.rb +0 -24
  535. data/spec/rubyspec/core/array/count_spec.rb +0 -17
  536. data/spec/rubyspec/core/array/delete_at_spec.rb +0 -71
  537. data/spec/rubyspec/core/array/delete_if_spec.rb +0 -71
  538. data/spec/rubyspec/core/array/delete_spec.rb +0 -104
  539. data/spec/rubyspec/core/array/drop_spec.rb +0 -29
  540. data/spec/rubyspec/core/array/drop_while_spec.rb +0 -17
  541. data/spec/rubyspec/core/array/dup_spec.rb +0 -15
  542. data/spec/rubyspec/core/array/each_index_spec.rb +0 -40
  543. data/spec/rubyspec/core/array/each_spec.rb +0 -30
  544. data/spec/rubyspec/core/array/empty_spec.rb +0 -10
  545. data/spec/rubyspec/core/array/eql_spec.rb +0 -14
  546. data/spec/rubyspec/core/array/fetch_spec.rb +0 -52
  547. data/spec/rubyspec/core/array/find_index_spec.rb +0 -8
  548. data/spec/rubyspec/core/array/first_spec.rb +0 -89
  549. data/spec/rubyspec/core/array/fixtures/classes.rb +0 -538
  550. data/spec/rubyspec/core/array/flatten_spec.rb +0 -232
  551. data/spec/rubyspec/core/array/frozen_spec.rb +0 -32
  552. data/spec/rubyspec/core/array/include_spec.rb +0 -33
  553. data/spec/rubyspec/core/array/index_spec.rb +0 -6
  554. data/spec/rubyspec/core/array/insert_spec.rb +0 -90
  555. data/spec/rubyspec/core/array/inspect_spec.rb +0 -7
  556. data/spec/rubyspec/core/array/intersection_spec.rb +0 -78
  557. data/spec/rubyspec/core/array/join_spec.rb +0 -34
  558. data/spec/rubyspec/core/array/keep_if_spec.rb +0 -12
  559. data/spec/rubyspec/core/array/last_spec.rb +0 -88
  560. data/spec/rubyspec/core/array/length_spec.rb +0 -7
  561. data/spec/rubyspec/core/array/map_spec.rb +0 -11
  562. data/spec/rubyspec/core/array/max_spec.rb +0 -32
  563. data/spec/rubyspec/core/array/min_spec.rb +0 -32
  564. data/spec/rubyspec/core/array/minus_spec.rb +0 -89
  565. data/spec/rubyspec/core/array/multiply_spec.rb +0 -143
  566. data/spec/rubyspec/core/array/new_spec.rb +0 -137
  567. data/spec/rubyspec/core/array/ntimes_spec.rb +0 -26
  568. data/spec/rubyspec/core/array/plus_spec.rb +0 -64
  569. data/spec/rubyspec/core/array/pop_spec.rb +0 -196
  570. data/spec/rubyspec/core/array/push_spec.rb +0 -44
  571. data/spec/rubyspec/core/array/rassoc_spec.rb +0 -38
  572. data/spec/rubyspec/core/array/reject_spec.rb +0 -134
  573. data/spec/rubyspec/core/array/replace_spec.rb +0 -7
  574. data/spec/rubyspec/core/array/reverse_each_spec.rb +0 -37
  575. data/spec/rubyspec/core/array/reverse_spec.rb +0 -58
  576. data/spec/rubyspec/core/array/rindex_spec.rb +0 -71
  577. data/spec/rubyspec/core/array/select_spec.rb +0 -36
  578. data/spec/rubyspec/core/array/shared/collect.rb +0 -7
  579. data/spec/rubyspec/core/array/shared/enumeratorize.rb +0 -12
  580. data/spec/rubyspec/core/array/shared/eql.rb +0 -95
  581. data/spec/rubyspec/core/array/shared/index.rb +0 -37
  582. data/spec/rubyspec/core/array/shared/inspect.rb +0 -3
  583. data/spec/rubyspec/core/array/shared/join.rb +0 -7
  584. data/spec/rubyspec/core/array/shared/keep_if.rb +0 -3
  585. data/spec/rubyspec/core/array/shared/length.rb +0 -3
  586. data/spec/rubyspec/core/array/shared/replace.rb +0 -3
  587. data/spec/rubyspec/core/array/shared/slice.rb +0 -3
  588. data/spec/rubyspec/core/array/shift_spec.rb +0 -160
  589. data/spec/rubyspec/core/array/shuffle_spec.rb +0 -87
  590. data/spec/rubyspec/core/array/size_spec.rb +0 -7
  591. data/spec/rubyspec/core/array/slice_spec.rb +0 -166
  592. data/spec/rubyspec/core/array/sort_spec.rb +0 -271
  593. data/spec/rubyspec/core/array/take_spec.rb +0 -29
  594. data/spec/rubyspec/core/array/take_while_spec.rb +0 -17
  595. data/spec/rubyspec/core/array/to_a_spec.rb +0 -24
  596. data/spec/rubyspec/core/array/to_ary_spec.rb +0 -20
  597. data/spec/rubyspec/core/array/try_convert_spec.rb +0 -52
  598. data/spec/rubyspec/core/array/uniq_spec.rb +0 -167
  599. data/spec/rubyspec/core/array/unshift_spec.rb +0 -64
  600. data/spec/rubyspec/core/array/zip_spec.rb +0 -55
  601. data/spec/rubyspec/core/class/fixtures/classes.rb +0 -9
  602. data/spec/rubyspec/core/class/new_spec.rb +0 -113
  603. data/spec/rubyspec/core/enumerable/all_spec.rb +0 -130
  604. data/spec/rubyspec/core/enumerable/any_spec.rb +0 -150
  605. data/spec/rubyspec/core/enumerable/collect_spec.rb +0 -39
  606. data/spec/rubyspec/core/enumerable/count_spec.rb +0 -45
  607. data/spec/rubyspec/core/enumerable/detect_spec.rb +0 -48
  608. data/spec/rubyspec/core/enumerable/drop_spec.rb +0 -20
  609. data/spec/rubyspec/core/enumerable/drop_while_spec.rb +0 -18
  610. data/spec/rubyspec/core/enumerable/each_slice_spec.rb +0 -25
  611. data/spec/rubyspec/core/enumerable/each_with_index_spec.rb +0 -14
  612. data/spec/rubyspec/core/enumerable/each_with_object_spec.rb +0 -20
  613. data/spec/rubyspec/core/enumerable/entries_spec.rb +0 -9
  614. data/spec/rubyspec/core/enumerable/find_all_spec.rb +0 -16
  615. data/spec/rubyspec/core/enumerable/find_index_spec.rb +0 -44
  616. data/spec/rubyspec/core/enumerable/find_spec.rb +0 -56
  617. data/spec/rubyspec/core/enumerable/first_spec.rb +0 -43
  618. data/spec/rubyspec/core/enumerable/fixtures/classes.rb +0 -240
  619. data/spec/rubyspec/core/enumerable/grep_spec.rb +0 -24
  620. data/spec/rubyspec/core/enumerable/group_by_spec.rb +0 -16
  621. data/spec/rubyspec/core/enumerable/none_spec.rb +0 -68
  622. data/spec/rubyspec/core/enumerable/select_spec.rb +0 -16
  623. data/spec/rubyspec/core/enumerable/sort_by_spec.rb +0 -31
  624. data/spec/rubyspec/core/enumerable/take_spec.rb +0 -43
  625. data/spec/rubyspec/core/enumerable/to_a_spec.rb +0 -9
  626. data/spec/rubyspec/core/enumerator/each_spec.rb +0 -11
  627. data/spec/rubyspec/core/enumerator/new_spec.rb +0 -17
  628. data/spec/rubyspec/core/enumerator/next_spec.rb +0 -25
  629. data/spec/rubyspec/core/enumerator/rewind_spec.rb +0 -28
  630. data/spec/rubyspec/core/false/and_spec.rb +0 -11
  631. data/spec/rubyspec/core/false/inspect_spec.rb +0 -7
  632. data/spec/rubyspec/core/false/or_spec.rb +0 -11
  633. data/spec/rubyspec/core/false/to_s_spec.rb +0 -7
  634. data/spec/rubyspec/core/false/xor_spec.rb +0 -11
  635. data/spec/rubyspec/core/hash/allocate_spec.rb +0 -13
  636. data/spec/rubyspec/core/hash/assoc_spec.rb +0 -25
  637. data/spec/rubyspec/core/hash/clear_spec.rb +0 -19
  638. data/spec/rubyspec/core/hash/clone_spec.rb +0 -10
  639. data/spec/rubyspec/core/hash/constructor_spec.rb +0 -13
  640. data/spec/rubyspec/core/hash/default_proc_spec.rb +0 -20
  641. data/spec/rubyspec/core/hash/default_spec.rb +0 -17
  642. data/spec/rubyspec/core/hash/delete_if_spec.rb +0 -13
  643. data/spec/rubyspec/core/hash/delete_spec.rb +0 -11
  644. data/spec/rubyspec/core/hash/dup_spec.rb +0 -10
  645. data/spec/rubyspec/core/hash/each_key_spec.rb +0 -15
  646. data/spec/rubyspec/core/hash/each_pair_spec.rb +0 -30
  647. data/spec/rubyspec/core/hash/each_spec.rb +0 -36
  648. data/spec/rubyspec/core/hash/each_value_spec.rb +0 -15
  649. data/spec/rubyspec/core/hash/element_reference_spec.rb +0 -41
  650. data/spec/rubyspec/core/hash/element_set_spec.rb +0 -7
  651. data/spec/rubyspec/core/hash/empty_spec.rb +0 -10
  652. data/spec/rubyspec/core/hash/fetch_spec.rb +0 -24
  653. data/spec/rubyspec/core/hash/flatten_spec.rb +0 -46
  654. data/spec/rubyspec/core/hash/has_key_spec.rb +0 -24
  655. data/spec/rubyspec/core/hash/has_value_spec.rb +0 -12
  656. data/spec/rubyspec/core/hash/include_spec.rb +0 -24
  657. data/spec/rubyspec/core/hash/index_spec.rb +0 -13
  658. data/spec/rubyspec/core/hash/indexes_spec.rb +0 -9
  659. data/spec/rubyspec/core/hash/indices_spec.rb +0 -9
  660. data/spec/rubyspec/core/hash/invert_spec.rb +0 -12
  661. data/spec/rubyspec/core/hash/keep_if_spec.rb +0 -18
  662. data/spec/rubyspec/core/hash/key_spec.rb +0 -24
  663. data/spec/rubyspec/core/hash/keys_spec.rb +0 -10
  664. data/spec/rubyspec/core/hash/length_spec.rb +0 -10
  665. data/spec/rubyspec/core/hash/member_spec.rb +0 -24
  666. data/spec/rubyspec/core/hash/merge_spec.rb +0 -37
  667. data/spec/rubyspec/core/hash/new_spec.rb +0 -19
  668. data/spec/rubyspec/core/hash/rassoc_spec.rb +0 -34
  669. data/spec/rubyspec/core/hash/reject_spec.rb +0 -18
  670. data/spec/rubyspec/core/hash/replace_spec.rb +0 -7
  671. data/spec/rubyspec/core/hash/select_spec.rb +0 -52
  672. data/spec/rubyspec/core/hash/shift_spec.rb +0 -19
  673. data/spec/rubyspec/core/hash/size_spec.rb +0 -10
  674. data/spec/rubyspec/core/hash/to_a_spec.rb +0 -13
  675. data/spec/rubyspec/core/hash/to_json_spec.rb +0 -11
  676. data/spec/rubyspec/core/hash/update_spec.rb +0 -17
  677. data/spec/rubyspec/core/hash/value_spec.rb +0 -12
  678. data/spec/rubyspec/core/hash/values_at_spec.rb +0 -9
  679. data/spec/rubyspec/core/hash/values_spec.rb +0 -7
  680. data/spec/rubyspec/core/kernel/eql_spec.rb +0 -15
  681. data/spec/rubyspec/core/kernel/equal_spec.rb +0 -12
  682. data/spec/rubyspec/core/kernel/tap_spec.rb +0 -10
  683. data/spec/rubyspec/core/kernel/to_s_spec.rb +0 -5
  684. data/spec/rubyspec/core/matchdata/to_a_spec.rb +0 -5
  685. data/spec/rubyspec/core/nil/and_spec.rb +0 -11
  686. data/spec/rubyspec/core/nil/dup_spec.rb +0 -7
  687. data/spec/rubyspec/core/nil/inspect_spec.rb +0 -7
  688. data/spec/rubyspec/core/nil/nil_spec.rb +0 -7
  689. data/spec/rubyspec/core/nil/or_spec.rb +0 -11
  690. data/spec/rubyspec/core/nil/to_a_spec.rb +0 -7
  691. data/spec/rubyspec/core/nil/to_f_spec.rb +0 -11
  692. data/spec/rubyspec/core/nil/to_h_spec.rb +0 -10
  693. data/spec/rubyspec/core/nil/to_i_spec.rb +0 -11
  694. data/spec/rubyspec/core/nil/to_s_spec.rb +0 -7
  695. data/spec/rubyspec/core/nil/xor_spec.rb +0 -11
  696. data/spec/rubyspec/core/numeric/to_s_spec.rb +0 -8
  697. data/spec/rubyspec/core/range/begin_spec.rb +0 -9
  698. data/spec/rubyspec/core/range/case_compare_spec.rb +0 -15
  699. data/spec/rubyspec/core/range/end_spec.rb +0 -9
  700. data/spec/rubyspec/core/regexp/match_spec.rb +0 -95
  701. data/spec/rubyspec/core/string/capitalize_spec.rb +0 -10
  702. data/spec/rubyspec/core/string/casecmp_spec.rb +0 -16
  703. data/spec/rubyspec/core/string/center_spec.rb +0 -49
  704. data/spec/rubyspec/core/string/chomp_spec.rb +0 -48
  705. data/spec/rubyspec/core/string/downcase_spec.rb +0 -6
  706. data/spec/rubyspec/core/string/empty_spec.rb +0 -7
  707. data/spec/rubyspec/core/string/end_with_spec.rb +0 -16
  708. data/spec/rubyspec/core/string/include_spec.rb +0 -6
  709. data/spec/rubyspec/core/string/index_spec.rb +0 -405
  710. data/spec/rubyspec/core/string/intern_spec.rb +0 -9
  711. data/spec/rubyspec/core/string/length_spec.rb +0 -9
  712. data/spec/rubyspec/core/string/reverse_spec.rb +0 -7
  713. data/spec/rubyspec/core/string/size_spec.rb +0 -9
  714. data/spec/rubyspec/core/string/start_with_spec.rb +0 -12
  715. data/spec/rubyspec/core/string/swapcase_spec.rb +0 -13
  716. data/spec/rubyspec/core/string/to_a_spec.rb +0 -9
  717. data/spec/rubyspec/core/string/to_s_spec.rb +0 -6
  718. data/spec/rubyspec/core/string/to_str_spec.rb +0 -6
  719. data/spec/rubyspec/core/string/to_sym_spec.rb +0 -9
  720. data/spec/rubyspec/core/string/upcase_spec.rb +0 -6
  721. data/spec/rubyspec/core/struct/fixtures/classes.rb +0 -26
  722. data/spec/rubyspec/core/struct/initialize_spec.rb +0 -11
  723. data/spec/rubyspec/core/struct/new_spec.rb +0 -24
  724. data/spec/rubyspec/core/symbol/to_proc_spec.rb +0 -12
  725. data/spec/rubyspec/core/time/at_spec.rb +0 -7
  726. data/spec/rubyspec/core/time/day_spec.rb +0 -5
  727. data/spec/rubyspec/core/time/friday_spec.rb +0 -9
  728. data/spec/rubyspec/core/time/hour_spec.rb +0 -5
  729. data/spec/rubyspec/core/time/min_spec.rb +0 -5
  730. data/spec/rubyspec/core/time/monday_spec.rb +0 -9
  731. data/spec/rubyspec/core/time/month_spec.rb +0 -5
  732. data/spec/rubyspec/core/time/now_spec.rb +0 -5
  733. data/spec/rubyspec/core/time/saturday_spec.rb +0 -9
  734. data/spec/rubyspec/core/true/and_spec.rb +0 -11
  735. data/spec/rubyspec/core/true/inspect_spec.rb +0 -7
  736. data/spec/rubyspec/core/true/or_spec.rb +0 -11
  737. data/spec/rubyspec/core/true/to_s_spec.rb +0 -7
  738. data/spec/rubyspec/core/true/xor_spec.rb +0 -11
  739. data/spec/rubyspec/language/alias_spec.rb +0 -160
  740. data/spec/rubyspec/language/and_spec.rb +0 -66
  741. data/spec/rubyspec/language/array_spec.rb +0 -117
  742. data/spec/rubyspec/language/break_spec.rb +0 -332
  743. data/spec/rubyspec/language/case_spec.rb +0 -310
  744. data/spec/rubyspec/language/class_spec.rb +0 -190
  745. data/spec/rubyspec/language/class_variable_spec.rb +0 -56
  746. data/spec/rubyspec/language/def_spec.rb +0 -551
  747. data/spec/rubyspec/language/defined_spec.rb +0 -107
  748. data/spec/rubyspec/language/ensure_spec.rb +0 -104
  749. data/spec/rubyspec/language/execution_spec.rb +0 -15
  750. data/spec/rubyspec/language/for_spec.rb +0 -192
  751. data/spec/rubyspec/language/hash_spec.rb +0 -65
  752. data/spec/rubyspec/language/if_spec.rb +0 -356
  753. data/spec/rubyspec/language/literal_lambda_spec.rb +0 -1
  754. data/spec/rubyspec/language/loop_spec.rb +0 -67
  755. data/spec/rubyspec/language/metaclass_spec.rb +0 -159
  756. data/spec/rubyspec/language/module_spec.rb +0 -56
  757. data/spec/rubyspec/language/next_spec.rb +0 -469
  758. data/spec/rubyspec/language/not_spec.rb +0 -55
  759. data/spec/rubyspec/language/or_spec.rb +0 -90
  760. data/spec/rubyspec/language/order_spec.rb +0 -77
  761. data/spec/rubyspec/language/precedence_spec.rb +0 -483
  762. data/spec/rubyspec/language/redo_spec.rb +0 -65
  763. data/spec/rubyspec/language/rescue_spec.rb +0 -121
  764. data/spec/rubyspec/language/retry_spec.rb +0 -56
  765. data/spec/rubyspec/language/return_spec.rb +0 -281
  766. data/spec/rubyspec/language/singleton_class_spec.rb +0 -32
  767. data/spec/rubyspec/language/super_spec.rb +0 -284
  768. data/spec/rubyspec/language/undef_spec.rb +0 -16
  769. data/spec/rubyspec/language/unless_spec.rb +0 -45
  770. data/spec/rubyspec/language/until_spec.rb +0 -234
  771. data/spec/rubyspec/language/while_spec.rb +0 -238
  772. data/spec/rubyspec/language/yield_spec.rb +0 -128
  773. data/spec/rubyspec/library/date/new_spec.rb +0 -10
  774. data/spec/rubyspec/library/date/to_s_spec.rb +0 -7
  775. data/spec/rubyspec/library/date/today_spec.rb +0 -7
  776. data/spec/rubyspec/library/erb/util/html_escape_spec.rb +0 -10
  777. data/spec/rubyspec/library/observer/add_observer_spec.rb +0 -31
  778. data/spec/rubyspec/library/observer/count_observers_spec.rb +0 -33
  779. data/spec/rubyspec/library/observer/delete_observer_spec.rb +0 -19
  780. data/spec/rubyspec/library/observer/delete_observers_spec.rb +0 -19
  781. data/spec/rubyspec/library/observer/fixtures/classes.rb +0 -25
  782. data/spec/rubyspec/library/observer/notify_observers_spec.rb +0 -31
  783. data/spec/rubyspec/library/rbconfig/config_spec.rb +0 -47
  784. data/spec/rubyspec/library/singleton/clone_spec.rb +0 -8
  785. data/spec/rubyspec/library/singleton/dup_spec.rb +0 -8
  786. data/spec/rubyspec/library/singleton/fixtures/classes.rb +0 -18
  787. data/spec/rubyspec/library/singleton/instance_spec.rb +0 -30
  788. data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +0 -29
  789. data/spec/rubyspec/library/stringscanner/pos_spec.rb +0 -20
  790. data/spec/rubyspec/spec_helper.rb +0 -96
  791. data/stdlib/fileutils.rb +0 -0
  792. data/stdlib/iconv.rb +0 -0
  793. data/stdlib/opal-browser/local_storage.rb +0 -27
  794. data/stdlib/opal-browser/script_loader.rb +0 -35
  795. data/stdlib/opal-parser.js.erb +0 -13
  796. data/stdlib/yaml.rb +0 -0
@@ -3,20 +3,26 @@ class BasicObject
3
3
  end
4
4
 
5
5
  def ==(other)
6
- `#{self} === other`
6
+ `self === other`
7
7
  end
8
8
 
9
9
  def __send__(symbol, *args, &block)
10
10
  %x{
11
- var func = #{self}['$' + symbol]
11
+ var func = self['$' + symbol]
12
12
 
13
13
  if (func) {
14
- if (block !== nil) { func._p = block; }
15
- return func.apply(#{self}, args);
14
+ if (block !== nil) {
15
+ func._p = block;
16
+ }
17
+
18
+ return func.apply(self, args);
19
+ }
20
+
21
+ if (block !== nil) {
22
+ self.$method_missing._p = block;
16
23
  }
17
24
 
18
- if (block !== nil) { #{self}.$method_missing._p = block; }
19
- return #{self}.$method_missing.apply(#{self}, [symbol].concat(args));
25
+ return self.$method_missing.apply(self, [symbol].concat(args));
20
26
  }
21
27
  end
22
28
 
@@ -24,15 +30,14 @@ class BasicObject
24
30
  alias equal? ==
25
31
 
26
32
  def instance_eval(&block)
27
- %x{
28
- if (block === nil) {
29
- throw new Error("no block given");
30
- }
33
+ Kernel.raise ArgumentError, "no block given" unless block
31
34
 
32
- var block_self = block._s, result;
35
+ %x{
36
+ var block_self = block._s,
37
+ result;
33
38
 
34
39
  block._s = null;
35
- result = block.call(#{self}, #{self});
40
+ result = block.call(self, self);
36
41
  block._s = block_self;
37
42
 
38
43
  return result;
@@ -40,15 +45,14 @@ class BasicObject
40
45
  end
41
46
 
42
47
  def instance_exec(*args, &block)
43
- %x{
44
- if (block === nil) {
45
- throw new Error("no block given");
46
- }
48
+ Kernel.raise ArgumentError, "no block given" unless block
47
49
 
48
- var block_self = block._s, result;
50
+ %x{
51
+ var block_self = block._s,
52
+ result;
49
53
 
50
54
  block._s = null;
51
- result = block.apply(#{self}, args);
55
+ result = block.apply(self, args);
52
56
  block._s = block_self;
53
57
 
54
58
  return result;
@@ -1,32 +1,41 @@
1
1
  class Boolean
2
2
  `def._isBoolean = true`
3
3
 
4
+ class << self
5
+ undef_method :new
6
+ end
7
+
4
8
  def &(other)
5
- `(#{self} == true) ? (other !== false && other !== nil) : false`
9
+ `(self == true) ? (other !== false && other !== nil) : false`
6
10
  end
7
11
 
8
12
  def |(other)
9
- `(#{self} == true) ? true : (other !== false && other !== nil)`
13
+ `(self == true) ? true : (other !== false && other !== nil)`
10
14
  end
11
15
 
12
16
  def ^(other)
13
- `(#{self} == true) ? (other === false || other === nil) : (other !== false && other !== nil)`
17
+ `(self == true) ? (other === false || other === nil) : (other !== false && other !== nil)`
14
18
  end
15
19
 
16
20
  def ==(other)
17
- `(#{self} == true) === other.valueOf()`
21
+ `(self == true) === other.valueOf()`
18
22
  end
19
23
 
24
+ alias equal? ==
25
+
20
26
  alias singleton_class class
21
27
 
22
28
  def to_s
23
- `(#{self} == true) ? 'true' : 'false'`
29
+ `(self == true) ? 'true' : 'false'`
24
30
  end
25
31
 
26
32
  def to_n
27
- `#{self}.valueOf()`
33
+ `self.valueOf()`
28
34
  end
29
35
  end
30
36
 
31
37
  TrueClass = Boolean
32
38
  FalseClass = Boolean
39
+
40
+ TRUE = true
41
+ FALSE = false
@@ -1,10 +1,17 @@
1
1
  class Class
2
2
  def self.new(sup = Object, &block)
3
3
  %x{
4
+ if (!sup._isClass || sup.__mod__) {
5
+ #{raise TypeError, "superclass must be a Class"};
6
+ }
7
+
4
8
  function AnonClass(){};
5
- var klass = Opal.boot(sup, AnonClass)
6
- klass._name = nil;
7
- klass._scope = sup._scope;
9
+ var klass = Opal.boot(sup, AnonClass)
10
+ klass._name = nil;
11
+ klass.__parent = sup;
12
+
13
+ // inherit scope from parent
14
+ $opal.create_scope(sup._scope, klass);
8
15
 
9
16
  sup.$inherited(klass);
10
17
 
@@ -21,7 +28,7 @@ class Class
21
28
 
22
29
  def allocate
23
30
  %x{
24
- var obj = new #{self}._alloc;
31
+ var obj = new self._alloc;
25
32
  obj._id = Opal.uid();
26
33
  return obj;
27
34
  }
@@ -33,7 +40,6 @@ class Class
33
40
  def new(*args, &block)
34
41
  %x{
35
42
  var obj = #{allocate};
36
- obj._id = Opal.uid();
37
43
 
38
44
  obj.$initialize._p = block;
39
45
  obj.$initialize.apply(obj, args);
@@ -42,6 +48,6 @@ class Class
42
48
  end
43
49
 
44
50
  def superclass
45
- `#{self}._super || nil`
51
+ `self._super || nil`
46
52
  end
47
53
  end
@@ -1,25 +1,56 @@
1
1
  module Comparable
2
- def <(other)
3
- (self <=> other) == -1
4
- end
2
+ def self.normalize(what)
3
+ return what if Integer === what
5
4
 
6
- def <=(other)
7
- (self <=> other) <= 0
5
+ return 1 if what > 0
6
+ return -1 if what < 0
7
+ return 0
8
8
  end
9
9
 
10
10
  def ==(other)
11
- (self <=> other) == 0
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
12
17
  end
13
18
 
14
19
  def >(other)
15
- (self <=> other) == 1
20
+ unless cmp = (self <=> other)
21
+ raise ArgumentError, "comparison of #{self.class} with #{other.class} failed"
22
+ end
23
+
24
+ Comparable.normalize(cmp) > 0
16
25
  end
17
26
 
18
27
  def >=(other)
19
- (self <=> other) >= 0
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
20
49
  end
21
50
 
22
51
  def between?(min, max)
23
- self > min && self < max
52
+ return false if self < min
53
+ return false if self > max
54
+ return true
24
55
  end
25
56
  end
@@ -0,0 +1,164 @@
1
+ class Encoding
2
+ def self.register(name, options = {}, &block)
3
+ names = [name] + (options[:aliases] || [])
4
+ encoding = Class.new(self, &block).
5
+ new(name, names, options[:ascii] || false, options[:dummy] || false)
6
+
7
+ names.each {|name|
8
+ const_set name.sub('-', '_'), encoding
9
+ }
10
+ end
11
+
12
+ def self.find(name)
13
+ return name if self === name
14
+
15
+ constants.each {|const|
16
+ encoding = const_get(const)
17
+
18
+ if encoding.name == name || encoding.names.include?(name)
19
+ return encoding
20
+ end
21
+ }
22
+
23
+ raise ArgumentError, "unknown encoding name - #{name}"
24
+ end
25
+
26
+ class << self
27
+ attr_accessor :default_external
28
+ end
29
+
30
+ attr_reader :name, :names
31
+
32
+ def initialize(name, names, ascii, dummy)
33
+ @name = name
34
+ @names = names
35
+ @ascii = ascii
36
+ @dummy = dummy
37
+ end
38
+
39
+ def ascii_compatible?
40
+ @ascii
41
+ end
42
+
43
+ def dummy?
44
+ @dummy
45
+ end
46
+
47
+ def to_s
48
+ @name
49
+ end
50
+
51
+ def inspect
52
+ "#<Encoding:#{@name}#{" (dummy)" if @dummy}>"
53
+ end
54
+
55
+ # methods to implement per encoding
56
+ def each_byte(*)
57
+ raise NotImplementedError
58
+ end
59
+
60
+ def getbyte(*)
61
+ raise NotImplementedError
62
+ end
63
+
64
+ def bytesize(*)
65
+ raise NotImplementedError
66
+ end
67
+ end
68
+
69
+ Encoding.register "UTF-8", aliases: ["CP65001"], ascii: true do
70
+ def each_byte(string, &block)
71
+ %x{
72
+ for (var i = 0, length = string.length; i < length; i++) {
73
+ var code = string.charCodeAt(i);
74
+
75
+ if (code <= 0x7f) {
76
+ #{yield `code`};
77
+ }
78
+ else {
79
+ var encoded = encodeURIComponent(string.charAt(i)).substr(1).split('%');
80
+
81
+ for (var j = 0, encoded_length = encoded.length; j < encoded_length; j++) {
82
+ #{yield `parseInt(encoded[j], 16)`};
83
+ }
84
+ }
85
+ }
86
+ }
87
+ end
88
+
89
+ def bytesize
90
+ bytes.length
91
+ end
92
+ end
93
+
94
+ Encoding.register "UTF-16LE" do
95
+ def each_byte(string, &block)
96
+ %x{
97
+ for (var i = 0, length = string.length; i < length; i++) {
98
+ var code = string.charCodeAt(i);
99
+
100
+ #{yield `code & 0xff`};
101
+ #{yield `code >> 8`};
102
+ }
103
+ }
104
+ end
105
+
106
+ def bytesize
107
+ bytes.length
108
+ end
109
+ end
110
+
111
+ Encoding.register "ASCII-8BIT", aliases: ["BINARY"], ascii: true do
112
+ def each_byte(string, &block)
113
+ %x{
114
+ for (var i = 0, length = string.length; i < length; i++) {
115
+ #{yield `string.charCodeAt(i) & 0xff`};
116
+ }
117
+ }
118
+ end
119
+
120
+ def bytesize
121
+ bytes.length
122
+ end
123
+ end
124
+
125
+ class String
126
+ `def.encoding = #{Encoding::UTF_16LE}`
127
+
128
+ def bytes
129
+ each_byte.to_a
130
+ end
131
+
132
+ def bytesize
133
+ @encoding.bytesize(self)
134
+ end
135
+
136
+ def each_byte(&block)
137
+ return enum_for :each_byte unless block_given?
138
+
139
+ @encoding.each_byte(self, &block)
140
+
141
+ self
142
+ end
143
+
144
+ def encoding
145
+ @encoding
146
+ end
147
+
148
+ def force_encoding(encoding)
149
+ encoding = Encoding.find(encoding)
150
+
151
+ return self if encoding == @encoding
152
+
153
+ %x{
154
+ var result = new native_string(self);
155
+ result.encoding = encoding;
156
+
157
+ return result;
158
+ }
159
+ end
160
+
161
+ def getbyte(idx)
162
+ @encoding.getbyte(self, idx)
163
+ end
164
+ end
@@ -1,38 +1,33 @@
1
1
  module Enumerable
2
2
  def all?(&block)
3
3
  %x{
4
- var result = true, proc;
4
+ var result = true;
5
5
 
6
6
  if (block !== nil) {
7
- proc = function(obj) {
8
- var value;
9
- var args = $slice.call(arguments);
7
+ self.$each._p = function() {
8
+ var value = $opal.$yieldX(block, arguments);
10
9
 
11
- if ((value = block.apply(#{self}, args)) === $breaker) {
12
- return $breaker.$v;
10
+ if (value === $breaker) {
11
+ result = $breaker.$v;
12
+ return $breaker;
13
13
  }
14
14
 
15
- if (value === false || value === nil) {
15
+ if (#{Opal.falsy?(`value`)}) {
16
16
  result = false;
17
- $breaker.$v = nil;
18
-
19
17
  return $breaker;
20
18
  }
21
19
  }
22
20
  }
23
21
  else {
24
- proc = function(obj) {
25
- if ((obj === false || obj === nil) && arguments.length < 2) {
26
- result = false;
27
- $breaker.$v = nil;
28
-
22
+ self.$each._p = function(obj) {
23
+ if (arguments.length == 1 && #{Opal.falsy?(`obj`)}) {
24
+ result = false;
29
25
  return $breaker;
30
26
  }
31
27
  }
32
28
  }
33
29
 
34
- #{self}.$each._p = proc;
35
- #{self}.$each();
30
+ self.$each();
36
31
 
37
32
  return result;
38
33
  }
@@ -40,38 +35,33 @@ module Enumerable
40
35
 
41
36
  def any?(&block)
42
37
  %x{
43
- var result = false, proc;
38
+ var result = false;
44
39
 
45
40
  if (block !== nil) {
46
- proc = function(obj) {
47
- var value;
48
- var args = $slice.call(arguments);
41
+ self.$each._p = function() {
42
+ var value = $opal.$yieldX(block, arguments);
49
43
 
50
- if ((value = block.apply(#{self}, args)) === $breaker) {
51
- return $breaker.$v;
44
+ if (value === $breaker) {
45
+ result = $breaker.$v;
46
+ return $breaker;
52
47
  }
53
48
 
54
- if (value !== false && value !== nil) {
55
- result = true;
56
- $breaker.$v = nil;
57
-
49
+ if (#{Opal.truthy?(`value`)}) {
50
+ result = true;
58
51
  return $breaker;
59
52
  }
60
- }
53
+ };
61
54
  }
62
55
  else {
63
- proc = function(obj) {
64
- if ((obj !== false && obj !== nil) || arguments.length >= 2) {
65
- result = true;
66
- $breaker.$v = nil;
67
-
56
+ self.$each._p = function(obj) {
57
+ if (arguments.length != 1 || #{Opal.truthy?(`obj`)}) {
58
+ result = true;
68
59
  return $breaker;
69
60
  }
70
61
  }
71
62
  }
72
63
 
73
- #{self}.$each._p = proc;
74
- #{self}.$each();
64
+ self.$each();
75
65
 
76
66
  return result;
77
67
  }
@@ -83,42 +73,18 @@ module Enumerable
83
73
  %x{
84
74
  var result = [];
85
75
 
86
- var proc = function() {
87
- var value, args = $slice.call(arguments);
88
-
89
- if ((value = block.apply(null, arguments)) === $breaker) {
90
- return $breaker.$v;
91
- }
92
-
93
- result.push(value);
94
- };
95
-
96
- #{self}.$each._p = proc;
97
- #{self}.$each();
76
+ self.$each._p = function() {
77
+ var value = $opal.$yieldX(block, arguments);
98
78
 
99
- return result;
100
- }
101
- end
102
-
103
- def reduce(object = undefined, &block)
104
- %x{
105
- var result = #{object} == undefined ? 0 : #{object};
106
-
107
- var proc = function() {
108
- var obj = $slice.call(arguments), value;
109
-
110
- if ((value = block.apply(nil, [result].concat(obj))) === $breaker) {
79
+ if (value === $breaker) {
111
80
  result = $breaker.$v;
112
- $breaker.$v = nil;
113
-
114
81
  return $breaker;
115
82
  }
116
83
 
117
- result = value;
84
+ result.push(value);
118
85
  };
119
86
 
120
- #{self}.$each._p = proc;
121
- #{self}.$each();
87
+ self.$each();
122
88
 
123
89
  return result;
124
90
  }
@@ -130,196 +96,226 @@ module Enumerable
130
96
 
131
97
  if (object != null) {
132
98
  block = function() {
133
- var param = arguments.length == 1 ?
134
- arguments[0] : $slice.call(arguments);
135
-
136
- return #{ `param` == `object` };
99
+ return #{Opal.destructure(`arguments`) == `object`};
137
100
  };
138
101
  }
139
102
  else if (block === nil) {
140
103
  block = function() { return true; };
141
104
  }
142
105
 
143
- var proc = function() {
144
- var value, param = $slice.call(arguments);
106
+ self.$each._p = function() {
107
+ var value = $opal.$yieldX(block, arguments);
145
108
 
146
- if ((value = block.apply(null, param)) === $breaker) {
147
- return $breaker.$v;
109
+ if (value === $breaker) {
110
+ result = $breaker.$v;
111
+ return $breaker;
148
112
  }
149
113
 
150
- if (value !== false && value !== nil) {
114
+ if (#{Opal.truthy?(`value`)}) {
151
115
  result++;
152
116
  }
153
117
  }
154
118
 
155
- #{self}.$each._p = proc;
156
- #{self}.$each();
119
+ self.$each();
157
120
 
158
121
  return result;
159
122
  }
160
123
  end
161
124
 
162
125
  def detect(ifnone = undefined, &block)
126
+ return enum_for :detect, ifnone unless block_given?
127
+
163
128
  %x{
164
- var result = nil;
129
+ var result = undefined;
165
130
 
166
- #{self}.$each._p = function() {
167
- var value;
168
- var param = arguments.length == 1 ?
169
- arguments[0] : $slice.call(arguments);
131
+ self.$each._p = function() {
132
+ var params = #{Opal.destructure(`arguments`)},
133
+ value = $opal.$yield1(block, params);
170
134
 
171
- if ((value = block(param)) === $breaker) {
172
- return $breaker.$v;
135
+ if (value === $breaker) {
136
+ result = $breaker.$v;
137
+ return $breaker;
173
138
  }
174
139
 
175
- if (value !== false && value !== nil) {
176
- result = param;
177
- $breaker.$v = nil;
178
-
140
+ if (#{Opal.truthy?(`value`)}) {
141
+ result = params;
179
142
  return $breaker;
180
143
  }
181
144
  };
182
145
 
183
- #{self}.$each();
146
+ self.$each();
184
147
 
185
- if (result !== nil) {
186
- return result;
187
- }
188
-
189
- if (typeof(ifnone) === 'function') {
190
- return #{ifnone.call};
148
+ if (result === undefined && ifnone !== undefined) {
149
+ if (typeof(ifnone) === 'function') {
150
+ result = ifnone();
151
+ }
152
+ else {
153
+ result = ifnone;
154
+ }
191
155
  }
192
156
 
193
- return ifnone == null ? nil : ifnone;
157
+ return result === undefined ? nil : result;
194
158
  }
195
159
  end
196
160
 
197
161
  def drop(number)
162
+ number = Opal.coerce_to number, Integer, :to_int
163
+
164
+ if `number < 0`
165
+ raise ArgumentError, "attempt to drop negative size"
166
+ end
167
+
198
168
  %x{
199
169
  var result = [],
200
170
  current = 0;
201
171
 
202
- #{self}.$each._p = function() {
172
+ self.$each._p = function() {
203
173
  if (number < current) {
204
- result.push(e);
174
+ result.push(#{Opal.destructure(`arguments`)});
205
175
  }
206
176
 
207
177
  current++;
208
178
  };
209
179
 
210
- #{self}.$each()
180
+ self.$each()
211
181
 
212
182
  return result;
213
183
  }
214
184
  end
215
185
 
216
186
  def drop_while(&block)
187
+ return enum_for :drop_while unless block_given?
188
+
217
189
  %x{
218
190
  var result = [];
219
191
 
220
- #{self}.$each._p = function() {
221
- var value;
222
- var param = arguments.length == 1 ?
223
- arguments[0] : $slice.call(arguments);
192
+ self.$each._p = function() {
193
+ var param = #{Opal.destructure(`arguments`)},
194
+ value = $opal.$yield1(block, param);
224
195
 
225
- if ((value = block(param)) === $breaker) {
196
+ if (value === $breaker) {
197
+ result = $breaker.$v;
226
198
  return $breaker;
227
199
  }
228
200
 
229
- if (value === false || value === nil) {
230
- result.push(param);
231
- return value;
201
+ if (#{Opal.truthy?(`value`)}) {
202
+ return;
232
203
  }
233
204
 
234
- return $breaker;
205
+ result.push(param);
235
206
  };
236
207
 
237
- #{self}.$each();
208
+ self.$each();
238
209
 
239
210
  return result;
240
211
  }
241
212
  end
242
213
 
243
214
  def each_slice(n, &block)
215
+ n = Opal.coerce_to n, Integer, :to_int
216
+
217
+ return enum_for :each_slice, n unless block_given?
218
+
244
219
  %x{
245
- var all = [];
220
+ var result,
221
+ slice = []
246
222
 
247
- #{self}.$each._p = function() {
248
- var param = arguments.length == 1 ?
249
- arguments[0] : $slice.call(arguments);
223
+ self.$each._p = function() {
224
+ var param = #{Opal.destructure(`arguments`)};
250
225
 
251
- all.push(param);
226
+ slice.push(param);
227
+
228
+ if (slice.length === n) {
229
+ if (block(slice) === $breaker) {
230
+ result = $breaker.$v;
231
+ return $breaker;
232
+ }
252
233
 
253
- if (all.length == n) {
254
- block(all.slice(0));
255
- all = [];
234
+ slice = [];
256
235
  }
257
236
  };
258
237
 
259
- #{self}.$each();
238
+ self.$each();
260
239
 
261
- // our "last" group, if smaller than n then wont have been yielded
262
- if (all.length > 0) {
263
- block(all.slice(0));
240
+ if (result !== undefined) {
241
+ return result;
264
242
  }
265
243
 
266
- return nil;
244
+ // our "last" group, if smaller than n then won't have been yielded
245
+ if (slice.length > 0) {
246
+ if (block(slice) === $breaker) {
247
+ return $breaker.$v;
248
+ }
249
+ }
267
250
  }
251
+
252
+ nil
268
253
  end
269
254
 
270
255
  def each_with_index(&block)
256
+ return enum_for :each_with_index unless block_given?
257
+
271
258
  %x{
272
- var index = 0;
259
+ var result,
260
+ index = 0;
273
261
 
274
- #{self}.$each._p = function() {
275
- var value;
276
- var param = arguments.length == 1 ?
277
- arguments[0] : $slice.call(arguments);
262
+ self.$each._p = function() {
263
+ var param = #{Opal.destructure(`arguments`)},
264
+ value = block(param, index);
278
265
 
279
- if ((value = block(param, index)) === $breaker) {
280
- return $breaker.$v;
266
+ if (value === $breaker) {
267
+ result = $breaker.$v;
268
+ return $breaker;
281
269
  }
282
270
 
283
271
  index++;
284
272
  };
285
- #{self}.$each();
286
273
 
287
- return nil;
274
+ self.$each();
275
+
276
+ if (result !== undefined) {
277
+ return result;
278
+ }
288
279
  }
280
+
281
+ nil
289
282
  end
290
283
 
291
284
  def each_with_object(object, &block)
285
+ return enum_for :each_with_object, object unless block_given?
286
+
292
287
  %x{
293
- #{self}.$each._p = function() {
294
- var value;
295
- var param = arguments.length == 1 ?
296
- arguments[0] : $slice.call(arguments);
288
+ var result;
297
289
 
298
- if ((value = block(param, object)) === $breaker) {
299
- return $breaker.$v;
290
+ self.$each._p = function() {
291
+ var param = #{Opal.destructure(`arguments`)},
292
+ value = block(param, object);
293
+
294
+ if (value === $breaker) {
295
+ result = $breaker.$v;
296
+ return $breaker;
300
297
  }
301
298
  };
302
299
 
303
- #{self}.$each();
300
+ self.$each();
304
301
 
305
- return object;
302
+ if (result !== undefined) {
303
+ return result;
304
+ }
306
305
  }
306
+
307
+ object
307
308
  end
308
309
 
309
310
  def entries
310
311
  %x{
311
312
  var result = [];
312
313
 
313
- #{self}.$each._p = function() {
314
- if (arguments.length == 1) {
315
- result.push(arguments[0]);
316
- }
317
- else {
318
- result.push($slice.call(arguments));
319
- }
314
+ self.$each._p = function() {
315
+ result.push(#{Opal.destructure(`arguments`)});
320
316
  };
321
317
 
322
- #{self}.$each();
318
+ self.$each();
323
319
 
324
320
  return result;
325
321
  }
@@ -328,39 +324,43 @@ module Enumerable
328
324
  alias find detect
329
325
 
330
326
  def find_all(&block)
327
+ return enum_for :find_all unless block_given?
328
+
331
329
  %x{
332
330
  var result = [];
333
331
 
334
- #{self}.$each._p = function() {
335
- var value;
336
- var param = arguments.length == 1 ?
337
- arguments[0] : $slice.call(arguments);
332
+ self.$each._p = function() {
333
+ var param = #{Opal.destructure(`arguments`)},
334
+ value = $opal.$yield1(block, param);
338
335
 
339
- if ((value = block(param)) === $breaker) {
340
- return $breaker.$v;
336
+ if (value === $breaker) {
337
+ result = $breaker.$v;
338
+ return $breaker;
341
339
  }
342
340
 
343
- if (value !== false && value !== nil) {
341
+ if (#{Opal.truthy?(`value`)}) {
344
342
  result.push(param);
345
343
  }
346
344
  };
347
345
 
348
- #{self}.$each();
346
+ self.$each();
349
347
 
350
348
  return result;
351
349
  }
352
350
  end
353
351
 
354
352
  def find_index(object = undefined, &block)
353
+ return enum_for :find_index if `object === undefined && block === nil`
354
+
355
355
  %x{
356
- var proc, result = nil, index = 0;
356
+ var result = nil,
357
+ index = 0;
357
358
 
358
359
  if (object != null) {
359
- proc = function() {
360
- var param = arguments.length == 1 ?
361
- arguments[0] : $slice.call(arguments);
360
+ self.$each._p = function() {
361
+ var param = #{Opal.destructure(`arguments`)};
362
362
 
363
- if (#{ `param` == `object` }) {
363
+ if (#{`param` == `object`}) {
364
364
  result = index;
365
365
  return $breaker;
366
366
  }
@@ -368,20 +368,17 @@ module Enumerable
368
368
  index += 1;
369
369
  };
370
370
  }
371
- else {
372
- proc = function() {
373
- var value;
374
- var param = arguments.length == 1 ?
375
- arguments[0] : $slice.call(arguments);
371
+ else if (block !== nil) {
372
+ self.$each._p = function() {
373
+ var value = $opal.$yieldX(block, arguments);
376
374
 
377
- if ((value = block(param)) === $breaker) {
378
- return $breaker.$v;
375
+ if (value === $breaker) {
376
+ result = $breaker.$v;
377
+ return $breaker;
379
378
  }
380
379
 
381
- if (value !== false && value !== nil) {
382
- result = index;
383
- $breaker.$v = index;
384
-
380
+ if (#{Opal.truthy?(`value`)}) {
381
+ result = index;
385
382
  return $breaker;
386
383
  }
387
384
 
@@ -389,8 +386,7 @@ module Enumerable
389
386
  };
390
387
  }
391
388
 
392
- #{self}.$each._p = proc;
393
- #{self}.$each();
389
+ self.$each();
394
390
 
395
391
  return result;
396
392
  }
@@ -398,36 +394,31 @@ module Enumerable
398
394
 
399
395
  def first(number = undefined)
400
396
  %x{
401
- var result = [],
402
- current = 0,
403
- proc;
404
-
405
397
  if (number == null) {
406
- result = nil;
407
- proc = function() {
408
- result = arguments.length == 1 ?
409
- arguments[0] : $slice.call(arguments);
398
+ var result = nil;
410
399
 
400
+ self.$each._p = function() {
401
+ result = #{Opal.destructure(`arguments`)};
411
402
  return $breaker;
412
403
  };
413
404
  }
414
405
  else {
415
- proc = function() {
406
+ var current = 0,
407
+ result = [],
408
+ number = #{Opal.coerce_to number, Integer, :to_int};
409
+
410
+ self.$each._p = function() {
416
411
  if (number <= current) {
417
412
  return $breaker;
418
413
  }
419
414
 
420
- var param = arguments.length == 1 ?
421
- arguments[0] : $slice.call(arguments);
422
-
423
- result.push(param);
415
+ result.push(#{Opal.destructure(`arguments`)});
424
416
 
425
417
  current++;
426
418
  };
427
419
  }
428
420
 
429
- #{self}.$each._p = proc;
430
- #{self}.$each();
421
+ self.$each();
431
422
 
432
423
  return result;
433
424
  }
@@ -435,19 +426,19 @@ module Enumerable
435
426
 
436
427
  def grep(pattern, &block)
437
428
  %x{
438
- var result = [],
439
- proc;
429
+ var result = [];
440
430
 
441
431
  if (block !== nil) {
442
- proc = function() {
443
- var param = arguments.length == 1 ?
444
- arguments[0] : $slice.call(arguments);
432
+ self.$each._p = function() {
433
+ var param = #{Opal.destructure(`arguments`)},
434
+ value = #{pattern === `param`};
445
435
 
446
- var value = #{pattern === `param`};
436
+ if (#{Opal.truthy?(`value`)}) {
437
+ value = $opal.$yield1(block, param);
447
438
 
448
- if (value !== false && value !== nil) {
449
- if ((value = block(param)) === $breaker) {
450
- return $breaker.$v;
439
+ if (value === $breaker) {
440
+ result = $breaker.$v;
441
+ return $breaker;
451
442
  }
452
443
 
453
444
  result.push(value);
@@ -455,216 +446,457 @@ module Enumerable
455
446
  };
456
447
  }
457
448
  else {
458
- proc = function() {
459
- var param = arguments.length == 1 ?
460
- arguments[0] : $slice.call(arguments);
449
+ self.$each._p = function() {
450
+ var param = #{Opal.destructure(`arguments`)},
451
+ value = #{pattern === `param`};
461
452
 
462
- var value = #{pattern === `param`};
463
-
464
- if (value !== false && value !== nil) {
453
+ if (#{Opal.truthy?(`value`)}) {
465
454
  result.push(param);
466
455
  }
467
456
  };
468
457
  }
469
458
 
470
- #{self}.$each._p = proc;
471
- #{self}.$each();
459
+ self.$each();
472
460
 
473
461
  return result;
474
462
  }
475
463
  end
476
464
 
477
465
  def group_by(&block)
466
+ return enum_for :group_by unless block_given?
467
+
478
468
  hash = Hash.new { |h, k| h[k] = [] }
479
469
 
480
- each do |el|
481
- hash[block.call(el)] << el
482
- end
470
+ %x{
471
+ var result;
472
+
473
+ self.$each._p = function() {
474
+ var param = #{Opal.destructure(`arguments`)},
475
+ value = $opal.$yield1(block, param);
476
+
477
+ if (value === $breaker) {
478
+ result = $breaker.$v;
479
+ return $breaker;
480
+ }
481
+
482
+ #{hash[`value`] << `param`};
483
+ }
484
+
485
+ self.$each();
486
+
487
+ if (result !== undefined) {
488
+ return result;
489
+ }
490
+ }
483
491
 
484
492
  hash
485
493
  end
486
494
 
487
- alias map collect
495
+ def include?(obj)
496
+ any? { |v| v == obj }
497
+ end
488
498
 
489
- def max(&block)
499
+ def inject(object = undefined, sym = undefined, &block)
490
500
  %x{
491
- var proc, result;
492
- var arg_error = false;
501
+ var result = object;
493
502
 
494
503
  if (block !== nil) {
495
- proc = function() {
496
- var param = arguments.length == 1 ?
497
- arguments[0] : $slice.call(arguments);
504
+ self.$each._p = function() {
505
+ var value = #{Opal.destructure(`arguments`)};
498
506
 
499
- if (result == undefined) {
500
- result = param;
507
+ if (result === undefined) {
508
+ result = value;
509
+ return;
501
510
  }
502
- else if ((value = block(param, result)) === $breaker) {
503
- result = $breaker.$v;
504
511
 
512
+ value = $opal.$yieldX(block, [result, value]);
513
+
514
+ if (value === $breaker) {
515
+ result = $breaker.$v;
505
516
  return $breaker;
506
517
  }
507
- else {
508
- if (value > 0) {
509
- result = param;
510
- }
511
518
 
512
- $breaker.$v = nil;
519
+ result = value;
520
+ };
521
+ }
522
+ else {
523
+ if (sym === undefined) {
524
+ if (!#{Symbol === object}) {
525
+ #{raise TypeError, "#{object.inspect} is not a Symbol"};
513
526
  }
527
+
528
+ sym = object;
529
+ result = undefined;
514
530
  }
531
+
532
+ self.$each._p = function() {
533
+ var value = #{Opal.destructure(`arguments`)};
534
+
535
+ if (result === undefined) {
536
+ result = value;
537
+ return;
538
+ }
539
+
540
+ result = #{`result`.__send__ sym, `value`};
541
+ };
515
542
  }
516
- else {
517
- proc = function() {
518
- var param = arguments.length == 1 ?
519
- arguments[0] : $slice.call(arguments);
520
543
 
521
- var modules = param.$class().$included_modules;
544
+ self.$each();
522
545
 
523
- if (modules == undefined || modules.length == 0 || modules.indexOf(Opal.Comparable) == -1) {
524
- arg_error = true;
546
+ return result;
547
+ }
548
+ end
549
+
550
+ alias map collect
551
+
552
+ def max(&block)
553
+ %x{
554
+ var result;
555
+
556
+ if (block !== nil) {
557
+ self.$each._p = function() {
558
+ var param = #{Opal.destructure(`arguments`)};
559
+
560
+ if (result === undefined) {
561
+ result = param;
562
+ return;
563
+ }
525
564
 
565
+ var value = block(param, result);
566
+
567
+ if (value === $breaker) {
568
+ result = $breaker.$v;
526
569
  return $breaker;
527
570
  }
528
571
 
529
- if (result == undefined || #{`param` > `result`}) {
572
+ if (value > 0) {
530
573
  result = param;
531
574
  }
532
- }
575
+ };
533
576
  }
577
+ else {
578
+ self.$each._p = function() {
579
+ var param = #{Opal.destructure(`arguments`)};
534
580
 
535
- #{self}.$each._p = proc;
536
- #{self}.$each();
581
+ if (result === undefined) {
582
+ result = param;
583
+ return;
584
+ }
537
585
 
538
- if (arg_error) {
539
- #{raise ArgumentError, "Array#max"};
586
+ if (#{`param` <=> `result`} > 0) {
587
+ result = param;
588
+ }
589
+ };
540
590
  }
541
591
 
542
- return (result == undefined ? nil : result);
592
+ self.$each();
593
+
594
+ return result === undefined ? nil : result;
595
+ }
596
+ end
597
+
598
+ def max_by(&block)
599
+ return enum_for :max_by unless block
600
+
601
+ %x{
602
+ var result,
603
+ by;
604
+
605
+ self.$each._p = function() {
606
+ var param = #{Opal.destructure(`arguments`)},
607
+ value = $opal.$yield1(block, param);
608
+
609
+ if (result === undefined) {
610
+ result = param;
611
+ by = value;
612
+ return;
613
+ }
614
+
615
+ if (value === $breaker) {
616
+ result = $breaker.$v;
617
+ return $breaker;
618
+ }
619
+
620
+ if (#{`value` <=> `by`} > 0) {
621
+ result = param
622
+ by = value;
623
+ }
624
+ };
625
+
626
+ self.$each();
627
+
628
+ return result === undefined ? nil : result;
543
629
  }
544
630
  end
545
631
 
632
+ alias member? include?
633
+
546
634
  def min(&block)
547
635
  %x{
548
- var proc,
549
- result,
550
- arg_error = false;
636
+ var result;
551
637
 
552
638
  if (block !== nil) {
553
- proc = function() {
554
- var param = arguments.length == 1 ?
555
- arguments[0] : $slice.call(arguments);
639
+ self.$each._p = function() {
640
+ var param = #{Opal.destructure(`arguments`)};
556
641
 
557
- if (result == undefined) {
642
+ if (result === undefined) {
558
643
  result = param;
644
+ return;
559
645
  }
560
- else if ((value = block(param, result)) === $breaker) {
561
- result = $breaker.$v;
562
646
 
647
+ var value = block(param, result);
648
+
649
+ if (value === $breaker) {
650
+ result = $breaker.$v;
563
651
  return $breaker;
564
652
  }
565
- else {
566
- if (value < 0) {
567
- result = param;
568
- }
569
653
 
570
- $breaker.$v = nil;
654
+ if (value < 0) {
655
+ result = param;
571
656
  }
572
- }
657
+ };
573
658
  }
574
659
  else {
575
- proc = function(obj) {
576
- var param = arguments.length == 1 ?
577
- arguments[0] : $slice.call(arguments);
578
-
579
- var modules = param.$class().$included_modules;
580
-
581
- if (modules == undefined || modules.length == 0 || modules.indexOf(Opal.Comparable) == -1) {
582
- arg_error = true;
660
+ self.$each._p = function() {
661
+ var param = #{Opal.destructure(`arguments`)};
583
662
 
584
- return $breaker;
663
+ if (result === undefined) {
664
+ result = param;
665
+ return;
585
666
  }
586
667
 
587
- if (result == undefined || #{`param` < `result`}) {
668
+ if (#{`param` <=> `result`} < 0) {
588
669
  result = param;
589
670
  }
590
- }
671
+ };
591
672
  }
592
673
 
593
- #{self}.$each._p = proc;
594
- #{self}.$each();
674
+ self.$each();
595
675
 
596
- if (arg_error) {
597
- #{raise ArgumentError, "Array#min"};
598
- }
676
+ return result === undefined ? nil : result;
677
+ }
678
+ end
679
+
680
+ def min_by(&block)
681
+ return enum_for :min_by unless block
682
+
683
+ %x{
684
+ var result,
685
+ by;
686
+
687
+ self.$each._p = function() {
688
+ var param = #{Opal.destructure(`arguments`)},
689
+ value = $opal.$yield1(block, param);
599
690
 
600
- return result == undefined ? nil : result;
691
+ if (result === undefined) {
692
+ result = param;
693
+ by = value;
694
+ return;
695
+ }
696
+
697
+ if (value === $breaker) {
698
+ result = $breaker.$v;
699
+ return $breaker;
700
+ }
701
+
702
+ if (#{`value` <=> `by`} < 0) {
703
+ result = param
704
+ by = value;
705
+ }
706
+ };
707
+
708
+ self.$each();
709
+
710
+ return result === undefined ? nil : result;
601
711
  }
602
712
  end
603
713
 
604
714
  def none?(&block)
605
715
  %x{
606
- var result = true,
607
- proc;
716
+ var result = true;
608
717
 
609
718
  if (block !== nil) {
610
- proc = function(obj) {
611
- var value,
612
- args = $slice.call(arguments);
719
+ self.$each._p = function() {
720
+ var value = $opal.$yieldX(block, arguments);
613
721
 
614
- if ((value = block.apply(#{self}, args)) === $breaker) {
615
- return $breaker.$v;
722
+ if (value === $breaker) {
723
+ result = $breaker.$v;
724
+ return $breaker;
616
725
  }
617
726
 
618
- if (value !== false && value !== nil) {
619
- result = false;
620
- $breaker.$v = nil;
621
-
727
+ if (#{Opal.truthy?(`value`)}) {
728
+ result = false;
622
729
  return $breaker;
623
730
  }
624
731
  }
625
732
  }
626
733
  else {
627
- proc = function(obj) {
628
- if (arguments.length == 1 && (obj !== false && obj !== nil)) {
629
- result = false;
630
- $breaker.$v = nil;
734
+ self.$each._p = function() {
735
+ var value = #{Opal.destructure(`arguments`)};
631
736
 
737
+ if (#{Opal.truthy?(`value`)}) {
738
+ result = false;
632
739
  return $breaker;
633
740
  }
634
- else {
635
- for (var i = 0, length = arguments.length; i < length; i++) {
636
- if (arguments[i] !== false && arguments[i] !== nil) {
637
- result = false;
638
- $breaker.$v = nil;
741
+ };
742
+ }
639
743
 
640
- return $breaker;
641
- }
744
+ self.$each();
745
+
746
+ return result;
747
+ }
748
+ end
749
+
750
+ def one?(&block)
751
+ %x{
752
+ var result = false;
753
+
754
+ if (block !== nil) {
755
+ self.$each._p = function() {
756
+ var value = $opal.$yieldX(block, arguments);
757
+
758
+ if (value === $breaker) {
759
+ result = $breaker.$v;
760
+ return $breaker;
761
+ }
762
+
763
+ if (#{Opal.truthy?(`value`)}) {
764
+ if (result === true) {
765
+ result = false;
766
+ return $breaker;
642
767
  }
768
+
769
+ result = true;
643
770
  }
644
- };
771
+ }
645
772
  }
773
+ else {
774
+ self.$each._p = function() {
775
+ var value = #{Opal.destructure(`arguments`)};
646
776
 
647
- #{self}.$each._p = proc;
648
- #{self}.$each();
777
+ if (#{Opal.truthy?(`value`)}) {
778
+ if (result === true) {
779
+ result = false;
780
+ return $breaker;
781
+ }
782
+
783
+ result = true;
784
+ }
785
+ }
786
+ }
787
+
788
+ self.$each();
649
789
 
650
790
  return result;
651
791
  }
652
792
  end
653
793
 
794
+ def slice_before(pattern = undefined, &block)
795
+ if `pattern === undefined && block === nil || arguments.length > 1`
796
+ raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 1)"
797
+ end
798
+
799
+ Enumerator.new {|e|
800
+ %x{
801
+ var slice = [];
802
+
803
+ if (block !== nil) {
804
+ if (pattern === undefined) {
805
+ self.$each._p = function() {
806
+ var param = #{Opal.destructure(`arguments`)},
807
+ value = $opal.$yield1(block, param);
808
+
809
+ if (#{Opal.truthy?(`value`)} && slice.length > 0) {
810
+ #{e << `slice`};
811
+ slice = [];
812
+ }
813
+
814
+ slice.push(param);
815
+ };
816
+ }
817
+ else {
818
+ self.$each._p = function() {
819
+ var param = #{Opal.destructure(`arguments`)},
820
+ value = block(param, #{pattern.dup});
821
+
822
+ if (#{Opal.truthy?(`value`)} && slice.length > 0) {
823
+ #{e << `slice`};
824
+ slice = [];
825
+ }
826
+
827
+ slice.push(param);
828
+ };
829
+ }
830
+ }
831
+ else {
832
+ self.$each._p = function() {
833
+ var param = #{Opal.destructure(`arguments`)},
834
+ value = #{pattern === `param`};
835
+
836
+ if (#{Opal.truthy?(`value`)} && slice.length > 0) {
837
+ #{e << `slice`};
838
+ slice = [];
839
+ }
840
+
841
+ slice.push(param);
842
+ };
843
+ }
844
+
845
+ self.$each();
846
+
847
+ if (slice.length > 0) {
848
+ #{e << `slice`};
849
+ }
850
+ }
851
+ }
852
+ end
853
+
654
854
  def sort_by(&block)
655
- map { |*f|
656
- # FIXME: this should probably belongs to somewhere more
657
- f = `#{f}.length === 1 ? #{f}[0] : #{f}`
658
- `[#{block.call(f)}, #{f}]`
659
- }.sort.map { |f| `#{f}[1]` }
855
+ return enum_for :sort_by unless block_given?
856
+
857
+ map {
858
+ arg = Opal.destructure(`arguments`)
859
+
860
+ [block.call(arg), arg]
861
+ }.sort { |a, b| a[0] <=> b[0] }.map { |arg| `arg[1]` }
660
862
  end
661
863
 
662
864
  alias select find_all
663
865
 
664
- alias take first
866
+ alias reduce inject
665
867
 
666
- alias to_a entries
868
+ def take(num)
869
+ first(num)
870
+ end
871
+
872
+ def take_while(&block)
873
+ return enum_for :take_while unless block
667
874
 
668
- alias inject reduce
875
+ %x{
876
+ var result = [];
877
+
878
+ self.$each._p = function() {
879
+ var param = #{Opal.destructure(`arguments`)},
880
+ value = $opal.$yield1(block, param);
881
+
882
+ if (value === $breaker) {
883
+ result = $breaker.$v;
884
+ return $breaker;
885
+ }
886
+
887
+ if (#{Opal.falsy?(`value`)}) {
888
+ return $breaker;
889
+ }
890
+
891
+ result.push(param);
892
+ };
893
+
894
+ self.$each();
895
+
896
+ return result;
897
+ }
898
+ end
899
+
900
+ alias to_a entries
669
901
  end
670
902