opal 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (796) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +8 -0
  5. data/CONTRIBUTING.md +46 -2
  6. data/Gemfile +17 -0
  7. data/README.md +13 -4
  8. data/Rakefile +22 -119
  9. data/bin/opal +11 -2
  10. data/bin/opal-repl +71 -0
  11. data/corelib/array.rb +554 -356
  12. data/corelib/basic_object.rb +22 -18
  13. data/corelib/boolean.rb +15 -6
  14. data/corelib/class.rb +12 -6
  15. data/corelib/comparable.rb +40 -9
  16. data/corelib/encoding.rb +164 -0
  17. data/corelib/enumerable.rb +532 -300
  18. data/corelib/enumerator.rb +31 -6
  19. data/corelib/error.rb +14 -3
  20. data/corelib/hash.rb +108 -97
  21. data/corelib/io.rb +30 -0
  22. data/corelib/kernel.rb +151 -82
  23. data/corelib/main.rb +7 -0
  24. data/corelib/match_data.rb +118 -0
  25. data/corelib/method.rb +58 -0
  26. data/corelib/module.rb +145 -77
  27. data/corelib/native.rb +144 -22
  28. data/corelib/nil_class.rb +2 -0
  29. data/corelib/numeric.rb +259 -61
  30. data/corelib/opal.rb +43 -28
  31. data/corelib/proc.rb +21 -9
  32. data/corelib/range.rb +42 -23
  33. data/corelib/regexp.rb +51 -9
  34. data/corelib/runtime.js +470 -129
  35. data/corelib/string.rb +170 -246
  36. data/corelib/struct.rb +13 -1
  37. data/corelib/time.rb +414 -43
  38. data/doc/compiler.md +42 -0
  39. data/doc/compiler_options.md +5 -0
  40. data/doc/examples/node_http_server.rb +49 -0
  41. data/doc/external_libraries.md +9 -0
  42. data/doc/generated_javascript.md +272 -0
  43. data/doc/home.md +17 -0
  44. data/doc/method_missing.md +58 -0
  45. data/doc/static_applications.md +60 -0
  46. data/doc/using_ruby_from_javascript.md +18 -0
  47. data/doc/using_sprockets.md +65 -0
  48. data/lib/opal.rb +18 -15
  49. data/lib/opal/builder.rb +26 -9
  50. data/lib/opal/cli.rb +143 -90
  51. data/lib/opal/cli_options.rb +19 -13
  52. data/lib/opal/compiler.rb +307 -0
  53. data/lib/opal/erb.rb +3 -3
  54. data/lib/opal/fragment.rb +34 -0
  55. data/lib/opal/nodes.rb +25 -0
  56. data/lib/opal/nodes/arglist.rb +56 -0
  57. data/lib/opal/nodes/array.rb +54 -0
  58. data/lib/opal/nodes/base.rb +150 -0
  59. data/lib/opal/nodes/base_scope.rb +11 -0
  60. data/lib/opal/nodes/call.rb +195 -0
  61. data/lib/opal/nodes/call_special.rb +153 -0
  62. data/lib/opal/nodes/case.rb +96 -0
  63. data/lib/opal/nodes/class.rb +43 -0
  64. data/lib/opal/nodes/constants.rb +91 -0
  65. data/lib/opal/nodes/def.rb +157 -0
  66. data/lib/opal/nodes/defined.rb +113 -0
  67. data/lib/opal/nodes/definitions.rb +182 -0
  68. data/lib/opal/nodes/hash.rb +67 -0
  69. data/lib/opal/nodes/helpers.rb +105 -0
  70. data/lib/opal/nodes/if.rb +60 -0
  71. data/lib/opal/nodes/iter.rb +118 -0
  72. data/lib/opal/nodes/literal.rb +193 -0
  73. data/lib/opal/nodes/logic.rb +211 -0
  74. data/lib/opal/nodes/masgn.rb +62 -0
  75. data/lib/opal/nodes/module.rb +46 -0
  76. data/lib/opal/nodes/rescue.rb +134 -0
  77. data/lib/opal/nodes/singleton_class.rb +26 -0
  78. data/lib/opal/nodes/super.rb +97 -0
  79. data/lib/opal/nodes/top.rb +63 -0
  80. data/lib/opal/nodes/variables.rb +155 -0
  81. data/lib/opal/nodes/while.rb +65 -0
  82. data/lib/opal/nodes/yield.rb +84 -0
  83. data/lib/opal/parser.rb +294 -2169
  84. data/lib/opal/parser/grammar.rb +5326 -0
  85. data/lib/opal/{grammar.y → parser/grammar.y} +180 -113
  86. data/lib/opal/parser/keywords.rb +64 -0
  87. data/lib/opal/{lexer.rb → parser/lexer.rb} +278 -327
  88. data/lib/opal/{lexer_scope.rb → parser/parser_scope.rb} +2 -5
  89. data/lib/opal/parser/sexp.rb +63 -0
  90. data/lib/opal/source_map.rb +6 -5
  91. data/lib/opal/target_scope.rb +15 -17
  92. data/lib/opal/version.rb +1 -1
  93. data/mri_spec/cli_spec.rb +67 -6
  94. data/opal.gemspec +4 -4
  95. data/spec/config.ru +2 -1
  96. data/spec/corelib/enumerable/all_break_spec.rb +5 -0
  97. data/spec/corelib/enumerable/any_break_spec.rb +5 -0
  98. data/spec/corelib/enumerable/collect_break_spec.rb +13 -0
  99. data/spec/corelib/enumerable/count_break_spec.rb +5 -0
  100. data/spec/corelib/enumerable/detect_break_spec.rb +5 -0
  101. data/spec/corelib/enumerable/drop_while_break_spec.rb +5 -0
  102. data/spec/corelib/enumerable/each_slice_break.rb +6 -0
  103. data/spec/corelib/enumerable/each_with_index_break_spec.rb +5 -0
  104. data/spec/corelib/enumerable/each_with_object_break_spec.rb +5 -0
  105. data/spec/corelib/enumerable/find_all_break_spec.rb +5 -0
  106. data/spec/corelib/enumerable/find_index_break_spec.rb +5 -0
  107. data/spec/corelib/enumerable/grep_break_spec.rb +5 -0
  108. data/spec/corelib/enumerable/max_break_spec.rb +5 -0
  109. data/spec/corelib/enumerable/max_by_break_spec.rb +5 -0
  110. data/spec/corelib/enumerable/min_break_spec.rb +5 -0
  111. data/spec/corelib/enumerable/min_by_break_spec.rb +5 -0
  112. data/spec/corelib/enumerable/none_break_spec.rb +5 -0
  113. data/spec/corelib/enumerable/one_break_spec.rb +5 -0
  114. data/spec/corelib/enumerable/reduce_break_spec.rb +5 -0
  115. data/spec/corelib/enumerable/take_while_break_spec.rb +5 -0
  116. data/spec/{rubyspec → corelib}/fixtures/class.rb +0 -0
  117. data/spec/{rubyspec → corelib}/fixtures/class_variables.rb +0 -0
  118. data/spec/{rubyspec → corelib}/fixtures/constants.rb +0 -0
  119. data/spec/{rubyspec/core → corelib}/kernel/Array_spec.rb +0 -0
  120. data/spec/{opal → corelib}/kernel/block_given_spec.rb +0 -0
  121. data/spec/{opal → corelib}/kernel/class_spec.rb +0 -0
  122. data/spec/{rubyspec/core → corelib}/kernel/define_singleton_method_spec.rb +0 -0
  123. data/spec/{rubyspec/core → corelib}/kernel/equal_value_spec.rb +0 -0
  124. data/spec/{opal → corelib}/kernel/extend_spec.rb +0 -0
  125. data/spec/{opal → corelib}/kernel/format_spec.rb +0 -0
  126. data/spec/{opal → corelib}/kernel/freeze_spec.rb +0 -0
  127. data/spec/{rubyspec/core → corelib}/kernel/instance_eval_spec.rb +0 -0
  128. data/spec/{opal → corelib}/kernel/instance_variable_defined_spec.rb +0 -0
  129. data/spec/{rubyspec/core → corelib}/kernel/instance_variable_get_spec.rb +0 -0
  130. data/spec/{rubyspec/core → corelib}/kernel/instance_variable_set_spec.rb +0 -0
  131. data/spec/{rubyspec/core → corelib}/kernel/loop_spec.rb +0 -0
  132. data/spec/{opal → corelib}/kernel/match_spec.rb +0 -0
  133. data/spec/{opal → corelib}/kernel/method_spec.rb +0 -0
  134. data/spec/{opal → corelib}/kernel/methods_spec.rb +0 -0
  135. data/spec/{opal → corelib}/kernel/nil_spec.rb +0 -0
  136. data/spec/{opal → corelib}/kernel/p_spec.rb +8 -6
  137. data/spec/{opal → corelib}/kernel/printf_spec.rb +4 -2
  138. data/spec/{opal → corelib}/kernel/proc_spec.rb +0 -0
  139. data/spec/{opal → corelib}/kernel/rand_spec.rb +0 -0
  140. data/spec/{opal → corelib}/kernel/respond_to_spec.rb +0 -0
  141. data/spec/{rubyspec/core → corelib}/kernel/send_spec.rb +0 -0
  142. data/spec/{opal → corelib}/kernel/sprintf_spec.rb +0 -0
  143. data/spec/corelib/kernel/warn_spec.rb +83 -0
  144. data/spec/{rubyspec → corelib}/language/block_spec.rb +17 -18
  145. data/spec/{rubyspec → corelib}/language/fixtures/array.rb +0 -0
  146. data/spec/{rubyspec → corelib}/language/fixtures/block.rb +0 -0
  147. data/spec/{rubyspec → corelib}/language/fixtures/break.rb +0 -0
  148. data/spec/{rubyspec → corelib}/language/fixtures/ensure.rb +0 -0
  149. data/spec/{rubyspec → corelib}/language/fixtures/literal_lambda.rb +0 -0
  150. data/spec/{rubyspec → corelib}/language/fixtures/metaclass.rb +0 -0
  151. data/spec/{rubyspec → corelib}/language/fixtures/module.rb +0 -0
  152. data/spec/{rubyspec → corelib}/language/fixtures/next.rb +0 -0
  153. data/spec/{rubyspec → corelib}/language/fixtures/return.rb +0 -0
  154. data/spec/{rubyspec → corelib}/language/fixtures/send.rb +1 -1
  155. data/spec/{rubyspec → corelib}/language/fixtures/send_1.9.rb +0 -0
  156. data/spec/{rubyspec → corelib}/language/fixtures/super.rb +0 -0
  157. data/spec/{rubyspec → corelib}/language/fixtures/variables.rb +0 -0
  158. data/spec/{rubyspec → corelib}/language/fixtures/yield.rb +0 -0
  159. data/spec/{rubyspec → corelib}/language/numbers_spec.rb +0 -2
  160. data/spec/{rubyspec → corelib}/language/predefined_spec.rb +0 -0
  161. data/spec/{rubyspec → corelib}/language/proc_spec.rb +0 -2
  162. data/spec/{rubyspec → corelib}/language/regexp_spec.rb +0 -0
  163. data/spec/{rubyspec → corelib}/language/send_spec.rb +6 -7
  164. data/spec/{rubyspec → corelib}/language/string_spec.rb +0 -0
  165. data/spec/{rubyspec → corelib}/language/symbol_spec.rb +0 -0
  166. data/spec/{rubyspec → corelib}/language/variables_spec.rb +1 -2
  167. data/spec/{rubyspec → corelib}/language/versions/array_1.9.rb +0 -0
  168. data/spec/{rubyspec → corelib}/language/versions/block_1.9.rb +0 -0
  169. data/spec/{rubyspec → corelib}/language/versions/break_1.9.rb +0 -0
  170. data/spec/{rubyspec → corelib}/language/versions/case_1.9.rb +0 -0
  171. data/spec/{rubyspec → corelib}/language/versions/hash_1.9.rb +0 -0
  172. data/spec/{rubyspec → corelib}/language/versions/literal_lambda_1.9.rb +0 -0
  173. data/spec/{rubyspec → corelib}/language/versions/not_1.9.rb +0 -0
  174. data/spec/{rubyspec → corelib}/language/versions/send_1.9.rb +0 -0
  175. data/spec/{rubyspec → corelib}/language/versions/symbol_1.9.rb +0 -0
  176. data/spec/{rubyspec → corelib}/language/versions/variables_1.9.rb +1 -1
  177. data/spec/corelib/module/alias_method_spec.rb +28 -0
  178. data/spec/{opal → corelib}/module/ancestors_spec.rb +0 -0
  179. data/spec/{opal → corelib}/module/append_features_spec.rb +0 -0
  180. data/spec/corelib/module/attr_accessor_spec.rb +26 -0
  181. data/spec/{rubyspec/core → corelib}/module/const_defined_spec.rb +1 -2
  182. data/spec/{rubyspec/core → corelib}/module/const_get_spec.rb +1 -2
  183. data/spec/{rubyspec/core → corelib}/module/const_missing_spec.rb +1 -2
  184. data/spec/{rubyspec/core → corelib}/module/const_set_spec.rb +1 -2
  185. data/spec/{opal → corelib}/module/constants_spec.rb +0 -0
  186. data/spec/{rubyspec/core → corelib}/module/fixtures/classes.rb +0 -0
  187. data/spec/{rubyspec/core → corelib}/module/method_defined_spec.rb +0 -1
  188. data/spec/{opal → corelib}/module/module_function_spec.rb +0 -2
  189. data/spec/corelib/module/name_spec.rb +52 -0
  190. data/spec/{rubyspec/core → corelib}/module/public_method_defined_spec.rb +0 -1
  191. data/spec/{rubyspec/core → corelib}/module/remove_const_spec.rb +0 -1
  192. data/spec/{rubyspec/core → corelib}/module/undef_method_spec.rb +0 -1
  193. data/spec/{opal → corelib}/native/alias_native_spec.rb +7 -0
  194. data/spec/{opal → corelib}/native/each_spec.rb +2 -5
  195. data/spec/{opal → corelib}/native/element_reference_spec.rb +0 -0
  196. data/spec/{rubyspec/core/hash/to_native_spec.rb → corelib/native/ext_spec.rb} +0 -0
  197. data/spec/corelib/native/initialize_spec.rb +17 -0
  198. data/spec/{opal → corelib}/native/method_missing_spec.rb +0 -0
  199. data/spec/corelib/native/new_spec.rb +6 -0
  200. data/spec/{rubyspec/core → corelib}/numeric/abs_spec.rb +0 -0
  201. data/spec/{rubyspec/core → corelib}/numeric/bit_and_spec.rb +0 -0
  202. data/spec/{rubyspec/core → corelib}/numeric/bit_or_spec.rb +0 -0
  203. data/spec/{rubyspec/core → corelib}/numeric/bit_xor_spec.rb +0 -0
  204. data/spec/{rubyspec/core → corelib}/numeric/ceil_spec.rb +0 -0
  205. data/spec/{rubyspec/core → corelib}/numeric/chr_spec.rb +0 -0
  206. data/spec/{rubyspec/core → corelib}/numeric/comparison_spec.rb +0 -0
  207. data/spec/{rubyspec/core → corelib}/numeric/complement_spec.rb +0 -0
  208. data/spec/{rubyspec/core → corelib}/numeric/divide_spec.rb +0 -0
  209. data/spec/{rubyspec/core → corelib}/numeric/downto_spec.rb +0 -0
  210. data/spec/{rubyspec/core → corelib}/numeric/eql_spec.rb +0 -0
  211. data/spec/{rubyspec/core → corelib}/numeric/equal_value_spec.rb +0 -0
  212. data/spec/{rubyspec/core → corelib}/numeric/even_spec.rb +0 -0
  213. data/spec/{rubyspec/core → corelib}/numeric/exponent_spec.rb +0 -0
  214. data/spec/{rubyspec/core → corelib}/numeric/floor_spec.rb +0 -0
  215. data/spec/{rubyspec/core → corelib}/numeric/gt_spec.rb +0 -0
  216. data/spec/{rubyspec/core → corelib}/numeric/gte_spec.rb +0 -0
  217. data/spec/{rubyspec/core → corelib}/numeric/integer_spec.rb +0 -0
  218. data/spec/{rubyspec/core → corelib}/numeric/left_shift_spec.rb +0 -0
  219. data/spec/{rubyspec/core → corelib}/numeric/lt_spec.rb +0 -0
  220. data/spec/{rubyspec/core → corelib}/numeric/lte_spec.rb +0 -0
  221. data/spec/{rubyspec/core → corelib}/numeric/magnitude_spec.rb +0 -0
  222. data/spec/{rubyspec/core → corelib}/numeric/minus_spec.rb +0 -0
  223. data/spec/{rubyspec/core → corelib}/numeric/modulo_spec.rb +0 -0
  224. data/spec/{rubyspec/core → corelib}/numeric/multiply_spec.rb +0 -0
  225. data/spec/{rubyspec/core → corelib}/numeric/next_spec.rb +0 -0
  226. data/spec/{rubyspec/core → corelib}/numeric/odd_spec.rb +0 -0
  227. data/spec/{rubyspec/core → corelib}/numeric/ord_spec.rb +0 -0
  228. data/spec/{rubyspec/core → corelib}/numeric/plus_spec.rb +0 -0
  229. data/spec/{rubyspec/core → corelib}/numeric/pred_spec.rb +0 -0
  230. data/spec/{rubyspec/core → corelib}/numeric/right_shift_spec.rb +0 -0
  231. data/spec/{rubyspec/core → corelib}/numeric/step_spec.rb +0 -3
  232. data/spec/{rubyspec/core → corelib}/numeric/succ_spec.rb +0 -0
  233. data/spec/{rubyspec/core → corelib}/numeric/times_spec.rb +0 -0
  234. data/spec/{rubyspec/core → corelib}/numeric/to_f_spec.rb +0 -0
  235. data/spec/{rubyspec/core → corelib}/numeric/to_i_spec.rb +0 -0
  236. data/spec/{rubyspec/core → corelib}/numeric/to_json_spec.rb +0 -0
  237. data/spec/corelib/numeric/to_s_spec.rb +26 -0
  238. data/spec/{rubyspec/core → corelib}/numeric/uminus_spec.rb +0 -0
  239. data/spec/{rubyspec/core → corelib}/numeric/upto_spec.rb +0 -0
  240. data/spec/{rubyspec/core → corelib}/numeric/zero_spec.rb +0 -0
  241. data/spec/{rubyspec/core → corelib}/proc/call_spec.rb +0 -0
  242. data/spec/{rubyspec/core → corelib}/proc/element_reference_spec.rb +0 -0
  243. data/spec/{opal → corelib}/proc/proc_tricks_spec.rb +0 -0
  244. data/spec/corelib/runtime/begin_spec.rb +39 -0
  245. data/spec/{opal → corelib}/runtime/block_send_spec.rb +0 -0
  246. data/spec/{opal/language → corelib/runtime}/block_spec.rb +10 -0
  247. data/spec/corelib/runtime/bridged_classes_spec.rb +64 -0
  248. data/spec/{opal → corelib/runtime}/constants_spec.rb +0 -0
  249. data/spec/{opal → corelib}/runtime/eval_spec.rb +0 -0
  250. data/spec/{opal → corelib}/runtime/main_methods_spec.rb +0 -0
  251. data/spec/{opal → corelib/runtime}/method_missing_spec.rb +0 -0
  252. data/spec/corelib/runtime/method_spec.rb +31 -0
  253. data/spec/corelib/runtime/paren_spec.rb +14 -0
  254. data/spec/{opal/language → corelib/runtime}/rescue_spec.rb +11 -0
  255. data/spec/{opal/language → corelib/runtime}/return_spec.rb +0 -0
  256. data/spec/{opal → corelib}/runtime/send_spec.rb +0 -0
  257. data/spec/{opal/language → corelib/runtime}/singleton_class_spec.rb +0 -0
  258. data/spec/{opal/language → corelib/runtime}/super_spec.rb +113 -0
  259. data/spec/{opal/language → corelib/runtime}/variables_spec.rb +0 -0
  260. data/spec/{opal → corelib}/source_map_spec.rb +3 -3
  261. data/spec/{rubyspec/core → corelib}/string/chop_spec.rb +0 -0
  262. data/spec/{rubyspec/core → corelib}/string/chr_spec.rb +0 -0
  263. data/spec/{rubyspec/core → corelib}/string/clone_spec.rb +0 -0
  264. data/spec/{rubyspec/core → corelib}/string/comparison_spec.rb +0 -0
  265. data/spec/{rubyspec/core → corelib}/string/dup_spec.rb +0 -0
  266. data/spec/{rubyspec/core → corelib}/string/element_reference_spec.rb +0 -1
  267. data/spec/{rubyspec/core → corelib}/string/fixtures/classes.rb +0 -0
  268. data/spec/{rubyspec/core → corelib}/string/format_spec.rb +0 -0
  269. data/spec/{opal → corelib}/string/freeze_spec.rb +0 -0
  270. data/spec/{rubyspec/core → corelib}/string/gsub_spec.rb +0 -0
  271. data/spec/{rubyspec/core → corelib}/string/lines_spec.rb +0 -0
  272. data/spec/{rubyspec/core → corelib}/string/ljust_spec.rb +0 -1
  273. data/spec/{rubyspec/core → corelib}/string/lstrip_spec.rb +0 -0
  274. data/spec/{rubyspec/core → corelib}/string/match_spec.rb +0 -0
  275. data/spec/{rubyspec/core → corelib}/string/next_spec.rb +0 -0
  276. data/spec/{rubyspec/core → corelib}/string/ord_spec.rb +0 -0
  277. data/spec/{rubyspec/core → corelib}/string/partition_spec.rb +0 -0
  278. data/spec/{rubyspec/core → corelib}/string/rindex_spec.rb +0 -0
  279. data/spec/{rubyspec/core → corelib}/string/rjust_spec.rb +0 -1
  280. data/spec/{rubyspec/core → corelib}/string/rstrip_spec.rb +0 -0
  281. data/spec/{rubyspec/core → corelib}/string/scan_spec.rb +0 -0
  282. data/spec/{rubyspec/core → corelib}/string/slice_spec.rb +1 -2
  283. data/spec/{rubyspec/core → corelib}/string/split_spec.rb +0 -0
  284. data/spec/{rubyspec/core → corelib}/string/strip_spec.rb +0 -0
  285. data/spec/{rubyspec/core → corelib}/string/sub_spec.rb +0 -0
  286. data/spec/{rubyspec/core → corelib}/string/succ_spec.rb +0 -0
  287. data/spec/{rubyspec/core → corelib}/string/sum_spec.rb +0 -0
  288. data/spec/{rubyspec/core → corelib}/string/to_f_spec.rb +0 -0
  289. data/spec/{rubyspec/core → corelib}/string/to_i_spec.rb +0 -0
  290. data/spec/{rubyspec/core → corelib}/string/tr_s_spec.rb +0 -0
  291. data/spec/{rubyspec/core → corelib}/string/tr_spec.rb +0 -0
  292. data/spec/filters/bugs/array.rb +236 -4
  293. data/spec/filters/bugs/basic_object.rb +4 -0
  294. data/spec/filters/bugs/class.rb +4 -0
  295. data/spec/filters/bugs/enumerable.rb +58 -0
  296. data/spec/filters/bugs/enumerator.rb +6 -0
  297. data/spec/filters/bugs/hash.rb +146 -0
  298. data/spec/filters/bugs/kernel.rb +10 -0
  299. data/spec/filters/bugs/language.rb +366 -0
  300. data/spec/filters/bugs/module.rb +14 -0
  301. data/spec/filters/bugs/regexp.rb +7 -0
  302. data/spec/filters/bugs/set.rb +7 -0
  303. data/spec/filters/bugs/{singleton/instance.rb → singleton.rb} +3 -1
  304. data/spec/filters/bugs/string.rb +37 -0
  305. data/spec/filters/bugs/stringscanner.rb +18 -0
  306. data/spec/filters/bugs/struct.rb +11 -0
  307. data/spec/filters/bugs/symbol.rb +5 -0
  308. data/spec/filters/bugs/time.rb +28 -0
  309. data/spec/filters/bugs/unknown.rb +11 -0
  310. data/spec/filters/unsupported/array_subclasses.rb +32 -0
  311. data/spec/filters/unsupported/encoding.rb +14 -0
  312. data/spec/filters/unsupported/float.rb +4 -0
  313. data/spec/filters/unsupported/frozen.rb +57 -0
  314. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  315. data/spec/filters/unsupported/immutable_strings.rb +6 -0
  316. data/spec/filters/unsupported/mutable_strings.rb +49 -0
  317. data/spec/filters/unsupported/private_methods.rb +26 -0
  318. data/spec/filters/{mspec → unsupported}/ruby_exe.rb +0 -0
  319. data/spec/filters/unsupported/string_subclasses.rb +8 -0
  320. data/spec/filters/unsupported/tainted.rb +46 -0
  321. data/spec/filters/unsupported/time.rb +21 -0
  322. data/spec/filters/unsupported/trusted.rb +26 -0
  323. data/spec/opal/{parser → compiler}/irb_spec.rb +9 -9
  324. data/spec/{parser → opal/parser}/alias_spec.rb +0 -0
  325. data/spec/{parser → opal/parser}/and_spec.rb +0 -0
  326. data/spec/{parser → opal/parser}/array_spec.rb +0 -0
  327. data/spec/{parser → opal/parser}/attrasgn_spec.rb +0 -0
  328. data/spec/{parser → opal/parser}/begin_spec.rb +0 -0
  329. data/spec/{parser → opal/parser}/block_spec.rb +0 -0
  330. data/spec/{parser → opal/parser}/break_spec.rb +0 -0
  331. data/spec/{parser → opal/parser}/call_spec.rb +33 -8
  332. data/spec/{parser → opal/parser}/class_spec.rb +0 -0
  333. data/spec/{parser → opal/parser}/const_spec.rb +0 -0
  334. data/spec/{parser → opal/parser}/cvar_spec.rb +0 -0
  335. data/spec/{parser → opal/parser}/def_spec.rb +17 -17
  336. data/spec/{parser → opal/parser}/false_spec.rb +0 -0
  337. data/spec/{parser → opal/parser}/file_spec.rb +0 -0
  338. data/spec/{parser → opal/parser}/gvar_spec.rb +0 -0
  339. data/spec/{parser → opal/parser}/hash_spec.rb +0 -0
  340. data/spec/opal/parser/heredoc_spec.rb +30 -0
  341. data/spec/{parser → opal/parser}/iasgn_spec.rb +0 -0
  342. data/spec/{parser → opal/parser}/if_spec.rb +0 -0
  343. data/spec/{parser → opal/parser}/int_spec.rb +0 -0
  344. data/spec/opal/parser/iter_spec.rb +59 -0
  345. data/spec/{parser → opal/parser}/ivar_spec.rb +0 -0
  346. data/spec/opal/parser/lambda_spec.rb +64 -0
  347. data/spec/{parser → opal/parser}/lasgn_spec.rb +0 -0
  348. data/spec/{parser → opal/parser}/line_spec.rb +0 -0
  349. data/spec/{parser → opal/parser}/lvar_spec.rb +6 -6
  350. data/spec/{parser → opal/parser}/masgn_spec.rb +0 -0
  351. data/spec/{parser → opal/parser}/module_spec.rb +0 -0
  352. data/spec/{parser → opal/parser}/nil_spec.rb +0 -0
  353. data/spec/{parser → opal/parser}/not_spec.rb +0 -0
  354. data/spec/{parser → opal/parser}/nth_ref_spec.rb +0 -0
  355. data/spec/{parser → opal/parser}/op_asgn1_spec.rb +0 -0
  356. data/spec/{parser → opal/parser}/op_asgn2_spec.rb +0 -0
  357. data/spec/{parser → opal/parser}/or_spec.rb +0 -0
  358. data/spec/{parser → opal/parser}/parse_spec.rb +17 -17
  359. data/spec/{parser → opal/parser}/regexp_spec.rb +0 -0
  360. data/spec/{parser → opal/parser}/return_spec.rb +0 -0
  361. data/spec/{parser → opal/parser}/sclass_spec.rb +0 -0
  362. data/spec/{parser → opal/parser}/self_spec.rb +0 -0
  363. data/spec/{parser → opal/parser}/str_spec.rb +1 -12
  364. data/spec/{parser → opal/parser}/string_spec.rb +0 -0
  365. data/spec/opal/parser/super_spec.rb +20 -0
  366. data/spec/{parser → opal/parser}/true_spec.rb +0 -0
  367. data/spec/{parser → opal/parser}/undef_spec.rb +0 -0
  368. data/spec/{parser → opal/parser}/unless_spec.rb +0 -0
  369. data/spec/{parser → opal/parser}/while_spec.rb +0 -0
  370. data/spec/{parser → opal/parser}/xstr_spec.rb +2 -2
  371. data/spec/{parser → opal/parser}/yield_spec.rb +0 -0
  372. data/spec/ospec/main.rb.erb +1 -13
  373. data/spec/ospec/mspec_fixes.rb +87 -0
  374. data/spec/ospec/runner.rb +188 -0
  375. data/spec/rubyspecs +351 -0
  376. data/spec/spec_helper.rb +8 -198
  377. data/spec/{opal → stdlib}/erb/erb_spec.rb +3 -3
  378. data/spec/{opal → stdlib}/erb/inline_block.opalerb +0 -0
  379. data/spec/{opal → stdlib}/erb/quoted.opalerb +0 -0
  380. data/spec/{opal → stdlib}/erb/simple.opalerb +0 -0
  381. data/spec/stdlib/json/ext_spec.rb +48 -0
  382. data/spec/{opal → stdlib}/json/parse_spec.rb +0 -0
  383. data/spec/stdlib/template/paths_spec.rb +10 -0
  384. data/stdlib/delegate.rb +29 -0
  385. data/stdlib/dir.rb +5 -0
  386. data/stdlib/file.rb +7 -0
  387. data/stdlib/json.rb +82 -27
  388. data/stdlib/opal-parser.rb +46 -0
  389. data/stdlib/opal-source-maps.js.erb +1 -1
  390. data/stdlib/pathname.rb +31 -0
  391. data/stdlib/{racc.rb → racc/parser.rb} +0 -0
  392. data/stdlib/securerandom.rb +12 -0
  393. data/stdlib/set.rb +89 -0
  394. data/stdlib/stringio.rb +12 -4
  395. data/stdlib/strscan.rb +19 -0
  396. data/stdlib/template.rb +4 -0
  397. data/stdlib/thread.rb +20 -0
  398. data/tasks/mspec.rake +147 -0
  399. metadata +650 -1266
  400. data/lib/opal/core_ext.rb +0 -5
  401. data/lib/opal/grammar.rb +0 -5137
  402. data/lib/opal/grammar_helpers.rb +0 -364
  403. data/lib/opal/require_parser.rb +0 -77
  404. data/spec/filters/bugs/alias.rb +0 -6
  405. data/spec/filters/bugs/ancestors.rb +0 -4
  406. data/spec/filters/bugs/array/combination.rb +0 -11
  407. data/spec/filters/bugs/array/count.rb +0 -3
  408. data/spec/filters/bugs/array/delete_if.rb +0 -3
  409. data/spec/filters/bugs/array/drop.rb +0 -3
  410. data/spec/filters/bugs/array/drop_while.rb +0 -5
  411. data/spec/filters/bugs/array/eql.rb +0 -3
  412. data/spec/filters/bugs/array/flatten.rb +0 -9
  413. data/spec/filters/bugs/array/minus.rb +0 -5
  414. data/spec/filters/bugs/array/multipliy.rb +0 -9
  415. data/spec/filters/bugs/array/new.rb +0 -3
  416. data/spec/filters/bugs/array/pop.rb +0 -6
  417. data/spec/filters/bugs/array/rassoc.rb +0 -4
  418. data/spec/filters/bugs/array/rindex.rb +0 -6
  419. data/spec/filters/bugs/array/select.rb +0 -3
  420. data/spec/filters/bugs/array/shift.rb +0 -7
  421. data/spec/filters/bugs/array/shuffle.rb +0 -11
  422. data/spec/filters/bugs/array/slice.rb +0 -7
  423. data/spec/filters/bugs/array/take.rb +0 -3
  424. data/spec/filters/bugs/array/to_a.rb +0 -3
  425. data/spec/filters/bugs/array/try_convert.rb +0 -7
  426. data/spec/filters/bugs/array/uniq.rb +0 -10
  427. data/spec/filters/bugs/array/zip.rb +0 -4
  428. data/spec/filters/bugs/array_delete.rb +0 -4
  429. data/spec/filters/bugs/array_fetch.rb +0 -3
  430. data/spec/filters/bugs/array_first.rb +0 -3
  431. data/spec/filters/bugs/array_flatten.rb +0 -14
  432. data/spec/filters/bugs/array_intersection.rb +0 -5
  433. data/spec/filters/bugs/array_join.rb +0 -6
  434. data/spec/filters/bugs/break.rb +0 -10
  435. data/spec/filters/bugs/case.rb +0 -4
  436. data/spec/filters/bugs/coerce_integer.rb +0 -9
  437. data/spec/filters/bugs/enumerable_sort_by.rb +0 -3
  438. data/spec/filters/bugs/kernel/instance_variables.rb +0 -3
  439. data/spec/filters/bugs/kernel/rand.rb +0 -4
  440. data/spec/filters/bugs/language/array.rb +0 -3
  441. data/spec/filters/bugs/language/block.rb +0 -6
  442. data/spec/filters/bugs/language/break.rb +0 -3
  443. data/spec/filters/bugs/language/class.rb +0 -12
  444. data/spec/filters/bugs/language/class_variables.rb +0 -12
  445. data/spec/filters/bugs/language/def.rb +0 -27
  446. data/spec/filters/bugs/language/defined.rb +0 -3
  447. data/spec/filters/bugs/language/ensure.rb +0 -4
  448. data/spec/filters/bugs/language/execution.rb +0 -4
  449. data/spec/filters/bugs/language/for.rb +0 -18
  450. data/spec/filters/bugs/language/if.rb +0 -13
  451. data/spec/filters/bugs/language/loop.rb +0 -4
  452. data/spec/filters/bugs/language/metaclass.rb +0 -14
  453. data/spec/filters/bugs/language/module.rb +0 -6
  454. data/spec/filters/bugs/language/next.rb +0 -3
  455. data/spec/filters/bugs/language/or.rb +0 -3
  456. data/spec/filters/bugs/language/order.rb +0 -4
  457. data/spec/filters/bugs/language/precedence.rb +0 -10
  458. data/spec/filters/bugs/language/proc.rb +0 -24
  459. data/spec/filters/bugs/language/redo.rb +0 -5
  460. data/spec/filters/bugs/language/rescue.rb +0 -9
  461. data/spec/filters/bugs/language/retry.rb +0 -5
  462. data/spec/filters/bugs/language/send.rb +0 -10
  463. data/spec/filters/bugs/language/super.rb +0 -9
  464. data/spec/filters/bugs/language/until.rb +0 -8
  465. data/spec/filters/bugs/language/variables.rb +0 -37
  466. data/spec/filters/bugs/language/while.rb +0 -6
  467. data/spec/filters/bugs/language/yield.rb +0 -5
  468. data/spec/filters/bugs/module/class_variables.rb +0 -6
  469. data/spec/filters/bugs/module/method_defined.rb +0 -6
  470. data/spec/filters/bugs/public_methods.rb +0 -4
  471. data/spec/filters/bugs/return.rb +0 -7
  472. data/spec/filters/bugs/source_map.rb +0 -3
  473. data/spec/filters/bugs/string/center.rb +0 -4
  474. data/spec/filters/bugs/string/lines.rb +0 -3
  475. data/spec/filters/mspec/mocks.rb +0 -3
  476. data/spec/filters/mspec/should_receive.rb +0 -5
  477. data/spec/filters/parser/block_args.rb +0 -51
  478. data/spec/mspec/guards/block_device.rb +0 -0
  479. data/spec/mspec/guards/endian.rb +0 -0
  480. data/spec/mspec/helpers/environment.rb +0 -0
  481. data/spec/mspec/helpers/language_version.rb +0 -0
  482. data/spec/mspec/helpers/tmp.rb +0 -0
  483. data/spec/opal/array/element_reference_spec.rb +0 -206
  484. data/spec/opal/array/equal_value_spec.rb +0 -19
  485. data/spec/opal/array/fill_spec.rb +0 -26
  486. data/spec/opal/array/reduce_spec.rb +0 -31
  487. data/spec/opal/array/to_json_spec.rb +0 -9
  488. data/spec/opal/basic_object/send_spec.rb +0 -28
  489. data/spec/opal/boolean/singleton_class_spec.rb +0 -9
  490. data/spec/opal/boolean/to_json_spec.rb +0 -11
  491. data/spec/opal/browser/local_storage_spec.rb +0 -55
  492. data/spec/opal/class/constants_spec.rb +0 -7
  493. data/spec/opal/class/extend_spec.rb +0 -47
  494. data/spec/opal/class/instance_methods_spec.rb +0 -13
  495. data/spec/opal/class/last_value_spec.rb +0 -67
  496. data/spec/opal/class/proc_methods_spec.rb +0 -23
  497. data/spec/opal/class/singleton_methods_spec.rb +0 -41
  498. data/spec/opal/hash/allocate_spec.rb +0 -16
  499. data/spec/opal/hash/new_spec.rb +0 -10
  500. data/spec/opal/hash/to_s_spec.rb +0 -9
  501. data/spec/opal/kernel/to_json_spec.rb +0 -7
  502. data/spec/opal/module/alias_method_spec.rb +0 -10
  503. data/spec/opal/module/attr_accessor_spec.rb +0 -8
  504. data/spec/opal/native/new_spec.rb +0 -19
  505. data/spec/opal/native/nil_spec.rb +0 -14
  506. data/spec/opal/nil/to_json_spec.rb +0 -7
  507. data/spec/opal/numeric/equal_spec.rb +0 -9
  508. data/spec/opal/runtime2/call_spec.rb +0 -16
  509. data/spec/opal/runtime2/class_hierarchy_spec.rb +0 -21
  510. data/spec/opal/runtime2/defined_spec.rb +0 -11
  511. data/spec/opal/runtime2/super_spec.rb +0 -16
  512. data/spec/opal/string/to_json_spec.rb +0 -8
  513. data/spec/parser/iter_spec.rb +0 -59
  514. data/spec/parser/lambda_spec.rb +0 -64
  515. data/spec/parser/parser_spec.rb +0 -41
  516. data/spec/parser/strscan/check_spec.rb +0 -13
  517. data/spec/parser/strscan/get_byte_spec.rb +0 -29
  518. data/spec/parser/strscan/scan_spec.rb +0 -33
  519. data/spec/parser/strscan/skip_spec.rb +0 -40
  520. data/spec/parser/super_spec.rb +0 -20
  521. data/spec/rubyspec/core/array/allocate_spec.rb +0 -19
  522. data/spec/rubyspec/core/array/append_spec.rb +0 -43
  523. data/spec/rubyspec/core/array/array_spec.rb +0 -7
  524. data/spec/rubyspec/core/array/assoc_spec.rb +0 -40
  525. data/spec/rubyspec/core/array/at_spec.rb +0 -56
  526. data/spec/rubyspec/core/array/choice_spec.rb +0 -20
  527. data/spec/rubyspec/core/array/clear_spec.rb +0 -61
  528. data/spec/rubyspec/core/array/clone_spec.rb +0 -15
  529. data/spec/rubyspec/core/array/collect_spec.rb +0 -53
  530. data/spec/rubyspec/core/array/combination_spec.rb +0 -55
  531. data/spec/rubyspec/core/array/compact_spec.rb +0 -111
  532. data/spec/rubyspec/core/array/comparison_spec.rb +0 -16
  533. data/spec/rubyspec/core/array/concat_spec.rb +0 -19
  534. data/spec/rubyspec/core/array/constructor_spec.rb +0 -24
  535. data/spec/rubyspec/core/array/count_spec.rb +0 -17
  536. data/spec/rubyspec/core/array/delete_at_spec.rb +0 -71
  537. data/spec/rubyspec/core/array/delete_if_spec.rb +0 -71
  538. data/spec/rubyspec/core/array/delete_spec.rb +0 -104
  539. data/spec/rubyspec/core/array/drop_spec.rb +0 -29
  540. data/spec/rubyspec/core/array/drop_while_spec.rb +0 -17
  541. data/spec/rubyspec/core/array/dup_spec.rb +0 -15
  542. data/spec/rubyspec/core/array/each_index_spec.rb +0 -40
  543. data/spec/rubyspec/core/array/each_spec.rb +0 -30
  544. data/spec/rubyspec/core/array/empty_spec.rb +0 -10
  545. data/spec/rubyspec/core/array/eql_spec.rb +0 -14
  546. data/spec/rubyspec/core/array/fetch_spec.rb +0 -52
  547. data/spec/rubyspec/core/array/find_index_spec.rb +0 -8
  548. data/spec/rubyspec/core/array/first_spec.rb +0 -89
  549. data/spec/rubyspec/core/array/fixtures/classes.rb +0 -538
  550. data/spec/rubyspec/core/array/flatten_spec.rb +0 -232
  551. data/spec/rubyspec/core/array/frozen_spec.rb +0 -32
  552. data/spec/rubyspec/core/array/include_spec.rb +0 -33
  553. data/spec/rubyspec/core/array/index_spec.rb +0 -6
  554. data/spec/rubyspec/core/array/insert_spec.rb +0 -90
  555. data/spec/rubyspec/core/array/inspect_spec.rb +0 -7
  556. data/spec/rubyspec/core/array/intersection_spec.rb +0 -78
  557. data/spec/rubyspec/core/array/join_spec.rb +0 -34
  558. data/spec/rubyspec/core/array/keep_if_spec.rb +0 -12
  559. data/spec/rubyspec/core/array/last_spec.rb +0 -88
  560. data/spec/rubyspec/core/array/length_spec.rb +0 -7
  561. data/spec/rubyspec/core/array/map_spec.rb +0 -11
  562. data/spec/rubyspec/core/array/max_spec.rb +0 -32
  563. data/spec/rubyspec/core/array/min_spec.rb +0 -32
  564. data/spec/rubyspec/core/array/minus_spec.rb +0 -89
  565. data/spec/rubyspec/core/array/multiply_spec.rb +0 -143
  566. data/spec/rubyspec/core/array/new_spec.rb +0 -137
  567. data/spec/rubyspec/core/array/ntimes_spec.rb +0 -26
  568. data/spec/rubyspec/core/array/plus_spec.rb +0 -64
  569. data/spec/rubyspec/core/array/pop_spec.rb +0 -196
  570. data/spec/rubyspec/core/array/push_spec.rb +0 -44
  571. data/spec/rubyspec/core/array/rassoc_spec.rb +0 -38
  572. data/spec/rubyspec/core/array/reject_spec.rb +0 -134
  573. data/spec/rubyspec/core/array/replace_spec.rb +0 -7
  574. data/spec/rubyspec/core/array/reverse_each_spec.rb +0 -37
  575. data/spec/rubyspec/core/array/reverse_spec.rb +0 -58
  576. data/spec/rubyspec/core/array/rindex_spec.rb +0 -71
  577. data/spec/rubyspec/core/array/select_spec.rb +0 -36
  578. data/spec/rubyspec/core/array/shared/collect.rb +0 -7
  579. data/spec/rubyspec/core/array/shared/enumeratorize.rb +0 -12
  580. data/spec/rubyspec/core/array/shared/eql.rb +0 -95
  581. data/spec/rubyspec/core/array/shared/index.rb +0 -37
  582. data/spec/rubyspec/core/array/shared/inspect.rb +0 -3
  583. data/spec/rubyspec/core/array/shared/join.rb +0 -7
  584. data/spec/rubyspec/core/array/shared/keep_if.rb +0 -3
  585. data/spec/rubyspec/core/array/shared/length.rb +0 -3
  586. data/spec/rubyspec/core/array/shared/replace.rb +0 -3
  587. data/spec/rubyspec/core/array/shared/slice.rb +0 -3
  588. data/spec/rubyspec/core/array/shift_spec.rb +0 -160
  589. data/spec/rubyspec/core/array/shuffle_spec.rb +0 -87
  590. data/spec/rubyspec/core/array/size_spec.rb +0 -7
  591. data/spec/rubyspec/core/array/slice_spec.rb +0 -166
  592. data/spec/rubyspec/core/array/sort_spec.rb +0 -271
  593. data/spec/rubyspec/core/array/take_spec.rb +0 -29
  594. data/spec/rubyspec/core/array/take_while_spec.rb +0 -17
  595. data/spec/rubyspec/core/array/to_a_spec.rb +0 -24
  596. data/spec/rubyspec/core/array/to_ary_spec.rb +0 -20
  597. data/spec/rubyspec/core/array/try_convert_spec.rb +0 -52
  598. data/spec/rubyspec/core/array/uniq_spec.rb +0 -167
  599. data/spec/rubyspec/core/array/unshift_spec.rb +0 -64
  600. data/spec/rubyspec/core/array/zip_spec.rb +0 -55
  601. data/spec/rubyspec/core/class/fixtures/classes.rb +0 -9
  602. data/spec/rubyspec/core/class/new_spec.rb +0 -113
  603. data/spec/rubyspec/core/enumerable/all_spec.rb +0 -130
  604. data/spec/rubyspec/core/enumerable/any_spec.rb +0 -150
  605. data/spec/rubyspec/core/enumerable/collect_spec.rb +0 -39
  606. data/spec/rubyspec/core/enumerable/count_spec.rb +0 -45
  607. data/spec/rubyspec/core/enumerable/detect_spec.rb +0 -48
  608. data/spec/rubyspec/core/enumerable/drop_spec.rb +0 -20
  609. data/spec/rubyspec/core/enumerable/drop_while_spec.rb +0 -18
  610. data/spec/rubyspec/core/enumerable/each_slice_spec.rb +0 -25
  611. data/spec/rubyspec/core/enumerable/each_with_index_spec.rb +0 -14
  612. data/spec/rubyspec/core/enumerable/each_with_object_spec.rb +0 -20
  613. data/spec/rubyspec/core/enumerable/entries_spec.rb +0 -9
  614. data/spec/rubyspec/core/enumerable/find_all_spec.rb +0 -16
  615. data/spec/rubyspec/core/enumerable/find_index_spec.rb +0 -44
  616. data/spec/rubyspec/core/enumerable/find_spec.rb +0 -56
  617. data/spec/rubyspec/core/enumerable/first_spec.rb +0 -43
  618. data/spec/rubyspec/core/enumerable/fixtures/classes.rb +0 -240
  619. data/spec/rubyspec/core/enumerable/grep_spec.rb +0 -24
  620. data/spec/rubyspec/core/enumerable/group_by_spec.rb +0 -16
  621. data/spec/rubyspec/core/enumerable/none_spec.rb +0 -68
  622. data/spec/rubyspec/core/enumerable/select_spec.rb +0 -16
  623. data/spec/rubyspec/core/enumerable/sort_by_spec.rb +0 -31
  624. data/spec/rubyspec/core/enumerable/take_spec.rb +0 -43
  625. data/spec/rubyspec/core/enumerable/to_a_spec.rb +0 -9
  626. data/spec/rubyspec/core/enumerator/each_spec.rb +0 -11
  627. data/spec/rubyspec/core/enumerator/new_spec.rb +0 -17
  628. data/spec/rubyspec/core/enumerator/next_spec.rb +0 -25
  629. data/spec/rubyspec/core/enumerator/rewind_spec.rb +0 -28
  630. data/spec/rubyspec/core/false/and_spec.rb +0 -11
  631. data/spec/rubyspec/core/false/inspect_spec.rb +0 -7
  632. data/spec/rubyspec/core/false/or_spec.rb +0 -11
  633. data/spec/rubyspec/core/false/to_s_spec.rb +0 -7
  634. data/spec/rubyspec/core/false/xor_spec.rb +0 -11
  635. data/spec/rubyspec/core/hash/allocate_spec.rb +0 -13
  636. data/spec/rubyspec/core/hash/assoc_spec.rb +0 -25
  637. data/spec/rubyspec/core/hash/clear_spec.rb +0 -19
  638. data/spec/rubyspec/core/hash/clone_spec.rb +0 -10
  639. data/spec/rubyspec/core/hash/constructor_spec.rb +0 -13
  640. data/spec/rubyspec/core/hash/default_proc_spec.rb +0 -20
  641. data/spec/rubyspec/core/hash/default_spec.rb +0 -17
  642. data/spec/rubyspec/core/hash/delete_if_spec.rb +0 -13
  643. data/spec/rubyspec/core/hash/delete_spec.rb +0 -11
  644. data/spec/rubyspec/core/hash/dup_spec.rb +0 -10
  645. data/spec/rubyspec/core/hash/each_key_spec.rb +0 -15
  646. data/spec/rubyspec/core/hash/each_pair_spec.rb +0 -30
  647. data/spec/rubyspec/core/hash/each_spec.rb +0 -36
  648. data/spec/rubyspec/core/hash/each_value_spec.rb +0 -15
  649. data/spec/rubyspec/core/hash/element_reference_spec.rb +0 -41
  650. data/spec/rubyspec/core/hash/element_set_spec.rb +0 -7
  651. data/spec/rubyspec/core/hash/empty_spec.rb +0 -10
  652. data/spec/rubyspec/core/hash/fetch_spec.rb +0 -24
  653. data/spec/rubyspec/core/hash/flatten_spec.rb +0 -46
  654. data/spec/rubyspec/core/hash/has_key_spec.rb +0 -24
  655. data/spec/rubyspec/core/hash/has_value_spec.rb +0 -12
  656. data/spec/rubyspec/core/hash/include_spec.rb +0 -24
  657. data/spec/rubyspec/core/hash/index_spec.rb +0 -13
  658. data/spec/rubyspec/core/hash/indexes_spec.rb +0 -9
  659. data/spec/rubyspec/core/hash/indices_spec.rb +0 -9
  660. data/spec/rubyspec/core/hash/invert_spec.rb +0 -12
  661. data/spec/rubyspec/core/hash/keep_if_spec.rb +0 -18
  662. data/spec/rubyspec/core/hash/key_spec.rb +0 -24
  663. data/spec/rubyspec/core/hash/keys_spec.rb +0 -10
  664. data/spec/rubyspec/core/hash/length_spec.rb +0 -10
  665. data/spec/rubyspec/core/hash/member_spec.rb +0 -24
  666. data/spec/rubyspec/core/hash/merge_spec.rb +0 -37
  667. data/spec/rubyspec/core/hash/new_spec.rb +0 -19
  668. data/spec/rubyspec/core/hash/rassoc_spec.rb +0 -34
  669. data/spec/rubyspec/core/hash/reject_spec.rb +0 -18
  670. data/spec/rubyspec/core/hash/replace_spec.rb +0 -7
  671. data/spec/rubyspec/core/hash/select_spec.rb +0 -52
  672. data/spec/rubyspec/core/hash/shift_spec.rb +0 -19
  673. data/spec/rubyspec/core/hash/size_spec.rb +0 -10
  674. data/spec/rubyspec/core/hash/to_a_spec.rb +0 -13
  675. data/spec/rubyspec/core/hash/to_json_spec.rb +0 -11
  676. data/spec/rubyspec/core/hash/update_spec.rb +0 -17
  677. data/spec/rubyspec/core/hash/value_spec.rb +0 -12
  678. data/spec/rubyspec/core/hash/values_at_spec.rb +0 -9
  679. data/spec/rubyspec/core/hash/values_spec.rb +0 -7
  680. data/spec/rubyspec/core/kernel/eql_spec.rb +0 -15
  681. data/spec/rubyspec/core/kernel/equal_spec.rb +0 -12
  682. data/spec/rubyspec/core/kernel/tap_spec.rb +0 -10
  683. data/spec/rubyspec/core/kernel/to_s_spec.rb +0 -5
  684. data/spec/rubyspec/core/matchdata/to_a_spec.rb +0 -5
  685. data/spec/rubyspec/core/nil/and_spec.rb +0 -11
  686. data/spec/rubyspec/core/nil/dup_spec.rb +0 -7
  687. data/spec/rubyspec/core/nil/inspect_spec.rb +0 -7
  688. data/spec/rubyspec/core/nil/nil_spec.rb +0 -7
  689. data/spec/rubyspec/core/nil/or_spec.rb +0 -11
  690. data/spec/rubyspec/core/nil/to_a_spec.rb +0 -7
  691. data/spec/rubyspec/core/nil/to_f_spec.rb +0 -11
  692. data/spec/rubyspec/core/nil/to_h_spec.rb +0 -10
  693. data/spec/rubyspec/core/nil/to_i_spec.rb +0 -11
  694. data/spec/rubyspec/core/nil/to_s_spec.rb +0 -7
  695. data/spec/rubyspec/core/nil/xor_spec.rb +0 -11
  696. data/spec/rubyspec/core/numeric/to_s_spec.rb +0 -8
  697. data/spec/rubyspec/core/range/begin_spec.rb +0 -9
  698. data/spec/rubyspec/core/range/case_compare_spec.rb +0 -15
  699. data/spec/rubyspec/core/range/end_spec.rb +0 -9
  700. data/spec/rubyspec/core/regexp/match_spec.rb +0 -95
  701. data/spec/rubyspec/core/string/capitalize_spec.rb +0 -10
  702. data/spec/rubyspec/core/string/casecmp_spec.rb +0 -16
  703. data/spec/rubyspec/core/string/center_spec.rb +0 -49
  704. data/spec/rubyspec/core/string/chomp_spec.rb +0 -48
  705. data/spec/rubyspec/core/string/downcase_spec.rb +0 -6
  706. data/spec/rubyspec/core/string/empty_spec.rb +0 -7
  707. data/spec/rubyspec/core/string/end_with_spec.rb +0 -16
  708. data/spec/rubyspec/core/string/include_spec.rb +0 -6
  709. data/spec/rubyspec/core/string/index_spec.rb +0 -405
  710. data/spec/rubyspec/core/string/intern_spec.rb +0 -9
  711. data/spec/rubyspec/core/string/length_spec.rb +0 -9
  712. data/spec/rubyspec/core/string/reverse_spec.rb +0 -7
  713. data/spec/rubyspec/core/string/size_spec.rb +0 -9
  714. data/spec/rubyspec/core/string/start_with_spec.rb +0 -12
  715. data/spec/rubyspec/core/string/swapcase_spec.rb +0 -13
  716. data/spec/rubyspec/core/string/to_a_spec.rb +0 -9
  717. data/spec/rubyspec/core/string/to_s_spec.rb +0 -6
  718. data/spec/rubyspec/core/string/to_str_spec.rb +0 -6
  719. data/spec/rubyspec/core/string/to_sym_spec.rb +0 -9
  720. data/spec/rubyspec/core/string/upcase_spec.rb +0 -6
  721. data/spec/rubyspec/core/struct/fixtures/classes.rb +0 -26
  722. data/spec/rubyspec/core/struct/initialize_spec.rb +0 -11
  723. data/spec/rubyspec/core/struct/new_spec.rb +0 -24
  724. data/spec/rubyspec/core/symbol/to_proc_spec.rb +0 -12
  725. data/spec/rubyspec/core/time/at_spec.rb +0 -7
  726. data/spec/rubyspec/core/time/day_spec.rb +0 -5
  727. data/spec/rubyspec/core/time/friday_spec.rb +0 -9
  728. data/spec/rubyspec/core/time/hour_spec.rb +0 -5
  729. data/spec/rubyspec/core/time/min_spec.rb +0 -5
  730. data/spec/rubyspec/core/time/monday_spec.rb +0 -9
  731. data/spec/rubyspec/core/time/month_spec.rb +0 -5
  732. data/spec/rubyspec/core/time/now_spec.rb +0 -5
  733. data/spec/rubyspec/core/time/saturday_spec.rb +0 -9
  734. data/spec/rubyspec/core/true/and_spec.rb +0 -11
  735. data/spec/rubyspec/core/true/inspect_spec.rb +0 -7
  736. data/spec/rubyspec/core/true/or_spec.rb +0 -11
  737. data/spec/rubyspec/core/true/to_s_spec.rb +0 -7
  738. data/spec/rubyspec/core/true/xor_spec.rb +0 -11
  739. data/spec/rubyspec/language/alias_spec.rb +0 -160
  740. data/spec/rubyspec/language/and_spec.rb +0 -66
  741. data/spec/rubyspec/language/array_spec.rb +0 -117
  742. data/spec/rubyspec/language/break_spec.rb +0 -332
  743. data/spec/rubyspec/language/case_spec.rb +0 -310
  744. data/spec/rubyspec/language/class_spec.rb +0 -190
  745. data/spec/rubyspec/language/class_variable_spec.rb +0 -56
  746. data/spec/rubyspec/language/def_spec.rb +0 -551
  747. data/spec/rubyspec/language/defined_spec.rb +0 -107
  748. data/spec/rubyspec/language/ensure_spec.rb +0 -104
  749. data/spec/rubyspec/language/execution_spec.rb +0 -15
  750. data/spec/rubyspec/language/for_spec.rb +0 -192
  751. data/spec/rubyspec/language/hash_spec.rb +0 -65
  752. data/spec/rubyspec/language/if_spec.rb +0 -356
  753. data/spec/rubyspec/language/literal_lambda_spec.rb +0 -1
  754. data/spec/rubyspec/language/loop_spec.rb +0 -67
  755. data/spec/rubyspec/language/metaclass_spec.rb +0 -159
  756. data/spec/rubyspec/language/module_spec.rb +0 -56
  757. data/spec/rubyspec/language/next_spec.rb +0 -469
  758. data/spec/rubyspec/language/not_spec.rb +0 -55
  759. data/spec/rubyspec/language/or_spec.rb +0 -90
  760. data/spec/rubyspec/language/order_spec.rb +0 -77
  761. data/spec/rubyspec/language/precedence_spec.rb +0 -483
  762. data/spec/rubyspec/language/redo_spec.rb +0 -65
  763. data/spec/rubyspec/language/rescue_spec.rb +0 -121
  764. data/spec/rubyspec/language/retry_spec.rb +0 -56
  765. data/spec/rubyspec/language/return_spec.rb +0 -281
  766. data/spec/rubyspec/language/singleton_class_spec.rb +0 -32
  767. data/spec/rubyspec/language/super_spec.rb +0 -284
  768. data/spec/rubyspec/language/undef_spec.rb +0 -16
  769. data/spec/rubyspec/language/unless_spec.rb +0 -45
  770. data/spec/rubyspec/language/until_spec.rb +0 -234
  771. data/spec/rubyspec/language/while_spec.rb +0 -238
  772. data/spec/rubyspec/language/yield_spec.rb +0 -128
  773. data/spec/rubyspec/library/date/new_spec.rb +0 -10
  774. data/spec/rubyspec/library/date/to_s_spec.rb +0 -7
  775. data/spec/rubyspec/library/date/today_spec.rb +0 -7
  776. data/spec/rubyspec/library/erb/util/html_escape_spec.rb +0 -10
  777. data/spec/rubyspec/library/observer/add_observer_spec.rb +0 -31
  778. data/spec/rubyspec/library/observer/count_observers_spec.rb +0 -33
  779. data/spec/rubyspec/library/observer/delete_observer_spec.rb +0 -19
  780. data/spec/rubyspec/library/observer/delete_observers_spec.rb +0 -19
  781. data/spec/rubyspec/library/observer/fixtures/classes.rb +0 -25
  782. data/spec/rubyspec/library/observer/notify_observers_spec.rb +0 -31
  783. data/spec/rubyspec/library/rbconfig/config_spec.rb +0 -47
  784. data/spec/rubyspec/library/singleton/clone_spec.rb +0 -8
  785. data/spec/rubyspec/library/singleton/dup_spec.rb +0 -8
  786. data/spec/rubyspec/library/singleton/fixtures/classes.rb +0 -18
  787. data/spec/rubyspec/library/singleton/instance_spec.rb +0 -30
  788. data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +0 -29
  789. data/spec/rubyspec/library/stringscanner/pos_spec.rb +0 -20
  790. data/spec/rubyspec/spec_helper.rb +0 -96
  791. data/stdlib/fileutils.rb +0 -0
  792. data/stdlib/iconv.rb +0 -0
  793. data/stdlib/opal-browser/local_storage.rb +0 -27
  794. data/stdlib/opal-browser/script_loader.rb +0 -35
  795. data/stdlib/opal-parser.js.erb +0 -13
  796. data/stdlib/yaml.rb +0 -0
