opal-cj 0.7.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +27 -0
  4. data/.rspec +3 -0
  5. data/.spectator +2 -0
  6. data/.spectator-mspec +3 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.md +406 -0
  9. data/CONTRIBUTING.md +41 -0
  10. data/Gemfile +27 -0
  11. data/Guardfile +77 -0
  12. data/LICENSE +19 -0
  13. data/README.md +178 -0
  14. data/Rakefile +116 -0
  15. data/benchmarks/operators.rb +11 -0
  16. data/bin/opal +22 -0
  17. data/bin/opal-build +77 -0
  18. data/bin/opal-mspec +10 -0
  19. data/bin/opal-repl +72 -0
  20. data/config.ru +14 -0
  21. data/examples/rack/Gemfile +3 -0
  22. data/examples/rack/app/application.rb +13 -0
  23. data/examples/rack/app/user.rb +21 -0
  24. data/examples/rack/config.ru +7 -0
  25. data/examples/rack/index.html.erb +10 -0
  26. data/examples/sinatra/Gemfile +4 -0
  27. data/examples/sinatra/app/application.rb +7 -0
  28. data/examples/sinatra/config.ru +28 -0
  29. data/lib/mspec/opal/main.rb.erb +9 -0
  30. data/lib/mspec/opal/rake_task.rb +278 -0
  31. data/lib/mspec/opal/runner.rb +206 -0
  32. data/lib/mspec/opal/sprockets.js +57 -0
  33. data/lib/opal.rb +11 -0
  34. data/lib/opal/builder.rb +135 -0
  35. data/lib/opal/builder_processors.rb +165 -0
  36. data/lib/opal/cli.rb +145 -0
  37. data/lib/opal/cli_options.rb +149 -0
  38. data/lib/opal/cli_runners.rb +10 -0
  39. data/lib/opal/cli_runners/nodejs.rb +56 -0
  40. data/lib/opal/cli_runners/phantom.js +35 -0
  41. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  42. data/lib/opal/cli_runners/server.rb +54 -0
  43. data/lib/opal/compiler.rb +307 -0
  44. data/lib/opal/erb.rb +64 -0
  45. data/lib/opal/fragment.rb +41 -0
  46. data/lib/opal/hike_path_finder.rb +18 -0
  47. data/lib/opal/nodes.rb +26 -0
  48. data/lib/opal/nodes/arglist.rb +56 -0
  49. data/lib/opal/nodes/array.rb +54 -0
  50. data/lib/opal/nodes/base.rb +151 -0
  51. data/lib/opal/nodes/call.rb +283 -0
  52. data/lib/opal/nodes/call_special.rb +178 -0
  53. data/lib/opal/nodes/case.rb +96 -0
  54. data/lib/opal/nodes/class.rb +42 -0
  55. data/lib/opal/nodes/constants.rb +78 -0
  56. data/lib/opal/nodes/def.rb +157 -0
  57. data/lib/opal/nodes/defined.rb +113 -0
  58. data/lib/opal/nodes/definitions.rb +168 -0
  59. data/lib/opal/nodes/for.rb +35 -0
  60. data/lib/opal/nodes/hash.rb +67 -0
  61. data/lib/opal/nodes/helpers.rb +114 -0
  62. data/lib/opal/nodes/if.rb +67 -0
  63. data/lib/opal/nodes/iter.rb +131 -0
  64. data/lib/opal/nodes/literal.rb +230 -0
  65. data/lib/opal/nodes/logic.rb +217 -0
  66. data/lib/opal/nodes/masgn.rb +62 -0
  67. data/lib/opal/nodes/module.rb +46 -0
  68. data/lib/opal/nodes/rescue.rb +135 -0
  69. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  70. data/lib/opal/nodes/scope.rb +293 -0
  71. data/lib/opal/nodes/singleton_class.rb +25 -0
  72. data/lib/opal/nodes/super.rb +97 -0
  73. data/lib/opal/nodes/top.rb +101 -0
  74. data/lib/opal/nodes/variables.rb +158 -0
  75. data/lib/opal/nodes/while.rb +65 -0
  76. data/lib/opal/nodes/yield.rb +95 -0
  77. data/lib/opal/parser.rb +658 -0
  78. data/lib/opal/parser/grammar.rb +5452 -0
  79. data/lib/opal/parser/grammar.y +1684 -0
  80. data/lib/opal/parser/keywords.rb +66 -0
  81. data/lib/opal/parser/lexer.rb +1208 -0
  82. data/lib/opal/parser/parser_scope.rb +25 -0
  83. data/lib/opal/parser/sexp.rb +75 -0
  84. data/lib/opal/path_reader.rb +28 -0
  85. data/lib/opal/paths.rb +38 -0
  86. data/lib/opal/source_map.rb +70 -0
  87. data/lib/opal/sprockets.rb +4 -0
  88. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  89. data/lib/opal/sprockets/environment.rb +37 -0
  90. data/lib/opal/sprockets/erb.rb +37 -0
  91. data/lib/opal/sprockets/path_reader.rb +34 -0
  92. data/lib/opal/sprockets/processor.rb +124 -0
  93. data/lib/opal/sprockets/server.rb +180 -0
  94. data/lib/opal/util.rb +64 -0
  95. data/lib/opal/version.rb +3 -0
  96. data/opal.gemspec +36 -0
  97. data/opal/README.md +6 -0
  98. data/opal/corelib/array.rb +1556 -0
  99. data/opal/corelib/array/inheritance.rb +113 -0
  100. data/opal/corelib/basic_object.rb +73 -0
  101. data/opal/corelib/boolean.rb +41 -0
  102. data/opal/corelib/class.rb +55 -0
  103. data/opal/corelib/comparable.rb +56 -0
  104. data/opal/corelib/complex.rb +3 -0
  105. data/opal/corelib/dir.rb +20 -0
  106. data/opal/corelib/enumerable.rb +1132 -0
  107. data/opal/corelib/enumerator.rb +422 -0
  108. data/opal/corelib/error.rb +63 -0
  109. data/opal/corelib/file.rb +56 -0
  110. data/opal/corelib/hash.rb +728 -0
  111. data/opal/corelib/helpers.rb +102 -0
  112. data/opal/corelib/io.rb +59 -0
  113. data/opal/corelib/kernel.rb +569 -0
  114. data/opal/corelib/main.rb +7 -0
  115. data/opal/corelib/match_data.rb +114 -0
  116. data/opal/corelib/method.rb +58 -0
  117. data/opal/corelib/module.rb +462 -0
  118. data/opal/corelib/nil_class.rb +62 -0
  119. data/opal/corelib/numeric.rb +532 -0
  120. data/opal/corelib/proc.rb +52 -0
  121. data/opal/corelib/range.rb +116 -0
  122. data/opal/corelib/rational.rb +3 -0
  123. data/opal/corelib/regexp.rb +133 -0
  124. data/opal/corelib/runtime.js +1240 -0
  125. data/opal/corelib/string.rb +1212 -0
  126. data/opal/corelib/string/inheritance.rb +78 -0
  127. data/opal/corelib/struct.rb +141 -0
  128. data/opal/corelib/time.rb +584 -0
  129. data/opal/corelib/variables.rb +24 -0
  130. data/opal/opal.rb +32 -0
  131. data/package.json +9 -0
  132. data/spec/filters/bugs/array.rb +232 -0
  133. data/spec/filters/bugs/basic_object.rb +14 -0
  134. data/spec/filters/bugs/class.rb +21 -0
  135. data/spec/filters/bugs/enumerable.rb +69 -0
  136. data/spec/filters/bugs/enumerator.rb +3 -0
  137. data/spec/filters/bugs/hash.rb +128 -0
  138. data/spec/filters/bugs/kernel.rb +10 -0
  139. data/spec/filters/bugs/language.rb +415 -0
  140. data/spec/filters/bugs/math.rb +95 -0
  141. data/spec/filters/bugs/module.rb +14 -0
  142. data/spec/filters/bugs/nil.rb +7 -0
  143. data/spec/filters/bugs/numeric.rb +20 -0
  144. data/spec/filters/bugs/opal.rb +14 -0
  145. data/spec/filters/bugs/regexp.rb +11 -0
  146. data/spec/filters/bugs/set.rb +7 -0
  147. data/spec/filters/bugs/singleton.rb +6 -0
  148. data/spec/filters/bugs/string.rb +360 -0
  149. data/spec/filters/bugs/stringscanner.rb +22 -0
  150. data/spec/filters/bugs/struct.rb +45 -0
  151. data/spec/filters/bugs/time.rb +177 -0
  152. data/spec/filters/bugs/unknown.rb +11 -0
  153. data/spec/filters/unsupported/encoding.rb +95 -0
  154. data/spec/filters/unsupported/enumerator.rb +14 -0
  155. data/spec/filters/unsupported/float.rb +5 -0
  156. data/spec/filters/unsupported/frozen.rb +90 -0
  157. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  158. data/spec/filters/unsupported/integer_size.rb +7 -0
  159. data/spec/filters/unsupported/method_added.rb +10 -0
  160. data/spec/filters/unsupported/mutable_strings.rb +361 -0
  161. data/spec/filters/unsupported/private_constants.rb +30 -0
  162. data/spec/filters/unsupported/private_methods.rb +44 -0
  163. data/spec/filters/unsupported/random.rb +4 -0
  164. data/spec/filters/unsupported/ruby_exe.rb +5 -0
  165. data/spec/filters/unsupported/tainted.rb +155 -0
  166. data/spec/filters/unsupported/time.rb +21 -0
  167. data/spec/filters/unsupported/trusted.rb +80 -0
  168. data/spec/lib/builder_processors_spec.rb +27 -0
  169. data/spec/lib/builder_spec.rb +66 -0
  170. data/spec/lib/cli_spec.rb +134 -0
  171. data/spec/lib/compiler_spec.rb +197 -0
  172. data/spec/lib/dependency_resolver_spec.rb +40 -0
  173. data/spec/lib/fixtures/no_requires.rb +1 -0
  174. data/spec/lib/fixtures/opal_file.rb +2 -0
  175. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  176. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  177. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  178. data/spec/lib/fixtures/requires.rb +7 -0
  179. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  180. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  181. data/spec/lib/hike_path_finder_spec.rb +23 -0
  182. data/spec/lib/lexer_spec.rb +110 -0
  183. data/spec/lib/parser/alias_spec.rb +26 -0
  184. data/spec/lib/parser/and_spec.rb +13 -0
  185. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  186. data/spec/lib/parser/begin_spec.rb +42 -0
  187. data/spec/lib/parser/block_spec.rb +12 -0
  188. data/spec/lib/parser/break_spec.rb +17 -0
  189. data/spec/lib/parser/call_spec.rb +139 -0
  190. data/spec/lib/parser/class_spec.rb +35 -0
  191. data/spec/lib/parser/comments_spec.rb +11 -0
  192. data/spec/lib/parser/def_spec.rb +61 -0
  193. data/spec/lib/parser/if_spec.rb +26 -0
  194. data/spec/lib/parser/iter_spec.rb +59 -0
  195. data/spec/lib/parser/lambda_spec.rb +64 -0
  196. data/spec/lib/parser/literal_spec.rb +118 -0
  197. data/spec/lib/parser/masgn_spec.rb +37 -0
  198. data/spec/lib/parser/module_spec.rb +27 -0
  199. data/spec/lib/parser/not_spec.rb +27 -0
  200. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  201. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  202. data/spec/lib/parser/or_spec.rb +13 -0
  203. data/spec/lib/parser/return_spec.rb +17 -0
  204. data/spec/lib/parser/sclass_spec.rb +21 -0
  205. data/spec/lib/parser/string_spec.rb +276 -0
  206. data/spec/lib/parser/super_spec.rb +20 -0
  207. data/spec/lib/parser/unary_spec.rb +48 -0
  208. data/spec/lib/parser/undef_spec.rb +15 -0
  209. data/spec/lib/parser/unless_spec.rb +13 -0
  210. data/spec/lib/parser/variables_spec.rb +92 -0
  211. data/spec/lib/parser/while_spec.rb +15 -0
  212. data/spec/lib/parser/yield_spec.rb +20 -0
  213. data/spec/lib/path_reader_spec.rb +24 -0
  214. data/spec/lib/shared/path_finder_shared.rb +19 -0
  215. data/spec/lib/shared/path_reader_shared.rb +31 -0
  216. data/spec/lib/spec_helper.rb +9 -0
  217. data/spec/lib/sprockets/environment_spec.rb +30 -0
  218. data/spec/lib/sprockets/erb_spec.rb +25 -0
  219. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  220. data/spec/lib/sprockets/processor_spec.rb +35 -0
  221. data/spec/lib/sprockets/server_spec.rb +20 -0
  222. data/spec/opal/compiler/irb_spec.rb +44 -0
  223. data/spec/opal/core/array/select_spec.rb +14 -0
  224. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  225. data/spec/opal/core/date_spec.rb +122 -0
  226. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  227. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  228. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  229. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  230. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  231. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  232. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  233. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  234. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  235. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  246. data/spec/opal/core/fixtures/class.rb +124 -0
  247. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  248. data/spec/opal/core/fixtures/constants.rb +33 -0
  249. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  250. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  251. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  252. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  253. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  254. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  255. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  256. data/spec/opal/core/kernel/class_spec.rb +6 -0
  257. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  258. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  259. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  260. data/spec/opal/core/kernel/format_spec.rb +122 -0
  261. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  262. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  263. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  264. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  265. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  266. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  267. data/spec/opal/core/kernel/match_spec.rb +5 -0
  268. data/spec/opal/core/kernel/method_spec.rb +31 -0
  269. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  270. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  271. data/spec/opal/core/kernel/p_spec.rb +15 -0
  272. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  273. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  274. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  275. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  276. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  277. data/spec/opal/core/kernel/send_spec.rb +56 -0
  278. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  279. data/spec/opal/core/language/block_spec.rb +538 -0
  280. data/spec/opal/core/language/fixtures/array.rb +11 -0
  281. data/spec/opal/core/language/fixtures/block.rb +57 -0
  282. data/spec/opal/core/language/fixtures/break.rb +240 -0
  283. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  284. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  285. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  286. data/spec/opal/core/language/fixtures/module.rb +24 -0
  287. data/spec/opal/core/language/fixtures/next.rb +128 -0
  288. data/spec/opal/core/language/fixtures/return.rb +118 -0
  289. data/spec/opal/core/language/fixtures/send.rb +110 -0
  290. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  291. data/spec/opal/core/language/fixtures/super.rb +308 -0
  292. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  293. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  294. data/spec/opal/core/language/predefined_spec.rb +85 -0
  295. data/spec/opal/core/language/proc_spec.rb +263 -0
  296. data/spec/opal/core/language/regexp_spec.rb +20 -0
  297. data/spec/opal/core/language/send_spec.rb +225 -0
  298. data/spec/opal/core/language/string_spec.rb +44 -0
  299. data/spec/opal/core/language/symbol_spec.rb +40 -0
  300. data/spec/opal/core/language/variables_spec.rb +1366 -0
  301. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  302. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  303. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  304. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  305. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  306. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  307. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  308. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  309. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  310. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  311. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  312. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  313. data/spec/opal/core/module/append_features_spec.rb +14 -0
  314. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  315. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  316. data/spec/opal/core/module/const_get_spec.rb +85 -0
  317. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  318. data/spec/opal/core/module/const_set_spec.rb +64 -0
  319. data/spec/opal/core/module/constants_spec.rb +49 -0
  320. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  321. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  322. data/spec/opal/core/module/module_function_spec.rb +25 -0
  323. data/spec/opal/core/module/name_spec.rb +52 -0
  324. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  325. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  326. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  327. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  328. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  329. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  330. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  331. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  332. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  333. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  334. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  335. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  336. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  337. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  338. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  339. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  340. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  341. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  342. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  343. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  344. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  345. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  346. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  347. data/spec/opal/core/numeric/next_spec.rb +9 -0
  348. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  349. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  350. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  351. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  352. data/spec/opal/core/numeric/step_spec.rb +11 -0
  353. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  354. data/spec/opal/core/numeric/times_spec.rb +36 -0
  355. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  356. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  357. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  358. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  359. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  360. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  361. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  362. data/spec/opal/core/proc/call_spec.rb +21 -0
  363. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  364. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  365. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  366. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  367. data/spec/opal/core/runtime/block_spec.rb +23 -0
  368. data/spec/opal/core/runtime/bridged_classes_spec.rb +64 -0
  369. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  370. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  371. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  372. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  373. data/spec/opal/core/runtime/method_spec.rb +31 -0
  374. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  375. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  376. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  377. data/spec/opal/core/runtime/return_spec.rb +38 -0
  378. data/spec/opal/core/runtime/send_spec.rb +34 -0
  379. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  380. data/spec/opal/core/runtime/super_spec.rb +212 -0
  381. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  382. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  383. data/spec/opal/core/source_map_spec.rb +15 -0
  384. data/spec/opal/core/string_spec.rb +11 -0
  385. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  386. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  387. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  388. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  389. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  390. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  391. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  392. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  393. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  394. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  395. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  396. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  397. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  398. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  399. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  400. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  401. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  402. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  403. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  404. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  405. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  406. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  407. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  408. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  409. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  410. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  411. data/spec/rubyspecs +329 -0
  412. data/spec/spec_helper.rb +42 -0
  413. data/spec/support/mspec_rspec_adapter.rb +33 -0
  414. data/spec/support/parser_helpers.rb +37 -0
  415. data/stdlib/README.md +3 -0
  416. data/stdlib/base64.rb +152 -0
  417. data/stdlib/benchmark.rb +10 -0
  418. data/stdlib/buffer.rb +40 -0
  419. data/stdlib/buffer/array.rb +66 -0
  420. data/stdlib/buffer/view.rb +70 -0
  421. data/stdlib/date.rb +170 -0
  422. data/stdlib/delegate.rb +29 -0
  423. data/stdlib/dir.rb +1 -0
  424. data/stdlib/encoding.rb +166 -0
  425. data/stdlib/enumerator.rb +1 -0
  426. data/stdlib/erb.rb +16 -0
  427. data/stdlib/file.rb +1 -0
  428. data/stdlib/forwardable.rb +71 -0
  429. data/stdlib/json.rb +182 -0
  430. data/stdlib/math.rb +370 -0
  431. data/stdlib/native.rb +530 -0
  432. data/stdlib/nodejs.rb +5 -0
  433. data/stdlib/nodejs/dir.rb +13 -0
  434. data/stdlib/nodejs/file.rb +98 -0
  435. data/stdlib/nodejs/fileutils.rb +26 -0
  436. data/stdlib/nodejs/io.rb +2 -0
  437. data/stdlib/nodejs/irb.rb +45 -0
  438. data/stdlib/nodejs/process.rb +16 -0
  439. data/stdlib/nodejs/require.rb +32 -0
  440. data/stdlib/nodejs/rubygems.rb +68 -0
  441. data/stdlib/nodejs/runtime.rb +25 -0
  442. data/stdlib/nodejs/yaml.rb +11 -0
  443. data/stdlib/observer.rb +202 -0
  444. data/stdlib/opal-parser.rb +53 -0
  445. data/stdlib/opal-source-maps.rb +2 -0
  446. data/stdlib/ostruct.rb +69 -0
  447. data/stdlib/pathname.rb +31 -0
  448. data/stdlib/phantomjs.rb +8 -0
  449. data/stdlib/pp.rb +12 -0
  450. data/stdlib/process.rb +10 -0
  451. data/stdlib/promise.rb +300 -0
  452. data/stdlib/racc/parser.rb +215 -0
  453. data/stdlib/rbconfig.rb +20 -0
  454. data/stdlib/securerandom.rb +12 -0
  455. data/stdlib/set.rb +116 -0
  456. data/stdlib/singleton.rb +40 -0
  457. data/stdlib/source_map.rb +5 -0
  458. data/stdlib/source_map/map.rb +220 -0
  459. data/stdlib/source_map/mapping.rb +26 -0
  460. data/stdlib/source_map/offset.rb +88 -0
  461. data/stdlib/source_map/version.rb +3 -0
  462. data/stdlib/source_map/vlq.rb +98 -0
  463. data/stdlib/sourcemap.rb +1 -0
  464. data/stdlib/stringio.rb +181 -0
  465. data/stdlib/strscan.rb +155 -0
  466. data/stdlib/template.rb +46 -0
  467. data/stdlib/thread.rb +160 -0
  468. data/stdlib/time.rb +9 -0
  469. data/tasks/github.rake +19 -0
  470. metadata +690 -0
