opal 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fdf74450cbd2b81a0d8ba44700ef6e0e77b5ca45
4
+ data.tar.gz: 01e6a0e881a43bdaa1eb4db93c0e1989ca1d4568
5
+ SHA512:
6
+ metadata.gz: 90d5d6913908ef1d38f69d029d6033fbcd0d2214035a3cf34ebe5c5d8725e2bd37689009dbbd28e99ca27f9069cfe09b44445a0a3710e3d0e71f0d1ce00dd72b
7
+ data.tar.gz: bca3fd06513433d71ff656a473acf3269caa301a55589fdccea45cc463d9f865b6d558bbc1f427552f46586172f6f053cf6396cb5bbe193aa2e5b113783d0a86
data/.gitignore CHANGED
@@ -5,3 +5,4 @@
5
5
  Gemfile.lock
6
6
  /mspec
7
7
  /build
8
+ /.github_access_token
@@ -0,0 +1,3 @@
1
+ [submodule "rubyspec"]
2
+ path = rubyspec
3
+ url = git://github.com/rubyspec/rubyspec.git
@@ -4,6 +4,14 @@ rvm:
4
4
  - 1.8.7
5
5
  - 1.9.3
6
6
  - 2.0.0
7
+ - rbx-20mode
8
+
9
+ before_install:
10
+ - git submodule update --init
7
11
 
8
12
  notifications:
9
13
  irc: "irc.freenode.org#opal"
14
+
15
+ matrix:
16
+ allow_failures:
17
+ - rvm: rbx-20mode
@@ -1,5 +1,21 @@
1
1
  # Contributing
2
2
 
