opal-wedge 0.9.0.dev

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 (830) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.gitmodules +7 -0
  4. data/.inch.yml +19 -0
  5. data/.jshintrc +48 -0
  6. data/.rspec +3 -0
  7. data/.spectator +2 -0
  8. data/.spectator-mspec +3 -0
  9. data/.travis.yml +60 -0
  10. data/.yardopts +6 -0
  11. data/CHANGELOG.md +571 -0
  12. data/CODE_OF_CONDUCT.md +15 -0
  13. data/CONTRIBUTING.md +192 -0
  14. data/Gemfile +26 -0
  15. data/Guardfile +77 -0
  16. data/LICENSE +19 -0
  17. data/README.md +167 -0
  18. data/Rakefile +15 -0
  19. data/benchmark/benchmarks +103 -0
  20. data/benchmark/bm_array_intersection_numbers.rb +7 -0
  21. data/benchmark/bm_array_intersection_objects.rb +7 -0
  22. data/benchmark/bm_array_intersection_strings.rb +7 -0
  23. data/benchmark/bm_array_minus_numbers.rb +7 -0
  24. data/benchmark/bm_array_minus_objects.rb +7 -0
  25. data/benchmark/bm_array_minus_strings.rb +7 -0
  26. data/benchmark/bm_array_union_numbers.rb +7 -0
  27. data/benchmark/bm_array_union_objects.rb +7 -0
  28. data/benchmark/bm_array_union_strings.rb +7 -0
  29. data/benchmark/bm_array_uniq_bang_numbers.rb +5 -0
  30. data/benchmark/bm_array_uniq_bang_objects.rb +5 -0
  31. data/benchmark/bm_array_uniq_bang_strings.rb +5 -0
  32. data/benchmark/bm_array_uniq_numbers.rb +5 -0
  33. data/benchmark/bm_array_uniq_objects.rb +5 -0
  34. data/benchmark/bm_array_uniq_strings.rb +5 -0
  35. data/benchmark/bm_dispatch_bind_table.rb +57 -0
  36. data/benchmark/bm_dispatch_code_gen.rb +65 -0
  37. data/benchmark/bm_dispatch_code_gen_if.rb +64 -0
  38. data/benchmark/bm_dispatch_hardcoded.rb +44 -0
  39. data/benchmark/bm_dispatch_send.rb +38 -0
  40. data/benchmark/bm_dispatch_send_table.rb +57 -0
  41. data/benchmark/bm_hash_assoc_object.rb +11 -0
  42. data/benchmark/bm_hash_assoc_string.rb +9 -0
  43. data/benchmark/bm_hash_clone_object.rb +9 -0
  44. data/benchmark/bm_hash_clone_string.rb +9 -0
  45. data/benchmark/bm_hash_delete_object.rb +11 -0
  46. data/benchmark/bm_hash_delete_string.rb +9 -0
  47. data/benchmark/bm_hash_each_key_object.rb +9 -0
  48. data/benchmark/bm_hash_each_key_string.rb +9 -0
  49. data/benchmark/bm_hash_each_object.rb +9 -0
  50. data/benchmark/bm_hash_each_string.rb +9 -0
  51. data/benchmark/bm_hash_each_value_object.rb +9 -0
  52. data/benchmark/bm_hash_each_value_string.rb +9 -0
  53. data/benchmark/bm_hash_element_reference_object.rb +11 -0
  54. data/benchmark/bm_hash_element_reference_string.rb +9 -0
  55. data/benchmark/bm_hash_element_set_object.rb +5 -0
  56. data/benchmark/bm_hash_element_set_string.rb +5 -0
  57. data/benchmark/bm_hash_equal_value_object.rb +14 -0
  58. data/benchmark/bm_hash_equal_value_string.rb +11 -0
  59. data/benchmark/bm_hash_fetch_object.rb +11 -0
  60. data/benchmark/bm_hash_fetch_string.rb +9 -0
  61. data/benchmark/bm_hash_flatten_object.rb +9 -0
  62. data/benchmark/bm_hash_flatten_string.rb +9 -0
  63. data/benchmark/bm_hash_has_key_object.rb +11 -0
  64. data/benchmark/bm_hash_has_key_string.rb +9 -0
  65. data/benchmark/bm_hash_has_value_object.rb +9 -0
  66. data/benchmark/bm_hash_has_value_string.rb +9 -0
  67. data/benchmark/bm_hash_hash_object.rb +9 -0
  68. data/benchmark/bm_hash_hash_string.rb +9 -0
  69. data/benchmark/bm_hash_inspect_object.rb +9 -0
  70. data/benchmark/bm_hash_inspect_string.rb +9 -0
  71. data/benchmark/bm_hash_invert_object.rb +9 -0
  72. data/benchmark/bm_hash_invert_string.rb +9 -0
  73. data/benchmark/bm_hash_keep_if_object.rb +9 -0
  74. data/benchmark/bm_hash_keep_if_string.rb +9 -0
  75. data/benchmark/bm_hash_key_object.rb +9 -0
  76. data/benchmark/bm_hash_key_string.rb +9 -0
  77. data/benchmark/bm_hash_keys_object.rb +9 -0
  78. data/benchmark/bm_hash_keys_string.rb +9 -0
  79. data/benchmark/bm_hash_literal_mixed_large.rb +3 -0
  80. data/benchmark/bm_hash_literal_mixed_small.rb +3 -0
  81. data/benchmark/bm_hash_literal_object_large.rb +4 -0
  82. data/benchmark/bm_hash_literal_object_small.rb +3 -0
  83. data/benchmark/bm_hash_literal_string_large.rb +4 -0
  84. data/benchmark/bm_hash_literal_string_small.rb +3 -0
  85. data/benchmark/bm_hash_merge_object.rb +22 -0
  86. data/benchmark/bm_hash_merge_string.rb +18 -0
  87. data/benchmark/bm_hash_rassoc_object.rb +9 -0
  88. data/benchmark/bm_hash_rassoc_string.rb +9 -0
  89. data/benchmark/bm_hash_rehash_object.rb +9 -0
  90. data/benchmark/bm_hash_rehash_string.rb +9 -0
  91. data/benchmark/bm_hash_reject_bang_object.rb +9 -0
  92. data/benchmark/bm_hash_reject_bang_string.rb +9 -0
  93. data/benchmark/bm_hash_reject_object.rb +9 -0
  94. data/benchmark/bm_hash_reject_string.rb +9 -0
  95. data/benchmark/bm_hash_replace_object.rb +18 -0
  96. data/benchmark/bm_hash_replace_string.rb +14 -0
  97. data/benchmark/bm_hash_select_bang_object.rb +9 -0
  98. data/benchmark/bm_hash_select_bang_string.rb +9 -0
  99. data/benchmark/bm_hash_select_object.rb +9 -0
  100. data/benchmark/bm_hash_select_string.rb +9 -0
  101. data/benchmark/bm_hash_shift_object.rb +10 -0
  102. data/benchmark/bm_hash_shift_string.rb +10 -0
  103. data/benchmark/bm_hash_to_a_object.rb +9 -0
  104. data/benchmark/bm_hash_to_a_string.rb +9 -0
  105. data/benchmark/bm_hash_to_h_object.rb +10 -0
  106. data/benchmark/bm_hash_to_h_string.rb +10 -0
  107. data/benchmark/bm_hash_values_object.rb +9 -0
  108. data/benchmark/bm_hash_values_string.rb +9 -0
  109. data/benchmark/run.rb +37 -0
  110. data/bin/opal +27 -0
  111. data/bin/opal-build +77 -0
  112. data/bin/opal-mspec +10 -0
  113. data/bin/opal-repl +72 -0
  114. data/config.ru +14 -0
  115. data/docs/compiler_directives.md +127 -0
  116. data/examples/rack/.gitignore +1 -0
  117. data/examples/rack/Gemfile +3 -0
  118. data/examples/rack/app/application.rb +13 -0
  119. data/examples/rack/app/user.rb +22 -0
  120. data/examples/rack/config.ru +20 -0
  121. data/examples/rack/index.html.erb +10 -0
  122. data/examples/sinatra/Gemfile +5 -0
  123. data/examples/sinatra/app/application.rb +7 -0
  124. data/examples/sinatra/config.ru +38 -0
  125. data/lib/mspec/opal/main.rb.erb +9 -0
  126. data/lib/mspec/opal/new.html.erb +1 -0
  127. data/lib/mspec/opal/rake_task.rb +248 -0
  128. data/lib/mspec/opal/runner.rb +281 -0
  129. data/lib/mspec/opal/special_calls.rb +44 -0
  130. data/lib/mspec/opal/sprockets.js +57 -0
  131. data/lib/opal-wedge.rb +4 -0
  132. data/lib/opal.rb +11 -0
  133. data/lib/opal/builder.rb +161 -0
  134. data/lib/opal/builder_processors.rb +149 -0
  135. data/lib/opal/cli.rb +162 -0
  136. data/lib/opal/cli_options.rb +158 -0
  137. data/lib/opal/cli_runners.rb +11 -0
  138. data/lib/opal/cli_runners/apple_script.rb +65 -0
  139. data/lib/opal/cli_runners/nodejs.rb +63 -0
  140. data/lib/opal/cli_runners/phantom.js +44 -0
  141. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  142. data/lib/opal/cli_runners/server.rb +56 -0
  143. data/lib/opal/compiler.rb +381 -0
  144. data/lib/opal/config.rb +48 -0
  145. data/lib/opal/erb.rb +84 -0
  146. data/lib/opal/fragment.rb +53 -0
  147. data/lib/opal/hike_path_finder.rb +18 -0
  148. data/lib/opal/nodes.rb +26 -0
  149. data/lib/opal/nodes/arglist.rb +56 -0
  150. data/lib/opal/nodes/array.rb +54 -0
  151. data/lib/opal/nodes/base.rb +151 -0
  152. data/lib/opal/nodes/call.rb +290 -0
  153. data/lib/opal/nodes/call_special.rb +252 -0
  154. data/lib/opal/nodes/case.rb +96 -0
  155. data/lib/opal/nodes/class.rb +42 -0
  156. data/lib/opal/nodes/constants.rb +78 -0
  157. data/lib/opal/nodes/def.rb +281 -0
  158. data/lib/opal/nodes/defined.rb +113 -0
  159. data/lib/opal/nodes/definitions.rb +168 -0
  160. data/lib/opal/nodes/for.rb +48 -0
  161. data/lib/opal/nodes/hash.rb +67 -0
  162. data/lib/opal/nodes/helpers.rb +116 -0
  163. data/lib/opal/nodes/if.rb +81 -0
  164. data/lib/opal/nodes/iter.rb +136 -0
  165. data/lib/opal/nodes/literal.rb +247 -0
  166. data/lib/opal/nodes/logic.rb +217 -0
  167. data/lib/opal/nodes/masgn.rb +62 -0
  168. data/lib/opal/nodes/module.rb +45 -0
  169. data/lib/opal/nodes/rescue.rb +143 -0
  170. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  171. data/lib/opal/nodes/scope.rb +281 -0
  172. data/lib/opal/nodes/singleton_class.rb +26 -0
  173. data/lib/opal/nodes/super.rb +97 -0
  174. data/lib/opal/nodes/top.rb +103 -0
  175. data/lib/opal/nodes/variables.rb +191 -0
  176. data/lib/opal/nodes/while.rb +65 -0
  177. data/lib/opal/nodes/yield.rb +95 -0
  178. data/lib/opal/parser.rb +742 -0
  179. data/lib/opal/parser/grammar.rb +5723 -0
  180. data/lib/opal/parser/grammar.y +1787 -0
  181. data/lib/opal/parser/keywords.rb +66 -0
  182. data/lib/opal/parser/lexer.rb +1260 -0
  183. data/lib/opal/parser/parser_scope.rb +28 -0
  184. data/lib/opal/parser/sexp.rb +81 -0
  185. data/lib/opal/path_reader.rb +35 -0
  186. data/lib/opal/paths.rb +55 -0
  187. data/lib/opal/regexp_anchors.rb +5 -0
  188. data/lib/opal/source_map.rb +70 -0
  189. data/lib/opal/sprockets.rb +3 -0
  190. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  191. data/lib/opal/sprockets/environment.rb +31 -0
  192. data/lib/opal/sprockets/erb.rb +23 -0
  193. data/lib/opal/sprockets/path_reader.rb +36 -0
  194. data/lib/opal/sprockets/processor.rb +167 -0
  195. data/lib/opal/sprockets/server.rb +160 -0
  196. data/lib/opal/sprockets/source_map_header_patch.rb +41 -0
  197. data/lib/opal/sprockets/source_map_server.rb +115 -0
  198. data/lib/opal/util.rb +69 -0
  199. data/lib/opal/version.rb +5 -0
  200. data/lib/tilt/opal.rb +54 -0
  201. data/opal.gemspec +37 -0
  202. data/opal/README.md +6 -0
  203. data/opal/corelib/array.rb +2073 -0
  204. data/opal/corelib/array/inheritance.rb +127 -0
  205. data/opal/corelib/basic_object.rb +82 -0
  206. data/opal/corelib/boolean.rb +47 -0
  207. data/opal/corelib/class.rb +55 -0
  208. data/opal/corelib/comparable.rb +57 -0
  209. data/opal/corelib/complex.rb +3 -0
  210. data/opal/corelib/dir.rb +20 -0
  211. data/opal/corelib/enumerable.rb +1138 -0
  212. data/opal/corelib/enumerator.rb +426 -0
  213. data/opal/corelib/error.rb +77 -0
  214. data/opal/corelib/file.rb +59 -0
  215. data/opal/corelib/hash.rb +951 -0
  216. data/opal/corelib/helpers.rb +102 -0
  217. data/opal/corelib/io.rb +73 -0
  218. data/opal/corelib/kernel.rb +1124 -0
  219. data/opal/corelib/main.rb +7 -0
  220. data/opal/corelib/match_data.rb +128 -0
  221. data/opal/corelib/method.rb +62 -0
  222. data/opal/corelib/module.rb +553 -0
  223. data/opal/corelib/nil_class.rb +57 -0
  224. data/opal/corelib/numeric.rb +564 -0
  225. data/opal/corelib/proc.rb +105 -0
  226. data/opal/corelib/process.rb +27 -0
  227. data/opal/corelib/range.rb +116 -0
  228. data/opal/corelib/rational.rb +3 -0
  229. data/opal/corelib/regexp.rb +203 -0
  230. data/opal/corelib/runtime.js +1637 -0
  231. data/opal/corelib/string.rb +1762 -0
  232. data/opal/corelib/string/inheritance.rb +117 -0
  233. data/opal/corelib/struct.rb +159 -0
  234. data/opal/corelib/time.rb +746 -0
  235. data/opal/corelib/variables.rb +28 -0
  236. data/opal/opal.rb +33 -0
  237. data/spec/README.md +8 -0
  238. data/spec/filters/bugs/array.rb +77 -0
  239. data/spec/filters/bugs/basicobject.rb +33 -0
  240. data/spec/filters/bugs/class.rb +15 -0
  241. data/spec/filters/bugs/comparable.rb +4 -0
  242. data/spec/filters/bugs/date.rb +173 -0
  243. data/spec/filters/bugs/enumerable.rb +62 -0
  244. data/spec/filters/bugs/enumerator.rb +45 -0
  245. data/spec/filters/bugs/exception.rb +84 -0
  246. data/spec/filters/bugs/fixnum.rb +35 -0
  247. data/spec/filters/bugs/float.rb +100 -0
  248. data/spec/filters/bugs/hash.rb +17 -0
  249. data/spec/filters/bugs/integer.rb +63 -0
  250. data/spec/filters/bugs/kernel.rb +395 -0
  251. data/spec/filters/bugs/language.rb +246 -0
  252. data/spec/filters/bugs/math.rb +89 -0
  253. data/spec/filters/bugs/method.rb +5 -0
  254. data/spec/filters/bugs/module.rb +372 -0
  255. data/spec/filters/bugs/nil.rb +7 -0
  256. data/spec/filters/bugs/numeric.rb +123 -0
  257. data/spec/filters/bugs/proc.rb +65 -0
  258. data/spec/filters/bugs/range.rb +148 -0
  259. data/spec/filters/bugs/regexp.rb +252 -0
  260. data/spec/filters/bugs/set.rb +51 -0
  261. data/spec/filters/bugs/singleton.rb +6 -0
  262. data/spec/filters/bugs/string.rb +99 -0
  263. data/spec/filters/bugs/strscan.rb +106 -0
  264. data/spec/filters/bugs/struct.rb +22 -0
  265. data/spec/filters/bugs/time.rb +28 -0
  266. data/spec/filters/bugs/unboundmethod.rb +22 -0
  267. data/spec/filters/unsupported/array.rb +176 -0
  268. data/spec/filters/unsupported/basicobject.rb +12 -0
  269. data/spec/filters/unsupported/class.rb +4 -0
  270. data/spec/filters/unsupported/delegator.rb +5 -0
  271. data/spec/filters/unsupported/enumerable.rb +8 -0
  272. data/spec/filters/unsupported/enumerator.rb +13 -0
  273. data/spec/filters/unsupported/fixnum.rb +15 -0
  274. data/spec/filters/unsupported/float.rb +6 -0
  275. data/spec/filters/unsupported/hash.rb +55 -0
  276. data/spec/filters/unsupported/integer.rb +3 -0
  277. data/spec/filters/unsupported/kernel.rb +22 -0
  278. data/spec/filters/unsupported/language.rb +31 -0
  279. data/spec/filters/unsupported/matchdata.rb +33 -0
  280. data/spec/filters/unsupported/math.rb +3 -0
  281. data/spec/filters/unsupported/module.rb +36 -0
  282. data/spec/filters/unsupported/pathname.rb +3 -0
  283. data/spec/filters/unsupported/regexp.rb +94 -0
  284. data/spec/filters/unsupported/set.rb +4 -0
  285. data/spec/filters/unsupported/singleton.rb +6 -0
  286. data/spec/filters/unsupported/string.rb +538 -0
  287. data/spec/filters/unsupported/struct.rb +3 -0
  288. data/spec/filters/unsupported/time.rb +208 -0
  289. data/spec/lib/builder_processors_spec.rb +27 -0
  290. data/spec/lib/builder_spec.rb +72 -0
  291. data/spec/lib/cli_spec.rb +150 -0
  292. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +87 -0
  293. data/spec/lib/compiler_spec.rb +131 -0
  294. data/spec/lib/dependency_resolver_spec.rb +40 -0
  295. data/spec/lib/fixtures/complex_sprockets.js.rb.erb +4 -0
  296. data/spec/lib/fixtures/file_with_directives.js +2 -0
  297. data/spec/lib/fixtures/jst_file.js.jst +1 -0
  298. data/spec/lib/fixtures/no_requires.rb +1 -0
  299. data/spec/lib/fixtures/opal_file.rb +2 -0
  300. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  301. data/spec/lib/fixtures/required_file.js +1 -0
  302. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  303. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  304. data/spec/lib/fixtures/requires.rb +7 -0
  305. data/spec/lib/fixtures/source_map.rb +1 -0
  306. data/spec/lib/fixtures/source_map/subfolder/other_file.rb +1 -0
  307. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  308. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  309. data/spec/lib/hike_path_finder_spec.rb +23 -0
  310. data/spec/lib/lexer_spec.rb +110 -0
  311. data/spec/lib/parser/alias_spec.rb +26 -0
  312. data/spec/lib/parser/and_spec.rb +13 -0
  313. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  314. data/spec/lib/parser/begin_spec.rb +42 -0
  315. data/spec/lib/parser/block_spec.rb +12 -0
  316. data/spec/lib/parser/break_spec.rb +17 -0
  317. data/spec/lib/parser/call_spec.rb +165 -0
  318. data/spec/lib/parser/class_spec.rb +35 -0
  319. data/spec/lib/parser/comments_spec.rb +11 -0
  320. data/spec/lib/parser/def_spec.rb +80 -0
  321. data/spec/lib/parser/if_spec.rb +26 -0
  322. data/spec/lib/parser/iter_spec.rb +59 -0
  323. data/spec/lib/parser/lambda_spec.rb +64 -0
  324. data/spec/lib/parser/literal_spec.rb +118 -0
  325. data/spec/lib/parser/masgn_spec.rb +37 -0
  326. data/spec/lib/parser/module_spec.rb +27 -0
  327. data/spec/lib/parser/not_spec.rb +21 -0
  328. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  329. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  330. data/spec/lib/parser/or_spec.rb +13 -0
  331. data/spec/lib/parser/return_spec.rb +17 -0
  332. data/spec/lib/parser/sclass_spec.rb +21 -0
  333. data/spec/lib/parser/string_spec.rb +276 -0
  334. data/spec/lib/parser/super_spec.rb +20 -0
  335. data/spec/lib/parser/unary_spec.rb +48 -0
  336. data/spec/lib/parser/undef_spec.rb +15 -0
  337. data/spec/lib/parser/unless_spec.rb +13 -0
  338. data/spec/lib/parser/variables_spec.rb +92 -0
  339. data/spec/lib/parser/while_spec.rb +15 -0
  340. data/spec/lib/parser/yield_spec.rb +20 -0
  341. data/spec/lib/path_reader_spec.rb +36 -0
  342. data/spec/lib/shared/path_finder_shared.rb +19 -0
  343. data/spec/lib/shared/path_reader_shared.rb +31 -0
  344. data/spec/lib/spec_helper.rb +9 -0
  345. data/spec/lib/sprockets/erb_spec.rb +38 -0
  346. data/spec/lib/sprockets/path_reader_spec.rb +41 -0
  347. data/spec/lib/sprockets/processor_spec.rb +67 -0
  348. data/spec/lib/sprockets/server_spec.rb +102 -0
  349. data/spec/lib/tilt/opal_spec.rb +37 -0
  350. data/spec/opal/compiler/irb_spec.rb +44 -0
  351. data/spec/opal/core/array/intersection_spec.rb +38 -0
  352. data/spec/opal/core/array/minus_spec.rb +38 -0
  353. data/spec/opal/core/array/select_spec.rb +14 -0
  354. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  355. data/spec/opal/core/array/union_spec.rb +38 -0
  356. data/spec/opal/core/array/uniq_spec.rb +49 -0
  357. data/spec/opal/core/date_spec.rb +177 -0
  358. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  359. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  360. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  361. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  362. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  363. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  364. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  365. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  366. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  367. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  368. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  369. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  370. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  371. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  372. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  373. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  374. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  375. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  376. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  377. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  378. data/spec/opal/core/exception_spec.rb +13 -0
  379. data/spec/opal/core/fixtures/class.rb +124 -0
  380. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  381. data/spec/opal/core/fixtures/constants.rb +33 -0
  382. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  383. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  384. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  385. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  386. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  387. data/spec/opal/core/fixtures/require_tree_files/nested/nested 1.rb +1 -0
  388. data/spec/opal/core/fixtures/require_tree_files/nested/nested 2.rb +1 -0
  389. data/spec/opal/core/fixtures/require_tree_files/other/other 1.rb +1 -0
  390. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  391. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  392. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  393. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  394. data/spec/opal/core/hash/has_value_spec.rb +13 -0
  395. data/spec/opal/core/hash/internals_spec.rb +332 -0
  396. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  397. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  398. data/spec/opal/core/kernel/class_spec.rb +6 -0
  399. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  400. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  401. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  402. data/spec/opal/core/kernel/format_spec.rb +122 -0
  403. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  404. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  405. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  406. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  407. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  408. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  409. data/spec/opal/core/kernel/match_spec.rb +5 -0
  410. data/spec/opal/core/kernel/method_spec.rb +31 -0
  411. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  412. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  413. data/spec/opal/core/kernel/p_spec.rb +15 -0
  414. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  415. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  416. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  417. data/spec/opal/core/kernel/require_tree_spec.rb +18 -0
  418. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  419. data/spec/opal/core/kernel/send_spec.rb +56 -0
  420. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  421. data/spec/opal/core/language/block_spec.rb +538 -0
  422. data/spec/opal/core/language/fixtures/array.rb +11 -0
  423. data/spec/opal/core/language/fixtures/block.rb +57 -0
  424. data/spec/opal/core/language/fixtures/break.rb +240 -0
  425. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  426. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  427. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  428. data/spec/opal/core/language/fixtures/module.rb +24 -0
  429. data/spec/opal/core/language/fixtures/next.rb +128 -0
  430. data/spec/opal/core/language/fixtures/return.rb +118 -0
  431. data/spec/opal/core/language/fixtures/send.rb +110 -0
  432. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  433. data/spec/opal/core/language/fixtures/super.rb +308 -0
  434. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  435. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  436. data/spec/opal/core/language/predefined_spec.rb +138 -0
  437. data/spec/opal/core/language/proc_spec.rb +263 -0
  438. data/spec/opal/core/language/regexp_spec.rb +20 -0
  439. data/spec/opal/core/language/send_spec.rb +225 -0
  440. data/spec/opal/core/language/string_spec.rb +44 -0
  441. data/spec/opal/core/language/variables_spec.rb +1366 -0
  442. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  443. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  444. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  445. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  446. data/spec/opal/core/language/versions/def_2_0_spec.rb +62 -0
  447. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  448. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  449. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  450. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  451. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  452. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  453. data/spec/opal/core/language_spec.rb +23 -0
  454. data/spec/opal/core/method/to_proc_spec.rb +28 -0
  455. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  456. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  457. data/spec/opal/core/module/append_features_spec.rb +14 -0
  458. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  459. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  460. data/spec/opal/core/module/const_get_spec.rb +85 -0
  461. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  462. data/spec/opal/core/module/const_set_spec.rb +64 -0
  463. data/spec/opal/core/module/constants_spec.rb +49 -0
  464. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  465. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  466. data/spec/opal/core/module/module_function_spec.rb +25 -0
  467. data/spec/opal/core/module/name_spec.rb +52 -0
  468. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  469. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  470. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  471. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  472. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  473. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  474. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  475. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  476. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  477. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  478. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  479. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  480. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  481. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  482. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  483. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  484. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  485. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  486. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  487. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  488. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  489. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  490. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  491. data/spec/opal/core/numeric/next_spec.rb +9 -0
  492. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  493. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  494. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  495. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  496. data/spec/opal/core/numeric/step_spec.rb +11 -0
  497. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  498. data/spec/opal/core/numeric/times_spec.rb +36 -0
  499. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  500. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  501. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  502. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  503. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  504. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  505. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  506. data/spec/opal/core/object_id_spec.rb +56 -0
  507. data/spec/opal/core/proc/call_spec.rb +21 -0
  508. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  509. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  510. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  511. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  512. data/spec/opal/core/runtime/block_spec.rb +23 -0
  513. data/spec/opal/core/runtime/bridged_classes_spec.rb +111 -0
  514. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  515. data/spec/opal/core/runtime/donate_spec.rb +53 -0
  516. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  517. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  518. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  519. data/spec/opal/core/runtime/method_spec.rb +31 -0
  520. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  521. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  522. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  523. data/spec/opal/core/runtime/return_spec.rb +38 -0
  524. data/spec/opal/core/runtime/send_spec.rb +34 -0
  525. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  526. data/spec/opal/core/runtime/super_spec.rb +212 -0
  527. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  528. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  529. data/spec/opal/core/runtime_spec.rb +58 -0
  530. data/spec/opal/core/source_map_spec.rb +15 -0
  531. data/spec/opal/core/string_spec.rb +11 -0
  532. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  533. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  534. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  535. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  536. data/spec/opal/stdlib/js_spec.rb +66 -0
  537. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  538. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  539. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  540. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  541. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  542. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  543. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  544. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  545. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  546. data/spec/opal/stdlib/native/native_alias_spec.rb +19 -0
  547. data/spec/opal/stdlib/native/native_class_spec.rb +18 -0
  548. data/spec/opal/stdlib/native/native_module_spec.rb +13 -0
  549. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  550. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  551. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  552. data/spec/opal/stdlib/promise/always_spec.rb +30 -0
  553. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  554. data/spec/opal/stdlib/promise/rescue_spec.rb +44 -0
  555. data/spec/opal/stdlib/promise/then_spec.rb +71 -0
  556. data/spec/opal/stdlib/promise/trace_spec.rb +52 -0
  557. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  558. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  559. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  560. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  561. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  562. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  563. data/spec/rubyspecs +144 -0
  564. data/spec/spec_helper.rb +53 -0
  565. data/spec/support/mspec_rspec_adapter.rb +33 -0
  566. data/spec/support/parser_helpers.rb +37 -0
  567. data/stdlib/README.md +3 -0
  568. data/stdlib/base64.rb +152 -0
  569. data/stdlib/benchmark.rb +557 -0
  570. data/stdlib/buffer.rb +41 -0
  571. data/stdlib/buffer/array.rb +66 -0
  572. data/stdlib/buffer/view.rb +70 -0
  573. data/stdlib/date.rb +248 -0
  574. data/stdlib/delegate.rb +29 -0
  575. data/stdlib/dir.rb +1 -0
  576. data/stdlib/encoding.rb +170 -0
  577. data/stdlib/enumerator.rb +1 -0
  578. data/stdlib/erb.rb +16 -0
  579. data/stdlib/file.rb +1 -0
  580. data/stdlib/fileutils.rb +0 -0
  581. data/stdlib/forwardable.rb +71 -0
  582. data/stdlib/iconv.rb +0 -0
  583. data/stdlib/js.rb +56 -0
  584. data/stdlib/json.rb +190 -0
  585. data/stdlib/math.rb +370 -0
  586. data/stdlib/native.rb +530 -0
  587. data/stdlib/nodejs.rb +7 -0
  588. data/stdlib/nodejs/dir.rb +13 -0
  589. data/stdlib/nodejs/file.rb +98 -0
  590. data/stdlib/nodejs/fileutils.rb +26 -0
  591. data/stdlib/nodejs/io.rb +2 -0
  592. data/stdlib/nodejs/irb.rb +45 -0
  593. data/stdlib/nodejs/kernel.rb +33 -0
  594. data/stdlib/nodejs/node_modules/.bin/js-yaml +140 -0
  595. data/stdlib/nodejs/node_modules/glob/LICENSE +15 -0
  596. data/stdlib/nodejs/node_modules/glob/README.md +357 -0
  597. data/stdlib/nodejs/node_modules/glob/common.js +177 -0
  598. data/stdlib/nodejs/node_modules/glob/glob.js +649 -0
  599. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/.eslintrc +17 -0
  600. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/LICENSE +15 -0
  601. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/README.md +37 -0
  602. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/inflight.js +44 -0
  603. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +15 -0
  604. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +36 -0
  605. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +52 -0
  606. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js +51 -0
  607. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +33 -0
  608. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/package.json +61 -0
  609. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/test.js +97 -0
  610. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/LICENSE +16 -0
  611. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/README.md +42 -0
  612. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits.js +1 -0
  613. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
  614. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/package.json +51 -0
  615. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/test.js +25 -0
  616. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.npmignore +1 -0
  617. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.travis.yml +4 -0
  618. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/LICENSE +23 -0
  619. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/README.md +216 -0
  620. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/benchmark.js +15 -0
  621. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/browser.js +1181 -0
  622. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/minimatch.js +845 -0
  623. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +2 -0
  624. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml +3 -0
  625. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +121 -0
  626. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +8 -0
  627. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +191 -0
  628. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +2 -0
  629. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml +4 -0
  630. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +6 -0
  631. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +80 -0
  632. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +5 -0
  633. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +38 -0
  634. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +73 -0
  635. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +56 -0
  636. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +4 -0
  637. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +18 -0
  638. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +62 -0
  639. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +6 -0
  640. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +13 -0
  641. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +83 -0
  642. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +39 -0
  643. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +75 -0
  644. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js +32 -0
  645. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt +1075 -0
  646. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt +182 -0
  647. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js +9 -0
  648. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js +10 -0
  649. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh +24 -0
  650. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js +15 -0
  651. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js +16 -0
  652. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js +10 -0
  653. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js +13 -0
  654. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js +7 -0
  655. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js +50 -0
  656. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/package.json +60 -0
  657. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/basic.js +399 -0
  658. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/brace-expand.js +45 -0
  659. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/defaults.js +274 -0
  660. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  661. data/stdlib/nodejs/node_modules/glob/node_modules/once/LICENSE +27 -0
  662. data/stdlib/nodejs/node_modules/glob/node_modules/once/README.md +51 -0
  663. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +15 -0
  664. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +36 -0
  665. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +52 -0
  666. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +51 -0
  667. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +33 -0
  668. data/stdlib/nodejs/node_modules/glob/node_modules/once/once.js +21 -0
  669. data/stdlib/nodejs/node_modules/glob/node_modules/once/package.json +60 -0
  670. data/stdlib/nodejs/node_modules/glob/node_modules/once/test/once.js +23 -0
  671. data/stdlib/nodejs/node_modules/glob/package.json +72 -0
  672. data/stdlib/nodejs/node_modules/glob/sync.js +409 -0
  673. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +277 -0
  674. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +21 -0
  675. data/stdlib/nodejs/node_modules/js-yaml/README.md +288 -0
  676. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +140 -0
  677. data/stdlib/nodejs/node_modules/js-yaml/bower.json +23 -0
  678. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.js +3666 -0
  679. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +3 -0
  680. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +102 -0
  681. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +18 -0
  682. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +31 -0
  683. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +22 -0
  684. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +18 -0
  685. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +197 -0
  686. data/stdlib/nodejs/node_modules/js-yaml/index.js +7 -0
  687. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +39 -0
  688. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +62 -0
  689. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +554 -0
  690. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +25 -0
  691. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +1581 -0
  692. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +78 -0
  693. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +103 -0
  694. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +18 -0
  695. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +25 -0
  696. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +28 -0
  697. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +17 -0
  698. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +25 -0
  699. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +61 -0
  700. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +133 -0
  701. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +37 -0
  702. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +110 -0
  703. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +183 -0
  704. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +85 -0
  705. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +84 -0
  706. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +27 -0
  707. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +8 -0
  708. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +12 -0
  709. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +36 -0
  710. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +56 -0
  711. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +61 -0
  712. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +8 -0
  713. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +33 -0
  714. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +8 -0
  715. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +98 -0
  716. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +117 -0
  717. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +177 -0
  718. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +115 -0
  719. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +21 -0
  720. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +239 -0
  721. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +36 -0
  722. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +22 -0
  723. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +59 -0
  724. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +13 -0
  725. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +33 -0
  726. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +28 -0
  727. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +23 -0
  728. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +49 -0
  729. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +35 -0
  730. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +270 -0
  731. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +1 -0
  732. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +146 -0
  733. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +55 -0
  734. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +47 -0
  735. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +40 -0
  736. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +48 -0
  737. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +50 -0
  738. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +43 -0
  739. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +27 -0
  740. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +26 -0
  741. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +148 -0
  742. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +50 -0
  743. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +481 -0
  744. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +14 -0
  745. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +50 -0
  746. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +54 -0
  747. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +75 -0
  748. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +1168 -0
  749. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +18 -0
  750. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +88 -0
  751. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +798 -0
  752. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +77 -0
  753. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +2 -0
  754. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +8 -0
  755. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +825 -0
  756. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +33 -0
  757. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +11 -0
  758. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +10 -0
  759. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +26 -0
  760. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +673 -0
  761. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  762. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +107 -0
  763. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +23 -0
  764. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +22 -0
  765. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +69 -0
  766. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +6 -0
  767. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +1415 -0
  768. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +62 -0
  769. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +73 -0
  770. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +117 -0
  771. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +177 -0
  772. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +3908 -0
  773. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +69 -0
  774. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +239 -0
  775. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +422 -0
  776. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +66 -0
  777. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +387 -0
  778. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +20238 -0
  779. data/stdlib/nodejs/node_modules/js-yaml/package.json +83 -0
  780. data/stdlib/nodejs/package.json +6 -0
  781. data/stdlib/nodejs/require.rb +30 -0
  782. data/stdlib/nodejs/rubygems.rb +68 -0
  783. data/stdlib/nodejs/yaml.rb +11 -0
  784. data/stdlib/observer.rb +202 -0
  785. data/stdlib/opal-parser.rb +54 -0
  786. data/stdlib/opal-source-maps.rb +2 -0
  787. data/stdlib/ostruct.rb +69 -0
  788. data/stdlib/pathname.rb +55 -0
  789. data/stdlib/phantomjs.rb +3 -0
  790. data/stdlib/pp.rb +35 -0
  791. data/stdlib/promise.rb +427 -0
  792. data/stdlib/racc/parser.rb +215 -0
  793. data/stdlib/rbconfig.rb +18 -0
  794. data/stdlib/securerandom.rb +12 -0
  795. data/stdlib/set.rb +170 -0
  796. data/stdlib/singleton.rb +40 -0
  797. data/stdlib/source_map.rb +5 -0
  798. data/stdlib/source_map/map.rb +220 -0
  799. data/stdlib/source_map/mapping.rb +26 -0
  800. data/stdlib/source_map/offset.rb +88 -0
  801. data/stdlib/source_map/version.rb +3 -0
  802. data/stdlib/source_map/vlq.rb +98 -0
  803. data/stdlib/sourcemap.rb +1 -0
  804. data/stdlib/stringio.rb +181 -0
  805. data/stdlib/strscan.rb +166 -0
  806. data/stdlib/template.rb +46 -0
  807. data/stdlib/thread.rb +164 -0
  808. data/stdlib/time.rb +9 -0
  809. data/stdlib/yaml.rb +1 -0
  810. data/tasks/benchmarking.rake +88 -0
  811. data/tasks/building.rake +58 -0
  812. data/tasks/documenting.rake +37 -0
  813. data/tasks/github.rake +19 -0
  814. data/tasks/linting.rake +18 -0
  815. data/tasks/testing.rake +125 -0
  816. data/vendored-minitest/minitest.rb +780 -0
  817. data/vendored-minitest/minitest/assertions.rb +662 -0
  818. data/vendored-minitest/minitest/autorun.rb +12 -0
  819. data/vendored-minitest/minitest/benchmark.rb +426 -0
  820. data/vendored-minitest/minitest/expectations.rb +281 -0
  821. data/vendored-minitest/minitest/hell.rb +11 -0
  822. data/vendored-minitest/minitest/mock.rb +220 -0
  823. data/vendored-minitest/minitest/parallel.rb +65 -0
  824. data/vendored-minitest/minitest/pride.rb +4 -0
  825. data/vendored-minitest/minitest/pride_plugin.rb +142 -0
  826. data/vendored-minitest/minitest/spec.rb +310 -0
  827. data/vendored-minitest/minitest/test.rb +293 -0
  828. data/vendored-minitest/minitest/unit.rb +45 -0
  829. data/vendored-minitest/test/unit.rb +28 -0
  830. metadata +1058 -0