@@ -13,13 +13,17 @@ require 'enumerator'
13
13
  require 'array'
14
14
  require 'hash'
15
15
  require 'string'
16
+ require 'match_data'
17
+ require 'encoding'
16
18
  require 'numeric'
17
19
  require 'proc'
20
+ require 'method'
18
21
  require 'range'
19
22
  require 'time'
20
23
  require 'struct'
21
24
  require 'native'
22
25
  require 'io'
26
+ require 'main'
23
27
 
24
28
  # regexp matches
25
29
  $& = $~ = $` = $' = nil
@@ -31,32 +35,9 @@ $: = []
31
35
  $/ = "\n"
32
36
  $, = " "
33
37
 
34
- # native global
35
- $$ = $global = Native(`Opal.global`)
36
-
37
38
  ARGV = []
38
39
  ARGF = Object.new
39
40
  ENV = {}
40
- TRUE = true
41
- FALSE = false
42
- NIL = nil
43
-
44
- STDERR = $stderr = IO.new
45
- STDIN = $stdin = IO.new
46
- STDOUT = $stdout = IO.new
47
-
48
- def $stdout.puts(*strs)
49
- %x{
50
- for (var i = 0; i < strs.length; i++) {
51
- if(strs[i] instanceof Array) {
52
- #{ puts(*`strs[i]`) }
53
- } else {
54
- $opal.puts(#{ `strs[i]`.to_s });
55
- }
56
- }
57
- }
58
- nil
59
- end
60
41
 
61
42
  RUBY_PLATFORM = 'opal'
62
43
  RUBY_ENGINE = 'opal'
@@ -64,10 +45,44 @@ RUBY_VERSION = '1.9.3'
64
45
  RUBY_ENGINE_VERSION = '0.4.4'
65
46
  RUBY_RELEASE_DATE = '2013-08-13'
66
47
 
67
- def self.to_s
68
- 'main'
69
- end
48
+ module Opal
49
+ def self.coerce_to(object, type, method)
50
+ return object if type === object
51
+
52
+ unless object.respond_to? method
53
+ raise TypeError, "no implicit conversion of #{object.class} into #{type}"
54
+ end
70
55
 
71
- def self.include(mod)
72
- Object.include mod
56
+ object.__send__ method
57
+ end
58
+
59
+ def self.truthy?(value)
60
+ if value
61
+ true
62
+ else
63
+ false
64
+ end
65
+ end
66
+
67
+ def self.falsy?(value)
68
+ if value
69
+ false
70
+ else
71
+ true
72
+ end
73
+ end
74
+
75
+ def self.destructure(args)
76
+ %x{
77
+ if (args.length == 1) {
78
+ return args[0];
79
+ }
80
+ else if (args._isArray) {
81
+ return args;
82
+ }
83
+ else {
84
+ return $slice.call(args);
85
+ }
86
+ }
87
+ end
73
88
  end
@@ -1,16 +1,29 @@
1
1
  class Proc
2
2
  `def._isProc = true`
3
- `def.is_lambda = true`
3
+ `def.is_lambda = false`
4
4
 
5
5
  def self.new(&block)
6
- `if (block === nil) { throw new Error("no block given"); }`
7
- `block.is_lambda = false`
6
+ unless block
7
+ raise ArgumentError, "tried to create a Proc object without a block"
8
+ end
9
+
8
10
  block
9
11
  end
10
12
 
11
- def call(*args)
13
+ def call(*args, &block)
12
14
  %x{
13
- var result = #{self}.apply(null, #{args});
15
+ if (block !== nil) {
16
+ self._p = block;
17
+ }
18
+
19
+ var result;
20
+
21
+ if (self.is_lambda) {
22
+ result = self.apply(null, args);
23
+ }
24
+ else {
25
+ result = Opal.$yieldX(self, args);
26
+ }
14
27
 
15
28
  if (result === $breaker) {
16
29
  return $breaker.$v;
@@ -29,16 +42,15 @@ class Proc
29
42
  def lambda?
30
43
  # This method should tell the user if the proc tricks are unavailable,
31
44
  # (see Proc#lambda? on ruby docs to find out more).
32
- `!!#{self}.is_lambda`
45
+ `!!self.is_lambda`
33
46
  end
