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,56 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ # FIXME: needs rewrite
6
+ class ArglistNode < Base
7
+ handle :arglist
8
+
9
+ def compile
10
+ code, work = [], []
11
+
12
+ children.each do |current|
13
+ splat = current.first == :splat
14
+ arg = expr(current)
15
+
16
+ if splat
17
+ if work.empty?
18
+ if code.empty?
19
+ code << fragment("[].concat(")
20
+ code << arg
21
+ code << fragment(")")
22
+ else
23
+ code += ".concat(#{arg})"
24
+ end
25
+ else
26
+ if code.empty?
27
+ code << [fragment("["), work, fragment("]")]
28
+ else
29
+ code << [fragment(".concat(["), work, fragment("])")]
30
+ end
31
+
32
+ code << [fragment(".concat("), arg, fragment(")")]
33
+ end
34
+
35
+ work = []
36
+ else
37
+ work << fragment(", ") unless work.empty?
38
+ work << arg
39
+ end
40
+ end
41
+
42
+ unless work.empty?
43
+ join = work
44
+
45
+ if code.empty?
46
+ code = join
47
+ else
48
+ code << fragment(".concat(") << join << fragment(")")
49
+ end
50
+ end
51
+
52
+ push(*code)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,54 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class ArrayNode < Base
6
+ handle :array
7
+
8
+ def compile
9
+ return push('[]') if children.empty?
10
+
11
+ code, work = [], []
12
+
13
+ children.each do |child|
14
+ splat = child.type == :splat
15
+ part = expr(child)
16
+
17
+ if splat
18
+ if work.empty?
19
+ if code.empty?
20
+ code << fragment("[].concat(") << part << fragment(")")
21
+ else
22
+ code << fragment(".concat(") << part << fragment(")")
23
+ end
24
+ else
25
+ if code.empty?
26
+ code << fragment("[") << work << fragment("]")
27
+ else
28
+ code << fragment(".concat([") << work << fragment("])")
29
+ end
30
+
31
+ code << fragment(".concat(") << part << fragment(")")
32
+ end
33
+ work = []
34
+ else
35
+ work << fragment(", ") unless work.empty?
36
+ work << part
37
+ end
38
+ end
39
+
40
+ unless work.empty?
41
+ join = [fragment("["), work, fragment("]")]
42
+
43
+ if code.empty?
44
+ code = join
45
+ else
46
+ code.push([fragment(".concat("), join, fragment(")")])
47
+ end
48
+ end
49
+
50
+ push code
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,151 @@
1
+ require 'opal/nodes/helpers'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class Base
6
+ include Helpers
7
+
8
+ def self.handlers
9
+ @handlers ||= {}
10
+ end
11
+
12
+ def self.handle(*types)
13
+ types.each do |type|
14
+ Base.handlers[type] = self
15
+ end
16
+ end
17
+
18
+ def self.children(*names)
19
+ names.each_with_index do |name, idx|
20
+ define_method(name) do
21
+ @sexp[idx + 1]
22
+ end
23
+ end
24
+ end
25
+
26
+ attr_reader :compiler, :type
27
+
28
+ def initialize(sexp, level, compiler)
29
+ @sexp = sexp
30
+ @type = sexp.type
31
+ @level = level
32
+ @compiler = compiler
33
+ end
34
+
35
+ def children
36
+ @sexp[1..-1]
37
+ end
38
+
39
+ def compile_to_fragments
40
+ return @fragments if defined?(@fragments)
41
+
42
+ @fragments = []
43
+ self.compile
44
+ @fragments
45
+ end
46
+
47
+ def compile
48
+ raise "Not Implemented"
49
+ end
50
+
51
+ def push(*strs)
52
+ strs.each do |str|
53
+ str = fragment(str) if str.is_a?(String)
54
+ @fragments << str
55
+ end
56
+ end
57
+
58
+ def unshift(*strs)
59
+ strs.reverse.each do |str|
60
+ str = fragment(str) if str.is_a?(String)
61
+ @fragments.unshift str
62
+ end
63
+ end
64
+
65
+ def wrap(pre, post)
66
+ unshift pre
67
+ push post
68
+ end
69
+
70
+ def fragment(str)
71
+ Opal::Fragment.new str, @sexp
72
+ end
73
+
74
+ def error(msg)
75
+ @compiler.error msg
76
+ end
77
+
78
+ def scope
79
+ @compiler.scope
80
+ end
81
+
82
+ def s(*args)
83
+ @compiler.s(*args)
84
+ end
85
+
86
+ def expr?
87
+ @level == :expr
88
+ end
89
+
90
+ def recv?
91
+ @level == :recv
92
+ end
93
+
94
+ def stmt?
95
+ @level == :stmt
96
+ end
97
+
98
+ def process(sexp, level = :expr)
99
+ @compiler.process sexp, level
100
+ end
101
+
102
+ def expr(sexp)
103
+ @compiler.process sexp, :expr
104
+ end
105
+
106
+ def recv(sexp)
107
+ @compiler.process sexp, :recv
108
+ end
109
+
110
+ def stmt(sexp)
111
+ @compiler.process sexp, :stmt
112
+ end
113
+
114
+ def expr_or_nil(sexp)
115
+ sexp ? expr(sexp) : "nil"
116
+ end
117
+
118
+ def add_local(name)
119
+ scope.add_scope_local name.to_sym
120
+ end
121
+
122
+ def add_ivar(name)
123
+ scope.add_scope_ivar name
124
+ end
125
+
126
+ def add_gvar(name)
127
+ scope.add_scope_gvar name
128
+ end
129
+
130
+ def add_temp(temp)
131
+ scope.add_scope_temp temp
132
+ end
133
+
134
+ def helper(name)
135
+ @compiler.helper name
136
+ end
137
+
138
+ def with_temp(&block)
139
+ @compiler.with_temp(&block)
140
+ end
141
+
142
+ def in_while?
143
+ @compiler.in_while?
144
+ end
145
+
146
+ def while_loop
147
+ @compiler.instance_variable_get(:@while_loop)
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,283 @@
1
+ require 'set'
2
+ require 'opal/nodes/base'
3
+ require 'opal/nodes/runtime_helpers'
4
+
5
+ module Opal
6
+ module Nodes
7
+ class CallNode < Base
8
+ handle :call
9
+
10
+ children :recvr, :meth, :arglist, :iter
11
+
12
+ SPECIALS = {}
13
+
14
+ # Operators that get optimized by compiler
15
+ OPERATORS = { :+ => :plus, :- => :minus, :* => :times, :/ => :divide,
16
+ :< => :lt, :<= => :le, :> => :gt, :>= => :ge }
17
+
18
+ def self.add_special(name, options = {}, &handler)
19
+ SPECIALS[name] = options
20
+ define_method("handle_#{name}", &handler)
21
+ end
22
+
23
+ def compile
24
+ # handle some methods specially
25
+ handle_special
26
+
27
+ # some special methods need to skip compilation
28
+ return unless compile_default?
29
+
30
+ compiler.method_calls << meth.to_sym
31
+
32
+ # if trying to access an lvar in irb mode
33
+ return compile_irb_var if using_irb?
34
+
35
+ default_compile
36
+ end
37
+
38
+ def default_compile
39
+
40
+ mid = mid_to_jsid meth.to_s
41
+
42
+ splat = arglist[1..-1].any? { |a| a.first == :splat }
43
+
44
+ if Sexp === arglist.last and arglist.last.type == :block_pass
45
+ block = arglist.pop
46
+ elsif iter
47
+ block = iter
48
+ end
49
+
50
+ blktmp = scope.new_temp if block
51
+ tmprecv = scope.new_temp if splat || blktmp
52
+
53
+ # must do this after assigning temp variables
54
+ block = expr(block) if block
55
+
56
+ recv_code = recv(recv_sexp)
57
+ call_recv = s(:js_tmp, tmprecv || recv_code)
58
+
59
+ if blktmp and !splat
60
+ arglist.insert 1, call_recv
61
+ end
62
+
63
+ args = expr(arglist)
64
+
65
+ if tmprecv
66
+ push "(#{tmprecv} = ", recv_code, ")#{mid}"
67
+ else
68
+ push recv_code, mid
69
+ end
70
+
71
+ if blktmp
72
+ unshift "(#{blktmp} = "
73
+ push ", #{blktmp}.$$p = ", block, ", #{blktmp})"
74
+ end
75
+
76
+ if splat
77
+ push ".apply(", (tmprecv || recv_code), ", ", args, ")"
78
+ elsif blktmp
79
+ push ".call(", args, ")"
80
+ else
81
+ push "(", args, ")"
82
+ end
83
+
84
+ scope.queue_temp blktmp if blktmp
85
+ end
86
+
87
+ def recv_sexp
88
+ recvr || s(:self)
89
+ end
90
+
91
+ def attr_assignment?
92
+ @assignment ||= meth.to_s =~ /^[\da-z]+\=$/i
93
+ end
94
+
95
+ # Used to generate the code to use this sexp as an ivar var reference
96
+ def compile_irb_var
97
+ with_temp do |tmp|
98
+ lvar = variable(meth)
99
+ call = s(:call, s(:self), meth.intern, s(:arglist))
100
+ push "((#{tmp} = $opal.irb_vars.#{lvar}) == null ? ", expr(call), " : #{tmp})"
101
+ end
102
+ end
103
+
104
+ def compile_assignment
105
+ with_temp do |args_tmp|
106
+ with_temp do |recv_tmp|
107
+ args = expr(arglist)
108
+ mid = mid_to_jsid meth.to_s
109
+ push "((#{args_tmp} = [", args, "]), "+
110
+ "#{recv_tmp} = ", recv(recv_sexp), ", ",
111
+ recv_tmp, mid, ".apply(#{recv_tmp}, #{args_tmp}), "+
112
+ "#{args_tmp}[#{args_tmp}.length-1])"
113
+ end
114
+ end
115
+ end
116
+
117
+ # a variable reference in irb mode in top scope might be a var ref,
118
+ # or it might be a method call
119
+ def using_irb?
120
+ @compiler.irb? and scope.top? and arglist == s(:arglist) and recvr.nil? and iter.nil?
121
+ end
122
+
123
+ # Handle "special" method calls, e.g. require(). Subclasses can override
124
+ # this method. If this method returns nil, then the method will continue
125
+ # to be generated by CallNode.
126
+ def handle_special
127
+ @compile_default = true
128
+
129
+ if SPECIALS.include? meth
130
+ @compile_default = false
131
+ __send__("handle_#{meth}")
132
+ elsif RuntimeHelpers.compatible?(recvr, meth, arglist)
133
+ @compile_default = false
134
+ push(RuntimeHelpers.new(@sexp, @level, @compiler).compile)
135
+ end
136
+ end
137
+
138
+ def compile_default!
139
+ @compile_default = true
140
+ end
141
+
142
+ def compile_default?
143
+ @compile_default
144
+ end
145
+
146
+ OPERATORS.each do |operator, name|
147
+ add_special(operator.to_sym) do
148
+ if compiler.inline_operators?
149
+ compiler.operator_helpers << operator.to_sym
150
+ lhs, rhs = expr(recvr), expr(arglist[1])
151
+
152
+ push fragment("$rb_#{name}(")
153
+ push lhs
154
+ push fragment(", ")
155
+ push rhs
156
+ push fragment(")")
157
+ else
158
+ compile_default!
159
+ end
160
+ end
161
+ end
162
+
163
+ add_special :require do
164
+ compile_default!
165
+ str = DependencyResolver.new(compiler, arglist[1]).resolve
166
+ compiler.requires << str unless str.nil?
167
+ push fragment('')
168
+ end
169
+
170
+ add_special :require_relative do
171
+ arg = arglist[1]
172
+ file = compiler.file
173
+ if arg[0] == :str
174
+ compiler.requires << arg[1]
175
+ end
176
+ push fragment("self.$require(#{file.inspect}+ '/../' + ")
177
+ push process(arglist)
178
+ push fragment(')')
179
+ end
180
+
181
+ add_special :autoload do
182
+ if scope.class_scope?
183
+ compile_default!
184
+ str = DependencyResolver.new(compiler, arglist[2]).resolve
185
+ compiler.requires << str unless str.nil?
186
+ push fragment('')
187
+ end
188
+ end
189
+
190
+ add_special :require_tree do
191
+ arg = arglist[1]
192
+ if arg[0] == :str
193
+ dir = File.dirname(compiler.file)
194
+ relative_path = arg[1]
195
+ full_path = Pathname(dir).join(relative_path).cleanpath.to_s
196
+ compiler.required_trees << full_path
197
+ arg[1] = full_path
198
+ end
199
+ compile_default!
200
+ push fragment('')
201
+ end
202
+
203
+ add_special :block_given? do
204
+ push compiler.handle_block_given_call @sexp
205
+ end
206
+
207
+ add_special :__callee__ do
208
+ if scope.def?
209
+ push fragment scope.mid.to_s.inspect
210
+ else
211
+ push fragment 'nil'
212
+ end
213
+ end
214
+
215
+ add_special :__method__ do
216
+ if scope.def?
217
+ push fragment scope.mid.to_s.inspect
218
+ else
219
+ push fragment 'nil'
220
+ end
221
+ end
222
+
223
+ add_special :debugger do
224
+ push fragment 'debugger'
225
+ end
226
+
227
+ class DependencyResolver
228
+ def initialize(compiler, sexp)
229
+ @compiler = compiler
230
+ @sexp = sexp
231
+ end
232
+
233
+ def resolve
234
+ handle_part @sexp
235
+ end
236
+
237
+ def handle_part(sexp)
238
+ type = sexp.type
239
+
240
+ if type == :str
241
+ return sexp[1]
242
+ elsif type == :call
243
+ _, recv, meth, args = sexp
244
+
245
+ parts = args[1..-1].map { |s| handle_part s }
246
+
247
+ if recv == [:const, :File]
248
+ if meth == :expand_path
249
+ return expand_path(*parts)
250
+ elsif meth == :join
251
+ return expand_path parts.join('/')
252
+ elsif meth == :dirname
253
+ return expand_path parts[0].split('/')[0...-1].join('/')
254
+ end
255
+ end
256
+ end
257
+
258
+ msg = "Cannot handle dynamic require"
259
+ case @compiler.dynamic_require_severity
260
+ when :error
261
+ @compiler.error msg, @sexp.line
262
+ when :warning
263
+ @compiler.warning msg, @sexp.line
264
+ end
265
+ end
266
+
267
+ def expand_path(path, base = '')
268
+ "#{base}/#{path}".split("/").inject([]) do |p, part|
269
+ if part == ''
270
+ # we had '//', so ignore
271
+ elsif part == '..'
272
+ p.pop
273
+ else
274
+ p << part
275
+ end
276
+
277
+ p
278
+ end.join "/"
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end