opal-cj 0.7.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +27 -0
  4. data/.rspec +3 -0
  5. data/.spectator +2 -0
  6. data/.spectator-mspec +3 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.md +406 -0
  9. data/CONTRIBUTING.md +41 -0
  10. data/Gemfile +27 -0
  11. data/Guardfile +77 -0
  12. data/LICENSE +19 -0
  13. data/README.md +178 -0
  14. data/Rakefile +116 -0
  15. data/benchmarks/operators.rb +11 -0
  16. data/bin/opal +22 -0
  17. data/bin/opal-build +77 -0
  18. data/bin/opal-mspec +10 -0
  19. data/bin/opal-repl +72 -0
  20. data/config.ru +14 -0
  21. data/examples/rack/Gemfile +3 -0
  22. data/examples/rack/app/application.rb +13 -0
  23. data/examples/rack/app/user.rb +21 -0
  24. data/examples/rack/config.ru +7 -0
  25. data/examples/rack/index.html.erb +10 -0
  26. data/examples/sinatra/Gemfile +4 -0
  27. data/examples/sinatra/app/application.rb +7 -0
  28. data/examples/sinatra/config.ru +28 -0
  29. data/lib/mspec/opal/main.rb.erb +9 -0
  30. data/lib/mspec/opal/rake_task.rb +278 -0
  31. data/lib/mspec/opal/runner.rb +206 -0
  32. data/lib/mspec/opal/sprockets.js +57 -0
  33. data/lib/opal.rb +11 -0
  34. data/lib/opal/builder.rb +135 -0
  35. data/lib/opal/builder_processors.rb +165 -0
  36. data/lib/opal/cli.rb +145 -0
  37. data/lib/opal/cli_options.rb +149 -0
  38. data/lib/opal/cli_runners.rb +10 -0
  39. data/lib/opal/cli_runners/nodejs.rb +56 -0
  40. data/lib/opal/cli_runners/phantom.js +35 -0
  41. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  42. data/lib/opal/cli_runners/server.rb +54 -0
  43. data/lib/opal/compiler.rb +307 -0
  44. data/lib/opal/erb.rb +64 -0
  45. data/lib/opal/fragment.rb +41 -0
  46. data/lib/opal/hike_path_finder.rb +18 -0
  47. data/lib/opal/nodes.rb +26 -0
  48. data/lib/opal/nodes/arglist.rb +56 -0
  49. data/lib/opal/nodes/array.rb +54 -0
  50. data/lib/opal/nodes/base.rb +151 -0
  51. data/lib/opal/nodes/call.rb +283 -0
  52. data/lib/opal/nodes/call_special.rb +178 -0
  53. data/lib/opal/nodes/case.rb +96 -0
  54. data/lib/opal/nodes/class.rb +42 -0
  55. data/lib/opal/nodes/constants.rb +78 -0
  56. data/lib/opal/nodes/def.rb +157 -0
  57. data/lib/opal/nodes/defined.rb +113 -0
  58. data/lib/opal/nodes/definitions.rb +168 -0
  59. data/lib/opal/nodes/for.rb +35 -0
  60. data/lib/opal/nodes/hash.rb +67 -0
  61. data/lib/opal/nodes/helpers.rb +114 -0
  62. data/lib/opal/nodes/if.rb +67 -0
  63. data/lib/opal/nodes/iter.rb +131 -0
  64. data/lib/opal/nodes/literal.rb +230 -0
  65. data/lib/opal/nodes/logic.rb +217 -0
  66. data/lib/opal/nodes/masgn.rb +62 -0
  67. data/lib/opal/nodes/module.rb +46 -0
  68. data/lib/opal/nodes/rescue.rb +135 -0
  69. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  70. data/lib/opal/nodes/scope.rb +293 -0
  71. data/lib/opal/nodes/singleton_class.rb +25 -0
  72. data/lib/opal/nodes/super.rb +97 -0
  73. data/lib/opal/nodes/top.rb +101 -0
  74. data/lib/opal/nodes/variables.rb +158 -0
  75. data/lib/opal/nodes/while.rb +65 -0
  76. data/lib/opal/nodes/yield.rb +95 -0
  77. data/lib/opal/parser.rb +658 -0
  78. data/lib/opal/parser/grammar.rb +5452 -0
  79. data/lib/opal/parser/grammar.y +1684 -0
  80. data/lib/opal/parser/keywords.rb +66 -0
  81. data/lib/opal/parser/lexer.rb +1208 -0
  82. data/lib/opal/parser/parser_scope.rb +25 -0
  83. data/lib/opal/parser/sexp.rb +75 -0
  84. data/lib/opal/path_reader.rb +28 -0
  85. data/lib/opal/paths.rb +38 -0
  86. data/lib/opal/source_map.rb +70 -0
  87. data/lib/opal/sprockets.rb +4 -0
  88. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  89. data/lib/opal/sprockets/environment.rb +37 -0
  90. data/lib/opal/sprockets/erb.rb +37 -0
  91. data/lib/opal/sprockets/path_reader.rb +34 -0
  92. data/lib/opal/sprockets/processor.rb +124 -0
  93. data/lib/opal/sprockets/server.rb +180 -0
  94. data/lib/opal/util.rb +64 -0
  95. data/lib/opal/version.rb +3 -0
  96. data/opal.gemspec +36 -0
  97. data/opal/README.md +6 -0
  98. data/opal/corelib/array.rb +1556 -0
  99. data/opal/corelib/array/inheritance.rb +113 -0
  100. data/opal/corelib/basic_object.rb +73 -0
  101. data/opal/corelib/boolean.rb +41 -0
  102. data/opal/corelib/class.rb +55 -0
  103. data/opal/corelib/comparable.rb +56 -0
  104. data/opal/corelib/complex.rb +3 -0
  105. data/opal/corelib/dir.rb +20 -0
  106. data/opal/corelib/enumerable.rb +1132 -0
  107. data/opal/corelib/enumerator.rb +422 -0
  108. data/opal/corelib/error.rb +63 -0
  109. data/opal/corelib/file.rb +56 -0
  110. data/opal/corelib/hash.rb +728 -0
  111. data/opal/corelib/helpers.rb +102 -0
  112. data/opal/corelib/io.rb +59 -0
  113. data/opal/corelib/kernel.rb +569 -0
  114. data/opal/corelib/main.rb +7 -0
  115. data/opal/corelib/match_data.rb +114 -0
  116. data/opal/corelib/method.rb +58 -0
  117. data/opal/corelib/module.rb +462 -0
  118. data/opal/corelib/nil_class.rb +62 -0
  119. data/opal/corelib/numeric.rb +532 -0
  120. data/opal/corelib/proc.rb +52 -0
  121. data/opal/corelib/range.rb +116 -0
  122. data/opal/corelib/rational.rb +3 -0
  123. data/opal/corelib/regexp.rb +133 -0
  124. data/opal/corelib/runtime.js +1240 -0
  125. data/opal/corelib/string.rb +1212 -0
  126. data/opal/corelib/string/inheritance.rb +78 -0
  127. data/opal/corelib/struct.rb +141 -0
  128. data/opal/corelib/time.rb +584 -0
  129. data/opal/corelib/variables.rb +24 -0
  130. data/opal/opal.rb +32 -0
  131. data/package.json +9 -0
  132. data/spec/filters/bugs/array.rb +232 -0
  133. data/spec/filters/bugs/basic_object.rb +14 -0
  134. data/spec/filters/bugs/class.rb +21 -0
  135. data/spec/filters/bugs/enumerable.rb +69 -0
  136. data/spec/filters/bugs/enumerator.rb +3 -0
  137. data/spec/filters/bugs/hash.rb +128 -0
  138. data/spec/filters/bugs/kernel.rb +10 -0
  139. data/spec/filters/bugs/language.rb +415 -0
  140. data/spec/filters/bugs/math.rb +95 -0
  141. data/spec/filters/bugs/module.rb +14 -0
  142. data/spec/filters/bugs/nil.rb +7 -0
  143. data/spec/filters/bugs/numeric.rb +20 -0
  144. data/spec/filters/bugs/opal.rb +14 -0
  145. data/spec/filters/bugs/regexp.rb +11 -0
  146. data/spec/filters/bugs/set.rb +7 -0
  147. data/spec/filters/bugs/singleton.rb +6 -0
  148. data/spec/filters/bugs/string.rb +360 -0
  149. data/spec/filters/bugs/stringscanner.rb +22 -0
  150. data/spec/filters/bugs/struct.rb +45 -0
  151. data/spec/filters/bugs/time.rb +177 -0
  152. data/spec/filters/bugs/unknown.rb +11 -0
  153. data/spec/filters/unsupported/encoding.rb +95 -0
  154. data/spec/filters/unsupported/enumerator.rb +14 -0
  155. data/spec/filters/unsupported/float.rb +5 -0
  156. data/spec/filters/unsupported/frozen.rb +90 -0
  157. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  158. data/spec/filters/unsupported/integer_size.rb +7 -0
  159. data/spec/filters/unsupported/method_added.rb +10 -0
  160. data/spec/filters/unsupported/mutable_strings.rb +361 -0
  161. data/spec/filters/unsupported/private_constants.rb +30 -0
  162. data/spec/filters/unsupported/private_methods.rb +44 -0
  163. data/spec/filters/unsupported/random.rb +4 -0
  164. data/spec/filters/unsupported/ruby_exe.rb +5 -0
  165. data/spec/filters/unsupported/tainted.rb +155 -0
  166. data/spec/filters/unsupported/time.rb +21 -0
  167. data/spec/filters/unsupported/trusted.rb +80 -0
  168. data/spec/lib/builder_processors_spec.rb +27 -0
  169. data/spec/lib/builder_spec.rb +66 -0
  170. data/spec/lib/cli_spec.rb +134 -0
  171. data/spec/lib/compiler_spec.rb +197 -0
  172. data/spec/lib/dependency_resolver_spec.rb +40 -0
  173. data/spec/lib/fixtures/no_requires.rb +1 -0
  174. data/spec/lib/fixtures/opal_file.rb +2 -0
  175. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  176. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  177. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  178. data/spec/lib/fixtures/requires.rb +7 -0
  179. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  180. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  181. data/spec/lib/hike_path_finder_spec.rb +23 -0
  182. data/spec/lib/lexer_spec.rb +110 -0
  183. data/spec/lib/parser/alias_spec.rb +26 -0
  184. data/spec/lib/parser/and_spec.rb +13 -0
  185. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  186. data/spec/lib/parser/begin_spec.rb +42 -0
  187. data/spec/lib/parser/block_spec.rb +12 -0
  188. data/spec/lib/parser/break_spec.rb +17 -0
  189. data/spec/lib/parser/call_spec.rb +139 -0
  190. data/spec/lib/parser/class_spec.rb +35 -0
  191. data/spec/lib/parser/comments_spec.rb +11 -0
  192. data/spec/lib/parser/def_spec.rb +61 -0
  193. data/spec/lib/parser/if_spec.rb +26 -0
  194. data/spec/lib/parser/iter_spec.rb +59 -0
  195. data/spec/lib/parser/lambda_spec.rb +64 -0
  196. data/spec/lib/parser/literal_spec.rb +118 -0
  197. data/spec/lib/parser/masgn_spec.rb +37 -0
  198. data/spec/lib/parser/module_spec.rb +27 -0
  199. data/spec/lib/parser/not_spec.rb +27 -0
  200. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  201. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  202. data/spec/lib/parser/or_spec.rb +13 -0
  203. data/spec/lib/parser/return_spec.rb +17 -0
  204. data/spec/lib/parser/sclass_spec.rb +21 -0
  205. data/spec/lib/parser/string_spec.rb +276 -0
  206. data/spec/lib/parser/super_spec.rb +20 -0
  207. data/spec/lib/parser/unary_spec.rb +48 -0
  208. data/spec/lib/parser/undef_spec.rb +15 -0
  209. data/spec/lib/parser/unless_spec.rb +13 -0
  210. data/spec/lib/parser/variables_spec.rb +92 -0
  211. data/spec/lib/parser/while_spec.rb +15 -0
  212. data/spec/lib/parser/yield_spec.rb +20 -0
  213. data/spec/lib/path_reader_spec.rb +24 -0
  214. data/spec/lib/shared/path_finder_shared.rb +19 -0
  215. data/spec/lib/shared/path_reader_shared.rb +31 -0
  216. data/spec/lib/spec_helper.rb +9 -0
  217. data/spec/lib/sprockets/environment_spec.rb +30 -0
  218. data/spec/lib/sprockets/erb_spec.rb +25 -0
  219. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  220. data/spec/lib/sprockets/processor_spec.rb +35 -0
  221. data/spec/lib/sprockets/server_spec.rb +20 -0
  222. data/spec/opal/compiler/irb_spec.rb +44 -0
  223. data/spec/opal/core/array/select_spec.rb +14 -0
  224. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  225. data/spec/opal/core/date_spec.rb +122 -0
  226. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  227. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  228. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  229. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  230. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  231. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  232. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  233. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  234. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  235. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  246. data/spec/opal/core/fixtures/class.rb +124 -0
  247. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  248. data/spec/opal/core/fixtures/constants.rb +33 -0
  249. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  250. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  251. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  252. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  253. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  254. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  255. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  256. data/spec/opal/core/kernel/class_spec.rb +6 -0
  257. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  258. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  259. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  260. data/spec/opal/core/kernel/format_spec.rb +122 -0
  261. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  262. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  263. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  264. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  265. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  266. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  267. data/spec/opal/core/kernel/match_spec.rb +5 -0
  268. data/spec/opal/core/kernel/method_spec.rb +31 -0
  269. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  270. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  271. data/spec/opal/core/kernel/p_spec.rb +15 -0
  272. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  273. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  274. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  275. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  276. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  277. data/spec/opal/core/kernel/send_spec.rb +56 -0
  278. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  279. data/spec/opal/core/language/block_spec.rb +538 -0
  280. data/spec/opal/core/language/fixtures/array.rb +11 -0
  281. data/spec/opal/core/language/fixtures/block.rb +57 -0
  282. data/spec/opal/core/language/fixtures/break.rb +240 -0
  283. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  284. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  285. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  286. data/spec/opal/core/language/fixtures/module.rb +24 -0
  287. data/spec/opal/core/language/fixtures/next.rb +128 -0
  288. data/spec/opal/core/language/fixtures/return.rb +118 -0
  289. data/spec/opal/core/language/fixtures/send.rb +110 -0
  290. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  291. data/spec/opal/core/language/fixtures/super.rb +308 -0
  292. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  293. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  294. data/spec/opal/core/language/predefined_spec.rb +85 -0
  295. data/spec/opal/core/language/proc_spec.rb +263 -0
  296. data/spec/opal/core/language/regexp_spec.rb +20 -0
  297. data/spec/opal/core/language/send_spec.rb +225 -0
  298. data/spec/opal/core/language/string_spec.rb +44 -0
  299. data/spec/opal/core/language/symbol_spec.rb +40 -0
  300. data/spec/opal/core/language/variables_spec.rb +1366 -0
  301. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  302. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  303. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  304. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  305. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  306. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  307. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  308. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  309. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  310. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  311. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  312. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  313. data/spec/opal/core/module/append_features_spec.rb +14 -0
  314. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  315. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  316. data/spec/opal/core/module/const_get_spec.rb +85 -0
  317. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  318. data/spec/opal/core/module/const_set_spec.rb +64 -0
  319. data/spec/opal/core/module/constants_spec.rb +49 -0
  320. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  321. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  322. data/spec/opal/core/module/module_function_spec.rb +25 -0
  323. data/spec/opal/core/module/name_spec.rb +52 -0
  324. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  325. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  326. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  327. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  328. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  329. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  330. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  331. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  332. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  333. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  334. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  335. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  336. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  337. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  338. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  339. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  340. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  341. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  342. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  343. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  344. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  345. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  346. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  347. data/spec/opal/core/numeric/next_spec.rb +9 -0
  348. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  349. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  350. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  351. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  352. data/spec/opal/core/numeric/step_spec.rb +11 -0
  353. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  354. data/spec/opal/core/numeric/times_spec.rb +36 -0
  355. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  356. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  357. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  358. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  359. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  360. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  361. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  362. data/spec/opal/core/proc/call_spec.rb +21 -0
  363. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  364. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  365. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  366. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  367. data/spec/opal/core/runtime/block_spec.rb +23 -0
  368. data/spec/opal/core/runtime/bridged_classes_spec.rb +64 -0
  369. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  370. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  371. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  372. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  373. data/spec/opal/core/runtime/method_spec.rb +31 -0
  374. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  375. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  376. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  377. data/spec/opal/core/runtime/return_spec.rb +38 -0
  378. data/spec/opal/core/runtime/send_spec.rb +34 -0
  379. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  380. data/spec/opal/core/runtime/super_spec.rb +212 -0
  381. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  382. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  383. data/spec/opal/core/source_map_spec.rb +15 -0
  384. data/spec/opal/core/string_spec.rb +11 -0
  385. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  386. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  387. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  388. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  389. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  390. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  391. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  392. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  393. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  394. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  395. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  396. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  397. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  398. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  399. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  400. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  401. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  402. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  403. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  404. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  405. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  406. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  407. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  408. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  409. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  410. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  411. data/spec/rubyspecs +329 -0
  412. data/spec/spec_helper.rb +42 -0
  413. data/spec/support/mspec_rspec_adapter.rb +33 -0
  414. data/spec/support/parser_helpers.rb +37 -0
  415. data/stdlib/README.md +3 -0
  416. data/stdlib/base64.rb +152 -0
  417. data/stdlib/benchmark.rb +10 -0
  418. data/stdlib/buffer.rb +40 -0
  419. data/stdlib/buffer/array.rb +66 -0
  420. data/stdlib/buffer/view.rb +70 -0
  421. data/stdlib/date.rb +170 -0
  422. data/stdlib/delegate.rb +29 -0
  423. data/stdlib/dir.rb +1 -0
  424. data/stdlib/encoding.rb +166 -0
  425. data/stdlib/enumerator.rb +1 -0
  426. data/stdlib/erb.rb +16 -0
  427. data/stdlib/file.rb +1 -0
  428. data/stdlib/forwardable.rb +71 -0
  429. data/stdlib/json.rb +182 -0
  430. data/stdlib/math.rb +370 -0
  431. data/stdlib/native.rb +530 -0
  432. data/stdlib/nodejs.rb +5 -0
  433. data/stdlib/nodejs/dir.rb +13 -0
  434. data/stdlib/nodejs/file.rb +98 -0
  435. data/stdlib/nodejs/fileutils.rb +26 -0
  436. data/stdlib/nodejs/io.rb +2 -0
  437. data/stdlib/nodejs/irb.rb +45 -0
  438. data/stdlib/nodejs/process.rb +16 -0
  439. data/stdlib/nodejs/require.rb +32 -0
  440. data/stdlib/nodejs/rubygems.rb +68 -0
  441. data/stdlib/nodejs/runtime.rb +25 -0
  442. data/stdlib/nodejs/yaml.rb +11 -0
  443. data/stdlib/observer.rb +202 -0
  444. data/stdlib/opal-parser.rb +53 -0
  445. data/stdlib/opal-source-maps.rb +2 -0
  446. data/stdlib/ostruct.rb +69 -0
  447. data/stdlib/pathname.rb +31 -0
  448. data/stdlib/phantomjs.rb +8 -0
  449. data/stdlib/pp.rb +12 -0
  450. data/stdlib/process.rb +10 -0
  451. data/stdlib/promise.rb +300 -0
  452. data/stdlib/racc/parser.rb +215 -0
  453. data/stdlib/rbconfig.rb +20 -0
  454. data/stdlib/securerandom.rb +12 -0
  455. data/stdlib/set.rb +116 -0
  456. data/stdlib/singleton.rb +40 -0
  457. data/stdlib/source_map.rb +5 -0
  458. data/stdlib/source_map/map.rb +220 -0
  459. data/stdlib/source_map/mapping.rb +26 -0
  460. data/stdlib/source_map/offset.rb +88 -0
  461. data/stdlib/source_map/version.rb +3 -0
  462. data/stdlib/source_map/vlq.rb +98 -0
  463. data/stdlib/sourcemap.rb +1 -0
  464. data/stdlib/stringio.rb +181 -0
  465. data/stdlib/strscan.rb +155 -0
  466. data/stdlib/template.rb +46 -0
  467. data/stdlib/thread.rb +160 -0
  468. data/stdlib/time.rb +9 -0
  469. data/tasks/github.rake +19 -0
  470. metadata +690 -0