34
47
 
48
+ # FIXME: this should support the various splats and optional arguments
35
49
  def arity
36
- `#{self}.length - 1`
50
+ `self.length`
37
51
  end
38
52
 
39
53
  def to_n
40
54
  self
41
55
  end
42
56
  end
43
-
44
- class Method < Proc; end
@@ -4,22 +4,21 @@ class Range
4
4
  %x{
5
5
  Range._proto._isRange = true;
6
6
 
7
- Opal.range = function(beg, end, exc) {
7
+ Opal.range = function(first, last, exc) {
8
8
  var range = new Range._alloc;
9
- range.begin = beg;
10
- range.end = end;
9
+ range.begin = first;
10
+ range.end = last;
11
11
  range.exclude = exc;
12
12
 
13
13
  return range;
14
14
  };
15
15
  }
16
16
 
17
- attr_reader :begin
18
- attr_reader :end
17
+ attr_reader :begin, :end
19
18
 
20
- def initialize(min, max, exclude = false)
21
- @begin = min
22
- @end = max
19
+ def initialize(first, last, exclude = false)
20
+ @begin = first
21
+ @end = last
23
22
  @exclude = exclude
24
23
  end
25
24
 
@@ -29,33 +28,36 @@ class Range
29
28
  return false;
30
29
  }