@@ -0,0 +1,1637 @@
1
+ (function(undefined) {
2
+ if (typeof(this.Opal) !== 'undefined') {
3
+ console.warn('Opal already loaded. Loading twice can cause troubles, please fix your setup.');
4
+ return this.Opal;
5
+ }
6
+
7
+ // The Opal object that is exposed globally
8
+ var Opal = this.Opal = {};
9
+
10
+ // All bridged classes - keep track to donate methods from Object
11
+ var bridged_classes = Opal.bridged_classes = [];
12
+
13
+ // TopScope is used for inheriting constants from the top scope
14
+ var TopScope = function(){};
15
+
16
+ // Opal just acts as the top scope
17
+ TopScope.prototype = Opal;
18
+
19
+ // To inherit scopes
20
+ Opal.constructor = TopScope;
21
+
22
+ // List top scope constants
23
+ Opal.constants = [];
24
+
25
+ // This is a useful reference to global object inside ruby files
26
+ Opal.global = this;
27
+
28
+ // Minify common function calls
29
+ var $hasOwn = Opal.hasOwnProperty;
30
+ var $slice = Opal.slice = Array.prototype.slice;
31
+
32
+ // Nil object id is always 4
33
+ var nil_id = 4;
34
+
35
+ // Generates even sequential numbers greater than 4
36
+ // (nil_id) to serve as unique ids for ruby objects
37
+ var unique_id = nil_id;
38
+
39
+ // Return next unique id
40
+ Opal.uid = function() {
41
+ unique_id += 2;
42
+ return unique_id;
43
+ };
44
+
45
+ // Table holds all class variables
46
+ Opal.cvars = {};
47
+
48
+ // Globals table
49
+ Opal.gvars = {};
50
+
51
+ // Exit function, this should be replaced by platform specific implementation
52
+ // (See nodejs and phantom for examples)
53
+ Opal.exit = function(status) { if (Opal.gvars.DEBUG) console.log('Exited with status '+status); };
54
+
55
+ /**
56
+ Get a constant on the given scope. Every class and module in Opal has a
57
+ scope used to store, and inherit, constants. For example, the top level
58
+ `Object` in ruby has a scope accessible as `Opal.Object.$$scope`.
59
+
60
+ To get the `Array` class using this scope, you could use:
61
+
62
+ Opal.Object.$$scope.get("Array")
63
+
64
+ If a constant with the given name cannot be found, then a dispatch to the
65
+ class/module's `#const_method` is called, which by default will raise an
66
+ error.
67
+
68
+ @param [String] name the name of the constant to lookup
69
+ @returns [RubyObject]
70
+ */
71
+ Opal.get = function(name) {
72
+ var constant = this[name];
73
+
74
+ if (constant == null) {
75
+ return this.base.$const_missing(name);
76
+ }
77
+
78
+ return constant;
79
+ };
80
+
81
+ /*
82
+ * Create a new constants scope for the given class with the given
83
+ * base. Constants are looked up through their parents, so the base
84
+ * scope will be the outer scope of the new klass.
85
+ */
86
+ function create_scope(base, klass, id) {
87
+ var const_alloc = function() {};
88
+ var const_scope = const_alloc.prototype = new base.constructor();
89
+
90
+ klass.$$scope = const_scope;
91
+ klass.$$base_module = base.base;
92
+
93
+ const_scope.base = klass;
94
+ const_scope.constructor = const_alloc;
95
+ const_scope.constants = [];
96
+
97
+ if (id) {
98
+ klass.$$orig_scope = base;
99
+ base[id] = base.constructor[id] = klass;
100
+ base.constants.push(id);
101
+ }
102
+ }
103
+
104
+ Opal.create_scope = create_scope;
105
+
106
+ /*
107
+ * A `class Foo; end` expression in ruby is compiled to call this runtime
108
+ * method which either returns an existing class of the given name, or creates
109
+ * a new class in the given `base` scope.
110
+ *
111
+ * If a constant with the given name exists, then we check to make sure that
112
+ * it is a class and also that the superclasses match. If either of these
113
+ * fail, then we raise a `TypeError`. Note, superklass may be null if one was
114
+ * not specified in the ruby code.
115
+ *
116
+ * We pass a constructor to this method of the form `function ClassName() {}`
117
+ * simply so that classes show up with nicely formatted names inside debuggers
118
+ * in the web browser (or node/sprockets).
119
+ *
120
+ * The `base` is the current `self` value where the class is being created
121
+ * from. We use this to get the scope for where the class should be created.
122
+ * If `base` is an object (not a class/module), we simple get its class and
123
+ * use that as the base instead.
124
+ *
125
+ * @param [Object] base where the class is being created
126
+ * @param [Class] superklass superclass of the new class (may be null)
127
+ * @param [String] id the name of the class to be created
128
+ * @param [Function] constructor function to use as constructor
129
+ * @return [Class] new or existing ruby class
130
+ */
131
+ Opal.klass = function(base, superklass, id, constructor) {
132
+ // If base is an object, use its class
133
+ if (!base.$$is_class) {
134
+ base = base.$$class;
135
+ }
136
+
137
+ // Not specifying a superclass means we can assume it to be Object
138
+ if (superklass === null) {
139
+ superklass = ObjectClass;
140
+ }
141
+
142
+ var klass = base.$$scope[id];
143
+
144
+ // If a constant exists in the scope, then we must use that
145
+ if ($hasOwn.call(base.$$scope, id) && klass.$$orig_scope === base.$$scope) {
146
+ // Make sure the existing constant is a class, or raise error
147
+ if (!klass.$$is_class) {
148
+ throw Opal.TypeError.$new(id + " is not a class");
149
+ }
150
+
151
+ // Make sure existing class has same superclass
152
+ if (superklass !== klass.$$super && superklass !== ObjectClass) {
153
+ throw Opal.TypeError.$new("superclass mismatch for class " + id);
154
+ }
155
+ }
156
+ else if (typeof(superklass) === 'function') {
157
+ // passed native constructor as superklass, so bridge it as ruby class
158
+ return bridge_class(id, superklass, base);
159
+ }
160
+ else {
161
+ // if class doesnt exist, create a new one with given superclass
162
+ klass = boot_class(superklass, constructor);
163
+
164
+ // name class using base (e.g. Foo or Foo::Baz)
165
+ klass.$$name = id;
166
+
167
+ // every class gets its own constant scope, inherited from current scope
168
+ create_scope(base.$$scope, klass, id);
169
+
170
+ // Name new class directly onto current scope (Opal.Foo.Baz = klass)
171
+ base[id] = base.$$scope[id] = klass;
172
+
173
+ // Copy all parent constants to child, unless parent is Object
174
+ if (superklass !== ObjectClass && superklass !== BasicObjectClass) {
175
+ donate_constants(superklass, klass);
176
+ }
177
+
178
+ // call .inherited() hook with new class on the superclass
179
+ if (superklass.$inherited) {
180
+ superklass.$inherited(klass);
181
+ }
182
+ }
183
+
184
+ return klass;
185
+ };
186
+
187
+ // Create generic class with given superclass.
188
+ function boot_class(superklass, constructor) {
189
+ var alloc = boot_class_alloc(null, constructor, superklass)
190
+
191
+ return boot_class_object(superklass, alloc);
192
+ }
193
+
194
+ // Make `boot_class` available to the JS-API
195
+ Opal.boot = boot_class;
196
+
197
+ /*
198
+ * The class object itself (as in `Class.new`)
199
+ *
200
+ * @param [(Opal) Class] superklass Another class object (as in `Class.new`)
201
+ * @param [constructor] alloc The constructor that holds the prototype
202
+ * that will be used for instances of the
203
+ * newly constructed class.
204
+ */
205
+ function boot_class_object(superklass, alloc) {
206
+ var singleton_class = function() {};
207
+ singleton_class.prototype = superklass.constructor.prototype;
208
+
209
+ function OpalClass() {}
210
+ OpalClass.prototype = new singleton_class();
211
+
212
+ var klass = new OpalClass();
213
+
214
+ setup_module_or_class_object(klass, OpalClass, superklass, alloc.prototype);
215
+
216
+ // @property $$alloc This is the constructor of instances of the current
217
+ // class. Its prototype will be used for method lookup
218
+ klass.$$alloc = alloc;
219
+
220
+ // @property $$proto.$$class Make available to instances a reference to the
221
+ // class they belong to.
222
+ klass.$$proto.$$class = klass;
223
+
224
+ return klass;
225
+ }
226
+
227
+ /*
228
+ * Adds common/required properties to a module or class object
229
+ * (as in `Module.new` / `Class.new`)
230
+ *
231
+ * @param module The module or class that needs to be prepared
232
+ *
233
+ * @param constructor The constructor of the module or class itself,
234
+ * usually it's already assigned by using `new`. Some
235
+ * ipothesis on why it's needed can be found below.
236
+ *
237
+ * @param superklass The superclass of the class/module object, for modules
238
+ * is `Module` (of `ModuleClass` in JS context)
239
+ *
240
+ * @param prototype The prototype on which the class/module methods will
241
+ * be stored.
242
+ */
243
+ function setup_module_or_class_object(module, constructor, superklass, prototype) {
244
+ // @property $$id Each class is assigned a unique `id` that helps
245
+ // comparation and implementation of `#object_id`
246
+ module.$$id = Opal.uid();
247
+
248
+ // @property $$proto This is the prototype on which methods will be defined
249
+ module.$$proto = prototype;
250
+
251
+ // @property constructor keeps a ref to the constructor, but apparently the
252
+ // constructor is already set on:
253
+ //
254
+ // `var module = new constructor` is called.
255
+ //
256
+ // Maybe there are some browsers not abiding (IE6?)
257
+ module.constructor = constructor;
258
+
259
+ // @property $$is_class Clearly mark this as a class-like
260
+ module.$$is_class = true;
261
+
262
+ // @property $$super the superclass, doesn't get changed by module inclusions
263
+ module.$$super = superklass;
264
+
265
+ // @property $$parent direct parent class or module
266
+ // starts with the superclass, after module inclusion is
267
+ // the last included module
268
+ module.$$parent = superklass;
269
+
270
+ // @property $$methods keeps track of methods defined on the class
271
+ // but seems to be used just by `define_basic_object_method`
272
+ // and for donating (Ruby) Object methods to bridged classes
273
+ // TODO: check if it can be removed
274
+ module.$$methods = [];
275
+
276
+ // @property $$inc included modules
277
+ module.$$inc = [];
278
+ }
279
+
280
+ /**
281
+ Define new module (or return existing module). The given `base` is basically
282
+ the current `self` value the `module` statement was defined in. If this is
283
+ a ruby module or class, then it is used, otherwise if the base is a ruby
284
+ object then that objects real ruby class is used (e.g. if the base is the
285
+ main object, then the top level `Object` class is used as the base).
286
+
287
+ If a module of the given name is already defined in the base, then that
288
+ instance is just returned.
289
+
290
+ If there is a class of the given name in the base, then an error is
291
+ generated instead (cannot have a class and module of same name in same base).
292
+
293
+ Otherwise, a new module is created in the base with the given name, and that
294
+ new instance is returned back (to be referenced at runtime).
295
+
296
+ @param [RubyModule or Class] base class or module this definition is inside
297
+ @param [String] id the name of the new (or existing) module
298
+ @returns [RubyModule]
299
+ */
300
+ Opal.module = function(base, id) {
301
+ var module;
302
+
303
+ if (!base.$$is_class) {
304
+ base = base.$$class;
305
+ }
306
+
307
+ if ($hasOwn.call(base.$$scope, id)) {
308
+ module = base.$$scope[id];
309
+
310
+ if (!module.$$is_mod && module !== ObjectClass) {
311
+ throw Opal.TypeError.$new(id + " is not a module");
312
+ }
313
+ }
314
+ else {
315
+ module = boot_module_object();
316
+ module.$$name = id;
317
+
318
+ create_scope(base.$$scope, module, id);
319
+
320
+ // Name new module directly onto current scope (Opal.Foo.Baz = module)
321
+ base[id] = base.$$scope[id] = module;
322
+ }
323
+
324
+ return module;
325
+ };
326
+
327
+ /*
328
+ * Internal function to create a new module instance. This simply sets up
329
+ * the prototype hierarchy and method tables.
330
+ */
331
+ function boot_module_object() {
332
+ var mtor = function() {};
333
+ mtor.prototype = ModuleClass.constructor.prototype;
334
+
335
+ function module_constructor() {}
336
+ module_constructor.prototype = new mtor();
337
+
338
+ var module = new module_constructor();
339
+ var module_prototype = {};
340
+
341
+ setup_module_or_class_object(module, module_constructor, ModuleClass, module_prototype);
342
+
343
+ module.$$is_mod = true;
344
+ module.$$dep = [];
345
+
346
+ return module;
347
+ }
348
+
349
+ /**
350
+ Return the singleton class for the passed object.
351
+
352
+ If the given object alredy has a singleton class, then it will be stored on
353
+ the object as the `$$meta` property. If this exists, then it is simply
354
+ returned back.
355
+
356
+ Otherwise, a new singleton object for the class or object is created, set on
357
+ the object at `$$meta` for future use, and then returned.
358
+
359
+ @param [RubyObject] object the ruby object
360
+ @returns [RubyClass] the singleton class for object
361
+ */
362
+ Opal.get_singleton_class = function(object) {
363
+ if (object.$$meta) {
364
+ return object.$$meta;
365
+ }
366
+
367
+ if (object.$$is_class) {
368
+ return build_class_singleton_class(object);
369
+ }
370
+
371
+ return build_object_singleton_class(object);
372
+ };
373
+
374
+ /**
375
+ Build the singleton class for an existing class.
376
+
377
+ NOTE: Actually in MRI a class' singleton class inherits from its
378
+ superclass' singleton class which in turn inherits from Class.
379
+
380
+ @param [RubyClass] klass
381
+ @returns [RubyClass]
382
+ */
383
+ function build_class_singleton_class(klass) {
384
+ var meta = new Opal.Class.$$alloc();
385
+
386
+ meta.$$class = Opal.Class;
387
+ meta.$$proto = klass.constructor.prototype;
388
+
389
+ meta.$$is_singleton = true;
390
+ meta.$$inc = [];
391
+ meta.$$methods = [];
392
+ meta.$$scope = klass.$$scope;
393
+
394
+ return klass.$$meta = meta;
395
+ }
396
+
397
+ /**
398
+ Build the singleton class for a Ruby (non class) Object.
399
+
400
+ @param [RubyObject] object
401
+ @returns [RubyClass]
402
+ */
403
+ function build_object_singleton_class(object) {
404
+ var orig_class = object.$$class,
405
+ class_id = "#<Class:#<" + orig_class.$$name + ":" + orig_class.$$id + ">>";
406
+
407
+ var Singleton = function () {};
408
+ var meta = Opal.boot(orig_class, Singleton);
409
+ meta.$$name = class_id;
410
+
411
+ meta.$$proto = object;
412
+ meta.$$class = orig_class.$$class;
413
+ meta.$$scope = orig_class.$$scope;
414
+ meta.$$parent = orig_class;
415
+ return object.$$meta = meta;
416
+ }
417
+
418
+ /**
419
+ The actual inclusion of a module into a class.
420
+
421
+ ## Class `$$parent` and `iclass`
422
+
423
+ To handle `super` calls, every class has a `$$parent`. This parent is
424
+ used to resolve the next class for a super call. A normal class would
425
+ have this point to its superclass. However, if a class includes a module
426
+ then this would need to take into account the module. The module would
427
+ also have to then point its `$$parent` to the actual superclass. We
428
+ cannot modify modules like this, because it might be included in more
429
+ then one class. To fix this, we actually insert an `iclass` as the class'
430
+ `$$parent` which can then point to the superclass. The `iclass` acts as
431
+ a proxy to the actual module, so the `super` chain can then search it for
432
+ the required method.
433
+
434
+ @param [RubyModule] module the module to include
435
+ @param [RubyClass] klass the target class to include module into
436
+ @returns [null]
437
+ */
438
+ Opal.append_features = function(module, klass) {
439
+ var included = klass.$$inc;
440
+
441
+ // check if this module is already included in the klass
442
+ for (var j = 0, jj = included.length; j < jj; j++) {
443
+ if (included[j] === module) {
444
+ return;
445
+ }
446
+ }
447
+
448
+ included.push(module);
449
+ module.$$dep.push(klass);
450
+
451
+ // iclass
452
+ var iclass = {
453
+ $$name: module.$$name,
454
+ $$proto: module.$$proto,
455
+ $$parent: klass.$$parent,
456
+ $$module: module,
457
+ $$iclass: true
458
+ };
459
+
460
+ klass.$$parent = iclass;
461
+
462
+ var donator = module.$$proto,
463
+ prototype = klass.$$proto,
464
+ methods = module.$$methods;
465
+
466
+ for (var i = 0, length = methods.length; i < length; i++) {
467
+ var method = methods[i], current;
468
+
469
+
470
+ if ( prototype.hasOwnProperty(method) &&
471
+ !(current = prototype[method]).$$donated && !current.$$stub ) {
472
+ // if the target class already has a method of the same name defined
473
+ // and that method was NOT donated, then it must be a method defined
474
+ // by the class so we do not want to override it
475
+ }
476
+ else {
477
+ prototype[method] = donator[method];
478
+ prototype[method].$$donated = true;
479
+ }
480
+ }
481
+
482
+ if (klass.$$dep) {
483
+ donate_methods(klass, methods.slice(), true);
484
+ }
485
+
486
+ donate_constants(module, klass);
487
+ };
488
+
489
+ // Boot a base class (makes instances).
490
+ function boot_class_alloc(id, constructor, superklass) {
491
+ if (superklass) {
492
+ var ctor = function() {};
493
+ ctor.prototype = superklass.$$proto || superklass.prototype;
494
+
495
+ if (id) {
496
+ ctor.displayName = id;
497
+ }
498
+
499
+ constructor.prototype = new ctor();
500
+ }
501
+
502
+ constructor.prototype.constructor = constructor;
503
+
504
+ return constructor;
505
+ }
506
+
507
+ /*
508
+ * Builds the class object for core classes:
509
+ * - make the class object have a singleton class
510
+ * - make the singleton class inherit from its parent singleton class
511
+ *
512
+ * @param id [String] the name of the class
513
+ * @param alloc [Function] the constructor for the core class instances
514
+ * @param superclass [Class alloc] the constructor of the superclass
515
+ */
516
+ function boot_core_class_object(id, alloc, superclass) {
517
+ var superclass_constructor = function() {};
518
+ superclass_constructor.prototype = superclass.prototype;
519
+
520
+ var singleton_class = function() {};
521
+ singleton_class.prototype = new superclass_constructor();
522
+
523
+ singleton_class.displayName = "#<Class:"+id+">";
524
+
525
+ // the singleton_class acts as the class object constructor
526
+ var klass = new singleton_class();
527
+
528
+ setup_module_or_class_object(klass, singleton_class, superclass, alloc.prototype);
529
+
530
+ klass.$$alloc = alloc;
531
+ klass.$$name = id;
532
+
533
+ // Give all instances a ref to their class
534
+ alloc.prototype.$$class = klass;
535
+
536
+ Opal[id] = klass;
537
+ Opal.constants.push(id);
538
+
539
+ return klass;
540
+ }
541
+
542
+ /*
543
+ * For performance, some core ruby classes are toll-free bridged to their
544
+ * native javascript counterparts (e.g. a ruby Array is a javascript Array).
545
+ *
546
+ * This method is used to setup a native constructor (e.g. Array), to have
547
+ * its prototype act like a normal ruby class. Firstly, a new ruby class is
548
+ * created using the native constructor so that its prototype is set as the
549
+ * target for th new class. Note: all bridged classes are set to inherit
550
+ * from Object.
551
+ *
552
+ * Bridged classes are tracked in `bridged_classes` array so that methods
553
+ * defined on Object can be "donated" to all bridged classes. This allows
554
+ * us to fake the inheritance of a native prototype from our Object
555
+ * prototype.
556
+ *
557
+ * Example:
558
+ *
559
+ * bridge_class("Proc", Function);
560
+ *
561
+ * @param [String] name the name of the ruby class to create
562
+ * @param [Function] constructor native javascript constructor to use
563
+ * @param [Object] base where the bridge class is being created. If none is supplied, the top level scope (Opal) will be used
564
+ * @return [Class] returns new ruby class
565
+ */
566
+ function bridge_class(name, constructor, base) {
567
+ var klass = boot_class_object(ObjectClass, constructor);
568
+
569
+ klass.$$name = name;
570
+
571
+ if (base === undefined) {
572
+ base = Opal;
573
+ }
574
+ else {
575
+ base = base.$$scope;
576
+ }
577
+
578
+ create_scope(base, klass, name);
579
+ bridged_classes.push(klass);
580
+
581
+ var object_methods = BasicObjectClass.$$methods.concat(ObjectClass.$$methods);
582
+
583
+ for (var i = 0, len = object_methods.length; i < len; i++) {
584
+ var meth = object_methods[i];
585
+ constructor.prototype[meth] = ObjectClass.$$proto[meth];
586
+ }
587
+
588
+ add_stubs_subscriber(constructor.prototype);
589
+
590
+ return klass;
591
+ }
592
+
593
+ /*
594
+ * constant assign
595
+ */
596
+ Opal.casgn = function(base_module, name, value) {
597
+ var scope = base_module.$$scope;
598
+
599
+ if (value.$$is_class && value.$$name === nil) {
600
+ value.$$name = name;
601
+ }
602
+
603
+ if (value.$$is_class) {
604
+ value.$$base_module = base_module;
605
+ }
606
+
607
+ scope.constants.push(name);
608
+ return scope[name] = value;
609
+ };
610
+
611
+ /*
612
+ * constant decl
613
+ */
614
+ Opal.cdecl = function(base_scope, name, value) {
615
+ base_scope.constants.push(name);
616
+ return base_scope[name] = value;
617
+ };
618
+
619
+ /*
620
+ * When a source module is included into the target module, we must also copy
621
+ * its constants to the target.
622
+ */
623
+ function donate_constants(source_mod, target_mod) {
624
+ var source_constants = source_mod.$$scope.constants,
625
+ target_scope = target_mod.$$scope,
626
+ target_constants = target_scope.constants;
627
+
628
+ for (var i = 0, length = source_constants.length; i < length; i++) {
629
+ target_constants.push(source_constants[i]);
630
+ target_scope[source_constants[i]] = source_mod.$$scope[source_constants[i]];
631
+ }
632
+ };
633
+
634
+ /*
635
+ * Methods stubs are used to facilitate method_missing in opal. A stub is a
636
+ * placeholder function which just calls `method_missing` on the receiver.
637
+ * If no method with the given name is actually defined on an object, then it
638
+ * is obvious to say that the stub will be called instead, and then in turn
639
+ * method_missing will be called.
640
+ *
641
+ * When a file in ruby gets compiled to javascript, it includes a call to
642
+ * this function which adds stubs for every method name in the compiled file.
643
+ * It should then be safe to assume that method_missing will work for any
644
+ * method call detected.
645
+ *
646
+ * Method stubs are added to the BasicObject prototype, which every other
647
+ * ruby object inherits, so all objects should handle method missing. A stub
648
+ * is only added if the given property name (method name) is not already
649
+ * defined.
650
+ *
651
+ * Note: all ruby methods have a `$` prefix in javascript, so all stubs will
652
+ * have this prefix as well (to make this method more performant).
653
+ *
654
+ * Opal.add_stubs(["$foo", "$bar", "$baz="]);
655
+ *
656
+ * All stub functions will have a private `$$stub` property set to true so
657
+ * that other internal methods can detect if a method is just a stub or not.
658
+ * `Kernel#respond_to?` uses this property to detect a methods presence.
659
+ *
660
+ * @param [Array] stubs an array of method stubs to add
661
+ */
662
+ Opal.add_stubs = function(stubs) {
663
+ var subscribers = Opal.stub_subscribers;
664
+ var subscriber;
665
+
666
+ for (var i = 0, length = stubs.length; i < length; i++) {
667
+ var method_name = stubs[i], stub = stub_for(method_name);
668
+
669
+ for (var j = 0; j < subscribers.length; j++) {
670
+ subscriber = subscribers[j];
671
+ if (!(method_name in subscriber)) {
672
+ subscriber[method_name] = stub;
673
+ }
674
+ }
675
+ }
676
+ };
677
+
678
+ /*
679
+ * Add a prototype to the subscribers list, and (TODO) add previously stubbed
680
+ * methods.
681
+ *
682
+ * @param [Prototype]
683
+ */
684
+ function add_stubs_subscriber(prototype) {
685
+ // TODO: Add previously stubbed methods too.
686
+ Opal.stub_subscribers.push(prototype);
687
+ }
688
+
689
+ /*
690
+ * Keep a list of prototypes that want method_missing stubs to be added.
691
+ *
692
+ * @default [Prototype List] BasicObject.prototype
693
+ */
694
+ Opal.stub_subscribers = [BasicObject.prototype];
695
+
696
+ /*
697
+ * Add a method_missing stub function to the given prototype for the
698
+ * given name.
699
+ *
700
+ * @param [Prototype] prototype the target prototype
701
+ * @param [String] stub stub name to add (e.g. "$foo")
702
+ */
703
+ function add_stub_for(prototype, stub) {
704
+ var method_missing_stub = stub_for(stub);
705
+ prototype[stub] = method_missing_stub;
706
+ }
707
+
708
+ /*
709
+ * Generate the method_missing stub for a given method name.
710
+ *
711
+ * @param [String] method_name The js-name of the method to stub (e.g. "$foo")
712
+ */
713
+ function stub_for(method_name) {
714
+ function method_missing_stub() {
715
+ // Copy any given block onto the method_missing dispatcher
716
+ this.$method_missing.$$p = method_missing_stub.$$p;
717
+
718
+ // Set block property to null ready for the next call (stop false-positives)
719
+ method_missing_stub.$$p = null;
720
+
721
+ // call method missing with correct args (remove '$' prefix on method name)
722
+ return this.$method_missing.apply(this, [method_name.slice(1)].concat($slice.call(arguments)));
723
+ }
724
+
725
+ method_missing_stub.$$stub = true;
726
+
727
+ return method_missing_stub;
728
+ }
729
+
730
+ // Expose for other parts of Opal to use
731
+ Opal.add_stub_for = add_stub_for;
732
+
733
+ // Arity count error dispatcher
734
+ Opal.ac = function(actual, expected, object, meth) {
735
+ var inspect = (object.$$is_class ? object.$$name + '.' : object.$$class.$$name + '#') + meth;
736
+ var msg = '[' + inspect + '] wrong number of arguments(' + actual + ' for ' + expected + ')';
737
+ throw Opal.ArgumentError.$new(msg);
738
+ };
739
+
740
+ // Super dispatcher
741
+ Opal.find_super_dispatcher = function(obj, jsid, current_func, iter, defs) {
742
+ var dispatcher;
743
+
744
+ if (defs) {
745
+ dispatcher = obj.$$is_class ? defs.$$super : obj.$$class.$$proto;
746
+ }
747
+ else {
748
+ if (obj.$$is_class) {
749
+ dispatcher = obj.$$super;
750
+ }
751
+ else {
752
+ dispatcher = find_obj_super_dispatcher(obj, jsid, current_func);
753
+ }
754
+ }
755
+
756
+ dispatcher = dispatcher['$' + jsid];
757
+ dispatcher.$$p = iter;
758
+
759
+ return dispatcher;
760
+ };
761
+
762
+ // Iter dispatcher for super in a block
763
+ Opal.find_iter_super_dispatcher = function(obj, jsid, current_func, iter, defs) {
764
+ if (current_func.$$def) {
765
+ return Opal.find_super_dispatcher(obj, current_func.$$jsid, current_func, iter, defs);
766
+ }
767
+ else {
768
+ return Opal.find_super_dispatcher(obj, jsid, current_func, iter, defs);
769
+ }
770
+ };
771
+
772
+ function find_obj_super_dispatcher(obj, jsid, current_func) {
773
+ var klass = obj.$$meta || obj.$$class;
774
+ jsid = '$' + jsid;
775
+
776
+ while (klass) {
777
+ if (klass.$$proto[jsid] === current_func) {
778
+ // ok
779
+ break;
780
+ }
781
+
782
+ klass = klass.$$parent;
783
+ }
784
+
785
+ // if we arent in a class, we couldnt find current?
786
+ if (!klass) {
787
+ throw new Error("could not find current class for super()");
788
+ }
789
+
790
+ klass = klass.$$parent;
791
+
792
+ // else, let's find the next one
793
+ while (klass) {
794
+ var working = klass.$$proto[jsid];
795
+
796
+ if (working && working !== current_func) {
797
+ // ok
798
+ break;
799
+ }
800
+
801
+ klass = klass.$$parent;
802
+ }
803
+
804
+ return klass.$$proto;
805
+ };
806
+
807
+ /*
808
+ * Used to return as an expression. Sometimes, we can't simply return from
809
+ * a javascript function as if we were a method, as the return is used as
810
+ * an expression, or even inside a block which must "return" to the outer
811
+ * method. This helper simply throws an error which is then caught by the
812
+ * method. This approach is expensive, so it is only used when absolutely
813
+ * needed.
814
+ */
815
+ Opal.ret = function(val) {
816
+ Opal.returner.$v = val;
817
+ throw Opal.returner;
818
+ };
819
+
820
+ // handles yield calls for 1 yielded arg
821
+ Opal.yield1 = function(block, arg) {
822
+ if (typeof(block) !== "function") {
823
+ throw Opal.LocalJumpError.$new("no block given");
824
+ }
825
+
826
+ if (block.length > 1 && arg.$$is_array) {
827
+ return block.apply(null, arg);
828
+ }
829
+ else {
830
+ return block(arg);
831
+ }
832
+ };
833
+
834
+ // handles yield for > 1 yielded arg
835
+ Opal.yieldX = function(block, args) {
836
+ if (typeof(block) !== "function") {
837
+ throw Opal.LocalJumpError.$new("no block given");
838
+ }
839
+
840
+ if (block.length > 1 && args.length == 1) {
841
+ if (args[0].$$is_array) {
842
+ return block.apply(null, args[0]);
843
+ }
844
+ }
845
+
846
+ if (!args.$$is_array) {
847
+ args = $slice.call(args);
848
+ }
849
+
850
+ return block.apply(null, args);
851
+ };
852
+
853
+ // Finds the corresponding exception match in candidates. Each candidate can
854
+ // be a value, or an array of values. Returns null if not found.
855
+ Opal.rescue = function(exception, candidates) {
856
+ for (var i = 0; i < candidates.length; i++) {
857
+ var candidate = candidates[i];
858
+
859
+ if (candidate.$$is_array) {
860
+ var result = Opal.rescue(exception, candidate);
861
+
862
+ if (result) {
863
+ return result;
864
+ }
865
+ }
866
+ else if (candidate['$==='](exception)) {
867
+ return candidate;
868
+ }
869
+ }
870
+
871
+ return null;
872
+ };
873
+
874
+ Opal.is_a = function(object, klass) {
875
+ if (object.$$meta === klass) {
876
+ return true;
877
+ }
878
+
879
+ var search = object.$$class;
880
+
881
+ while (search) {
882
+ if (search === klass) {
883
+ return true;
884
+ }
885
+
886
+ for (var i = 0, length = search.$$inc.length; i < length; i++) {
887
+ if (search.$$inc[i] == klass) {
888
+ return true;
889
+ }
890
+ }
891
+
892
+ search = search.$$super;
893
+ }
894
+
895
+ return false;
896
+ };
897
+
898
+ // Helper to convert the given object to an array
899
+ Opal.to_ary = function(value) {
900
+ if (value.$$is_array) {
901
+ return value;
902
+ }
903
+ else if (value.$to_ary && !value.$to_ary.$$stub) {
904
+ return value.$to_ary();
905
+ }
906
+
907
+ return [value];
908
+ };
909
+
910
+ /**
911
+ Used to get a list of rest keyword arguments. Method takes the given
912
+ keyword args, i.e. the hash literal passed to the method containing all
913
+ keyword arguemnts passed to method, as well as the used args which are
914
+ the names of required and optional arguments defined. This method then
915
+ just returns all key/value pairs which have not been used, in a new
916
+ hash literal.
917
+
918
+ @param given_args [Hash] all kwargs given to method
919
+ @param used_args [Object<String: true>] all keys used as named kwargs
920
+ @return [Hash]
921
+ */
922
+ Opal.kwrestargs = function(given_args, used_args) {
923
+ var keys = [],
924
+ map = {},
925
+ key = null,
926
+ given_map = given_args.smap;
927
+
928
+ for (key in given_map) {
929
+ if (!used_args[key]) {
930
+ keys.push(key);
931
+ map[key] = given_map[key];
932
+ }
933
+ }
934
+
935
+ return Opal.hash2(keys, map);
936
+ };
937
+
938
+ /*
939
+ * Call a ruby method on a ruby object with some arguments:
940
+ *
941
+ * var my_array = [1, 2, 3, 4]
942
+ * Opal.send(my_array, 'length') # => 4
943
+ * Opal.send(my_array, 'reverse!') # => [4, 3, 2, 1]
944
+ *
945
+ * A missing method will be forwarded to the object via
946
+ * method_missing.
947
+ *
948
+ * The result of either call with be returned.
949
+ *
950
+ * @param [Object] recv the ruby object
951
+ * @param [String] mid ruby method to call
952
+ */
953
+ Opal.send = function(recv, mid) {
954
+ var args = $slice.call(arguments, 2),
955
+ func = recv['$' + mid];
956
+
957
+ if (func) {
958
+ return func.apply(recv, args);
959
+ }
960
+
961
+ return recv.$method_missing.apply(recv, [mid].concat(args));
962
+ };
963
+
964
+ Opal.block_send = function(recv, mid, block) {
965
+ var args = $slice.call(arguments, 3),
966
+ func = recv['$' + mid];
967
+
968
+ if (func) {
969
+ func.$$p = block;
970
+ return func.apply(recv, args);
971
+ }
972
+
973
+ return recv.$method_missing.apply(recv, [mid].concat(args));
974
+ };
975
+
976
+ /*
977
+ * Donate methods for a class/module
978
+ */
979
+ function donate_methods(klass, defined, indirect) {
980
+ var methods = klass.$$methods, included_in = klass.$$dep;
981
+
982
+ // if (!indirect) {
983
+ klass.$$methods = methods.concat(defined);
984
+ // }
985
+
986
+ if (included_in) {
987
+ for (var i = 0, length = included_in.length; i < length; i++) {
988
+ var includee = included_in[i];
989
+ var dest = includee.$$proto;
990
+
991
+ for (var j = 0, jj = defined.length; j < jj; j++) {
992
+ var method = defined[j];
993
+
994
+ dest[method] = klass.$$proto[method];
995
+ dest[method].$$donated = true;
996
+ }
997
+
998
+ if (includee.$$dep) {
999
+ donate_methods(includee, defined, true);
1000
+ }
1001
+ }
1002
+ }
1003
+ };
1004
+
1005
+ /**
1006
+ Define the given method on the module.
1007
+
1008
+ This also handles donating methods to all classes that include this
1009
+ module. Method conflicts are also handled here, where a class might already
1010
+ have defined a method of the same name, or another included module defined
1011
+ the same method.
1012
+
1013
+ @param [RubyModule] module the module method defined on
1014
+ @param [String] jsid javascript friendly method name (e.g. "$foo")
1015
+ @param [Function] body method body of actual function
1016
+ */
1017
+ function define_module_method(module, jsid, body) {
1018
+ module.$$proto[jsid] = body;
1019
+ body.$$owner = module;
1020
+
1021
+ module.$$methods.push(jsid);
1022
+
1023
+ if (module.$$module_function) {
1024
+ module[jsid] = body;
1025
+ }
1026
+
1027
+ var included_in = module.$$dep,
1028
+ i, length, includee, dest, current,
1029
+ klass_includees, j, jj, current_owner_index, module_index;
1030
+
1031
+ if (included_in) {
1032
+ for (i = 0, length = included_in.length; i < length; i++) {
1033
+ includee = included_in[i];
1034
+ dest = includee.$$proto;
1035
+ current = dest[jsid];
1036
+
1037
+
1038
+ if (dest.hasOwnProperty(jsid) && !current.$$donated && !current.$$stub) {
1039
+ // target class has already defined the same method name - do nothing
1040
+ }
1041
+ else if (dest.hasOwnProperty(jsid) && !current.$$stub) {
1042
+ // target class includes another module that has defined this method
1043
+ klass_includees = includee.$$inc;
1044
+
1045
+ for (j = 0, jj = klass_includees.length; j < jj; j++) {
1046
+ if (klass_includees[j] === current.$$owner) {
1047
+ current_owner_index = j;
1048
+ }
1049
+ if (klass_includees[j] === module) {
1050
+ module_index = j;
1051
+ }
1052
+ }
1053
+
1054
+ // only redefine method on class if the module was included AFTER
1055
+ // the module which defined the current method body. Also make sure
1056
+ // a module can overwrite a method it defined before
1057
+ if (current_owner_index <= module_index) {
1058
+ dest[jsid] = body;
1059
+ dest[jsid].$$donated = true;
1060
+ }
1061
+ }
1062
+ else {
1063
+ // neither a class, or module included by class, has defined method
1064
+ dest[jsid] = body;
1065
+ dest[jsid].$$donated = true;
1066
+ }
1067
+
1068
+ if (includee.$$dep) {
1069
+ donate_methods(includee, [jsid], true);
1070
+ }
1071
+ }
1072
+ }
1073
+ }
1074
+
1075
+ /**
1076
+ Used to define methods on an object. This is a helper method, used by the
1077
+ compiled source to define methods on special case objects when the compiler
1078
+ can not determine the destination object, or the object is a Module
1079
+ instance. This can get called by `Module#define_method` as well.
1080
+
1081
+ ## Modules
1082
+
1083
+ Any method defined on a module will come through this runtime helper.
1084
+ The method is added to the module body, and the owner of the method is
1085
+ set to be the module itself. This is used later when choosing which
1086
+ method should show on a class if more than 1 included modules define
1087
+ the same method. Finally, if the module is in `module_function` mode,
1088
+ then the method is also defined onto the module itself.
1089
+
1090
+ ## Classes
1091
+
1092
+ This helper will only be called for classes when a method is being
1093
+ defined indirectly; either through `Module#define_method`, or by a
1094
+ literal `def` method inside an `instance_eval` or `class_eval` body. In
1095
+ either case, the method is simply added to the class' prototype. A special
1096
+ exception exists for `BasicObject` and `Object`. These two classes are
1097
+ special because they are used in toll-free bridged classes. In each of
1098
+ these two cases, extra work is required to define the methods on toll-free
1099
+ bridged class' prototypes as well.
1100
+
1101
+ ## Objects
1102
+
1103
+ If a simple ruby object is the object, then the method is simply just
1104
+ defined on the object as a singleton method. This would be the case when
1105
+ a method is defined inside an `instance_eval` block.
1106
+
1107
+ @param [RubyObject or Class] obj the actual obj to define method for
1108
+ @param [String] jsid the javascript friendly method name (e.g. '$foo')
1109
+ @param [Function] body the literal javascript function used as method
1110
+ @returns [null]
1111
+ */
1112
+ Opal.defn = function(obj, jsid, body) {
1113
+ if (obj.$$is_mod) {
1114
+ define_module_method(obj, jsid, body);
1115
+ }
1116
+ else if (obj.$$is_class) {
1117
+ obj.$$proto[jsid] = body;
1118
+
1119
+ if (obj === BasicObjectClass) {
1120
+ define_basic_object_method(jsid, body);
1121
+ }
1122
+ else if (obj === ObjectClass) {
1123
+ donate_methods(obj, [jsid]);
1124
+ }
1125
+ }
1126
+ else {
1127
+ obj[jsid] = body;
1128
+ }
1129
+
1130
+ return nil;
1131
+ };
1132
+
1133
+ /*
1134
+ * Define a singleton method on the given object.
1135
+ */
1136
+ Opal.defs = function(obj, jsid, body) {
1137
+ if (obj.$$is_class || obj.$$is_mod) {
1138
+ obj.constructor.prototype[jsid] = body;
1139
+ }
1140
+ else {
1141
+ obj[jsid] = body;
1142
+ }
1143
+ };
1144
+
1145
+ function define_basic_object_method(jsid, body) {
1146
+ BasicObjectClass.$$methods.push(jsid);
1147
+ for (var i = 0, len = bridged_classes.length; i < len; i++) {
1148
+ bridged_classes[i].$$proto[jsid] = body;
1149
+ }
1150
+ }
1151
+
1152
+ /*
1153
+ * Called to remove a method.
1154
+ */
1155
+ Opal.undef = function(obj, jsid) {
1156
+ delete obj.$$proto[jsid];
1157
+ };
1158
+
1159
+ Opal.hash_init = function (hash) {
1160
+ hash.map = {};
1161
+ hash.smap = {};
1162
+ hash.keys = [];
1163
+ };
1164
+
1165
+ Opal.hash_clone = function (from_hash, to_hash) {
1166
+ to_hash.none = from_hash.none;
1167
+ to_hash.proc = from_hash.proc;
1168
+
1169
+ for (var i = 0, keys = from_hash.keys, length = keys.length, key, value; i < length; i++) {
1170
+ key = from_hash.keys[i];
1171
+
1172
+ if (key.$$is_string) {
1173
+ value = from_hash.smap[key];
1174
+ } else {
1175
+ value = key.value;
1176
+ key = key.key;
1177
+ }
1178
+
1179
+ Opal.hash_put(to_hash, key, value);
1180
+ }
1181
+ };
1182
+
1183
+ Opal.hash_put = function (hash, key, value) {
1184
+ if (key.$$is_string) {
1185
+ if (!hash.smap.hasOwnProperty(key)) {
1186
+ hash.keys.push(key);
1187
+ }
1188
+ hash.smap[key] = value;
1189
+ return;
1190
+ }
1191
+
1192
+ var key_hash = key.$hash(), bucket, last_bucket;
1193
+
1194
+ if (!hash.map.hasOwnProperty(key_hash)) {
1195
+ bucket = {key: key, key_hash: key_hash, value: value};
1196
+ hash.keys.push(bucket);
1197
+ hash.map[key_hash] = bucket;
1198
+ return;
1199
+ }
1200
+
1201
+ bucket = hash.map[key_hash];
1202
+
1203
+ while (bucket) {
1204
+ if (key === bucket.key || key['$eql?'](bucket.key)) {
1205
+ last_bucket = undefined;
1206
+ bucket.value = value;
1207
+ break;
1208
+ }
1209
+ last_bucket = bucket;
1210
+ bucket = bucket.next;
1211
+ }
1212
+
1213
+ if (last_bucket) {
1214
+ bucket = {key: key, key_hash: key_hash, value: value};
1215
+ hash.keys.push(bucket);
1216
+ last_bucket.next = bucket;
1217
+ }
1218
+ };
1219
+
1220
+ Opal.hash_get = function (hash, key) {
1221
+ if (key.$$is_string) {
1222
+ if (hash.smap.hasOwnProperty(key)) {
1223
+ return hash.smap[key];
1224
+ }
1225
+ return;
1226
+ }
1227
+
1228
+ var key_hash = key.$hash(), bucket;
1229
+
1230
+ if (hash.map.hasOwnProperty(key_hash)) {
1231
+ bucket = hash.map[key_hash];
1232
+
1233
+ while (bucket) {
1234
+ if (key === bucket.key || key['$eql?'](bucket.key)) {
1235
+ return bucket.value;
1236
+ }
1237
+ bucket = bucket.next;
1238
+ }
1239
+ }
1240
+ };
1241
+
1242
+ Opal.hash_delete = function (hash, key) {
1243
+ var i, keys = hash.keys, length = keys.length, value;
1244
+
1245
+ if (key.$$is_string) {
1246
+ if (!hash.smap.hasOwnProperty(key)) {
1247
+ return;
1248
+ }
1249
+
1250
+ for (i = 0; i < length; i++) {
1251
+ if (keys[i] === key) {
1252
+ keys.splice(i, 1);
1253
+ break;
1254
+ }
1255
+ }
1256
+
1257
+ value = hash.smap[key];
1258
+ delete hash.smap[key];
1259
+ return value;
1260
+ }
1261
+
1262
+ var key_hash = key.$hash();
1263
+
1264
+ if (!hash.map.hasOwnProperty(key_hash)) {
1265
+ return;
1266
+ }
1267
+
1268
+ var bucket = hash.map[key_hash], last_bucket;
1269
+
1270
+ while (bucket) {
1271
+ if (key === bucket.key || key['$eql?'](bucket.key)) {
1272
+ value = bucket.value;
1273
+
1274
+ for (i = 0; i < length; i++) {
1275
+ if (keys[i] === bucket) {
1276
+ keys.splice(i, 1);
1277
+ break;
1278
+ }
1279
+ }
1280
+
1281
+ if (last_bucket && bucket.next) {
1282
+ last_bucket.next = bucket.next;
1283
+ }
1284
+ else if (last_bucket) {
1285
+ delete last_bucket.next;
1286
+ }
1287
+ else if (bucket.next) {
1288
+ hash.map[key_hash] = bucket.next;
1289
+ }
1290
+ else {
1291
+ delete hash.map[key_hash];
1292
+ }
1293
+
1294
+ return value;
1295
+ }
1296
+ last_bucket = bucket;
1297
+ bucket = bucket.next;
1298
+ }
1299
+ };
1300
+
1301
+ Opal.hash_rehash = function (hash) {
1302
+ for (var i = 0, length = hash.keys.length, key_hash, bucket, last_bucket; i < length; i++) {
1303
+
1304
+ if (hash.keys[i].$$is_string) {
1305
+ continue;
1306
+ }
1307
+
1308
+ key_hash = hash.keys[i].key.$hash();
1309
+
1310
+ if (key_hash === hash.keys[i].key_hash) {
1311
+ continue;
1312
+ }
1313
+
1314
+ bucket = hash.map[hash.keys[i].key_hash];
1315
+ last_bucket = undefined;
1316
+
1317
+ while (bucket) {
1318
+ if (bucket === hash.keys[i]) {
1319
+ if (last_bucket && bucket.next) {
1320
+ last_bucket.next = bucket.next;
1321
+ }
1322
+ else if (last_bucket) {
1323
+ delete last_bucket.next;
1324
+ }
1325
+ else if (bucket.next) {
1326
+ hash.map[hash.keys[i].key_hash] = bucket.next;
1327
+ }
1328
+ else {
1329
+ delete hash.map[hash.keys[i].key_hash];
1330
+ }
1331
+ break;
1332
+ }
1333
+ last_bucket = bucket;
1334
+ bucket = bucket.next;
1335
+ }
1336
+
1337
+ hash.keys[i].key_hash = key_hash;
1338
+
1339
+ if (!hash.map.hasOwnProperty(key_hash)) {
1340
+ hash.map[key_hash] = hash.keys[i];
1341
+ continue;
1342
+ }
1343
+
1344
+ bucket = hash.map[key_hash];
1345
+ last_bucket = undefined;
1346
+
1347
+ while (bucket) {
1348
+ if (bucket === hash.keys[i]) {
1349
+ last_bucket = undefined;
1350
+ break;
1351
+ }
1352
+ last_bucket = bucket;
1353
+ bucket = bucket.next;
1354
+ }
1355
+
1356
+ if (last_bucket) {
1357
+ last_bucket.next = hash.keys[i];
1358
+ }
1359
+ }
1360
+ };
1361
+
1362
+ Opal.hash = function() {
1363
+ var arguments_length = arguments.length, args, hash, i, length, key, value;
1364
+
1365
+ if (arguments_length === 1 && arguments[0].$$is_hash) {
1366
+ return arguments[0];
1367
+ }
1368
+
1369
+ hash = new Opal.Hash.$$alloc();
1370
+ Opal.hash_init(hash);
1371
+
1372
+ if (arguments_length === 1 && arguments[0].$$is_array) {
1373
+ args = arguments[0];
1374
+ length = args.length;
1375
+
1376
+ for (i = 0; i < length; i++) {
1377
+ if (args[i].length !== 2) {
1378
+ throw Opal.ArgumentError.$new("value not of length 2: " + args[i].$inspect());
1379
+ }
1380
+
1381
+ key = args[i][0];
1382
+ value = args[i][1];
1383
+
1384
+ Opal.hash_put(hash, key, value);
1385
+ }
1386
+
1387
+ return hash;
1388
+ }
1389
+
1390
+ if (arguments_length === 1) {
1391
+ args = arguments[0];
1392
+ for (key in args) {
1393
+ if (args.hasOwnProperty(key)) {
1394
+ value = args[key];
1395
+
1396
+ Opal.hash_put(hash, key, value);
1397
+ }
1398
+ }
1399
+
1400
+ return hash;
1401
+ }
1402
+
1403
+ if (arguments_length % 2 !== 0) {
1404
+ throw Opal.ArgumentError.$new("odd number of arguments for Hash");
1405
+ }
1406
+
1407
+ for (i = 0; i < arguments_length; i += 2) {
1408
+ key = arguments[i];
1409
+ value = arguments[i + 1];
1410
+
1411
+ Opal.hash_put(hash, key, value);
1412
+ }
1413
+
1414
+ return hash;
1415
+ };
1416
+
1417
+ /*
1418
+ * hash2 is a faster creator for hashes that just use symbols and
1419
+ * strings as keys. The map and keys array can be constructed at
1420
+ * compile time, so they are just added here by the constructor
1421
+ * function
1422
+ */
1423
+ Opal.hash2 = function(keys, smap) {
1424
+ var hash = new Opal.Hash.$$alloc();
1425
+
1426
+ hash.map = {};
1427
+ hash.keys = keys;
1428
+ hash.smap = smap;
1429
+
1430
+ return hash;
1431
+ };
1432
+
1433
+ /*
1434
+ * Create a new range instance with first and last values, and whether the
1435
+ * range excludes the last value.
1436
+ */
1437
+ Opal.range = function(first, last, exc) {
1438
+ var range = new Opal.Range.$$alloc();
1439
+ range.begin = first;
1440
+ range.end = last;
1441
+ range.exclude = exc;
1442
+
1443
+ return range;
1444
+ };
1445
+
1446
+ // Require system
1447
+ // --------------
1448
+ (function(Opal) {
1449
+ var loaded_features = ['corelib/runtime'],
1450
+ require_table = {'corelib/runtime': true},
1451
+ modules = {};
1452
+
1453
+ var current_dir = '.';
1454
+
1455
+ function mark_as_loaded(filename) {
1456
+ if (require_table[filename]) {
1457
+ return false;
1458
+ }
1459
+
1460
+ loaded_features.push(filename);
1461
+ require_table[filename] = true;
1462
+
1463
+ return true;
1464
+ }
1465
+
1466
+ function normalize_loadable_path(path) {
1467
+ var parts, part, new_parts = [], SEPARATOR = '/';
1468
+
1469
+ if (current_dir !== '.') {
1470
+ path = current_dir.replace(/\/*$/, '/') + path;
1471
+ }
1472
+
1473
+ path = path.replace(/\.(rb|opal|js)$/, '');
1474
+ parts = path.split(SEPARATOR);
1475
+
1476
+ for (var i = 0, ii = parts.length; i < ii; i++) {
1477
+ part = parts[i];
1478
+ if (part == '') continue;
1479
+ (part === '..') ? new_parts.pop() : new_parts.push(part)
1480
+ }
1481
+
1482
+ return new_parts.join(SEPARATOR);
1483
+ }
1484
+
1485
+ function load(path) {
1486
+ mark_as_loaded(path);
1487
+
1488
+ var module = modules[path];
1489
+
1490
+ if (module) {
1491
+ module(Opal);
1492
+ }
1493
+ else {
1494
+ var severity = Opal.dynamic_require_severity || 'warning';
1495
+ var message = 'cannot load such file -- ' + path;
1496
+
1497
+ if (severity === "error") {
1498
+ Opal.LoadError ? Opal.LoadError.$new(message) : function(){throw message}();
1499
+ }
1500
+ else if (severity === "warning") {
1501
+ console.warn('WARNING: LoadError: ' + message);
1502
+ }
1503
+ }
1504
+
1505
+ return true;
1506
+ }
1507
+
1508
+ function require(path) {
1509
+ if (require_table[path]) {
1510
+ return false;
1511
+ }
1512
+
1513
+ return load(path);
1514
+ }
1515
+
1516
+ Opal.modules = modules;
1517
+ Opal.loaded_features = loaded_features;
1518
+
1519
+ Opal.normalize_loadable_path = normalize_loadable_path;
1520
+ Opal.mark_as_loaded = mark_as_loaded;
1521
+
1522
+ Opal.load = load;
1523
+ Opal.require = require;
1524
+ })(Opal);
1525
+
1526
+ // Initialization
1527
+ // --------------
1528
+
1529
+ // The actual class for BasicObject
1530
+ var BasicObjectClass;
1531
+
1532
+ // The actual Object class
1533
+ var ObjectClass;
1534
+
1535
+ // The actual Module class
1536
+ var ModuleClass;
1537
+
1538
+ // The actual Class class
1539
+ var ClassClass;
1540
+
1541
+ // Constructor for instances of BasicObject
1542
+ function BasicObject(){}
1543
+
1544
+ // Constructor for instances of Object
1545
+ function Object(){}
1546
+
1547
+ // Constructor for instances of Class
1548
+ function Class(){}
1549
+
1550
+ // Constructor for instances of Module
1551
+ function Module(){}
1552
+
1553
+ // Constructor for instances of NilClass (nil)
1554
+ function NilClass(){}
1555
+
1556
+ // Constructors for *instances* of core objects
1557
+ boot_class_alloc('BasicObject', BasicObject);
1558
+ boot_class_alloc('Object', Object, BasicObject);
1559
+ boot_class_alloc('Module', Module, Object);
1560
+ boot_class_alloc('Class', Class, Module);
1561
+
1562
+ // Constructors for *classes* of core objects
1563
+ BasicObjectClass = boot_core_class_object('BasicObject', BasicObject, Class);
1564
+ ObjectClass = boot_core_class_object('Object', Object, BasicObjectClass.constructor);
1565
+ ModuleClass = boot_core_class_object('Module', Module, ObjectClass.constructor);
1566
+ ClassClass = boot_core_class_object('Class', Class, ModuleClass.constructor);
1567
+
1568
+ // Fix booted classes to use their metaclass
1569
+ BasicObjectClass.$$class = ClassClass;
1570
+ ObjectClass.$$class = ClassClass;
1571
+ ModuleClass.$$class = ClassClass;
1572
+ ClassClass.$$class = ClassClass;
1573
+
1574
+ // Fix superclasses of booted classes
1575
+ BasicObjectClass.$$super = null;
1576
+ ObjectClass.$$super = BasicObjectClass;
1577
+ ModuleClass.$$super = ObjectClass;
1578
+ ClassClass.$$super = ModuleClass;
1579
+
1580
+ BasicObjectClass.$$parent = null;
1581
+ ObjectClass.$$parent = BasicObjectClass;
1582
+ ModuleClass.$$parent = ObjectClass;
1583
+ ClassClass.$$parent = ModuleClass;
1584
+
1585
+ // Internally, Object acts like a module as it is "included" into bridged
1586
+ // classes. In other words, we donate methods from Object into our bridged
1587
+ // classes as their prototypes don't inherit from our root Object, so they
1588
+ // act like module includes.
1589
+ ObjectClass.$$dep = bridged_classes;
1590
+
1591
+ Opal.base = ObjectClass;
1592
+ BasicObjectClass.$$scope = ObjectClass.$$scope = Opal;
1593
+ BasicObjectClass.$$orig_scope = ObjectClass.$$orig_scope = Opal;
1594
+ Opal.Kernel = ObjectClass;
1595
+
1596
+ ModuleClass.$$scope = ObjectClass.$$scope;
1597
+ ModuleClass.$$orig_scope = ObjectClass.$$orig_scope;
1598
+ ClassClass.$$scope = ObjectClass.$$scope;
1599
+ ClassClass.$$orig_scope = ObjectClass.$$orig_scope;
1600
+
1601
+ ObjectClass.$$proto.toString = function() {
1602
+ return this.$to_s();
1603
+ };
1604
+
1605
+ ObjectClass.$$proto.$require = Opal.require;
1606
+
1607
+ Opal.top = new ObjectClass.$$alloc();
1608
+
1609
+ // Nil
1610
+ Opal.klass(ObjectClass, ObjectClass, 'NilClass', NilClass);
1611
+ var nil = Opal.nil = new NilClass();
1612
+ nil.$$id = nil_id;
1613
+ nil.call = nil.apply = function() { throw Opal.LocalJumpError.$new('no block given'); };
1614
+
1615
+ Opal.breaker = new Error('unexpected break');
1616
+ Opal.returner = new Error('unexpected return');
1617
+
1618
+ bridge_class('Array', Array);
1619
+ bridge_class('Boolean', Boolean);
1620
+ bridge_class('Numeric', Number);
1621
+ bridge_class('String', String);
1622
+ bridge_class('Proc', Function);
1623
+ bridge_class('Exception', Error);
1624
+ bridge_class('Regexp', RegExp);
1625
+ bridge_class('Time', Date);
1626
+
1627
+ TypeError.$$super = Error;
1628
+ }).call(this);
1629
+
1630
+ if (typeof(global) !== 'undefined') {
1631
+ global.Opal = this.Opal;
1632
+ Opal.global = global;
1633
+ }
1634
+ if (typeof(window) !== 'undefined') {
1635
+ window.Opal = this.Opal;
1636
+ Opal.global = window;
1637
+ }