@@ -0,0 +1,62 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class MassAssignNode < Base
6
+ handle :masgn
7
+
8
+ children :lhs, :rhs
9
+
10
+ def compile
11
+ tmp = scope.new_temp
12
+ len = 0 # how many rhs items are we sure we have
13
+
14
+ if rhs.type == :array
15
+ len = rhs.size - 1
16
+ push "#{tmp} = ", expr(rhs)
17
+ elsif rhs.type == :to_ary
18
+ push "#{tmp} = $opal.to_ary(", expr(rhs[1]), ")"
19
+ elsif rhs.type == :splat
20
+ push "(#{tmp} = ", expr(rhs[1]), ")['$to_a'] && !#{tmp}['$to_a'].$$stub ? (#{tmp} = #{tmp}['$to_a']())"
21
+ push " : (#{tmp}).$$is_array ? #{tmp} : (#{tmp} = [#{tmp}])"
22
+ else
23
+ raise "unsupported mlhs type"
24
+ end
25
+
26
+ lhs.children.each_with_index do |child, idx|
27
+ push ', '
28
+
29
+ if child.type == :splat
30
+ if part = child[1]
31
+ part = part.dup
32
+ part << s(:js_tmp, "$slice.call(#{tmp}, #{idx})")
33
+ push expr(part)
34
+ end
35
+ else
36
+ if idx >= len
37
+ assign = s(:js_tmp, "(#{tmp}[#{idx}] == null ? nil : #{tmp}[#{idx}])")
38
+ else
39
+ assign = s(:js_tmp, "#{tmp}[#{idx}]")
40
+ end
41
+
42
+ part = child.dup
43
+ if child.type == :lasgn or child.type == :iasgn or child.type == :lvar or child.type == :gasgn
44
+ part << assign
45
+ elsif child.type == :call
46
+ part[2] = "#{part[2]}=".to_sym
47
+ part.last << assign
48
+ elsif child.type == :attrasgn
49
+ part.last << assign
50
+ else
51
+ raise "Bad lhs for masgn"
52
+ end
53
+
54
+ push expr(part)
55
+ end
56
+ end
57
+
58
+ scope.queue_temp tmp
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,46 @@
1
+ require 'opal/nodes/scope'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class ModuleNode < ScopeNode
6
+ handle :module
7
+
8
+ children :cid, :body
9
+
10
+ def compile
11
+ name, base = name_and_base
12
+ helper :module
13
+
14
+ push "(function($base) {"
15
+ line " var self = $module($base, '#{name}');"
16
+
17
+ in_scope do
18
+ scope.name = name
19
+ add_temp "#{scope.proto} = self.$$proto"
20
+ add_temp '$scope = self.$$scope'
21
+
22
+ body_code = stmt(body || s(:nil))
23
+ empty_line
24
+
25
+ line scope.to_vars
26
+ line body_code
27
+ line scope.to_donate_methods
28
+ end
29
+
30
+ line "})(", base, ")"
31
+ end
32
+
33
+ def name_and_base
34
+ if cid.type == :const
35
+ [cid[1].to_s, 'self']
36
+ elsif cid.type == :colon2
37
+ [cid[2].to_s, expr(cid[1])]
38
+ elsif cid.type == :colon3
39
+ [cid[1].to_s, '$opal.Object']
40
+ else
41
+ raise "Bad receiver in module"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,135 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class RescueModNode < Base
6
+ handle :rescue_mod
7
+
8
+ children :lhs, :rhs
9
+
10
+ def body
11
+ stmt? ? lhs : compiler.returns(lhs)
12
+ end
13
+
14
+ def rescue_val
15
+ stmt? ? rhs : compiler.returns(rhs)
16
+ end
17
+
18
+ def compile
19
+ push "try {", expr(body), " } catch ($err) { ", expr(rescue_val), " }"
20
+
21
+ wrap '(function() {', '})()' unless stmt?
22
+ end
23
+ end
24
+
25
+ class EnsureNode < Base
26
+ handle :ensure
27
+
28
+ children :begn, :ensr
29
+
30
+ def compile
31
+ push "try {"
32
+ line compiler.process(body_sexp, @level)
33
+ line "} finally {"
34
+ line compiler.process(ensr_sexp, @level)
35
+ line "}"
36
+
37
+ wrap '(function() {', '; })()' if wrap_in_closure?
38
+ end
39
+
40
+ def body_sexp
41
+ wrap_in_closure? ? compiler.returns(begn) : begn
42
+ end
43
+
44
+ def ensr_sexp
45
+ ensr || s(:nil)
46
+ end
47
+
48
+ def wrap_in_closure?
49
+ recv? or expr?
50
+ end
51
+ end
52
+
53
+ class RescueNode < Base
54
+ handle :rescue
55
+
56
+ children :body
57
+
58
+ def compile
59
+ handled_else = false
60
+
61
+ push "try {"
62
+ line(indent { process(body_code, @level) })
63
+ line "} catch ($err) {"
64
+
65
+ children[1..-1].each_with_index do |child, idx|
66
+ handled_else = true unless child.type == :resbody
67
+
68
+ push "else " unless idx == 0
69
+ push(indent { process(child, @level) })
70
+ end
71
+
72
+ # if no resbodys capture our error, then rethrow
73
+ unless handled_else
74
+ push "else { throw $err; }"
75
+ end
76
+
77
+ line "}"
78
+
79
+ wrap '(function() { ', '})()' if expr?
80
+ end
81
+
82
+ def body_code
83
+ body.type == :resbody ? s(:nil) : body
84
+ end
85
+ end
86
+
87
+ class ResBodyNode < Base
88
+ handle :resbody
89
+
90
+ children :args, :body
91
+
92
+ def compile
93
+ push "if ("
94
+ if rescue_exprs.empty?
95
+ # if no expressions are given, then catch all errors
96
+ push "true"
97
+ else
98
+ push "$opal.$rescue($err, ["
99
+ rescue_exprs.each_with_index do |rexpr, idx|
100
+ push ', ' unless idx == 0
101
+ push expr(rexpr)
102
+ end
103
+ push "])"
104
+ end
105
+ push ") {"
106
+
107
+ if variable = rescue_variable
108
+ variable[2] = s(:js_tmp, '$err')
109
+ push expr(variable), ';'
110
+ end
111
+
112
+ line process(rescue_body, @level)
113
+ line "}"
114
+ end
115
+
116
+ def rescue_variable?(variable)
117
+ Sexp === variable and [:lasgn, :iasgn].include?(variable.type)
118
+ end
119
+
120
+ def rescue_variable
121
+ rescue_variable?(args.last) ? args.last.dup : nil
122
+ end
123
+
124
+ def rescue_exprs
125
+ exprs = args.dup
126
+ exprs.pop if rescue_variable?(exprs.last)
127
+ exprs.children
128
+ end
129
+
130
+ def rescue_body
131
+ body || s(:nil)
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,45 @@
1
+ require 'set'
2
+ require 'opal/nodes/base'
3
+
4
+ module Opal
5
+ module Nodes
6
+ class RuntimeHelpers < Base
7
+ HELPERS = Set.new
8
+
9
+ children :recvr, :meth, :arglist
10
+
11
+ def self.compatible?(recvr, meth, arglist)
12
+ recvr == [:const, :Opal] and HELPERS.include?(meth.to_sym)
13
+ end
14
+
15
+ def self.helper(name, &block)
16
+ HELPERS << name
17
+ define_method("compile_#{name}", &block)
18
+ end
19
+
20
+ def compile
21
+ if HELPERS.include?(meth.to_sym)
22
+ __send__("compile_#{meth}")
23
+ else
24
+ raise "Helper not supported: #{meth}"
25
+ end
26
+ end
27
+
28
+ helper :truthy? do
29
+ unless sexp = arglist[1]
30
+ raise "truthy? requires an object"
31
+ end
32
+
33
+ js_truthy(sexp)
34
+ end
35
+
36
+ helper :falsy? do
37
+ unless sexp = arglist[1]
38
+ raise "falsy? requires an object"
39
+ end
40
+
41
+ js_falsy(sexp)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,293 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class ScopeNode < Base
6
+
7
+ # Every scope can have a parent scope
8
+ attr_accessor :parent
9
+
10
+ # The class or module name if this scope is a class scope
11
+ attr_accessor :name
12
+
13
+ # The given block name for a def scope
14
+ attr_accessor :block_name
15
+
16
+ attr_reader :scope_name
17
+ attr_reader :ivars
18
+ attr_reader :gvars
19
+
20
+ attr_accessor :mid
21
+
22
+ # true if singleton def, false otherwise
23
+ attr_accessor :defs
24
+
25
+ # used by modules to know what methods to donate to includees
26
+ attr_reader :methods
27
+
28
+ # uses parents super method
29
+ attr_accessor :uses_super
30
+ attr_accessor :uses_zuper
31
+
32
+ attr_accessor :catch_return
33
+
34
+ def initialize(*)
35
+ super
36
+
37
+ @locals = []
38
+ @temps = []
39
+ @args = []
40
+ @ivars = []
41
+ @gvars = []
42
+ @parent = nil
43
+ @queue = []
44
+ @unique = 'a'
45
+ @while_stack = []
46
+ @identity = nil
47
+ @defs = nil
48
+
49
+ @methods = []
50
+
51
+ @uses_block = false
52
+
53
+ # used by classes to store all ivars used in direct def methods
54
+ @proto_ivars = []
55
+ end
56
+
57
+ def in_scope(&block)
58
+ indent do
59
+ @parent = compiler.scope
60
+ compiler.scope = self
61
+ block.call self
62
+ compiler.scope = @parent
63
+ end
64
+ end
65
+
66
+ # Returns true if this scope is a class/module body scope
67
+ def class_scope?
68
+ @type == :class or @type == :module
69
+ end
70
+
71
+ # Returns true if this is strictly a class scope
72
+ def class?
73
+ @type == :class
74
+ end
75
+
76
+ # True if this is a module scope
77
+ def module?
78
+ @type == :module
79
+ end
80
+
81
+ def sclass?
82
+ @type == :sclass
83
+ end
84
+
85
+ # Returns true if this is a top scope (main file body)
86
+ def top?
87
+ @type == :top
88
+ end
89
+
90
+ # True if a block/iter scope
91
+ def iter?
92
+ @type == :iter
93
+ end
94
+
95
+ def def?
96
+ @type == :def
97
+ end
98
+
99
+ # Is this a normal def method directly inside a class? This is
100
+ # used for optimizing ivars as we can set them to nil in the
101
+ # class body
102
+ def def_in_class?
103
+ !@defs && @type == :def && @parent && @parent.class?
104
+ end
105
+
106
+ # Inside a class or module scope, the javascript variable name returned
107
+ # by this function points to the classes' prototype. This is the target
108
+ # to where methods are actually added inside a class body.
109
+ def proto
110
+ "def"
111
+ end
112
+
113
+ # A scope donates its methods if it is a module, or the core Object
114
+ # class. Modules donate their methods to classes or objects they are
115
+ # included in. Object donates methods to bridged classes whose native
116
+ # prototypes do not actually inherit from Opal.Object.prototype.
117
+ def should_donate?
118
+ @type == :module
119
+ end
120
+
121
+ ##
122
+ # Vars to use inside each scope
123
+ def to_vars
124
+ vars = @temps.dup
125
+ vars.push(*@locals.map { |l| "#{l} = nil" })
126
+
127
+ iv = ivars.map do |ivar|
128
+ "if (self#{ivar} == null) self#{ivar} = nil;\n"
129
+ end
130
+
131
+ gv = gvars.map do |gvar|
132
+ "if ($gvars#{gvar} == null) $gvars#{gvar} = nil;\n"
133
+ end
134
+
135
+ indent = @compiler.parser_indent
136
+ str = vars.empty? ? '' : "var #{vars.join ', '};\n"
137
+ str += "#{indent}#{iv.join indent}" unless ivars.empty?
138
+ str += "#{indent}#{gv.join indent}" unless gvars.empty?
139
+
140
+ if class? and !@proto_ivars.empty?
141
+ #raise "FIXME to_vars"
142
+ pvars = @proto_ivars.map { |i| "#{proto}#{i}"}.join(' = ')
143
+ result = "%s\n%s%s = nil;" % [str, indent, pvars]
144
+ else
145
+ result = str
146
+ end
147
+
148
+ fragment(result)
149
+ end
150
+
151
+ # Generates code for this module to donate methods
152
+ def to_donate_methods
153
+ if should_donate? and !@methods.empty?
154
+ fragment("%s;$opal.donate(self, [%s]);" % [@compiler.parser_indent, @methods.map(&:inspect).join(', ')])
155
+ else
156
+ fragment("")
157
+ end
158
+ end
159
+
160
+ def add_scope_ivar(ivar)
161
+ if def_in_class?
162
+ @parent.add_proto_ivar ivar
163
+ else
164
+ @ivars << ivar unless @ivars.include? ivar
165
+ end
166
+ end
167
+
168
+ def add_scope_gvar(gvar)
169
+ @gvars << gvar unless @gvars.include? gvar
170
+ end
171
+
172
+ def add_proto_ivar(ivar)
173
+ @proto_ivars << ivar unless @proto_ivars.include? ivar
174
+ end
175
+
176
+ def add_arg(arg)
177
+ @args << arg unless @args.include? arg
178
+ arg
179
+ end
180
+
181
+ def add_scope_local(local)
182
+ return if has_local? local
183
+
184
+ @locals << local
185
+ end
186
+
187
+ def has_local?(local)
188
+ return true if @locals.include? local or @args.include? local
189
+ return @parent.has_local?(local) if @parent and @type == :iter
190
+
191
+ false
192
+ end
193
+
194
+ def add_scope_temp(*tmps)
195
+ @temps.push(*tmps)
196
+ end
197
+
198
+ def has_temp?(tmp)
199
+ @temps.include? tmp
200
+ end
201
+
202
+ def new_temp
203
+ return @queue.pop unless @queue.empty?
204
+
205
+ tmp = next_temp
206
+ @temps << tmp
207
+ tmp
208
+ end
209
+
210
+ def next_temp
211
+ tmp = "$#{@unique}"
212
+ @unique = @unique.succ
213
+ tmp
214
+ end
215
+
216
+ def queue_temp(name)
217
+ @queue << name
218
+ end
219
+
220
+ def push_while
221
+ info = {}
222
+ @while_stack.push info
223
+ info
224
+ end
225
+
226
+ def pop_while
227
+ @while_stack.pop
228
+ end
229
+
230
+ def in_while?
231
+ !@while_stack.empty?
232
+ end
233
+
234
+ def uses_block!
235
+ if @type == :iter && @parent
236
+ @parent.uses_block!
237
+ else
238
+ @uses_block = true
239
+ identify!
240
+ end
241
+ end
242
+
243
+ def identify!
244
+ return @identity if @identity
245
+
246
+ @identity = @compiler.unique_temp
247
+ @parent.add_scope_temp @identity if @parent
248
+
249
+ @identity
250
+ end
251
+
252
+ def identity
253
+ @identity
254
+ end
255
+
256
+ def find_parent_def
257
+ scope = self
258
+ while scope = scope.parent
259
+ if scope.def?
260
+ return scope
261
+ end
262
+ end
263
+
264
+ nil
265
+ end
266
+
267
+ def get_super_chain
268
+ chain, scope, defn, mid = [], self, 'null', 'null'
269
+
270
+ while scope
271
+ if scope.type == :iter
272
+ chain << scope.identify!
273
+ scope = scope.parent if scope.parent
274
+
275
+ elsif scope.type == :def
276
+ defn = scope.identify!
277
+ mid = "'#{scope.mid}'"
278
+ break
279
+
280
+ else
281
+ break
282
+ end
283
+ end
284
+
285
+ [chain, defn, mid]
286
+ end
287
+
288
+ def uses_block?
289
+ @uses_block
290
+ end
291
+ end
292
+ end
293
+ end