31
30
 
32
- return #{self}.exclude === other.exclude && #{self}.begin == other.begin && #{self}.end == other.end;
31
+ return self.exclude === other.exclude &&
32
+ self.begin == other.begin &&
33
+ self.end == other.end;
33
34
  }
34
35
  end
35
36
 
36
37
  # FIXME: currently hardcoded to assume range holds numerics
37
38
  def ===(obj)
38
- `return obj >= #{self}.begin && (#{self}.exclude ? obj < #{self}.end : obj <= #{self}.end)`
39
+ include?(obj)
39
40
  end
40
41
 
41
42
  def cover?(value)
42
- `#{self}.begin` <= value && value <= (exclude_end? ? `#{self}.end` - 1 : `#{self}.end`)
43
+ @begin <= value && (@exclude ? value < @end : value <= @end)
43
44
  end
44
45
 
45
- def last
46
- self.end
47
- end
46
+ alias last end
48
47
 
49
48
  def each(&block)
50
- current = min
49
+ return enum_for :each unless block_given?
50
+
51
+ current = @begin
52
+ last = @end
51
53
 
52
- while current != max
54
+ while current < last
53
55
  yield current
54
56
 
55
57
  current = current.succ
56
58
  end
57
59
 
58
- yield current unless exclude_end?
60
+ yield current if !@exclude && current == last
59
61
 