@@ -0,0 +1,1212 @@
1
+ require 'corelib/comparable'
2
+
3
+ class String
4
+ include Comparable
5
+
6
+ `def.$$is_string = true`
7
+
8
+ def self.try_convert(what)
9
+ what.to_str
10
+ rescue
11
+ nil
12
+ end
13
+
14
+ def self.new(str = '')
15
+ `new String(str)`
16
+ end
17
+
18
+ def %(data)
19
+ if Array === data
20
+ format(self, *data)
21
+ else
22
+ format(self, data)
23
+ end
24
+ end
25
+
26
+ def *(count)
27
+ %x{
28
+ if (count < 1) {
29
+ return '';
30
+ }
31
+
32
+ var result = '',
33
+ pattern = self;
34
+
35
+ while (count > 0) {
36
+ if (count & 1) {
37
+ result += pattern;
38
+ }
39
+
40
+ count >>= 1;
41
+ pattern += pattern;
42
+ }
43
+
44
+ return result;
45
+ }
46
+ end
47
+
48
+ def +(other)
49
+ other = Opal.coerce_to other, String, :to_str
50
+
51
+ `self + #{other.to_s}`
52
+ end
53
+
54
+ def <=>(other)
55
+ if other.respond_to? :to_str
56
+ other = other.to_str.to_s
57
+
58
+ `self > other ? 1 : (self < other ? -1 : 0)`
59
+ else
60
+ %x{
61
+ var cmp = #{other <=> self};
62
+
63
+ if (cmp === nil) {
64
+ return nil;
65
+ }
66
+ else {
67
+ return cmp > 0 ? -1 : (cmp < 0 ? 1 : 0);
68
+ }
69
+ }
70
+ end
71
+ end
72
+
73
+ def ==(other)
74
+ return false unless String === other
75
+
76
+ `#{to_s} == #{other.to_s}`
77
+ end
78
+
79
+ alias eql? ==
80
+ alias === ==
81
+
82
+ def =~(other)
83
+ %x{
84
+ if (other.$$is_string) {
85
+ #{raise TypeError, 'type mismatch: String given'};
86
+ }
87
+
88
+ return #{other =~ self};
89
+ }
90
+ end
91
+
92
+ def [](index, length = undefined)
93
+ %x{
94
+ var size = self.length;
95
+
96
+ if (index.$$is_range) {
97
+ var exclude = index.exclude,
98
+ length = index.end,
99
+ index = index.begin;
100
+
101
+ if (index < 0) {
102
+ index += size;
103
+ }
104
+
105
+ if (length < 0) {
106
+ length += size;
107
+ }
108
+
109
+ if (!exclude) {
110
+ length += 1;
111
+ }
112
+
113
+ if (index > size) {
114
+ return nil;
115
+ }
116
+
117
+ length = length - index;
118
+
119
+ if (length < 0) {
120
+ length = 0;
121
+ }
122
+
123
+ return self.substr(index, length);
124
+ }
125
+
126
+ if (index < 0) {
127
+ index += self.length;
128
+ }
129
+
130
+ if (length == null) {
131
+ if (index >= self.length || index < 0) {
132
+ return nil;
133
+ }
134
+
135
+ return self.substr(index, 1);
136
+ }
137
+
138
+ if (index > self.length || index < 0) {
139
+ return nil;
140
+ }
141
+
142
+ return self.substr(index, length);
143
+ }
144
+ end
145
+
146
+ def capitalize
147
+ `self.charAt(0).toUpperCase() + self.substr(1).toLowerCase()`
148
+ end
149
+
150
+ def casecmp(other)
151
+ other = Opal.coerce_to(other, String, :to_str).to_s
152
+
153
+ `self.toLowerCase()` <=> `other.toLowerCase()`
154
+ end
155
+
156
+ def center(width, padstr = ' ')
157
+ width = Opal.coerce_to(width, Integer, :to_int)
158
+ padstr = Opal.coerce_to(padstr, String, :to_str).to_s
159
+
160
+ if padstr.empty?
161
+ raise ArgumentError, 'zero width padding'
162
+ end
163
+
164
+ return self if `width <= self.length`
165
+
166
+ %x{
167
+ var ljustified = #{ljust ((width + @length) / 2).ceil, padstr},
168
+ rjustified = #{rjust ((width + @length) / 2).floor, padstr};
169
+
170
+ return rjustified + ljustified.slice(self.length);
171
+ }
172
+ end
173
+
174
+ def chars(&block)
175
+ return each_char.to_a unless block
176
+
177
+ each_char(&block)
178
+ end
179
+
180
+ def chomp(separator = $/)
181
+ return self if `separator === nil || self.length === 0`
182
+
183
+ separator = Opal.coerce_to!(separator, String, :to_str).to_s
184
+
185
+ %x{
186
+ if (separator === "\n") {
187
+ return self.replace(/\r?\n?$/, '');
188
+ }
189
+ else if (separator === "") {
190
+ return self.replace(/(\r?\n)+$/, '');
191
+ }
192
+ else if (self.length > separator.length) {
193
+ var tail = self.substr(self.length - separator.length, separator.length);
194
+
195
+ if (tail === separator) {
196
+ return self.substr(0, self.length - separator.length);
197
+ }
198
+ }
199
+ }
200
+
201
+ self
202
+ end
203
+
204
+ def chop
205
+ %x{
206
+ var length = self.length;
207
+
208
+ if (length <= 1) {
209
+ return "";
210
+ }
211
+
212
+ if (self.charAt(length - 1) === "\n" && self.charAt(length - 2) === "\r") {
213
+ return self.substr(0, length - 2);
214
+ }
215
+ else {
216
+ return self.substr(0, length - 1);
217
+ }
218
+ }
219
+ end
220
+
221
+ def chr
222
+ `self.charAt(0)`
223
+ end
224
+
225
+ def clone
226
+ copy = `self.slice()`
227
+ copy.initialize_clone(self)
228
+ copy
229
+ end
230
+
231
+ def dup
232
+ copy = `self.slice()`
233
+ copy.initialize_dup(self)
234
+ copy
235
+ end
236
+
237
+ def count(str)
238
+ `(self.length - self.replace(new RegExp(str, 'g'), '').length) / str.length`
239
+ end
240
+
241
+ alias dup clone
242
+
243
+ def downcase
244
+ `self.toLowerCase()`
245
+ end
246
+
247
+ def each_char(&block)
248
+ return enum_for :each_char unless block_given?
249
+
250
+ %x{
251
+ for (var i = 0, length = self.length; i < length; i++) {
252
+ #{yield `self.charAt(i)`};
253
+ }
254
+ }
255
+
256
+ self
257
+ end
258
+
259
+ def each_line(separator = $/)
260
+ return split(separator) unless block_given?
261
+
262
+ %x{
263
+ var chomped = #{chomp},
264
+ trailing = self.length != chomped.length,
265
+ splitted = chomped.split(separator);
266
+
267
+ for (var i = 0, length = splitted.length; i < length; i++) {
268
+ if (i < length - 1 || trailing) {
269
+ #{yield `splitted[i] + separator`};
270
+ }
271
+ else {
272
+ #{yield `splitted[i]`};
273
+ }
274
+ }
275
+ }
276
+
277
+ self
278
+ end
279
+
280
+ def empty?
281
+ `self.length === 0`
282
+ end
283
+
284
+ def end_with?(*suffixes)
285
+ %x{
286
+ for (var i = 0, length = suffixes.length; i < length; i++) {
287
+ var suffix = #{Opal.coerce_to(`suffixes[i]`, String, :to_str).to_s};
288
+
289
+ if (self.length >= suffix.length &&
290
+ self.substr(self.length - suffix.length, suffix.length) == suffix) {
291
+ return true;
292
+ }
293
+ }
294
+ }
295
+
296
+ false
297
+ end
298
+
299
+ alias eql? ==
300
+ alias equal? ===
301
+
302
+ def gsub(pattern, replace = undefined, &block)
303
+ if String === pattern || pattern.respond_to?(:to_str)
304
+ pattern = /#{Regexp.escape(pattern.to_str)}/
305
+ end
306
+
307
+ unless Regexp === pattern
308
+ raise TypeError, "wrong argument type #{pattern.class} (expected Regexp)"
309
+ end
310
+
311
+ %x{
312
+ var pattern = pattern.toString(),
313
+ options = pattern.substr(pattern.lastIndexOf('/') + 1) + 'g',
314
+ regexp = pattern.substr(1, pattern.lastIndexOf('/') - 1);
315
+
316
+ self.$sub.$$p = block;
317
+ return self.$sub(new RegExp(regexp, options), replace);
318
+ }
319
+ end
320
+
321
+ def hash
322
+ `self.toString()`
323
+ end
324
+
325
+ def hex
326
+ to_i 16
327
+ end
328
+
329
+ def include?(other)
330
+ %x{
331
+ if (other.$$is_string) {
332
+ return self.indexOf(other) !== -1;
333
+ }
334
+ }
335
+
336
+ unless other.respond_to? :to_str
337
+ raise TypeError, "no implicit conversion of #{other.class.name} into String"
338
+ end
339
+
340
+ `self.indexOf(#{other.to_str}) !== -1`
341
+ end
342
+
343
+ def index(what, offset = nil)
344
+ if String === what
345
+ what = what.to_s
346
+ elsif what.respond_to? :to_str
347
+ what = what.to_str.to_s
348
+ elsif not Regexp === what
349
+ raise TypeError, "type mismatch: #{what.class} given"
350
+ end
351
+
352
+ result = -1
353
+
354
+ if offset
355
+ offset = Opal.coerce_to offset, Integer, :to_int
356
+
357
+ %x{
358
+ var size = self.length;
359
+
360
+ if (offset < 0) {
361
+ offset = offset + size;
362
+ }
363
+
364
+ if (offset > size) {
365
+ return nil;
366
+ }
367
+ }
368
+
369
+ if Regexp === what
370
+ result = (what =~ `self.substr(offset)`) || -1
371
+ else
372
+ result = `self.substr(offset).indexOf(what)`
373
+ end
374
+
375
+ %x{
376
+ if (result !== -1) {
377
+ result += offset;
378
+ }
379
+ }
380
+ else
381
+ if Regexp === what
382
+ result = (what =~ self) || -1
383
+ else
384
+ result = `self.indexOf(what)`
385
+ end
386
+ end
387
+
388
+ unless `result === -1`
389
+ result
390
+ end
391
+ end
392
+
393
+ def inspect
394
+ %x{
395
+ var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
396
+ meta = {
397
+ '\b': '\\b',
398
+ '\t': '\\t',
399
+ '\n': '\\n',
400
+ '\f': '\\f',
401
+ '\r': '\\r',
402
+ '"' : '\\"',
403
+ '\\': '\\\\'
404
+ };
405
+
406
+ escapable.lastIndex = 0;
407
+
408
+ return escapable.test(self) ? '"' + self.replace(escapable, function(a) {
409
+ var c = meta[a];
410
+
411
+ return typeof c === 'string' ? c :
412
+ '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
413
+ }) + '"' : '"' + self + '"';
414
+ }
415
+ end
416
+
417
+ def intern
418
+ self
419
+ end
420
+
421
+ def lines(separator = $/)
422
+ each_line(separator).to_a
423
+ end
424
+
425
+ def length
426
+ `self.length`
427
+ end
428
+
429
+ def ljust(width, padstr = ' ')
430
+ width = Opal.coerce_to(width, Integer, :to_int)
431
+ padstr = Opal.coerce_to(padstr, String, :to_str).to_s
432
+
433
+ if padstr.empty?
434
+ raise ArgumentError, 'zero width padding'
435
+ end
436
+
437
+ return self if `width <= self.length`
438
+
439
+ %x{
440
+ var index = -1,
441
+ result = "";
442
+
443
+ width -= self.length;
444
+
445
+ while (++index < width) {
446
+ result += padstr;
447
+ }
448
+
449
+ return self + result.slice(0, width);
450
+ }
451
+ end
452
+
453
+ def lstrip
454
+ `self.replace(/^\s*/, '')`
455
+ end
456
+
457
+ def match(pattern, pos = undefined, &block)
458
+ if String === pattern || pattern.respond_to?(:to_str)
459
+ pattern = /#{Regexp.escape(pattern.to_str)}/
460
+ end
461
+
462
+ unless Regexp === pattern
463
+ raise TypeError, "wrong argument type #{pattern.class} (expected Regexp)"
464
+ end
465
+
466
+ pattern.match(self, pos, &block)
467
+ end
468
+
469
+ def next
470
+ %x{
471
+ if (self.length === 0) {
472
+ return "";
473
+ }
474
+
475
+ var initial = self.substr(0, self.length - 1);
476
+ var last = String.fromCharCode(self.charCodeAt(self.length - 1) + 1);
477
+
478
+ return initial + last;
479
+ }
480
+ end
481
+
482
+ def ord
483
+ `self.charCodeAt(0)`
484
+ end
485
+
486
+ def partition(str)
487
+ %x{
488
+ var result = self.split(str);
489
+ var splitter = (result[0].length === self.length ? "" : str);
490
+
491
+ return [result[0], splitter, result.slice(1).join(str.toString())];
492
+ }
493
+ end
494
+
495
+ def reverse
496
+ `self.split('').reverse().join('')`
497
+ end
498
+
499
+ # TODO handle case where search is regexp
500
+ def rindex(search, offset = undefined)
501
+ %x{
502
+ var search_type = (search == null ? Opal.NilClass : search.constructor);
503
+ if (search_type != String && search_type != RegExp) {
504
+ var msg = "type mismatch: " + search_type + " given";
505
+ #{raise TypeError.new(`msg`)};
506
+ }
507
+
508
+ if (self.length == 0) {
509
+ return search.length == 0 ? 0 : nil;
510
+ }
511
+
512
+ var result = -1;
513
+ if (offset != null) {
514
+ if (offset < 0) {
515
+ offset = self.length + offset;
516
+ }
517
+
518
+ if (search_type == String) {
519
+ result = self.lastIndexOf(search, offset);
520
+ }
521
+ else {
522
+ result = self.substr(0, offset + 1).$reverse().search(search);
523
+ if (result !== -1) {
524
+ result = offset - result;
525
+ }
526
+ }
527
+ }
528
+ else {
529
+ if (search_type == String) {
530
+ result = self.lastIndexOf(search);
531
+ }
532
+ else {
533
+ result = self.$reverse().search(search);
534
+ if (result !== -1) {
535
+ result = self.length - 1 - result;
536
+ }
537
+ }
538
+ }
539
+
540
+ return result === -1 ? nil : result;
541
+ }
542
+ end
543
+
544
+ def rjust(width, padstr = ' ')
545
+ width = Opal.coerce_to(width, Integer, :to_int)
546
+ padstr = Opal.coerce_to(padstr, String, :to_str).to_s
547
+
548
+ if padstr.empty?
549
+ raise ArgumentError, 'zero width padding'
550
+ end
551
+
552
+ return self if `width <= self.length`
553
+
554
+ %x{
555
+ var chars = Math.floor(width - self.length),
556
+ patterns = Math.floor(chars / padstr.length),
557
+ result = Array(patterns + 1).join(padstr),
558
+ remaining = chars - result.length;
559
+
560
+ return result + padstr.slice(0, remaining) + self;
561
+ }
562
+ end
563
+
564
+ def rstrip
565
+ `self.replace(/\s*$/, '')`
566
+ end
567
+
568
+ def scan(pattern, &block)
569
+ %x{
570
+ if (pattern.global) {
571
+ // should we clear it afterwards too?
572
+ pattern.lastIndex = 0;
573
+ }
574
+ else {
575
+ // rewrite regular expression to add the global flag to capture pre/post match
576
+ pattern = new RegExp(pattern.source, 'g' + (pattern.multiline ? 'm' : '') + (pattern.ignoreCase ? 'i' : ''));
577
+ }
578
+
579
+ var result = [];
580
+ var match;
581
+
582
+ while ((match = pattern.exec(self)) != null) {
583
+ var match_data = #{MatchData.new `pattern`, `match`};
584
+ if (block === nil) {
585
+ match.length == 1 ? result.push(match[0]) : result.push(match.slice(1));
586
+ }
587
+ else {
588
+ match.length == 1 ? block(match[0]) : block.apply(self, match.slice(1));
589
+ }
590
+ }
591
+
592
+ return (block !== nil ? self : result);
593
+ }
594
+ end
595
+
596
+ alias size length
597
+
598
+ alias slice []
599
+
600
+ def split(pattern = $; || ' ', limit = undefined)
601
+ %x{
602
+ if (pattern === nil || pattern === undefined) {
603
+ pattern = #{$;};
604
+ }
605
+
606
+ var result = [];
607
+ if (limit !== undefined) {
608
+ limit = #{Opal.coerce_to!(limit, Integer, :to_int)};
609
+ }
610
+
611
+ if (self.length === 0) {
612
+ return [];
613
+ }
614
+
615
+ if (limit === 1) {
616
+ return [self];
617
+ }
618
+
619
+ if (pattern && pattern.$$is_regexp) {
620
+ var pattern_str = pattern.toString();
621
+
622
+ /* Opal and JS's repr of an empty RE. */
623
+ var blank_pattern = (pattern_str.substr(0, 3) == '/^/') ||
624
+ (pattern_str.substr(0, 6) == '/(?:)/');
625
+
626
+ /* This is our fast path */
627
+ if (limit === undefined || limit === 0) {
628
+ result = self.split(blank_pattern ? /(?:)/ : pattern);
629
+ }
630
+ else {
631
+ /* RegExp.exec only has sane behavior with global flag */
632
+ if (! pattern.global) {
633
+ pattern = eval(pattern_str + 'g');
634
+ }
635
+
636
+ var match_data;
637
+ var prev_index = 0;
638
+ pattern.lastIndex = 0;
639
+
640
+ while ((match_data = pattern.exec(self)) !== null) {
641
+ var segment = self.slice(prev_index, match_data.index);
642
+ result.push(segment);
643
+
644
+ prev_index = pattern.lastIndex;
645
+
646
+ if (match_data[0].length === 0) {
647
+ if (blank_pattern) {
648
+ /* explicitly split on JS's empty RE form.*/
649
+ pattern = /(?:)/;
650
+ }
651
+
652
+ result = self.split(pattern);
653
+ /* with "unlimited", ruby leaves a trail on blanks. */
654
+ if (limit !== undefined && limit < 0 && blank_pattern) {
655
+ result.push('');
656
+ }
657
+
658
+ prev_index = undefined;
659
+ break;
660
+ }
661
+
662
+ if (limit !== undefined && limit > 1 && result.length + 1 == limit) {
663
+ break;
664
+ }
665
+ }
666
+
667
+ if (prev_index !== undefined) {
668
+ result.push(self.slice(prev_index, self.length));
669
+ }
670
+ }
671
+ }
672
+ else {
673
+ var splitted = 0, start = 0, lim = 0;
674
+
675
+ if (pattern === nil || pattern === undefined) {
676
+ pattern = ' '
677
+ } else {
678
+ pattern = #{Opal.try_convert(pattern, String, :to_str).to_s};
679
+ }
680
+
681
+ var string = (pattern == ' ') ? self.replace(/[\r\n\t\v]\s+/g, ' ')
682
+ : self;
683
+ var cursor = -1;
684
+ while ((cursor = string.indexOf(pattern, start)) > -1 && cursor < string.length) {
685
+ if (splitted + 1 === limit) {
686
+ break;
687
+ }
688
+
689
+ if (pattern == ' ' && cursor == start) {
690
+ start = cursor + 1;
691
+ continue;
692
+ }
693
+
694
+ result.push(string.substr(start, pattern.length ? cursor - start : 1));
695
+ splitted++;
696
+
697
+ start = cursor + (pattern.length ? pattern.length : 1);
698
+ }
699
+
700
+ if (string.length > 0 && (limit < 0 || string.length > start)) {
701
+ if (string.length == start) {
702
+ result.push('');
703
+ }
704
+ else {
705
+ result.push(string.substr(start, string.length));
706
+ }
707
+ }
708
+ }
709
+
710
+ if (limit === undefined || limit === 0) {
711
+ while (result[result.length-1] === '') {
712
+ result.length = result.length - 1;
713
+ }
714
+ }
715
+
716
+ if (limit > 0) {
717
+ var tail = result.slice(limit - 1).join('');
718
+ result.splice(limit - 1, result.length - 1, tail);
719
+ }
720
+
721
+ return result;
722
+ }
723
+ end
724
+
725
+ def squeeze(*sets)
726
+ %x{
727
+ if (sets.length === 0) {
728
+ return self.replace(/(.)\1+/g, '$1');
729
+ }
730
+ }
731
+
732
+ %x{
733
+ var set = #{Opal.coerce_to(`sets[0]`, String, :to_str).chars};
734
+
735
+ for (var i = 1, length = sets.length; i < length; i++) {
736
+ set = #{`set` & Opal.coerce_to(`sets[i]`, String, :to_str).chars};
737
+ }
738
+
739
+ if (set.length === 0) {
740
+ return self;
741
+ }
742
+
743
+ return self.replace(new RegExp("([" + #{Regexp.escape(`set`.join)} + "])\\1+", "g"), "$1");
744
+ }
745
+ end
746
+
747
+ def start_with?(*prefixes)
748
+ %x{
749
+ for (var i = 0, length = prefixes.length; i < length; i++) {
750
+ var prefix = #{Opal.coerce_to(`prefixes[i]`, String, :to_str).to_s};
751
+
752
+ if (self.indexOf(prefix) === 0) {
753
+ return true;
754
+ }
755
+ }
756
+
757
+ return false;
758
+ }
759
+ end
760
+
761
+ def strip
762
+ `self.replace(/^\s*/, '').replace(/\s*$/, '')`
763
+ end
764
+
765
+ %x{
766
+ // convert Ruby back reference to JavaScript back reference
767
+ function convertReplace(replace) {
768
+ return replace.replace(
769
+ /(^|[^\\])\\\\(\d)/g, '$1\\$2'
770
+ ).replace(
771
+ /(^|[^\\])(\\\\)+\\\\(\d)/g, '$1$2\\$3'
772
+ ).replace(
773
+ /(^|[^\\])(?:(\\)\\)+([^\\]|$)/g, '$1$2$3'
774
+ );
775
+ }
776
+ }
777
+
778
+ def sub(pattern, replace = undefined, &block)
779
+ %x{
780
+ if (typeof(pattern) !== 'string' && !pattern.$$is_regexp) {
781
+ pattern = #{Opal.coerce_to! pattern, String, :to_str};
782
+ }
783
+
784
+ if (replace !== undefined) {
785
+ if (#{replace.is_a?(Hash)}) {
786
+ return self.replace(pattern, function(str) {
787
+ var value = #{replace[str]};
788
+
789
+ return (value == null) ? nil : #{value.to_s};
790
+ });
791
+ }
792
+ else {
793
+ if (typeof(replace) !== 'string') {
794
+ replace = #{Opal.coerce_to! replace, String, :to_str};
795
+ }
796
+
797
+ replace = convertReplace(replace);
798
+ return self.replace(pattern, replace);
799
+ }
800
+
801
+ }
802
+ else if (block != null && block !== nil) {
803
+ return self.replace(pattern, function() {
804
+ // FIXME: this should be a formal MatchData object with all the goodies
805
+ var match_data = []
806
+ for (var i = 0, len = arguments.length; i < len; i++) {
807
+ var arg = arguments[i];
808
+ if (arg == undefined) {
809
+ match_data.push(nil);
810
+ }
811
+ else {
812
+ match_data.push(arg);
813
+ }
814
+ }
815
+
816
+ var str = match_data.pop();
817
+ var offset = match_data.pop();
818
+ var match_len = match_data.length;
819
+
820
+ // $1, $2, $3 not being parsed correctly in Ruby code
821
+ for (var i = 1; i < match_len; i++) {
822
+ Opal.gvars[String(i)] = match_data[i];
823
+ }
824
+ #{$& = `match_data[0]`};
825
+ #{$~ = `match_data`};
826
+ return block(match_data[0]);
827
+ });
828
+ }
829
+ else {
830
+ #{raise ArgumentError, 'wrong number of arguments (1 for 2)'}
831
+ }
832
+ }
833
+ end
834
+
835
+ alias succ next
836
+
837
+ def sum(n = 16)
838
+ %x{
839
+ var result = 0;
840
+
841
+ for (var i = 0, length = self.length; i < length; i++) {
842
+ result += (self.charCodeAt(i) % ((1 << n) - 1));
843
+ }
844
+
845
+ return result;
846
+ }
847
+ end
848
+
849
+ def swapcase
850
+ %x{
851
+ var str = self.replace(/([a-z]+)|([A-Z]+)/g, function($0,$1,$2) {
852
+ return $1 ? $0.toUpperCase() : $0.toLowerCase();
853
+ });
854
+
855
+ if (self.constructor === String) {
856
+ return str;
857
+ }
858
+
859
+ return #{self.class.new `str`};
860
+ }
861
+ end
862
+
863
+ def to_f
864
+ %x{
865
+ if (self.charAt(0) === '_') {
866
+ return 0;
867
+ }
868
+
869
+ var result = parseFloat(self.replace(/_/g, ''));
870
+
871
+ if (isNaN(result) || result == Infinity || result == -Infinity) {
872
+ return 0;
873
+ }
874
+ else {
875
+ return result;
876
+ }
877
+ }
878
+ end
879
+
880
+ def to_i(base = 10)
881
+ %x{
882
+ var result = parseInt(self, base);
883
+
884
+ if (isNaN(result)) {
885
+ return 0;
886
+ }
887
+
888
+ return result;
889
+ }
890
+ end
891
+
892
+ def to_proc
893
+ # Give name to self in case this proc is passed to instance_eval
894
+ sym = self
895
+
896
+ proc do |*args, &block|
897
+ raise ArgumentError, "no receiver given" if args.empty?
898
+ obj = args.shift
899
+ obj.send(sym, *args, &block)
900
+ end
901
+ end
902
+
903
+ def to_s
904
+ `self.toString()`
905
+ end
906
+
907
+ alias to_str to_s
908
+
909
+ alias to_sym intern
910
+
911
+ def tr(from, to)
912
+ %x{
913
+ if (from.length == 0 || from === to) {
914
+ return self;
915
+ }
916
+
917
+ var subs = {};
918
+ var from_chars = from.split('');
919
+ var from_length = from_chars.length;
920
+ var to_chars = to.split('');
921
+ var to_length = to_chars.length;
922
+
923
+ var inverse = false;
924
+ var global_sub = null;
925
+ if (from_chars[0] === '^') {
926
+ inverse = true;
927
+ from_chars.shift();
928
+ global_sub = to_chars[to_length - 1]
929
+ from_length -= 1;
930
+ }
931
+
932
+ var from_chars_expanded = [];
933
+ var last_from = null;
934
+ var in_range = false;
935
+ for (var i = 0; i < from_length; i++) {
936
+ var ch = from_chars[i];
937
+ if (last_from == null) {
938
+ last_from = ch;
939
+ from_chars_expanded.push(ch);
940
+ }
941
+ else if (ch === '-') {
942
+ if (last_from === '-') {
943
+ from_chars_expanded.push('-');
944
+ from_chars_expanded.push('-');
945
+ }
946
+ else if (i == from_length - 1) {
947
+ from_chars_expanded.push('-');
948
+ }
949
+ else {
950
+ in_range = true;
951
+ }
952
+ }
953
+ else if (in_range) {
954
+ var start = last_from.charCodeAt(0) + 1;
955
+ var end = ch.charCodeAt(0);
956
+ for (var c = start; c < end; c++) {
957
+ from_chars_expanded.push(String.fromCharCode(c));
958
+ }
959
+ from_chars_expanded.push(ch);
960
+ in_range = null;
961
+ last_from = null;
962
+ }
963
+ else {
964
+ from_chars_expanded.push(ch);
965
+ }
966
+ }
967
+
968
+ from_chars = from_chars_expanded;
969
+ from_length = from_chars.length;
970
+
971
+ if (inverse) {
972
+ for (var i = 0; i < from_length; i++) {
973
+ subs[from_chars[i]] = true;
974
+ }
975
+ }
976
+ else {
977
+ if (to_length > 0) {
978
+ var to_chars_expanded = [];
979
+ var last_to = null;
980
+ var in_range = false;
981
+ for (var i = 0; i < to_length; i++) {
982
+ var ch = to_chars[i];
983
+ if (last_from == null) {
984
+ last_from = ch;
985
+ to_chars_expanded.push(ch);
986
+ }
987
+ else if (ch === '-') {
988
+ if (last_to === '-') {
989
+ to_chars_expanded.push('-');
990
+ to_chars_expanded.push('-');
991
+ }
992
+ else if (i == to_length - 1) {
993
+ to_chars_expanded.push('-');
994
+ }
995
+ else {
996
+ in_range = true;
997
+ }
998
+ }
999
+ else if (in_range) {
1000
+ var start = last_from.charCodeAt(0) + 1;
1001
+ var end = ch.charCodeAt(0);
1002
+ for (var c = start; c < end; c++) {
1003
+ to_chars_expanded.push(String.fromCharCode(c));
1004
+ }
1005
+ to_chars_expanded.push(ch);
1006
+ in_range = null;
1007
+ last_from = null;
1008
+ }
1009
+ else {
1010
+ to_chars_expanded.push(ch);
1011
+ }
1012
+ }
1013
+
1014
+ to_chars = to_chars_expanded;
1015
+ to_length = to_chars.length;
1016
+ }
1017
+
1018
+ var length_diff = from_length - to_length;
1019
+ if (length_diff > 0) {
1020
+ var pad_char = (to_length > 0 ? to_chars[to_length - 1] : '');
1021
+ for (var i = 0; i < length_diff; i++) {
1022
+ to_chars.push(pad_char);
1023
+ }
1024
+ }
1025
+
1026
+ for (var i = 0; i < from_length; i++) {
1027
+ subs[from_chars[i]] = to_chars[i];
1028
+ }
1029
+ }
1030
+
1031
+ var new_str = ''
1032
+ for (var i = 0, length = self.length; i < length; i++) {
1033
+ var ch = self.charAt(i);
1034
+ var sub = subs[ch];
1035
+ if (inverse) {
1036
+ new_str += (sub == null ? global_sub : ch);
1037
+ }
1038
+ else {
1039
+ new_str += (sub != null ? sub : ch);
1040
+ }
1041
+ }
1042
+ return new_str;
1043
+ }
1044
+ end
1045
+
1046
+ def tr_s(from, to)
1047
+ %x{
1048
+ if (from.length == 0) {
1049
+ return self;
1050
+ }
1051
+
1052
+ var subs = {};
1053
+ var from_chars = from.split('');
1054
+ var from_length = from_chars.length;
1055
+ var to_chars = to.split('');
1056
+ var to_length = to_chars.length;
1057
+
1058
+ var inverse = false;
1059
+ var global_sub = null;
1060
+ if (from_chars[0] === '^') {
1061
+ inverse = true;
1062
+ from_chars.shift();
1063
+ global_sub = to_chars[to_length - 1]
1064
+ from_length -= 1;
1065
+ }
1066
+
1067
+ var from_chars_expanded = [];
1068
+ var last_from = null;
1069
+ var in_range = false;
1070
+ for (var i = 0; i < from_length; i++) {
1071
+ var ch = from_chars[i];
1072
+ if (last_from == null) {
1073
+ last_from = ch;
1074
+ from_chars_expanded.push(ch);
1075
+ }
1076
+ else if (ch === '-') {
1077
+ if (last_from === '-') {
1078
+ from_chars_expanded.push('-');
1079
+ from_chars_expanded.push('-');
1080
+ }
1081
+ else if (i == from_length - 1) {
1082
+ from_chars_expanded.push('-');
1083
+ }
1084
+ else {
1085
+ in_range = true;
1086
+ }
1087
+ }
1088
+ else if (in_range) {
1089
+ var start = last_from.charCodeAt(0) + 1;
1090
+ var end = ch.charCodeAt(0);
1091
+ for (var c = start; c < end; c++) {
1092
+ from_chars_expanded.push(String.fromCharCode(c));
1093
+ }
1094
+ from_chars_expanded.push(ch);
1095
+ in_range = null;
1096
+ last_from = null;
1097
+ }
1098
+ else {
1099
+ from_chars_expanded.push(ch);
1100
+ }
1101
+ }
1102
+
1103
+ from_chars = from_chars_expanded;
1104
+ from_length = from_chars.length;
1105
+
1106
+ if (inverse) {
1107
+ for (var i = 0; i < from_length; i++) {
1108
+ subs[from_chars[i]] = true;
1109
+ }
1110
+ }
1111
+ else {
1112
+ if (to_length > 0) {
1113
+ var to_chars_expanded = [];
1114
+ var last_to = null;
1115
+ var in_range = false;
1116
+ for (var i = 0; i < to_length; i++) {
1117
+ var ch = to_chars[i];
1118
+ if (last_from == null) {
1119
+ last_from = ch;
1120
+ to_chars_expanded.push(ch);
1121
+ }
1122
+ else if (ch === '-') {
1123
+ if (last_to === '-') {
1124
+ to_chars_expanded.push('-');
1125
+ to_chars_expanded.push('-');
1126
+ }
1127
+ else if (i == to_length - 1) {
1128
+ to_chars_expanded.push('-');
1129
+ }
1130
+ else {
1131
+ in_range = true;
1132
+ }
1133
+ }
1134
+ else if (in_range) {
1135
+ var start = last_from.charCodeAt(0) + 1;
1136
+ var end = ch.charCodeAt(0);
1137
+ for (var c = start; c < end; c++) {
1138
+ to_chars_expanded.push(String.fromCharCode(c));
1139
+ }
1140
+ to_chars_expanded.push(ch);
1141
+ in_range = null;
1142
+ last_from = null;
1143
+ }
1144
+ else {
1145
+ to_chars_expanded.push(ch);
1146
+ }
1147
+ }
1148
+
1149
+ to_chars = to_chars_expanded;
1150
+ to_length = to_chars.length;
1151
+ }
1152
+
1153
+ var length_diff = from_length - to_length;
1154
+ if (length_diff > 0) {
1155
+ var pad_char = (to_length > 0 ? to_chars[to_length - 1] : '');
1156
+ for (var i = 0; i < length_diff; i++) {
1157
+ to_chars.push(pad_char);
1158
+ }
1159
+ }
1160
+
1161
+ for (var i = 0; i < from_length; i++) {
1162
+ subs[from_chars[i]] = to_chars[i];
1163
+ }
1164
+ }
1165
+ var new_str = ''
1166
+ var last_substitute = null
1167
+ for (var i = 0, length = self.length; i < length; i++) {
1168
+ var ch = self.charAt(i);
1169
+ var sub = subs[ch]
1170
+ if (inverse) {
1171
+ if (sub == null) {
1172
+ if (last_substitute == null) {
1173
+ new_str += global_sub;
1174
+ last_substitute = true;
1175
+ }
1176
+ }
1177
+ else {
1178
+ new_str += ch;
1179
+ last_substitute = null;
1180
+ }
1181
+ }
1182
+ else {
1183
+ if (sub != null) {
1184
+ if (last_substitute == null || last_substitute !== sub) {
1185
+ new_str += sub;
1186
+ last_substitute = sub;
1187
+ }
1188
+ }
1189
+ else {
1190
+ new_str += ch;
1191
+ last_substitute = null;
1192
+ }
1193
+ }
1194
+ }
1195
+ return new_str;
1196
+ }
1197
+ end
1198
+
1199
+ def upcase
1200
+ `self.toUpperCase()`
1201
+ end
1202
+
1203
+ def freeze
1204
+ self
1205
+ end
1206
+
1207
+ def frozen?
1208
+ true
1209
+ end
1210
+ end
1211
+
1212
+ Symbol = String