3
+ This is the issue tracker for Opal. If you have a more general question about
4
+ using opal (or related libraries) then use the
5
+ [google group for opal](http://groups.google.com/forum/#!forum/opalrb), or the
6
+ [#opal](http://webchat.freenode.net/?channels=opal) irc channel on
7
+ FreeNode.
8
+
9
+ ## Contributing
10
+
11
+ * Before opening a new issue, search for previous discussions including closed
12
+ ones. At comments there if a similar issue is found.
13
+
14
+ * Before sending pull requests make sure all tests run and pass (see below).
15
+
16
+ * Make sure to use a similar coding style to the rest of the code base. In ruby
17
+ and javascript code we use 2 spaces (no tabs).
18
+
3
19
  ## Quick Start
4
20
 
5
21
  Clone repo:
@@ -14,13 +30,23 @@ Get dependencies:
14
30
  $ bundle
15
31
  ```
16
32
 
17
- ## Tests
33
+ ## Running Tests
34
+
35
+ ### Runtime
36
+
37
+ Some opal specific tests are found inside `spec/`, but the majority of our
38
+ runtime tests now come from rubyspec. Rubyspec is included as a git submodule.
39
+ To get our latest referenced checkout, just run:
40
+
41
+ ```
42
+ $ git submodule update --init
43
+ ```
18
44
 
19
45
  You need phantomjs installed to run tests. To build opal, its dependencies
20
46
  and all specs, run:
21
47
 
22
48
  ```
23
- $ rake
49
+ $ bundle exec rake mspec
24
50
  ```
25
51
 
26
52
  You can alternatively run tests in a browser using:
@@ -30,3 +56,21 @@ $ rackup
30
56
  ```
31
57
 
32
58
  And then opening `http://127.0.0.1:9292` in a web browser.
59
+
60
+ ### Gem/lib tests
61
+
62
+ We also include some tests for running under your standard ruby implementation
63
+ which are in `mri_spec/`. To run tests tests using rake, use:
64
+
65
+ ```
66
+ $ bundle exec rake mri_spec
67
+ ```
68
+
69
+ ### All tests
70
+
71
+ To run all the tests together (which you should do while contributing), run:
72
+
73
+ ```
74
+ $ bundle exec rake
75
+ ```
76
+
data/Gemfile CHANGED
@@ -1,2 +1,19 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
+
4
+ gem 'opal-sprockets', :github => 'opal/opal-sprockets'
5
+
6
+ # Stick with older racc until
7
+ # https://github.com/tenderlove/racc/issues/32
8
+ # is solved.
9
+ gem 'racc', '< 1.4.10' if RUBY_VERSION.to_f < 1.9
10
+
11
+ platform :rbx do
12
+ gem 'rubysl'
13
+ gem 'rubysl-openssl'
14
+ end
15
+
16
+ group :repl do
17
+ gem 'therubyracer', :require => 'v8', :platform => :mri
18
+ gem 'therubyrhino', :platform => :jruby
19
+ end
data/README.md CHANGED
@@ -2,8 +2,9 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/opal/opal.png?branch=master)](http://travis-ci.org/opal/opal)
4
4
  [![Gem Version](https://badge.fury.io/rb/opal.png)](http://badge.fury.io/rb/opal)
5
+ [![Code Climate](https://codeclimate.com/github/opal/opal.png)](https://codeclimate.com/github/opal/opal)
5
6
 
6
- Opal is a ruby to javascript source-to-source compiler. It also has an
7
+ Opal is a ruby to javascript source-to-source compiler. It also has an
7
8
  implementation of the ruby corelib.
8
9
 
9
10
  Opal is [hosted on github](http://github.com/opal/opal), and there
@@ -15,11 +16,11 @@ See the website, [http://opalrb.org](http://opalrb.org).
15
16
 
16
17
  ### Compiling ruby code
17
18
 
18
- `Opal.parse` is a simple interface to just compile a string of ruby into a
19
+ `Opal.compile` is a simple interface to just compile a string of ruby into a
19
20
  string of javascript code.
20
21
 
21
22
  ```ruby
22
- Opal.parse("puts 'wow'") # => "(function() { ... })()"
23
+ Opal.compile("puts 'wow'") # => "(function() { ... })()"
23
24
  ```
24
25
 
25
26
  Running this by itself is not enough, you need the opal runtime/corelib.
@@ -54,11 +55,15 @@ First, install dependencies:
54
55
 
55
56
  $ bundle install
56
57
 
58
+ Rubyspecs must be cloned as a gitsubmodule:
59
+
60
+ $ git submodule update --init
61
+
57
62
  Tests can be run with phantomjs using:
58
63
 
59
64
  $ rake
60
65
 
61
- Alternatively, you can just load up a rack instance using `rackup`, and
66
+ Alternatively, you can just load up a rack instance using `rackup spec/config.ru`, and
62
67
  visit `http://localhost:9292/` in any web browser.
63
68
 
64
69
  ## Code Overview
@@ -112,3 +117,7 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
112
117
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
113
118
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
114
119
  THE SOFTWARE.
120
+
121
+
122
+ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/opal/opal/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
123
+
data/Rakefile CHANGED
@@ -2,79 +2,24 @@ require 'bundler'
2
2
  Bundler.require
3
3
  Bundler::GemHelper.install_tasks
4
4
 
5
- require 'rack'
6
- require 'webrick'
7
- require 'opal-sprockets'
8
-
9
- # mspec/rubyspec use a top level "language_version" to require relative specs.
10
- # We can't do this at runtime, so we hijack the method (and make sure we only
11
- # do this at the top level). We figure out which file we are including, and
12
- # add it to our require list
13
- class ::Opal::Parser
14
- alias_method :mspec_process_call, :process_call
15
-
16
- def process_call(sexp, level)
17
- if sexp[1] == :language_version and @scope.top?
18
- lang_type = sexp[2][2][1]
19
- target = "rubyspec/language/versions/#{lang_type}_1.9"
20
- @requires << target
21
- return f("nil")
22
- end
23
-
24
- mspec_process_call sexp, level
25
- end
26
- end
27
-
28
- class RunSpec
29
- def initialize(file=nil)
30
- Opal::Processor.arity_check_enabled = true
31
-
32
- ENV['OPAL_SPEC'] = file.nil? ? ["#{Dir.pwd}/spec/"].join(',') : file.join(',')
33
-
34
- build_specs
35
-
36
- server = fork do
37
- app = Rack::Builder.app do
38
- use Rack::ShowExceptions
39
- run Rack::Directory.new('.')
40
- end
41
-
42
- Rack::Server.start(:app => app, :Port => 9999, :AccessLog => [],
43
- :Logger => WEBrick::Log.new("/dev/null"))
44
- end
45
-
46
- system "phantomjs \"spec/ospec/sprockets.js\" \"http://localhost:9999/spec/index.html\""
47
- success = $?.success?
48
-
49
- exit 1 unless success
50
-
51
- rescue => e
52
- puts e.message
53
- ensure
54
- Process.kill(:SIGINT, server)
55
- Process.wait
56
- end
57
-
58
- def build_specs
59
- env = Opal::Environment.new
60
- env.append_path 'spec'
61
- env.use_gem 'mspec'
62
-
63
- FileUtils.mkdir_p 'build'
64
- puts " * build/specs.js"
65
-
66
- specs = uglify(env['ospec/main'].to_s)
67
- File.open('build/specs.js', 'w+') { |o| o << specs }
68
- end
69
-
70
- # Only if OPAL_UGLIFY is set
71
- def uglify(str)
72
- if ENV['OPAL_UGLIFY']
73
- require 'uglifier'
74
- puts " * uglifying"
75
- Uglifier.compile(str)
76
- else
77
- str
5
+ import 'tasks/mspec.rake'
6
+
7
+ namespace :github do
8
+ desc "Upload assets to github"
9
+ task :upload_assets do
10
+ require 'octokit'
11
+ # https://github.com/octokit/octokit.rb#oauth-access-tokens
12
+ token_path = '.github_access_token'
13
+ File.exist?(token_path) or raise ArgumentError, "Please create a personal access token (https://github.com/settings/tokens/new) and paste it inside #{token_path.inspect}"
14
+ token = File.read(token_path).strip
15
+ client = Octokit::Client.new :access_token => token
16
+ tag_name = ENV['TAG'] || raise(ArgumentError, 'missing the TAG env variable (e.g. TAG=v0.4.4)')
17
+ release = client.releases('opal/opal').find{|r| p(r.id); p(r).tag_name == tag_name}
18
+ release_url = "https://api.github.com/repos/opal/opal/releases/#{release.id}"
19
+ %w[opal opal-parser].each do |name|
20
+ client.upload_asset release_url, "build/#{name}.js", :content_type => 'application/x-javascript'
21
+ client.upload_asset release_url, "build/#{name}.min.js", :content_type => 'application/x-javascript'
22
+ client.upload_asset release_url, "build/#{name}.min.js.gz", :content_type => 'application/octet-stream'
78
23
  end
79
24
  end
80
25
  end
@@ -94,59 +39,17 @@ end
94
39
 
95
40
  desc "Build specs to build/specs.js and build/specs.min.js"
96
41
  task :build_specs do
97
- require 'uglifier'
98
-
99
42
  Opal::Processor.arity_check_enabled = true
100
43
  ENV['OPAL_SPEC'] = ["#{Dir.pwd}/spec/"].join(',')
101
44
 
102
- env = Opal::Environment.new
103
- env.append_path 'spec'
104
- env.use_gem 'mspec'
105
-
106
- FileUtils.mkdir_p 'build'
107
-
108
- puts " * build/specs.js"
109
- specs = env['ospec/main'].to_s
110
-
111
- puts " * build/specs.min.js"
112
- # min = Uglifier.compile(specs)
113
-
114
- File.open('build/specs.js', 'w+') { |o| o << specs }
115
- # File.open('build/specs.min.js', 'w+') { |o| o << min }
116
- end
117
-
118
- desc "Run task with spec:dir:file helper"
119
- namespace :spec do
120
- task 'dirs' do
121
- end
122
- rule '' do |task|
123
-
124
- #build path for spec files\dirs.
125
- #Example:
126
- #spec:core => spec/core/
127
- #spec:core:array:allocate => spec/core/array/allocate_spec.rb
128
- def path(dirs)
129
- path = "#{Dir.pwd}"
130
- dirs.each do |dir|
131
- base = path + "/#{dir}"
132
- if Dir.exists?(base)
133
- path = base
134
- else
135
- path = Dir.glob("#{base}_spec.rb")
136
- end
137
- end
138
- path = [path].flatten
139
- raise ArgumentError, "File or Dir with task #{dirs.join('/')} not found." if path.empty?
140
- path
141
- end
142
-
143
- RunSpec.new(path(task.name.split(":")))
144
- end
45
+ env = SpecEnvironment.new
46
+ env.build
145
47
  end
146
48
 
147
49
  desc "Build opal.js and opal-parser.js to build/"
148
50
  task :dist do
149
51
  Opal::Processor.arity_check_enabled = false
52
+ Opal::Processor.const_missing_enabled = false
150
53
 
151
54
  env = Opal::Environment.new
152
55
 
@@ -173,7 +76,7 @@ end
173
76
 
174
77
  desc "Rebuild grammar.rb for opal parser"
175
78
  task :racc do
176
- %x(racc -l lib/opal/grammar.y -o lib/opal/grammar.rb)
79
+ %x(racc -l lib/opal/parser/grammar.y -o lib/opal/parser/grammar.rb)
177
80
  end
178
81
 
179
82
  # Used for uglifying source to minify
data/bin/opal CHANGED
@@ -5,6 +5,15 @@ options = Opal::CLIOptions.new
5
5
  options.parse!
6
6
 
7
7
  require 'opal/cli'
8
- cli = Opal::CLI.new ARGV.first, options.options
9
- cli.run
10
8
 
9
+ if ARGV.empty? and !options.options[:evals]
10
+ p options
11
+ else
12
+ cli = Opal::CLI.new options.options.merge(:filename => ARGV.first)
13
+ begin
14
+ cli.run
15
+ rescue Opal::CLI::MissingNode => e
16
+ $stderr.puts e.message
17
+ exit 127
18
+ end
19
+ end
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'opal'
4
+
5
+ module Opal
6
+ class V8Context
7
+ def initialize
8
+ @builder = Opal::Builder.new
9
+ end
10
+
11
+ def run(filename = nil)
12
+ return if @v8
13
+
14
+ begin
15
+ require 'v8'
16
+ rescue LoadError
17
+ abort 'therubyracer must be installed'
18
+ end
19
+
20
+ @v8 = V8::Context.new
21
+ @v8['console'] = self
22
+ @v8.eval @builder.build 'opal'
23
+
24
+ if filename
25
+ if File.exist? filename
26
+ eval_ruby File.read(filename)
27
+ else
28
+ fail "file does not exist: #{filename}"
29
+ end
30
+ end
31
+
32
+ run_repl
33
+ end
34
+
35
+ def log(*str)
36
+ puts(*str)
37
+ end
38
+
39
+ def run_repl
40
+ require 'readline'
41
+
42
+ loop do
43
+ # on SIGINT lets just return from the loop..
44
+ trap("SIGINT") { finish; return }
45
+ line = Readline.readline '>> ', true
46
+
47
+ # if we type exit, then we need to close down context
48
+ if line == "exit" or line.nil?
49
+ break
50
+ end
51
+
52
+ puts "=> #{eval_ruby line}"
53
+ end
54
+
55
+ finish
56
+ end
57
+
58
+ def eval_ruby(str)
59
+ code = @builder.build_str str, :irb => true, :const_missing => true
60
+ @v8.eval "var $_result = #{code} ($_result == null ? 'nil' : $_result.$inspect());"
61
+ rescue => e
62
+ puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
63
+ end
64
+
65
+ def finish
66
+ @v8 = nil
67
+ end
68
+ end
69
+ end
70
+
71
+ Opal::V8Context.new.run ARGV.first
@@ -12,102 +12,80 @@ class Array
12
12
  self.class.new(*args)
13
13
  end
14
14
 
15
- def self.new(size = undefined, obj = nil, &block)
16
- %x{
15
+ def self.new(size = nil, obj = nil, &block)
16
+ if `arguments.length > 2`
17
+ raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 0..2)"
18
+ end
17
19
 
18
- if (arguments.length > 2)
19
- #{raise ArgumentError.new("wrong number of arguments. Array#new")};
20
+ if `arguments.length === 0`
21
+ return []
22
+ end
20
23
 
21
- if (arguments.length == 0)
22
- return [];
24
+ if `arguments.length === 1`
25
+ if Array === size
26
+ return size.to_a
27
+ elsif size.respond_to? :to_ary
28
+ return size.to_ary
29
+ end
30
+ end
23
31
 
24
- var size,
25
- obj = arguments[1],
26
- arr = [];
32
+ size = Opal.coerce_to size, Integer, :to_int
27
33
 
28
- if (!obj) {
29
- if (#{size.respond_to? :to_ary}) {
30
- if (size['$is_a?'](Array))
31
- return size;
32
- return size['$to_ary']();
33
- }
34
- }
35
-
36
- if (typeof(arguments[0]) == 'number')
37
- size = arguments[0];
38
- else {
39
- if (#{`arguments[0]`.respond_to? :to_int}) {
40
- size = arguments[0]['$to_int']();
41
- if (typeof(size) == 'number') {
42
- if (size % 1 !== 0) {
43
- #{raise TypeError.new("can't convert to Integer. Array#new")};
44
- }
45
- } else {
46
- #{raise TypeError.new("can't convert to Integer. Array#new")};
47
- }
48
- } else {
49
- #{raise TypeError.new("can't convert to Integer. Array#new")};
50
- }
51
- }
52
-
53
- if (size < 0) {
54
- #{raise ArgumentError.new("negative array size")};
55
- }
56
-
57
- if (obj == undefined) {
58
- obj = nil;
59
- }
34
+ if `size < 0`
35
+ raise ArgumentError, "negative array size"
36
+ end
60
37
 
38
+ %x{
39
+ var result = [];
61
40
 
62
- if (block === nil)
41
+ if (block === nil) {
63
42
  for (var i = 0; i < size; i++) {
64
- arr.push(obj);
43
+ result.push(obj);
65
44
  }
45
+ }
66
46
  else {
67
47
  for (var i = 0, value; i < size; i++) {
68
48
  value = block(i);
49
+
69
50
  if (value === $breaker) {
70
51
  return $breaker.$v;
71
52
  }
72
- arr[i] = block(i);
53
+
54
+ result[i] = value;
73
55
  }
74
56
  }
75
57
 
76
- return arr;
58
+ return result;
77
59
  }
78
60
  end
79
61
 
80
62
  def self.try_convert(obj)
81
- %x{
82
- if (obj._isArray) {
83
- return obj;
84
- }
63
+ return obj if Array === obj
64
+ return obj.to_ary if obj.respond_to? :to_ary
85
65
 
86
- return nil;
87
- }
66
+ nil
88
67
  end
89
68
 
90
69
  def &(other)
70
+ if Array === other
71
+ other = other.to_a
72
+ else
73
+ other = Opal.coerce_to other, Array, :to_ary
74
+ end
75
+
91
76
  %x{
92
77
  var result = [],
93
78
  seen = {};
94
79
 
95
- for (var i = 0, length = #{self}.length; i < length; i++) {
96
- var item = #{self}[i];
97
- if (item._isString) {
98
- item = item.toString();
99
- }
80
+ for (var i = 0, length = self.length; i < length; i++) {
81
+ var item = self[i];
100
82
 
101
83
  if (!seen[item]) {
102
84
  for (var j = 0, length2 = other.length; j < length2; j++) {
103
85
  var item2 = other[j];
104
- if (item2._isString) {
105
- item2 = item2.toString();
106
- }
107
86
 
108
- if (item === item2 && !seen[item]) {
87
+ if (!seen[item2] && #{`item` == `item2`}) {
109
88
  seen[item] = true;
110
-
111
89
  result.push(item);
112
90
  }
113
91
  }
@@ -119,15 +97,23 @@ class Array
119
97
  end
120
98
 
121
99
  def *(other)
122
- %x{
123
- if (typeof(other) === 'string') {
124
- return #{self}.join(other);
125
- }
100
+ return `self.join(#{other.to_str})` if other.respond_to? :to_str
126
101
 
102
+ unless other.respond_to? :to_int
103
+ raise TypeError, "no implicit conversion of #{other.class} into Integer"
104
+ end
105
+
106
+ other = Opal.coerce_to other, Integer, :to_int
107
+
108
+ if `other < 0`
109
+ raise ArgumentError, "negative argument"
110
+ end
111
+
112
+ %x{
127
113
  var result = [];
128
114
 
129
115
  for (var i = 0; i < other; i++) {
130
- result = result.concat(#{self});
116
+ result = result.concat(self);
131
117
  }
132
118
 
133
119
  return result;
@@ -135,75 +121,73 @@ class Array
135
121
  end
136
122
 
137
123
  def +(other)
138
- %x{
139
- var arr = other;
124
+ if Array === other
125
+ other = other.to_a
126
+ else
127
+ other = Opal.coerce_to other, Array, :to_ary
128
+ end
140
129
 
141
- if (!other._isArray){
142
- if (#{other.respond_to?(:to_ary)}) {
143
- arr = other['$to_ary']();
144
- }
145
- else {
146
- #{raise TypeError.new("can't convert to Array. Array#+") };
147
- }
148
- }
149
-
150
- return #{self}.concat(arr);
151
- }
130
+ `self.concat(other)`
152
131
  end
153
132
 
154
133
  def -(other)
134
+ if Array === other
135
+ other = other.to_a
136
+ else
137
+ other = Opal.coerce_to other, Array, :to_ary
138
+ end
139
+
140
+ return [] if `self.length === 0`
141
+ return clone if `other.length === 0`
142
+
155
143
  %x{
156
- var a = #{self},
157
- b = #{other},
158
- tmp = [],
144
+ var seen = {},
159
145
  result = [];
160
146
 
161
- if (typeof(b) == "object" && !(b._isArray)) {
162
- if (#{other.respond_to? :to_ary}) {
163
- b = b['$to_ary']();
164
- } else {
165
- #{raise TypeError.new("can't convert to Array. Array#-") };
166
- }
167
- }else if ((typeof(b) != "object")) {
168
- #{raise TypeError.new("can't convert to Array. Array#-") };
147
+ for (var i = 0, length = other.length; i < length; i++) {
148
+ seen[other[i]] = true;
169
149
  }
170
150
 
171
- if (a.length == 0)
172
- return [];
173
- if (b.length == 0)
174
- return a;
151
+ for (var i = 0, length = self.length; i < length; i++) {
152
+ var item = self[i];
175
153
 
176
- for(var i = 0, length = b.length; i < length; i++) {
177
- tmp[b[i]] = true;
178
- }
179
- for(var i = 0, length = a.length; i < length; i++) {
180
- if (!tmp[a[i]]) {
181
- result.push(a[i]);
154
+ if (!seen[item]) {
155
+ result.push(item);
182
156
  }
183
- }
157
+ }
184
158
 
185
159
  return result;
186
160
  }
187
161
  end
188
162
 
189
163
  def <<(object)
190
- `#{self}.push(object);`
164
+ `self.push(object);`
191
165
 
192
166
  self
193
167
  end
194
168
 
195
169
  def <=>(other)
170
+ if Array === other
171
+ other = other.to_a
172
+ elsif other.respond_to? :to_ary
173
+ other = other.to_ary
174
+ else
175
+ return
176
+ end
177
+
196
178
  %x{
197
- if (#{self.hash} === #{other.hash}) {
179
+ if (#{hash} === #{other.hash}) {
198
180
  return 0;
199
181
  }
200
182
 
201
- if (#{self}.length != other.length) {
202
- return (#{self}.length > other.length) ? 1 : -1;
183
+ if (self.length != other.length) {
184
+ return (self.length > other.length) ? 1 : -1;
203
185
  }
204
186
 
205
- for (var i = 0, length = #{self}.length, tmp; i < length; i++) {
206
- if ((tmp = #{`#{self}[i]` <=> `other[i]`}) !== 0) {
187
+ for (var i = 0, length = self.length; i < length; i++) {
188
+ var tmp = #{`self[i]` <=> `other[i]`};
189
+
190
+ if (tmp !== 0) {
207
191
  return tmp;
208
192
  }
209
193
  }
@@ -213,33 +197,35 @@ class Array
213
197
  end
214
198
 
215
199
  def ==(other)
200
+ return false unless Array === other
201
+
202
+ other = other.to_a
203
+
216
204
  %x{
217
- if (!other || (#{self}.length !== other.length)) {
205
+ if (self.length !== other.length) {
218
206
  return false;
219
207
  }
220
208
 
221
- for (var i = 0, length = #{self}.length, tmp1, tmp2; i < length; i++) {
222
- tmp1 = #{self}[i];
223
- tmp2 = #{other}[i];
209
+ for (var i = 0, length = self.length; i < length; i++) {
210
+ var a = self[i],
211
+ b = other[i];
224
212
 
225
- if (tmp1._isArray && tmp2._isArray && (tmp1 === #{self})) {
213
+ if (a._isArray && b._isArray && (a === self)) {
226
214
  continue;
227
215
  }
228
216
 
229
- if (!(#{`tmp1` == `tmp2`})) {
217
+ if (!(#{`a` == `b`})) {
230
218
  return false;
231
219
  }
232
-
233
220
  }
234
-
235
-
236
- return true;
237
221
  }
222
+
223
+ true
238
224
  end
239
225
 
240
226
  def [](index, length = undefined)
241
227
  %x{
242
- var size = #{self}.length;
228
+ var size = self.length;
243
229
 
244
230
  if (typeof index !== 'number' && !index._isNumber) {
245
231
  if (index._isRange) {
@@ -256,7 +242,7 @@ class Array
256
242
  }
257
243
 
258
244
  if (!exclude) length += 1;
259
- return #{self}.slice(index, length);
245
+ return self.slice(index, length);
260
246
  }
261
247
  else {
262
248
  #{ raise "bad arg for Array#[]" };
@@ -272,34 +258,76 @@ class Array
272
258
  return nil;
273
259
  }
274
260
 
275
- return #{self}.slice(index, index + length);
261
+ return self.slice(index, index + length);
276
262
  }
277
263
  else {
278
264
  if (index >= size || index < 0) {
279
265
  return nil;
280
266
  }
281
267
 
282
- return #{self}[index];
268
+ return self[index];
283
269
  }
284
270
  }
285
271
  end
286
272
 
287
- def []=(index, value)
273
+ def []=(index, value, extra = undefined)
288
274
  %x{
289
- var size = #{self}.length;
275
+ var size = self.length;
276
+
277
+ if (typeof index !== 'number' && !index._isNumber) {
278
+ if (index._isRange) {
279
+ var exclude = index.exclude;
280
+ extra = value;
281
+ value = index.end;
282
+ index = index.begin;
283
+
284
+ if (value < 0) {
285
+ value += size;
286
+ }
287
+
288
+ if (!exclude) value += 1;
289
+
290
+ value = value - index;
291
+ }
292
+ else {
293
+ #{raise ArgumentError};
294
+ }
295
+ }
290
296
 
291
297
  if (index < 0) {
292
298
  index += size;
293
299
  }
294
300
 
295
- return #{self}[index] = value;
301
+ if (extra != null) {
302
+ if (value < 0) {
303
+ #{raise IndexError};
304
+ }
305
+
306
+ if (index > size) {
307
+ for (var i = size; index > i; i++) {
308
+ self[i] = nil;
309
+ }
310
+ }
311
+
312
+ self.splice.apply(self, [index, value].concat(extra));
313
+
314
+ return extra;
315
+ }
316
+
317
+ if (index > size) {
318
+ for (var i = size; i < index; i++) {
319
+ self[i] = nil;
320
+ }
321
+ }
322
+
323
+ return self[index] = value;
296
324
  }
297
325
  end
298
326
 
299
327
  def assoc(object)
300
328
  %x{
301
- for (var i = 0, length = #{self}.length, item; i < length; i++) {
302
- if (item = #{self}[i], item.length && #{`item[0]` == object}) {
329
+ for (var i = 0, length = self.length, item; i < length; i++) {
330
+ if (item = self[i], item.length && #{`item[0]` == object}) {
303
331
  return item;
304
332
  }
305
333
  }
@@ -309,36 +337,68 @@ class Array
309
337
  end
310
338
 
311
339
  def at(index)
340
+ index = Opal.coerce_to index, Integer, :to_int
341
+
312
342
  %x{
313
343
  if (index < 0) {
314
- index += #{self}.length;
344
+ index += self.length;
315
345
  }
316
346
 
317
- if (index < 0 || index >= #{self}.length) {
347
+ if (index < 0 || index >= self.length) {
318
348
  return nil;
319
349
  }
320
350
 
321
- return #{self}[index];
351
+ return self[index];
322
352
  }
323
353
  end
324
354
 
355
+ def cycle(n = nil, &block)
356
+ return if `self.length === 0 || n === 0`
357
+ return enum_for :cycle, n unless block
358
+
359
+ if `n === nil`
360
+ while true
361
+ if `#{(value = each(&block))} !== self`
362
+ return value
363
+ end
364
+ end
365
+ else
366
+ cycles = Opal.coerce_to n, Integer, :to_int
367
+
368
+ unless Integer === cycles
369
+ raise TypeError, "can't convert #{n.class} into Integer (#{n.class}#to_int gives #{cycles.class}"
370
+ end
371
+
372
+ while cycles > 0
373
+ each(&block)
374
+
375
+ cycles -= 1
376
+ end
377
+ end
378
+
379
+ self
380
+ end
381
+
325
382
  def clear
326
- `#{self}.splice(0, #{self}.length)`
383
+ `self.splice(0, self.length)`
327
384
 
328
385
  self
329
386
  end
330
387
 
331
388
  def clone
332
- `#{self}.slice()`
389
+ `self.slice()`
333
390
  end
334
391
 
335
392
  def collect(&block)
393
+ return enum_for :collect unless block_given?
394
+
336
395
  %x{
337
396
  var result = [];
338
397
 
398
+ for (var i = 0, length = self.length; i < length; i++) {
399
+ var value = Opal.$yield1(block, self[i]);
339
400
 
340
- for (var i = 0, length = #{self}.length, value; i < length; i++) {
341
- if ((value = block(#{self}[i])) === $breaker) {
401
+ if (value === $breaker) {
342
402
  return $breaker.$v;
343
403
  }
344
404
 
@@ -350,13 +410,17 @@ class Array
350
410
  end
351
411
 
352
412
  def collect!(&block)
413
+ return enum_for :collect! unless block_given?
414
+
353
415
  %x{
354
- for (var i = 0, length = #{self}.length, val; i < length; i++) {
355
- if ((val = block(#{self}[i])) === $breaker) {
416
+ for (var i = 0, length = self.length; i < length; i++) {
417
+ var value = Opal.$yield1(block, self[i]);
418
+
419
+ if (value === $breaker) {
356
420
  return $breaker.$v;
357
421
  }
358
422
 
359
- #{self}[i] = val;
423
+ self[i] = value;
360
424
  }
361
425
  }
362
426
 
@@ -367,8 +431,8 @@ class Array
367
431
  %x{
368
432
  var result = [];
369
433
 
370
- for (var i = 0, length = #{self}.length, item; i < length; i++) {
371
- if ((item = #{self}[i]) !== nil) {
434
+ for (var i = 0, length = self.length, item; i < length; i++) {
435
+ if ((item = self[i]) !== nil) {
372
436
  result.push(item);
373
437
  }
374
438
  }
@@ -379,93 +443,77 @@ class Array
379
443
 
380
444
  def compact!
381
445
  %x{
382
- var original = #{self}.length;
446
+ var original = self.length;
383
447
 
384
- for (var i = 0, length = #{self}.length; i < length; i++) {
385
- if (#{self}[i] === nil) {
386
- #{self}.splice(i, 1);
448
+ for (var i = 0, length = self.length; i < length; i++) {
449
+ if (self[i] === nil) {
450
+ self.splice(i, 1);
387
451
 
388
452
  length--;
389
453
  i--;
390
454
  }
391
455
  }
392
456
 
393
- return #{self}.length === original ? nil : #{self};
457
+ return self.length === original ? nil : self;
394
458
  }
395
459
  end
396
460
 
397
461
  def concat(other)
398
462
  %x{
399
463
  for (var i = 0, length = other.length; i < length; i++) {
400
- #{self}.push(other[i]);
464
+ self.push(other[i]);
401
465
  }
402
466
  }
403
467
 
404
468
  self
405
469
  end
406
470
 
407
- def count(object = undefined)
408
- %x{
409
- if (object == null) {
410
- return #{self}.length;
411
- }
412
-
413
- var result = 0;
414
-
415
- for (var i = 0, length = #{self}.length; i < length; i++) {
416
- if (#{`#{self}[i]` == object}) {
417
- result++;
418
- }
419
- }
420
-
421
- return result;
422
- }
423
- end
424
-
425
471
  def delete(object)
426
472
  %x{
427
- var original = #{self}.length;
473
+ var original = self.length;
428
474
 
429
475
  for (var i = 0, length = original; i < length; i++) {
430
- if (#{`#{self}[i]` == object}) {
431
- #{self}.splice(i, 1);
476
+ if (#{`self[i]` == object}) {
477
+ self.splice(i, 1);
432
478
 
433
479
  length--;
434
480
  i--;
435
481
  }
436
482
  }
437
483
 
438
- return #{self}.length === original ? nil : object;
484
+ return self.length === original ? nil : object;
439
485
  }
440
486
  end
441
487
 
442
488
  def delete_at(index)
443
489
  %x{
444
490
  if (index < 0) {
445
- index += #{self}.length;
491
+ index += self.length;
446
492
  }
447
493
 
448
- if (index < 0 || index >= #{self}.length) {
494
+ if (index < 0 || index >= self.length) {
449
495
  return nil;
450
496
  }
451
497
 
452
- var result = #{self}[index];
498
+ var result = self[index];
453
499
 
454
- #{self}.splice(index, 1);
500
+ self.splice(index, 1);
455
501
 
456
502
  return result;
457
503
  }
458
504
  end
459
505
 
460
506
  def delete_if(&block)
507
+ return enum_for :delete_if unless block_given?
508
+
461
509
  %x{
462
- for (var i = 0, length = #{self}.length, value; i < length; i++) {
463
- if ((value = block(#{self}[i])) === $breaker) {
510
+ for (var i = 0, length = self.length, value; i < length; i++) {
511
+ if ((value = block(self[i])) === $breaker) {
464
512
  return $breaker.$v;
465
513
  }
466
514
 
467
515
  if (value !== false && value !== nil) {
468
- #{self}.splice(i, 1);
516
+ self.splice(i, 1);
469
517
 
470
518
  length--;
471
519
  i--;
@@ -477,7 +525,13 @@ class Array
477
525
  end
478
526
 
479
527
  def drop(number)
480
- `#{self}.slice(number)`
528
+ %x{
529
+ if (number < 0) {
530
+ #{raise ArgumentError}
531
+ }
532
+
533
+ return self.slice(number);
534
+ }
481
535
  end
482
536
 
483
537
  alias dup clone
@@ -486,16 +540,11 @@ class Array
486
540
  return enum_for :each unless block_given?
487
541
 
488
542
  %x{
489
- if (block.length > 1) {
490
- for (var i = 0, length = #{self}.length, el; i < length; i++) {
491
- el = #{self}[i];
492
- if (!el._isArray) el = [el];
543
+ for (var i = 0, length = self.length; i < length; i++) {
544
+ var value = $opal.$yield1(block, self[i]);
493
545
 
494
- if (block.apply(null, el) === $breaker) return $breaker.$v;
495
- }
496
- } else {
497
- for (var i = 0, length = #{self}.length; i < length; i++) {
498
- if (block(#{self}[i]) === $breaker) return $breaker.$v;
546
+ if (value == $breaker) {
547
+ return $breaker.$v;
499
548
  }
500
549
  }
501
550
  }
@@ -504,15 +553,23 @@ class Array
504
553
  end
505
554
 
506
555
  def each_index(&block)
507
- `for (var i = 0, length = #{self}.length; i < length; i++) {`
508
- yield `i`
509
- `}`
556
+ return enum_for :each_index unless block_given?
557
+
558
+ %x{
559
+ for (var i = 0, length = self.length; i < length; i++) {
560
+ var value = $opal.$yield1(block, i);
561
+
562
+ if (value === $breaker) {
563
+ return $breaker.$v;
564
+ }
565
+ }
566
+ }
510
567
 
511
568
  self
512
569
  end
513
570
 
514
571
  def empty?
515
- `!#{self}.length`
572
+ `self.length === 0`
516
573
  end
517
574
 
518
575
  def fetch(index, defaults = undefined, &block)
@@ -520,38 +577,110 @@ class Array
520
577
  var original = index;
521
578
 
522
579
  if (index < 0) {
523
- index += #{self}.length;
580
+ index += self.length;
524
581
  }
525
582
 
526
- if (index >= 0 && index < #{self}.length) {
527
- return #{self}[index];
528
- }
529
-
530
- if (defaults != null) {
531
- return defaults;
583
+ if (index >= 0 && index < self.length) {
584
+ return self[index];
532
585
  }
533
586
 
534
587
  if (block !== nil) {
535
588
  return block(original);
536
589
  }
537
590
 
591
+ if (defaults != null) {
592
+ return defaults;
593
+ }
594
+
538
595
  #{ raise IndexError, "Array#fetch" };
539
596
  }
540
597
  end
541
598
 
542
- def fill(obj = undefined, &block)
543
- %x{
544
- if (block !== nil) {
545
- for (var i = 0, length = #{self}.length; i < length; i++) {
546
- #{self}[i] = block(i);
599
+ def fill(*args, &block)
600
+ if block
601
+ if `args.length > 2`
602
+ raise ArgumentError, "wrong number of arguments (#{args.length} for 0..2)"
603
+ end
604
+
605
+ one, two = args
606
+ else
607
+ if `args.length == 0`
608
+ raise ArgumentError, "wrong number of arguments (0 for 1..3)"
609
+ elsif `args.length > 3`
610
+ raise ArgumentError, "wrong number of arguments (#{args.length} for 1..3)"
611
+ end
612
+
613
+ obj, one, two = args
614
+ end
615
+
616
+ if Range === one
617
+ raise TypeError, "length invalid with range" if two
618
+
619
+ left = Opal.coerce_to one.begin, Integer, :to_int
620
+ `left += #@length` if `left < 0`
621
+ raise RangeError, "#{one.inspect} out of range" if `left < 0`
622
+
623
+ right = Opal.coerce_to one.end, Integer, :to_int
624
+ `right += #@length` if `right < 0`
625
+ `right += 1` unless one.exclude_end?
626
+
627
+ return self if `right <= left`
628
+ elsif one
629
+ left = Opal.coerce_to one, Integer, :to_int
630
+ `left += #@length` if `left < 0`
631
+ left = 0 if `left < 0`
632
+
633
+ if two
634
+ right = Opal.coerce_to two, Integer, :to_int
635
+
636
+ return self if `right == 0`
637
+
638
+ `right += left`
639
+ else
640
+ right = @length
641
+ end
642
+ else
643
+ left = 0
644
+ right = @length
645
+ end
646
+
647
+ if `right > 2147483648`
648
+ raise RangeError, "bignum too big to convert into `long'"
649
+ elsif `right >= 536870910`
650
+ raise ArgumentError, "argument too big"
651
+ end
652
+
653
+ if `left > #@length`
654
+ %x{
655
+ for (var i = #@length; i < right; i++) {
656
+ self[i] = nil;
547
657
  }
548
658
  }
549
- else {
550
- for (var i = 0, length = #{self}.length; i < length; i++) {
551
- #{self}[i] = obj;
659
+ end
660
+
661
+ if `right > #@length`
662
+ @length = right
663
+ end
664
+
665
+ if block
666
+ %x{
667
+ for (var length = #@length; left < right; left++) {
668
+ var value = block(left);
669
+
670
+ if (value === $breaker) {
671
+ return $breaker.$v;
672
+ }
673
+
674
+ self[left] = value;
552
675
  }
553
676
  }
554
- }
677
+ else
678
+ %x{
679
+ for (var length = #@length; left < right; left++) {
680
+ self[left] = #{obj};
681
+ }
682
+ }
683
+ end
555
684
 
556
685
  self
557
686
  end
@@ -559,10 +688,15 @@ class Array
559
688
  def first(count = undefined)
560
689
  %x{
561
690
  if (count != null) {
562
- return #{self}.slice(0, count);
691
+
692
+ if (count < 0) {
693
+ #{raise ArgumentError};
694
+ }
695
+
696
+ return self.slice(0, count);
563
697
  }
564
698
 
565
- return #{self}.length === 0 ? nil : #{self}[0];
699
+ return self.length === 0 ? nil : self[0];
566
700
  }
567
701
  end
568
702
 
@@ -570,10 +704,12 @@ class Array
570
704
  %x{
571
705
  var result = [];
572
706
 
573
- for (var i = 0, length = #{self}.length, item; i < length; i++) {
574
- item = #{self}[i];
707
+ for (var i = 0, length = self.length; i < length; i++) {
708
+ var item = self[i];
709
+
710
+ if (#{`item`.respond_to?(:to_ary)}) {
711
+ item = #{`item`.to_ary};
575
712
 
576
- if (item._isArray) {
577
713
  if (level == null) {
578
714
  result = result.concat(#{`item`.flatten});
579
715
  }
@@ -595,21 +731,34 @@ class Array
595
731
 
596
732
  def flatten!(level = undefined)
597
733
  %x{
598
- var size = #{self}.length;
599
- #{replace flatten level};
734
+ var flattened = #{flatten level};
600
735
 
601
- return size === #{self}.length ? nil : #{self};
736
+ if (self.length == flattened.length) {
737
+ for (var i = 0, length = self.length; i < length; i++) {
738
+ if (self[i] !== flattened[i]) {
739
+ break;
740
+ }
741
+ }
742
+
743
+ if (i == length) {
744
+ return nil;
745
+ }
746
+ }
747
+
748
+ #{replace `flattened`};
602
749
  }
750
+
751
+ self
603
752
  end
604
753
 
605
754
  def hash
606
- `#{self}._id || (#{self}._id = Opal.uid())`
755
+ `self._id || (self._id = Opal.uid())`
607
756
  end
608
757
 
609
758
  def include?(member)
610
759
  %x{
611
- for (var i = 0, length = #{self}.length; i < length; i++) {
612
- if (#{`#{self}[i]` == member}) {
760
+ for (var i = 0, length = self.length; i < length; i++) {
761
+ if (#{`self[i]` == member}) {
613
762
  return true;
614
763
  }
615
764
  }
@@ -621,15 +770,15 @@ class Array
621
770
  def index(object=undefined, &block)
622
771
  %x{
623
772
  if (object != null) {
624
- for (var i = 0, length = #{self}.length; i < length; i++) {
625
- if (#{`#{self}[i]` == object}) {
773
+ for (var i = 0, length = self.length; i < length; i++) {
774
+ if (#{`self[i]` == object}) {
626
775
  return i;
627
776
  }
628
777
  }
629
778
  }
630
779
  else if (block !== nil) {
631
- for (var i = 0, length = #{self}.length, value; i < length; i++) {
632
- if ((value = block(#{self}[i])) === $breaker) {
780
+ for (var i = 0, length = self.length, value; i < length; i++) {
781
+ if ((value = block(self[i])) === $breaker) {
633
782
  return $breaker.$v;
634
783
  }
635
784
 
@@ -638,6 +787,9 @@ class Array
638
787
  }
639
788
  }
640
789
  }
790
+ else {
791
+ return #{enum_for :index};
792
+ }
641
793
 
642
794
  return nil;
643
795
  }
@@ -647,19 +799,19 @@ class Array
647
799
  %x{
648
800
  if (objects.length > 0) {
649
801
  if (index < 0) {
650
- index += #{self}.length + 1;
802
+ index += self.length + 1;
651
803
 
652
804
  if (index < 0) {
653
805
  #{ raise IndexError, "#{index} is out of bounds" };
654
806
  }
655
807
  }
656
- if (index > #{self}.length) {
657
- for (var i = #{self}.length; i < index; i++) {
658
- #{self}.push(nil);
808
+ if (index > self.length) {
809
+ for (var i = self.length; i < index; i++) {
810
+ self.push(nil);
659
811
  }
660
812
  }
661
813
 
662
- #{self}.splice.apply(#{self}, [index, 0].concat(objects));
814
+ self.splice.apply(self, [index, 0].concat(objects));
663
815
  }
664
816
  }
665
817
 
@@ -672,7 +824,7 @@ class Array
672
824
 
673
825
  inspect = [];
674
826
  object_id = #{object_id};
675
- length = #{self}.length;
827
+ length = self.length;
676
828
 
677
829
  for (i = 0; i < length; i++) {
678
830
  el = #{self[`i`]};
@@ -690,8 +842,8 @@ class Array
690
842
  %x{
691
843
  var result = [];
692
844
 
693
- for (var i = 0, length = #{self}.length; i < length; i++) {
694
- result.push(#{`#{self}[i]`.to_s});
845
+ for (var i = 0, length = self.length; i < length; i++) {
846
+ result.push(#{`self[i]`.to_s});
695
847
  }
696
848
 
697
849
  return result.join(sep);
@@ -699,14 +851,16 @@ class Array
699
851
  end
700
852
 
701
853
  def keep_if(&block)
854
+ return enum_for :keep_if unless block_given?
855
+
702
856
  %x{
703
- for (var i = 0, length = #{self}.length, value; i < length; i++) {
704
- if ((value = block(#{self}[i])) === $breaker) {
857
+ for (var i = 0, length = self.length, value; i < length; i++) {
858
+ if ((value = block(self[i])) === $breaker) {
705
859
  return $breaker.$v;
706
860
  }
707
861
 
708
862
  if (value === false || value === nil) {
709
- #{self}.splice(i, 1);
863
+ self.splice(i, 1);
710
864
 
711
865
  length--;
712
866
  i--;
@@ -719,7 +873,7 @@ class Array
719
873
 
720
874
  def last(count = undefined)
721
875
  %x{
722
- var length = #{self}.length;
876
+ var length = self.length;
723
877
 
724
878
  if (count === nil || typeof(count) == 'string') {
725
879
  #{ raise TypeError, "no implicit conversion to integer" };
@@ -735,7 +889,7 @@ class Array
735
889
  }
736
890
 
737
891
  if (count == null) {
738
- return length === 0 ? nil : #{self}[length - 1];
892
+ return length === 0 ? nil : self[length - 1];
739
893
  }
740
894
  else if (count < 0) {
741
895
  #{ raise ArgumentError, "negative count given" };
@@ -745,12 +899,12 @@ class Array
745
899
  count = length;
746
900
  }
747
901
 
748
- return #{self}.slice(length - count, length);
902
+ return self.slice(length - count, length);
749
903
  }
750
904
  end
751
905
 
752
906
  def length
753
- `#{self}.length`
907
+ `self.length`
754
908
  end
755
909
 
756
910
  alias map collect
@@ -759,24 +913,24 @@ class Array
759
913
 
760
914
  def pop(count = undefined)
761
915
  %x{
762
- var length = #{self}.length;
916
+ var length = self.length;
763
917
 
764
918
  if (count == null) {
765
- return length === 0 ? nil : #{self}.pop();
919
+ return length === 0 ? nil : self.pop();
766
920
  }
767
921
 
768
922
  if (count < 0) {
769
- #{ raise "negative count given" };
923
+ #{ raise ArgumentError, "negative count given" };
770
924
  }
771
925
 
772
- return count > length ? #{self}.splice(0, #{self}.length) : #{self}.splice(length - count, length);
926
+ return count > length ? self.splice(0, self.length) : self.splice(length - count, length);
773
927
  }
774
928
  end
775
929
 
776
930
  def push(*objects)
777
931
  %x{
778
932
  for (var i = 0, length = objects.length; i < length; i++) {
779
- #{self}.push(objects[i]);
933
+ self.push(objects[i]);
780
934
  }
781
935
  }
782
936
 
@@ -785,8 +939,8 @@ class Array
785
939
 
786
940
  def rassoc(object)
787
941
  %x{
788
- for (var i = 0, length = #{self}.length, item; i < length; i++) {
789
- item = #{self}[i];
942
+ for (var i = 0, length = self.length, item; i < length; i++) {
943
+ item = self[i];
790
944
 
791
945
  if (item.length && item[1] !== undefined) {
792
946
  if (#{`item[1]` == object}) {
@@ -800,16 +954,18 @@ class Array
800
954
  end
801
955
 
802
956
  def reject(&block)
957
+ return enum_for :reject unless block_given?
958
+
803
959
  %x{
804
960
  var result = [];
805
961
 
806
- for (var i = 0, length = #{self}.length, value; i < length; i++) {
807
- if ((value = block(#{self}[i])) === $breaker) {
962
+ for (var i = 0, length = self.length, value; i < length; i++) {
963
+ if ((value = block(self[i])) === $breaker) {
808
964
  return $breaker.$v;
809
965
  }
810
966
 
811
967
  if (value === false || value === nil) {
812
- result.push(#{self}[i]);
968
+ result.push(self[i]);
813
969
  }
814
970
  }
815
971
  return result;
@@ -817,40 +973,51 @@ class Array
817
973
  end
818
974
 
819
975
  def reject!(&block)
976
+ return enum_for :reject! unless block_given?
977
+
820
978
  %x{
821
- var original = #{self}.length;
979
+ var original = self.length;
822
980
  #{ delete_if &block };
823
- return #{self}.length === original ? nil : #{self};
981
+ return self.length === original ? nil : self;
824
982
  }
825
983
  end
826
984
 
827
985
  def replace(other)
828
986
  %x{
829
- #{self}.splice(0, #{self}.length);
830
- #{self}.push.apply(#{self}, other);
831
- return #{self};
987
+ self.splice(0, self.length);
988
+ self.push.apply(self, other);
832
989
  }
990
+
991
+ self
833
992
  end
834
993
 
835
994
  def reverse
836
- `#{self}.slice(0).reverse()`
995
+ `self.slice(0).reverse()`
837
996
  end
838
997
 
839
998
  def reverse!
840
- `#{self}.reverse()`
999
+ `self.reverse()`
841
1000
  end
842
1001
 
843
1002
  def reverse_each(&block)
844
- reverse.each &block
1003
+ return enum_for :reverse_each unless block_given?
845
1004
 
1005
+ reverse.each &block
846
1006
  self
847
1007
  end
848
1008
 
849
1009
  def rindex(object = undefined, &block)
850
1010
  %x{
851
- if (block !== nil) {
852
- for (var i = #{self}.length - 1, value; i >= 0; i--) {
853
- if ((value = block(#{self}[i])) === $breaker) {
1011
+ if (object != null) {
1012
+ for (var i = self.length - 1; i >= 0; i--) {
1013
+ if (#{`self[i]` == `object`}) {
1014
+ return i;
1015
+ }
1016
+ }
1017
+ }
1018
+ else if (block !== nil) {
1019
+ for (var i = self.length - 1, value; i >= 0; i--) {
1020
+ if ((value = block(self[i])) === $breaker) {
854
1021
  return $breaker.$v;
855
1022
  }
856
1023
 
@@ -859,24 +1026,35 @@ class Array
859
1026
  }
860
1027
  }
861
1028
  }
862
- else {
863
- for (var i = #{self}.length - 1; i >= 0; i--) {
864
- if (#{`#{self}[i]` == `object`}) {
865
- return i;
866
- }
867
- }
1029
+ else if (object == null) {
1030
+ return #{enum_for :rindex};
868
1031
  }
869
1032
 
870
1033
  return nil;
871
1034
  }
872
1035
  end
873
1036
 
1037
+ def sample(n = nil)
1038
+ return nil if !n && empty?
1039
+ return [] if n && empty?
1040
+
1041
+ if n
1042
+ (1 .. n).map {
1043
+ self[rand(length)]
1044
+ }
1045
+ else
1046
+ self[rand(length)]
1047
+ end
1048
+ end
1049
+
874
1050
  def select(&block)
1051
+ return enum_for :select unless block_given?
1052
+
875
1053
  %x{
876
1054
  var result = [];
877
1055
 
878
- for (var i = 0, length = #{self}.length, item, value; i < length; i++) {
879
- item = #{self}[i];
1056
+ for (var i = 0, length = self.length, item, value; i < length; i++) {
1057
+ item = self[i];
880
1058
 
881
1059
  if ((value = block(item)) === $breaker) {
882
1060
  return $breaker.$v;
@@ -892,143 +1070,136 @@ class Array
892
1070
  end
893
1071
 
894
1072
  def select!(&block)
1073
+ return enum_for :select! unless block_given?
1074
+
895
1075
  %x{
896
- var original = #{self}.length;
1076
+ var original = self.length;
897
1077
  #{ keep_if &block };
898
- return #{self}.length === original ? nil : #{self};
1078
+ return self.length === original ? nil : self;
899
1079
  }
900
1080
  end
901
1081
 
902
1082
  def shift(count = undefined)
903
1083
  %x{
904
- if (#{self}.length === 0) {
1084
+ if (self.length === 0) {
905
1085
  return nil;
906
1086
  }
907
1087
 
908
- return count == null ? #{self}.shift() : #{self}.splice(0, count)
1088
+ return count == null ? self.shift() : self.splice(0, count)
909
1089
  }
910
1090
  end
911
1091
 
912
1092
  alias size length
913
1093
 
914
1094
  def shuffle
1095
+ clone.shuffle!
1096
+ end
1097
+
1098
+ def shuffle!
915
1099
  %x{
916
- for (var i = #{self}.length - 1; i > 0; i--) {
917
- var j = Math.floor(Math.random() * (i + 1));
918
- var tmp = #{self}[i];
919
- #{self}[i] = #{self}[j];
920
- #{self}[j] = tmp;
921
- }
1100
+ for (var i = self.length - 1; i > 0; i--) {
1101
+ var tmp = self[i],
1102
+ j = Math.floor(Math.random() * (i + 1));
922
1103
 
923
- return #{self};
1104
+ self[i] = self[j];
1105
+ self[j] = tmp;
1106
+ }
924
1107
  }
1108
+
1109
+ self
925
1110
  end
926
1111
 
927
- alias slice :[]
1112
+ alias slice []
928
1113
 
929
1114
  def slice!(index, length = undefined)
930
1115
  %x{
931
1116
  if (index < 0) {
932
- index += #{self}.length;
1117
+ index += self.length;
933
1118
  }
934
1119
 
935
1120
  if (length != null) {
936
- return #{self}.splice(index, length);
1121
+ return self.splice(index, length);
937
1122
  }
938
1123
 
939
- if (index < 0 || index >= #{self}.length) {
1124
+ if (index < 0 || index >= self.length) {
940
1125
  return nil;
941
1126
  }
942
1127
 
943
- return #{self}.splice(index, 1)[0];
1128
+ return self.splice(index, 1)[0];
944
1129
  }
945
1130
  end
946
1131
 
947
1132
  def sort(&block)
1133
+ return self unless `self.length > 1`
1134
+
948
1135
  %x{
949
- var copy = #{self}.slice();
950
- var t_arg_error = false;
951
- var t_break = [];
1136
+ if (!#{block_given?}) {
1137
+ block = function(a, b) {
1138
+ return #{`a` <=> `b`};
1139
+ };
1140
+ }
952
1141
 
953
- if (block !== nil) {
954
- var result = copy.sort(function(x, y) {
955
- var result = block(x, y);
956
- if (result === $breaker) {
957
- t_break.push($breaker.$v);
958
- }
959
- if (result === nil) {
960
- t_arg_error = true;
961
- }
962
- if ((result != null) && #{ `result`.respond_to? :<=> }) {
963
- result = result['$<=>'](0);
1142
+ try {
1143
+ return self.slice().sort(function(x, y) {
1144
+ var ret = block(x, y);
1145
+
1146
+ if (ret === $breaker) {
1147
+ throw $breaker;
964
1148
  }
965
- if (result !== -1 && result !== 0 && result !== 1) {
966
- t_arg_error = true;
1149
+ else if (ret === nil) {
1150
+ #{raise ArgumentError, "comparison of #{`x`.inspect} with #{`y`.inspect} failed"};
967
1151
  }
968
- return result;
969
- });
970
-
971
- if (t_break.length > 0)
972
- return t_break[0];
973
- if (t_arg_error)
974
- #{raise ArgumentError, "Array#sort"};
975
1152
 
976
- return result;
1153
+ return #{`ret` > 0} ? 1 : (#{`ret` < 0} ? -1 : 0);
1154
+ });
977
1155
  }
978
-
979
- var result = copy.sort(function(a, b){
980
- if (typeof(a) !== typeof(b)) {
981
- t_arg_error = true;
1156
+ catch (e) {
1157
+ if (e === $breaker) {
1158
+ return $breaker.$v;
982
1159
  }
983
-
984
- if (a['$<=>'] && typeof(a['$<=>']) == "function") {
985
- var result = a['$<=>'](b);
986
- if (result === nil) {
987
- t_arg_error = true;
988
- }
989
- return result;
1160
+ else {
1161
+ throw e;
990
1162
  }
991
- if (a > b)
992
- return 1;
993
- if (a < b)
994
- return -1;
995
- return 0;
996
- });
997
-
998
- if (t_arg_error)
999
- #{raise ArgumentError, "Array#sort"};
1000
-
1001
- return result;
1163
+ }
1002
1164
  }
1003
1165
  end
1004
1166
 
1005
1167
  def sort!(&block)
1006
1168
  %x{
1007
1169
  var result;
1008
- if (block !== nil) {
1009
- //strangely
1010
- result = #{self}.slice().sort(block);
1011
- } else {
1012
- result = #{self}.slice()['$sort']();
1170
+
1171
+ if (#{block_given?}) {
1172
+ result = #{`self.slice()`.sort(&block)};
1173
+ }
1174
+ else {
1175
+ result = #{`self.slice()`.sort};
1013
1176
  }
1014
- #{self}.length = 0;
1015
- for(var i = 0; i < result.length; i++) {
1016
- #{self}.push(result[i]);
1177
+
1178
+ self.length = 0;
1179
+ for(var i = 0, length = result.length; i < length; i++) {
1180
+ self.push(result[i]);
1017
1181
  }
1018
- return #{self};
1182
+
1183
+ return self;
1019
1184
  }
1020
1185
  end
1021
1186
 
1022
1187
  def take(count)
1023
- `#{self}.slice(0, count)`
1188
+ %x{
1189
+ if (count < 0) {
1190
+ #{raise ArgumentError};
1191
+ }
1192
+
1193
+ return self.slice(0, count);
1194
+ }
1024
1195
  end
1025
1196
 
1026
1197
  def take_while(&block)
1027
1198
  %x{
1028
1199
  var result = [];
1029
1200
 
1030
- for (var i = 0, length = #{self}.length, item, value; i < length; i++) {
1031
- item = #{self}[i];
1201
+ for (var i = 0, length = self.length, item, value; i < length; i++) {
1202
+ item = self[i];
1032
1203
 
1033
1204
  if ((value = block(item)) === $breaker) {
1034
1205
  return $breaker.$v;
@@ -1055,11 +1226,11 @@ class Array
1055
1226
  %x{
1056
1227
  var result = [], obj
1057
1228
 
1058
- for (var i = 0, len = #{self}.length; i < len; i++) {
1059
- obj = #{self}[i];
1229
+ for (var i = 0, len = self.length; i < len; i++) {
1230
+ obj = self[i];
1060
1231
 
1061
- if (obj.$to_n) {
1062
- result.push(#{ `obj`.to_n });
1232
+ if (#{`obj`.respond_to? :to_n}) {
1233
+ result.push(#{`obj`.to_n});
1063
1234
  }
1064
1235
  else {
1065
1236
  result.push(obj);
@@ -1070,69 +1241,96 @@ class Array
1070
1241
  }
1071
1242
  end
1072
1243
 
1073
-
1074
1244
  alias to_s inspect
1075
1245
 
1246
+ def transpose
1247
+ return [] if empty?
1248
+
1249
+ result = []
1250
+ max = nil
1251
+
1252
+ each {|row|
1253
+ if Array === row
1254
+ row = row.to_a
1255
+ else
1256
+ row = Opal.coerce_to row, Array, :to_ary
1257
+ end
1258
+
1259
+ max ||= `row.length`
1260
+
1261
+ if `row.length` != max
1262
+ raise IndexError, "element size differs (#{`row.length`} should be #{max}"
1263
+ end
1264
+
1265
+ `row.length`.times {|i|
1266
+ entry = (result[i] ||= [])
1267
+ entry << row.at(i)
1268
+ }
1269
+ }
1270
+
1271
+ result
1272
+ end
1273
+
1076
1274
  def uniq
1077
1275
  %x{
1078
1276
  var result = [],
1079
1277
  seen = {};
1080
-
1081
- for (var i = 0, length = #{self}.length, item, hash; i < length; i++) {
1082
- item = #{self}[i];
1278
+
1279
+ for (var i = 0, length = self.length, item, hash; i < length; i++) {
1280
+ item = self[i];
1083
1281
  hash = item;
1084
-
1282
+
1085
1283
  if (!seen[hash]) {
1086
1284
  seen[hash] = true;
1087
-
1285
+
1088
1286
  result.push(item);
1089
1287
  }
1090
1288
  }
1091
-
1289
+
1092
1290
  return result;
1093
1291
  }
1094
1292
  end
1095
1293
 
1096
1294
  def uniq!
1097
1295
  %x{
1098
- var original = #{self}.length,
1296
+ var original = self.length,
1099
1297
  seen = {};
1100
1298
 
1101
1299
  for (var i = 0, length = original, item, hash; i < length; i++) {
1102
- item = #{self}[i];
1300
+ item = self[i];
1103
1301
  hash = item;
1104
1302
 
1105
1303
  if (!seen[hash]) {
1106
1304
  seen[hash] = true;
1107
1305
  }
1108
1306
  else {
1109
- #{self}.splice(i, 1);
1307
+ self.splice(i, 1);
1110
1308
 
1111
1309
  length--;
1112
1310
  i--;
1113
1311
  }
1114
1312
  }
1115
1313
 
1116
- return #{self}.length === original ? nil : #{self};
1314
+ return self.length === original ? nil : self;
1117
1315
  }
1118
1316
  end
1119
1317
 
1120
1318
  def unshift(*objects)
1121
1319
  %x{
1122
1320
  for (var i = objects.length - 1; i >= 0; i--) {
1123
- #{self}.unshift(objects[i]);
1321
+ self.unshift(objects[i]);
1124
1322
  }
1125
-
1126
- return #{self};
1127
1323
  }
1324
+
1325
+ self
1128
1326
  end
1129
1327
 
1130
1328
  def zip(*others, &block)
1131
1329
  %x{
1132
- var result = [], size = #{self}.length, part, o;
1330
+ var result = [], size = self.length, part, o;
1133
1331
 
1134
1332
  for (var i = 0; i < size; i++) {
1135
- part = [#{self}[i]];
1333
+ part = [self[i]];
1136
1334
 
1137
1335
  for (var j = 0, jj = others.length; j < jj; j++) {
1138
1336
  o = others[j][i];