60
62
  self
61
63
  end
@@ -63,21 +65,38 @@ class Range
63
65
  def eql?(other)
64
66
  return false unless Range === other
65
67
 
66
- exclude_end? == other.exclude_end? && `#{self}.begin`.eql?(other.begin) && `#{self}.end`.eql?(other.end)
68
+ @exclude === other.exclude_end? &&
69
+ @begin.eql?(other.begin) &&
70
+ @end.eql?(other.end)
67
71
  end
68
72
 
69
73
  def exclude_end?
70
- `#{self}.exclude`
74
+ @exclude
71
75
  end
72
76
 
77
+ alias first begin
78
+
73
79
  # FIXME: currently hardcoded to assume range holds numerics
74
80
  def include?(obj)
75
- `return obj >= #{self}.begin && obj <= #{self}.end`
81
+ cover?(obj)
76
82
  end
77
83
 
78
- alias max end
84
+ # FIXME: currently hardcoded to assume range holds numerics
85
+ def max
86
+ if block_given?
87
+ super
88
+ else
89
+ `#@exclude ? #@end - 1 : #@end`
90
+ end
91
+ end
79
92
 
80
- alias min begin
93
+ def min
94
+ if block_given?
95
+ super
96
+ else
97
+ @begin
98
+ end
99
+ end
81
100
 
82
101
  alias member? include?
83
102
 
@@ -86,7 +105,7 @@ class Range
86
105
  end
87
106
 
88
107
  def to_s
89
- `#{self}.begin + (#{self}.exclude ? '...' : '..') + #{self}.end`
108
+ `#{@begin.inspect} + (#@exclude ? '...' : '..') + #{@end.inspect}`
90
109
  end
91
110
 
92
111
  alias inspect to_s
@@ -5,21 +5,48 @@ class Regexp
5
5
  `string.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\^\\$\\|]/g, '\\\\$&')`
6
6
  end
7
7
 
8
+ def self.union(*parts)
9
+ `new RegExp(parts.join(''))`
10
+ end
11
+
8
12
  def self.new(regexp, options = undefined)
9
- `options? new RegExp(regexp, options) : new RegExp(regexp)`
13
+ `new RegExp(regexp, options)`
10
14
  end
11
15
 
12
16
  def ==(other)
13
- `other.constructor == RegExp && #{self}.toString() === other.toString()`
17
+ `other.constructor == RegExp && self.toString() === other.toString()`
14
18
  end
15
19
 
16
20
  def ===(str)
17
- `#{self}.test(str)`
21
+ if `str._isString == null` && str.respond_to?(:to_str)
22
+ str = str.to_str
23
+ end
24
+
25
+ if `str._isString == null`
26
+ return false
27
+ end
28
+
29
+ `self.test(str)`
18
30
  end
19
31
 
20
32
  def =~(string)
33
+ if `string === nil`
34
+ $~ = $` = $' = nil
35
+
36
+ return
37
+ end
38
+
39
+ if `string._isString == null`
40
+ unless string.respond_to? :to_str
41
+ raise TypeError, "no implicit conversion of #{string.class} into String"
42
+ end
43
+
44
+ string = string.to_str
45
+ end
46
+
21
47
  %x{
22
- var re = #{self};
48
+ var re = self;
49
+
23
50
  if (re.global) {
24
51
  // should we clear it afterwards too?
25
52
  re.lastIndex = 0;
@@ -45,18 +72,33 @@ class Regexp
45
72
  alias eql? ==
46
73
 
47
74
  def inspect
48
- `#{self}.toString()`
75
+ `self.toString()`
49
76
  end
50
77
 
51
78
  def match(string, pos = undefined)
79
+ if `string === nil`
80
+ $~ = $` = $' = nil
81
+
82
+ return
83
+ end
84
+
85
+ if `string._isString == null`
86
+ unless string.respond_to? :to_str
87
+ raise TypeError, "no implicit conversion of #{string.class} into String"
88
+ end
89
+
90
+ string = string.to_str
91
+ end
92
+
52
93
  %x{
53
- var re = #{self};
94
+ var re = self;
95
+
54
96
  if (re.global) {
55
97
  // should we clear it afterwards too?
56
98
  re.lastIndex = 0;
57
99
  }
58
100
  else {
59
- re = new RegExp(re.source, 'g' + (#{self}.multiline ? 'm' : '') + (#{self}.ignoreCase ? 'i' : ''));
101
+ re = new RegExp(re.source, 'g' + (re.multiline ? 'm' : '') + (re.ignoreCase ? 'i' : ''));
60
102
  }
61
103
 
62
104
  var result = re.exec(string);
@@ -71,12 +113,12 @@ class Regexp
71
113
  end
72
114
 
73
115
  def source
74
- `#{self}.source`
116
+ `self.source`
75
117
  end
76
118
 
77
119
  alias to_s source
78
120
 
79
121
  def to_n
80
- `#{self}.valueOf()`
122
+ `self.valueOf()`
81
123
  end
82
124
  end
@@ -2,21 +2,36 @@
2
2
  // The Opal object that is exposed globally
3
3
  var Opal = this.Opal = {};
4
4
 
5
- // Very root class
5
+ // The actual class for BasicObject
6
+ var RubyBasicObject;
7
+
8
+ // The actual Object class
9
+ var RubyObject;
10
+
11
+ // The actual Module class
12
+ var RubyModule;
13
+
14
+ // The actual Class class
15
+ var RubyClass;
16
+
17
+ // Constructor for instances of BasicObject
6
18
  function BasicObject(){}
7
19
 
8
- // Core Object class
20
+ // Constructor for instances of Object
9
21
  function Object(){}
10
22
 
11
- // Class' class
23
+ // Constructor for instances of Class
12
24
  function Class(){}
13
25
 
14
- // Module's class
26
+ // Constructor for instances of Module
15
27
  function Module(){}
16
28
 
17
- // the class of nil
29
+ // Constructor for instances of NilClass (nil)
18
30
  function NilClass(){}
19
31
 
32
+ // All bridged classes - keep track to donate methods from Object
33
+ var bridged_classes = [];
34
+
20
35
  // TopScope is used for inheriting constants from the top scope
21
36
  var TopScope = function(){};
22
37
 
@@ -26,6 +41,8 @@
26
41
  // To inherit scopes
27
42
  Opal.constructor = TopScope;
28
43
 
44
+ Opal.constants = [];
45
+
29
46
  // This is a useful reference to global object inside ruby files
30
47
  Opal.global = this;
31
48
 
@@ -57,44 +74,94 @@
57
74
  var const_scope = const_alloc.prototype = new base.constructor();
58
75
  klass._scope = const_scope;
59
76
  const_scope.base = klass;
77
+ klass._base_module = base.base;
60
78
  const_scope.constructor = const_alloc;
79
+ const_scope.constants = [];
61
80
 
62
81
  if (id) {
82
+ klass._orig_scope = base;
63
83
  base[id] = base.constructor[id] = klass;
84
+ base.constants.push(id);
64
85
  }
65
86
  }
66
87
 
88
+ Opal.create_scope = create_scope;
89
+
90
+ /*
91
+ * A `class Foo; end` expression in ruby is compiled to call this runtime
92
+ * method which either returns an existing class of the given name, or creates
93
+ * a new class in the given `base` scope.
94
+ *
95
+ * If a constant with the given name exists, then we check to make sure that
96
+ * it is a class and also that the superclasses match. If either of these
97
+ * fail, then we raise a `TypeError`. Note, superklass may be null if one was
98
+ * not specified in the ruby code.
99
+ *
100
+ * We pass a constructor to this method of the form `function ClassName() {}`
101
+ * simply so that classes show up with nicely formatted names inside debuggers
102
+ * in the web browser (or node/sprockets).
103
+ *
104
+ * The `base` is the current `self` value where the class is being created
105
+ * from. We use this to get the scope for where the class should be created.
106
+ * If `base` is an object (not a class/module), we simple get its class and
107
+ * use that as the base instead.
108
+ *
109
+ * @param [Object] base where the class is being created
110
+ * @param [Class] superklass superclass of the new class (may be null)
111
+ * @param [String] id the name of the class to be created
112
+ * @param [Function] constructor function to use as constructor
113
+ * @return [Class] new or existing ruby class
114
+ */
67
115
  Opal.klass = function(base, superklass, id, constructor) {
68
- var klass;
69
116
 
117
+ // If base is an object, use its class
70
118
  if (!base._isClass) {
71
119
  base = base._klass;
72
120
  }
73
121
 
122
+ // Not specifying a superclass means we can assume it to be Object
74
123
  if (superklass === null) {
75
- superklass = ObjectClass;
124
+ superklass = RubyObject;
76
125
  }
77
126
 
78
- if ($hasOwn.call(base._scope, id)) {
79
- klass = base._scope[id];
127
+ var klass = base._scope[id];
128
+
129
+ // If a constant exists in the scope, then we must use that
130
+ if ($hasOwn.call(base._scope, id) && klass._orig_scope === base._scope) {
80
131
 
132
+ // Make sure the existing constant is a class, or raise error
81
133
  if (!klass._isClass) {
82
134
  throw Opal.TypeError.$new(id + " is not a class");
83
135
  }
84
136
 
85
- if (superklass !== klass._super && superklass !== ObjectClass) {
137
+ // Make sure existing class has same superclass
138
+ if (superklass !== klass._super && superklass !== RubyObject) {
86
139
  throw Opal.TypeError.$new("superclass mismatch for class " + id);
87
140
  }
88
141
  }
142
+ else if (typeof(superklass) === 'function') {
143
+ // passed native constructor as superklass, so bridge it as ruby class
144
+ return bridge_class(id, superklass);
145
+ }
89
146
  else {
147
+ // if class doesnt exist, create a new one with given superclass
90
148
  klass = boot_class(superklass, constructor);
91
149
 
92
- klass._name = (base === ObjectClass ? id : base._name + '::' + id);
150
+ // name class using base (e.g. Foo or Foo::Baz)
151
+ klass._name = id;
93
152
 
94
- create_scope(base._scope, klass);
153
+ // every class gets its own constant scope, inherited from current scope
154
+ create_scope(base._scope, klass, id);
95
155
 
156
+ // Name new class directly onto current scope (Opal.Foo.Baz = klass)
96
157
  base[id] = base._scope[id] = klass;
97
158
 
159
+ // Copy all parent constants to child, unless parent is Object
160
+ if (superklass !== RubyObject && superklass !== RubyBasicObject) {
161
+ Opal.donate_constants(superklass, klass);
162
+ }
163
+
164
+ // call .inherited() hook with new class on the superclass
98
165
  if (superklass.$inherited) {
99
166
  superklass.$inherited(klass);
100
167
  }
@@ -103,34 +170,99 @@
103
170
  return klass;
104
171
  };
105
172
 
173
+ // Create generic class with given superclass.
174
+ var boot_class = Opal.boot = function(superklass, constructor) {
175
+ // instances
176
+ var ctor = function() {};
177
+ ctor.prototype = superklass._proto;
178
+
179
+ constructor.prototype = new ctor();
180
+
181
+ constructor.prototype.constructor = constructor;
182
+
183
+ return boot_class_meta(superklass, constructor);
184
+ };
185
+
186
+ // class itself
187
+ function boot_class_meta(superklass, constructor) {
188
+ var mtor = function() {};
189
+ mtor.prototype = superklass.constructor.prototype;
190
+
191
+ function OpalClass() {};
192
+ OpalClass.prototype = new mtor();
193
+
194
+ var klass = new OpalClass();
195
+
196
+ klass._id = unique_id++;
197
+ klass._alloc = constructor;
198
+ klass._isClass = true;
199
+ klass.constructor = OpalClass;
200
+ klass._super = superklass;
201
+ klass._methods = [];
202
+ klass.__inc__ = [];
203
+ klass.__parent = superklass;
204
+ klass._proto = constructor.prototype;
205
+
206
+ constructor.prototype._klass = klass;
207
+
208
+ return klass;
209
+ }
210
+
106
211
  // Define new module (or return existing module)
107
- Opal.module = function(base, id, constructor) {
108
- var klass;
212
+ Opal.module = function(base, id) {
213
+ var module;
109
214
 
110
215
  if (!base._isClass) {
111
216
  base = base._klass;
112
217
  }
113
218
 
114
219
  if ($hasOwn.call(base._scope, id)) {
115
- klass = base._scope[id];
220
+ module = base._scope[id];
116
221
 
117
- if (!klass._mod$ && klass !== ObjectClass) {
222
+ if (!module.__mod__ && module !== RubyObject) {
118
223
  throw Opal.TypeError.$new(id + " is not a module")
119
224
  }
120
225
  }
121
226
  else {
122
- klass = boot_class(ClassClass, constructor);
123
- klass._name = (base === ObjectClass ? id : base._name + '::' + id);
124
- klass._mod$ = true;
227
+ module = boot_module()
228
+ module._name = id;
125
229
 
126
- klass._included_in = [];
230
+ create_scope(base._scope, module, id);
127
231
 
128
- create_scope(base._scope, klass, id);
232
+ // Name new module directly onto current scope (Opal.Foo.Baz = module)
233
+ base[id] = base._scope[id] = module;
129
234
  }
130
235
 
131
- return klass;
236
+ return module;
132
237
  };
133
238
 
239
+ /*
240
+ * Internal function to create a new module instance. This simply sets up
241
+ * the prototype hierarchy and method tables.
242
+ */
243
+ function boot_module() {
244
+ var mtor = function() {};
245
+ mtor.prototype = RubyModule.constructor.prototype;
246
+
247
+ function OpalModule() {};
248
+ OpalModule.prototype = new mtor();
249
+
250
+ var module = new OpalModule();
251
+
252
+ module._id = unique_id++;
253
+ module._isClass = true;
254
+ module.constructor = OpalModule;
255
+ module._super = RubyModule;
256
+ module._methods = [];
257
+ module.__inc__ = [];
258
+ module.__parent = RubyModule;
259
+ module._proto = {};
260
+ module.__mod__ = true;
261
+ module.__dep__ = [];
262
+
263
+ return module;
264
+ }
265
+
134
266
  // Boot a base class (makes instances).
135
267
  var boot_defclass = function(id, constructor, superklass) {
136
268
  if (superklass) {
@@ -140,106 +272,170 @@
140
272
  constructor.prototype = new ctor();
141
273
  }
142
274
 
143
- var prototype = constructor.prototype;
144
-
145
- prototype.constructor = constructor;
275
+ constructor.prototype.constructor = constructor;
146
276
 
147
277
  return constructor;
148
278
  };
149
279
 
150
280
  // Boot the actual (meta?) classes of core classes
151
- var boot_makemeta = function(id, klass, superklass) {
152
- function RubyClass() {
153
- this._id = unique_id++;
154
- };
281
+ var boot_makemeta = function(id, constructor, superklass) {
155
282
 
156
- var ctor = function() {};
157
- ctor.prototype = superklass.prototype;
283
+ var mtor = function() {};
284
+ mtor.prototype = superklass.prototype;
158
285
 
159
- RubyClass.prototype = new ctor();
286
+ function OpalClass() {};
287
+ OpalClass.prototype = new mtor();
160
288
 
161
- var prototype = RubyClass.prototype;
162
- prototype._alloc = klass;
163
- prototype._isClass = true;
164
- prototype._name = id;
165
- prototype._super = superklass;
166
- prototype.constructor = RubyClass;
167
- prototype._methods = [];
289
+ var klass = new OpalClass();
168
290
 
169
- var result = new RubyClass();
170
- klass.prototype._klass = result;
171
- result._proto = klass.prototype;
291
+ klass._id = unique_id++;
292
+ klass._alloc = constructor;
293
+ klass._isClass = true;
294
+ klass._name = id;
295
+ klass._super = superklass;
296
+ klass.constructor = OpalClass;
297
+ klass._methods = [];
298
+ klass.__inc__ = [];
299
+ klass.__parent = superklass;
300
+ klass._proto = constructor.prototype;
172
301
 
173
- Opal[id] = result;
302
+ constructor.prototype._klass = klass;
174
303
 
175
- return result;
176
- };
304
+ Opal[id] = klass;
305
+ Opal.constants.push(id);
177
306
 
178
- // Create generic class with given superclass.
179
- var boot_class = Opal.boot = function(superklass, constructor) {
180
- // instances
181
- var ctor = function() {};
182
- ctor.prototype = superklass._proto;
307
+ return klass;
308
+ };
183
309
 
184
- constructor.prototype = new ctor();
185
- var prototype = constructor.prototype;
310
+ /*
311
+ * For performance, some core ruby classes are toll-free bridged to their
312
+ * native javascript counterparts (e.g. a ruby Array is a javascript Array).
313
+ *
314
+ * This method is used to setup a native constructor (e.g. Array), to have
315
+ * its prototype act like a normal ruby class. Firstly, a new ruby class is
316
+ * created using the native constructor so that its prototype is set as the
317
+ * target for th new class. Note: all bridged classes are set to inherit
318
+ * from Object.
319
+ *
320
+ * Bridged classes are tracked in `bridged_classes` array so that methods
321
+ * defined on Object can be "donated" to all bridged classes. This allows
322
+ * us to fake the inheritance of a native prototype from our Object
323
+ * prototype.
324
+ *
325
+ * Example:
326
+ *
327
+ * bridge_class("Proc", Function);
328
+ *
329
+ * @param [String] name the name of the ruby class to create
330
+ * @param [Function] constructor native javascript constructor to use
331
+ * @return [Class] returns new ruby class
332
+ */
333
+ function bridge_class(name, constructor) {
334
+ var klass = boot_class_meta(RubyObject, constructor);
186
335
 
187
- prototype.constructor = constructor;
336
+ klass._name = name;
188
337
 
189
- // class itself
190
- function OpalClass() {
191
- this._id = unique_id++;
192
- };
338
+ create_scope(Opal, klass, name);
339
+ bridged_classes.push(klass);
193
340
 
194
- var mtor = function() {};
195
- mtor.prototype = superklass.constructor.prototype;
341
+ var object_methods = RubyBasicObject._methods.concat(RubyObject._methods);
196
342
 
197
- OpalClass.prototype = new mtor();
343
+ for (var i = 0, len = object_methods.length; i < len; i++) {
344
+ var meth = object_methods[i];
345
+ constructor.prototype[meth] = RubyObject._proto[meth];
346
+ }
198
347
 
199
- prototype = OpalClass.prototype;
200
- prototype._alloc = constructor;
201
- prototype._isClass = true;
202
- prototype.constructor = OpalClass;
203
- prototype._super = superklass;
204
- prototype._methods = [];
348
+ return klass;
349
+ };
205
350
 
206
- var result = new OpalClass();
207
- constructor.prototype._klass = result;
351
+ /*
352
+ * constant assign
353
+ */
354
+ Opal.casgn = function(base_module, name, value) {
355
+ var scope = base_module._scope;
208
356
 
209
- result._proto = constructor.prototype;
357
+ if (value._isClass && value._name === nil) {
358
+ value._name = name;
359
+ }
210
360
 
211
- return result;
361
+ if (value._isClass) {
362
+ value._base_module = base_module;
363
+ }
212
364
 
213
- return constructor;
365
+ scope.constants.push(name);
366
+ return scope[name] = value;
214
367
  };
215
368
 
216
- var bridge_class = function(name, constructor) {
217
- var klass = boot_class(ObjectClass, constructor);
218
- var i, length, m;
219
-
220
- constructor.prototype.constructor = constructor;
221
-
222
- constructor._super = Object;
223
- constructor.constructor = Class;
224
- constructor._methods = [];
369
+ /*
370
+ * constant decl
371
+ */
372
+ Opal.cdecl = function(base_scope, name, value) {
373
+ base_scope.constants.push(name);
374
+ return base_scope[name] = value;
375
+ };
225
376
 
226
- bridged_classes.push(klass);
377
+ /*
378
+ * constant get
379
+ */
380
+ Opal.cget = function(base_scope, path) {
381
+ if (path == null) {
382
+ path = base_scope;
383
+ base_scope = Opal.Object;
384
+ }
227
385
 
228
- var table = ObjectClass._proto, methods = ObjectClass._methods;
386
+ var result = base_scope;
229
387
 
230
- for (i = 0, length = methods.length; i < length; i++) {
231
- m = methods[i];
232
- constructor.prototype[m] = table[m];
388
+ path = path.split('::');
389
+ while (path.length != 0) {
390
+ result = result.$const_get(path.shift());
233
391
  }
234
392
 
235
- klass._name = name;
236
- create_scope(Opal, klass, name);
393
+ return result;
394
+ }
237
395
 
238
- return klass;
396
+ /*
397
+ * When a source module is included into the target module, we must also copy
398
+ * its constants to the target.
399
+ */
400
+ Opal.donate_constants = function(source_mod, target_mod) {
401
+ var source_constants = source_mod._scope.constants,
402
+ target_scope = target_mod._scope,
403
+ target_constants = target_scope.constants;
404
+
405
+ for (var i = 0, length = source_constants.length; i < length; i++) {
406
+ target_constants.push(source_constants[i]);
407
+ target_scope[source_constants[i]] = source_mod._scope[source_constants[i]];
408
+ }
239
409
  };
240
410
 
241
- Opal.puts = function(a) { console.log(a); };
242
-
411
+ /*
412
+ * Methods stubs are used to facilitate method_missing in opal. A stub is a
413
+ * placeholder function which just calls `method_missing` on the receiver.
414
+ * If no method with the given name is actually defined on an object, then it
415
+ * is obvious to say that the stub will be called instead, and then in turn
416
+ * method_missing will be called.
417
+ *
418
+ * When a file in ruby gets compiled to javascript, it includes a call to
419
+ * this function which adds stubs for every method name in the compiled file.
420
+ * It should then be safe to assume that method_missing will work for any
421
+ * method call detected.
422
+ *
423
+ * Method stubs are added to the BasicObject prototype, which every other
424
+ * ruby object inherits, so all objects should handle method missing. A stub
425
+ * is only added if the given property name (method name) is not already
426
+ * defined.
427
+ *
428
+ * Note: all ruby methods have a `$` prefix in javascript, so all stubs will
429
+ * have this prefix as well (to make this method more performant).
430
+ *
431
+ * Opal.add_stubs(["$foo", "$bar", "$baz="]);
432
+ *
433
+ * All stub functions will have a private `rb_stub` property set to true so
434
+ * that other internal methods can detect if a method is just a stub or not.
435
+ * `Kernel#respond_to?` uses this property to detect a methods presence.
436
+ *
437
+ * @param [Array] stubs an array of method stubs to add
438
+ */
243
439
  Opal.add_stubs = function(stubs) {
244
440
  for (var i = 0, length = stubs.length; i < length; i++) {
245
441
  var stub = stubs[i];
@@ -251,11 +447,22 @@
251
447
  }
252
448
  };
253
449
 
450
+ /*
451
+ * Actuall add a method_missing stub function to the given prototype for the
452
+ * given name.
453
+ *
454
+ * @param [Prototype] prototype the target prototype
455
+ * @param [String] stub stub name to add (e.g. "$foo")
456
+ */
254
457
  function add_stub_for(prototype, stub) {
255
458
  function method_missing_stub() {
459
+ // Copy any given block onto the method_missing dispatcher
256
460
  this.$method_missing._p = method_missing_stub._p;
461
+
462
+ // Set block property to null ready for the next call (stop false-positives)
257
463
  method_missing_stub._p = null;
258
464
 
465
+ // call method missing with correct args (remove '$' prefix on method name)
259
466
  return this.$method_missing.apply(this, [stub.slice(1)].concat($slice.call(arguments)));
260
467
  }
261
468
 
@@ -263,6 +470,7 @@
263
470
  prototype[stub] = method_missing_stub;
264
471
  }
265
472
 
473
+ // Expose for other parts of Opal to use
266
474
  Opal.add_stub_for = add_stub_for;
267
475
 
268
476
  // Const missing dispatcher
@@ -272,29 +480,85 @@
272
480
 
273
481
  // Arity count error dispatcher
274
482
  Opal.ac = function(actual, expected, object, meth) {
275
- var inspect = ((typeof(object) !== 'function') ? object.constructor._name + '#' : object._name + '.') + meth;
483
+ var inspect = (object._isClass ? object._name + '.' : object._klass._name + '#') + meth;
276
484
  var msg = '[' + inspect + '] wrong number of arguments(' + actual + ' for ' + expected + ')';
277
485
  throw Opal.ArgumentError.$new(msg);
278
486
  };
279
487
 
280
488
  // Super dispatcher
281
- Opal.dispatch_super = function(obj, jsid, args, iter, defs) {
489
+ Opal.find_super_dispatcher = function(obj, jsid, current_func, iter, defs) {
282
490
  var dispatcher;
283
491
 
284
492
  if (defs) {
285
493
  dispatcher = obj._isClass ? defs._super : obj._klass._proto;
286
494
  }
287
495
  else {
288
- dispatcher = obj._isClass ? obj._klass : obj._klass._super._proto;
496
+ if (obj._isClass) {
497
+ dispatcher = obj._klass;
498
+ }
499
+ else {
500
+ dispatcher = find_obj_super_dispatcher(obj, jsid, current_func);
501
+ }
289
502
  }
290
503
 
291
504
  dispatcher = dispatcher['$' + jsid];
292
505
  dispatcher._p = iter;
293
506
 
294
- return dispatcher.apply(obj, args);
507
+ return dispatcher;
295
508
  };
296
509
 
297
- // return helper
510
+ // Iter dispatcher for super in a block
511
+ Opal.find_iter_super_dispatcher = function(obj, jsid, current_func, iter, defs) {
512
+ if (current_func._def) {
513
+ return Opal.find_super_dispatcher(obj, current_func._jsid, current_func, iter, defs);
514
+ }
515
+ else {
516
+ return Opal.find_super_dispatcher(obj, jsid, current_func, iter, defs);
517
+ }
518
+ };
519
+
520
+ var find_obj_super_dispatcher = function(obj, jsid, current_func) {
521
+ var klass = obj.__meta__ || obj._klass;
522
+
523
+ while (klass) {
524
+ if (klass._proto['$' + jsid] === current_func) {
525
+ // ok
526
+ break;
527
+ }
528
+
529
+ klass = klass.__parent;
530
+ }
531
+
532
+ // if we arent in a class, we couldnt find current?
533
+ if (!klass) {
534
+ throw new Error("could not find current class for super()");
535
+ }
536
+
537
+ klass = klass.__parent;
538
+
539
+ // else, let's find the next one
540
+ while (klass) {
541
+ var working = klass._proto['$' + jsid];
542
+
543
+ if (working && working !== current_func) {
544
+ // ok
545
+ break;
546
+ }
547
+
548
+ klass = klass.__parent;
549
+ }
550
+
551
+ return klass._proto;
552
+ };
553
+
554
+ /*
555
+ * Used to return as an expression. Sometimes, we can't simply return from
556
+ * a javascript function as if we were a method, as the return is used as
557
+ * an expression, or even inside a block which must "return" to the outer
558
+ * method. This helper simply throws an error which is then caught by the
559
+ * method. This approach is expensive, so it is only used when absolutely
560
+ * needed.
561
+ */
298
562
  Opal.$return = function(val) {
299
563
  Opal.returner.$v = val;
300
564
  throw Opal.returner;
@@ -321,15 +585,49 @@
321
585
 
322
586
  // handles yield for > 1 yielded arg
323
587
  Opal.$yieldX = function(block, args) {
588
+ if (typeof(block) !== "function") {
589
+ throw Opal.LocalJumpError.$new("no block given");
590
+ }
591
+
324
592
  if (block.length > 1 && args.length == 1) {
325
593
  if (args[0]._isArray) {
326
594
  return block.apply(null, args[0]);
327
595
  }
328
596
  }
329
597
 
598
+ if (!args._isArray) {
599
+ args = $slice.call(args);
600
+ }
601
+
330
602
  return block.apply(null, args);
331
603
  };
332
604
 
605
+ Opal.is_a = function(object, klass) {
606
+ var search = object._klass;
607
+
608
+ while (search) {
609
+ if (search === klass) {
610
+ return true;
611
+ }
612
+
613
+ search = search._super;
614
+ }
615
+
616
+ return false;
617
+ }
618
+
619
+ // Helper to convert the given object to an array
620
+ Opal.to_ary = function(value) {
621
+ if (value._isArray) {
622
+ return value;
623
+ }
624
+ else if (value.$to_ary && !value.$to_ary.rb_stub) {
625
+ return value.$to_ary();
626
+ }
627
+
628
+ return [value];
629
+ };
630
+
333
631
  /*
334
632
  Call a ruby method on a ruby object with some arguments:
335
633
 
@@ -372,7 +670,7 @@
372
670
  * Donate methods for a class/module
373
671
  */
374
672
  Opal.donate = function(klass, defined, indirect) {
375
- var methods = klass._methods, included_in = klass._included_in;
673
+ var methods = klass._methods, included_in = klass.__dep__;
376
674
 
377
675
  // if (!indirect) {
378
676
  klass._methods = methods.concat(defined);
@@ -386,15 +684,57 @@
386
684
  for (var j = 0, jj = defined.length; j < jj; j++) {
387
685
  var method = defined[j];
388
686
  dest[method] = klass._proto[method];
687
+ dest[method]._donated = true;
389
688
  }
390
689
 
391
- if (includee._included_in) {
690
+ if (includee.__dep__) {
392
691
  Opal.donate(includee, defined, true);
393
692
  }
394
693
  }
395
694
  }
396
695
  };
397
696
 
697
+ Opal.defn = function(obj, jsid, body) {
698
+ if (obj.__mod__) {
699
+ obj._proto[jsid] = body;
700
+ Opal.donate(obj, [jsid]);
701
+ }
702
+ else if (obj._isClass) {
703
+ obj._proto[jsid] = body;
704
+
705
+ if (obj === RubyBasicObject) {
706
+ define_basic_object_method(jsid, body);
707
+ }
708
+ else if (obj === RubyObject) {
709
+ Opal.donate(obj, [jsid]);
710
+ }
711
+ }
712
+ else {
713
+ obj[jsid] = body;
714
+ }
715
+
716
+ return nil;
717
+ };
718
+
719
+ /*
720
+ * Define a singleton method on the given object.
721
+ */
722
+ Opal.defs = function(obj, jsid, body) {
723
+ if (obj._isClass || obj.__mod__) {
724
+ obj.constructor.prototype[jsid] = body;
725
+ }
726
+ else {
727
+ obj[jsid] = body;
728
+ }
729
+ };
730
+
731
+ function define_basic_object_method(jsid, body) {
732
+ RubyBasicObject._methods.push(jsid);
733
+ for (var i = 0, len = bridged_classes.length; i < len; i++) {
734
+ bridged_classes[i]._proto[jsid] = body;
735
+ }
736
+ }
737
+
398
738
  // Initialization
399
739
  // --------------
400
740
 
@@ -405,47 +745,48 @@
405
745
  boot_defclass('Class', Class, Module);
406
746
 
407
747
  // Constructors for *classes* of core objects
408
- var BasicObjectClass = boot_makemeta('BasicObject', BasicObject, Class);
409
- var ObjectClass = boot_makemeta('Object', Object, BasicObjectClass.constructor);
410
- var ModuleClass = boot_makemeta('Module', Module, ObjectClass.constructor);
411
- var ClassClass = boot_makemeta('Class', Class, ModuleClass.constructor);
748
+ RubyBasicObject = boot_makemeta('BasicObject', BasicObject, Class);
749
+ RubyObject = boot_makemeta('Object', Object, RubyBasicObject.constructor);
750
+ RubyModule = boot_makemeta('Module', Module, RubyObject.constructor);
751
+ RubyClass = boot_makemeta('Class', Class, RubyModule.constructor);
412
752
 
413
753
  // Fix booted classes to use their metaclass
414
- BasicObjectClass._klass = ClassClass;
415
- ObjectClass._klass = ClassClass;
416
- ModuleClass._klass = ClassClass;
417
- ClassClass._klass = ClassClass;
754
+ RubyBasicObject._klass = RubyClass;
755
+ RubyObject._klass = RubyClass;
756
+ RubyModule._klass = RubyClass;
757
+ RubyClass._klass = RubyClass;
418
758
 
419
759
  // Fix superclasses of booted classes
420
- BasicObjectClass._super = null;
421
- ObjectClass._super = BasicObjectClass;
422
- ModuleClass._super = ObjectClass;
423
- ClassClass._super = ModuleClass;
424
-
425
- // Defines methods onto Object (which are then donated to bridged classes)
426
- ObjectClass._defn = function (mid, body) {
427
- this._proto[mid] = body;
428
- Opal.donate(this, [mid]);
429
- };
430
-
431
- var bridged_classes = ObjectClass._included_in = [];
432
-
433
- Opal.base = ObjectClass;
434
- BasicObjectClass._scope = ObjectClass._scope = Opal;
435
- Opal.Kernel = ObjectClass;
436
-
437
- create_scope(Opal, ModuleClass);
438
- create_scope(Opal, ClassClass);
439
-
440
- ObjectClass._proto.toString = function() {
760
+ RubyBasicObject._super = null;
761
+ RubyObject._super = RubyBasicObject;
762
+ RubyModule._super = RubyObject;
763
+ RubyClass._super = RubyModule;
764
+
765
+ // Internally, Object acts like a module as it is "included" into bridged
766
+ // classes. In other words, we donate methods from Object into our bridged
767
+ // classes as their prototypes don't inherit from our root Object, so they
768
+ // act like module includes.
769
+ RubyObject.__dep__ = bridged_classes;
770
+
771
+ Opal.base = RubyObject;
772
+ RubyBasicObject._scope = RubyObject._scope = Opal;
773
+ RubyBasicObject._orig_scope = RubyObject._orig_scope = Opal;
774
+ Opal.Kernel = RubyObject;
775
+
776
+ RubyModule._scope = RubyObject._scope;
777
+ RubyClass._scope = RubyObject._scope;
778
+ RubyModule._orig_scope = RubyObject._orig_scope;
779
+ RubyClass._orig_scope = RubyObject._orig_scope;
780
+
781
+ RubyObject._proto.toString = function() {
441
782
  return this.$to_s();
442
783
  };
443
784
 
444
- ClassClass._proto._defn = function(mid, body) { this._proto[mid] = body; };
785
+ RubyClass._proto._defn = function(mid, body) { this._proto[mid] = body; };
445
786
 
446
- Opal.top = new ObjectClass._alloc();
787
+ Opal.top = new RubyObject._alloc();
447
788
 
448
- Opal.klass(ObjectClass, ObjectClass, 'NilClass', NilClass);
789
+ Opal.klass(RubyObject, RubyObject, 'NilClass', NilClass);
449
790
 
450
791
  var nil = Opal.nil = new NilClass;
451
792
  nil.call = nil.apply = function() { throw Opal.LocalJumpError.$new('no block given'); };