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,307 @@
1
+ require 'set'
2
+ require 'opal/parser'
3
+ require 'opal/fragment'
4
+ require 'opal/nodes'
5
+
6
+ module Opal
7
+ def self.compile(source, options = {})
8
+ Compiler.new(source, options).compile
9
+ end
10
+
11
+ class Compiler
12
+ # Generated code gets indented with two spaces on each scope
13
+ INDENT = ' '
14
+
15
+ # All compare method nodes - used to optimize performance of
16
+ # math comparisons
17
+ COMPARE = %w[< > <= >=]
18
+
19
+ # defines a compiler option, also creating method of form 'name?'
20
+ def self.compiler_option(name, default_value, options = {})
21
+ mid = options[:as]
22
+ valid_values = options[:valid_values]
23
+ define_method(mid || name) do
24
+ value = @options.fetch(name) { default_value }
25
+ raise ArgumentError if valid_values and not(valid_values.include?(value))
26
+ value
27
+ end
28
+ end
29
+
30
+ # used for __FILE__ directives as well as finding relative require()
31
+ compiler_option :file, '(file)'
32
+
33
+ # adds method stubs for all used methods in file
34
+ compiler_option :method_missing, true, :as => :method_missing?
35
+
36
+ # adds an arity check to every method definition
37
+ compiler_option :arity_check, false, :as => :arity_check?
38
+
39
+ # compile top level local vars with support for irb style vars
40
+ compiler_option :irb, false, :as => :irb?
41
+
42
+ # how to handle dynamic requires (:error, :warning, :ignore)
43
+ compiler_option :dynamic_require_severity, :error, :valid_values => [:error, :warning, :ignore]
44
+
45
+ # Prepare the code for future requires
46
+ compiler_option :requirable, false, :as => :requirable?
47
+
48
+ # are operators compiled inline
49
+ compiler_option :inline_operators, false, :as => :inline_operators?
50
+
51
+ attr_reader :result, :fragments
52
+
53
+ # Current scope
54
+ attr_accessor :scope
55
+
56
+ # Current case_stmt
57
+ attr_reader :case_stmt
58
+
59
+ # Any content in __END__ special construct
60
+ attr_reader :eof_content
61
+
62
+ def initialize(source, options = {})
63
+ @source = source
64
+ @indent = ''
65
+ @unique = 0
66
+ @options = options
67
+ end
68
+
69
+ # Compile some ruby code to a string.
70
+ def compile
71
+ @parser = Parser.new
72
+
73
+ @sexp = s(:top, @parser.parse(@source, self.file) || s(:nil))
74
+ @eof_content = @parser.lexer.eof_content
75
+
76
+ @fragments = process(@sexp).flatten
77
+
78
+ @result = @fragments.map(&:code).join('')
79
+ end
80
+
81
+ def source_map(source_file = nil)
82
+ Opal::SourceMap.new(@fragments, source_file || self.file)
83
+ end
84
+
85
+ # Any helpers required by this file
86
+ def helpers
87
+ @helpers ||= Set.new([:breaker, :slice])
88
+ end
89
+
90
+ # Operator helpers
91
+ def operator_helpers
92
+ @operator_helpers ||= Set.new
93
+ end
94
+
95
+ # Method calls made in this file
96
+ def method_calls
97
+ @method_calls ||= Set.new
98
+ end
99
+
100
+ # This is called when a parsing/processing error occurs. This
101
+ # method simply appends the filename and curent line number onto
102
+ # the message and raises it.
103
+ def error(msg, line = nil)
104
+ raise SyntaxError, "#{msg} :#{file}:#{line}"
105
+ end
106
+
107
+ # This is called when a parsing/processing warning occurs. This
108
+ # method simply appends the filename and curent line number onto
109
+ # the message and issues a warning.
110
+ def warning(msg, line = nil)
111
+ warn "WARNING: #{msg} :#{file}:#{line}"
112
+ end
113
+
114
+ # Instances of `Scope` can use this to determine the current
115
+ # scope indent. The indent is used to keep generated code easily
116
+ # readable.
117
+ def parser_indent
118
+ @indent
119
+ end
120
+
121
+ # Create a new sexp using the given parts. Even though this just
122
+ # returns an array, it must be used incase the internal structure
123
+ # of sexps does change.
124
+ def s(*parts)
125
+ Sexp.new(parts)
126
+ end
127
+
128
+ def fragment(str, sexp = nil)
129
+ Fragment.new(str, sexp)
130
+ end
131
+
132
+ # Used to generate a unique id name per file. These are used
133
+ # mainly to name method bodies for methods that use blocks.
134
+ def unique_temp
135
+ "TMP_#{@unique += 1}"
136
+ end
137
+
138
+ # Use the given helper
139
+ def helper(name)
140
+ self.helpers << name
141
+ end
142
+
143
+ # To keep code blocks nicely indented, this will yield a block after
144
+ # adding an extra layer of indent, and then returning the resulting
145
+ # code after reverting the indent.
146
+ def indent(&block)
147
+ indent = @indent
148
+ @indent += INDENT
149
+ @space = "\n#@indent"
150
+ res = yield
151
+ @indent = indent
152
+ @space = "\n#@indent"
153
+ res
154
+ end
155
+
156
+ # Temporary varibales will be needed from time to time in the
157
+ # generated code, and this method will assign (or reuse) on
158
+ # while the block is yielding, and queue it back up once it is
159
+ # finished. Variables are queued once finished with to save the
160
+ # numbers of variables needed at runtime.
161
+ def with_temp(&block)
162
+ tmp = @scope.new_temp
163
+ res = yield tmp
164
+ @scope.queue_temp tmp
165
+ res
166
+ end
167
+
168
+ # Used when we enter a while statement. This pushes onto the current
169
+ # scope's while stack so we know how to handle break, next etc.
170
+ def in_while
171
+ return unless block_given?
172
+ @while_loop = @scope.push_while
173
+ result = yield
174
+ @scope.pop_while
175
+
176
+ result
177
+ end
178
+
179
+ def in_case
180
+ return unless block_given?
181
+ old = @case_stmt
182
+ @case_stmt = {}
183
+ yield
184
+ @case_stmt = old
185
+ end
186
+
187
+ # Returns true if the parser is curently handling a while sexp,
188
+ # false otherwise.
189
+ def in_while?
190
+ @scope.in_while?
191
+ end
192
+
193
+ # Process the given sexp by creating a node instance, based on its type,
194
+ # and compiling it to fragments.
195
+ def process(sexp, level = :expr)
196
+ return fragment('') if sexp == nil
197
+
198
+ if handler = handlers[sexp.type]
199
+ return handler.new(sexp, level, self).compile_to_fragments
200
+ else
201
+ raise "Unsupported sexp: #{sexp.type}"
202
+ end
203
+ end
204
+
205
+ def handlers
206
+ @handlers ||= Opal::Nodes::Base.handlers
207
+ end
208
+
209
+ # An array of requires used in this file
210
+ def requires
211
+ @requires ||= []
212
+ end
213
+
214
+ # An array of trees required in this file
215
+ # (typically by calling #require_tree)
216
+ def required_trees
217
+ @required_trees ||= []
218
+ end
219
+
220
+ # The last sexps in method bodies, for example, need to be returned
221
+ # in the compiled javascript. Due to syntax differences between
222
+ # javascript any ruby, some sexps need to be handled specially. For
223
+ # example, `if` statemented cannot be returned in javascript, so
224
+ # instead the "truthy" and "falsy" parts of the if statement both
225
+ # need to be returned instead.
226
+ #
227
+ # Sexps that need to be returned are passed to this method, and the
228
+ # alterned/new sexps are returned and should be used instead. Most
229
+ # sexps can just be added into a s(:return) sexp, so that is the
230
+ # default action if no special case is required.
231
+ def returns(sexp)
232
+ return returns s(:nil) unless sexp
233
+
234
+ case sexp.type
235
+ when :break, :next, :redo
236
+ sexp
237
+ when :yield
238
+ sexp[0] = :returnable_yield
239
+ sexp
240
+ when :scope
241
+ sexp[1] = returns sexp[1]
242
+ sexp
243
+ when :block
244
+ if sexp.length > 1
245
+ sexp[-1] = returns sexp[-1]
246
+ else
247
+ sexp << returns(s(:nil))
248
+ end
249
+ sexp
250
+ when :when
251
+ sexp[2] = returns(sexp[2])
252
+ sexp
253
+ when :rescue
254
+ sexp[1] = returns sexp[1]
255
+
256
+ if sexp[2] and sexp[2][0] == :resbody
257
+ if sexp[2][2]
258
+ sexp[2][2] = returns sexp[2][2]
259
+ else
260
+ sexp[2][2] = returns s(:nil)
261
+ end
262
+ end
263
+ sexp
264
+ when :ensure
265
+ sexp[1] = returns sexp[1]
266
+ sexp
267
+ when :begin
268
+ sexp[1] = returns sexp[1]
269
+ sexp
270
+ when :rescue_mod
271
+ sexp[1] = returns sexp[1]
272
+ sexp[2] = returns sexp[2]
273
+ sexp
274
+ when :while
275
+ # sexp[2] = returns(sexp[2])
276
+ sexp
277
+ when :return, :js_return
278
+ sexp
279
+ when :xstr
280
+ sexp[1] = "return #{sexp[1]};" unless /return|;/ =~ sexp[1]
281
+ sexp
282
+ when :dxstr
283
+ sexp[1] = "return #{sexp[1]}" unless /return|;|\n/ =~ sexp[1]
284
+ sexp
285
+ when :if
286
+ sexp[2] = returns(sexp[2] || s(:nil))
287
+ sexp[3] = returns(sexp[3] || s(:nil))
288
+ sexp
289
+ else
290
+ s(:js_return, sexp).tap { |s|
291
+ s.source = sexp.source
292
+ }
293
+ end
294
+ end
295
+
296
+ def handle_block_given_call(sexp)
297
+ @scope.uses_block!
298
+ if @scope.block_name
299
+ fragment("(#{@scope.block_name} !== nil)", sexp)
300
+ elsif scope = @scope.find_parent_def and scope.block_name
301
+ fragment("(#{scope.block_name} !== nil)", sexp)
302
+ else
303
+ fragment("false", sexp)
304
+ end
305
+ end
306
+ end
307
+ end
@@ -0,0 +1,64 @@
1
+ require 'opal/compiler'
2
+
3
+ module Opal
4
+ module ERB
5
+ def self.compile(source, file_name = '(erb)')
6
+ Compiler.new(source, file_name).compile
7
+ end
8
+
9
+ class Compiler
10
+ def initialize(source, file_name = '(erb)')
11
+ @source, @file_name, @result = source, file_name, source
12
+ end
13
+
14
+ def prepared_source
15
+ @prepared_source ||= begin
16
+ source = @source
17
+ source = fix_quotes(source)
18
+ source = find_contents(source)
19
+ source = find_code(source)
20
+ source = wrap_compiled(source)
21
+ source = require_erb(source)
22
+ source
23
+ end
24
+ end
25
+
26
+ def compile
27
+ Opal.compile prepared_source
28
+ end
29
+
30
+ def fix_quotes(result)
31
+ result.gsub '"', '\\"'
32
+ end
33
+
34
+ BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
35
+
36
+ def require_erb(result)
37
+ 'require "erb";'+result
38
+ end
39
+
40
+ def find_contents(result)
41
+ result.gsub(/<%=([\s\S]+?)%>/) do
42
+ inner = $1.gsub(/\\'/, "'").gsub(/\\"/, '"')
43
+
44
+ if inner =~ BLOCK_EXPR
45
+ "\")\noutput_buffer.append= #{ inner }\noutput_buffer.append(\""
46
+ else
47
+ "\")\noutput_buffer.append=(#{ inner })\noutput_buffer.append(\""
48
+ end
49
+ end
50
+ end
51
+
52
+ def find_code(result)
53
+ result.gsub(/<%([\s\S]+?)%>/) do
54
+ "\")\n#{ $1 }\noutput_buffer.append(\""
55
+ end
56
+ end
57
+
58
+ def wrap_compiled(result)
59
+ path = @file_name.sub(/\.opalerb$/, '')
60
+ result = "Template.new('#{path}') do |output_buffer|\noutput_buffer.append(\"#{result}\")\noutput_buffer.join\nend\n"
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,41 @@
1
+ module Opal
2
+ # A fragment holds a string of generated javascript that will be written
3
+ # to the destination. It also keeps hold of the original sexp from which
4
+ # it was generated. Using this sexp, when writing fragments in order, a
5
+ # mapping can be created of the original location => target location,
6
+ # aka, source-maps!
7
+ class Fragment
8
+ # String of javascript this fragment holds
9
+ attr_reader :code
10
+
11
+ def initialize(code, sexp = nil)
12
+ @code = code.to_s
13
+ @sexp = sexp
14
+ end
15
+
16
+ # In debug mode we may wish to include the original line as a comment
17
+ def to_code
18
+ if @sexp
19
+ "/*:#{@sexp.line}:#{@sexp.column}*/#{@code}"
20
+ else
21
+ @code
22
+ end
23
+ end
24
+
25
+ # debug:
26
+ # alias code to_code
27
+
28
+ # inspect the contents of this fragment, f("fooo")
29
+ def inspect
30
+ "f(#{@code.inspect})"
31
+ end
32
+
33
+ def line
34
+ @sexp.line if @sexp
35
+ end
36
+
37
+ def column
38
+ @sexp.column if @sexp
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ require 'hike'
2
+ require 'pathname'
3
+
4
+ module Opal
5
+ class HikePathFinder < Hike::Trail
6
+ def initialize(paths = Opal.paths)
7
+ super()
8
+ append_paths(*paths)
9
+ append_extensions '.js', '.js.rb', '.rb', '.opalerb'
10
+ end
11
+
12
+ def find path
13
+ pathname = Pathname(path)
14
+ return path if pathname.absolute? and pathname.exist?
15
+ super
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ require 'opal/nodes/base'
2
+ require 'opal/nodes/literal'
3
+ require 'opal/nodes/variables'
4
+ require 'opal/nodes/constants'
5
+ require 'opal/nodes/call'
6
+ require 'opal/nodes/call_special'
7
+ require 'opal/nodes/module'
8
+ require 'opal/nodes/class'
9
+ require 'opal/nodes/singleton_class'
10
+ require 'opal/nodes/iter'
11
+ require 'opal/nodes/def'
12
+ require 'opal/nodes/if'
13
+ require 'opal/nodes/logic'
14
+ require 'opal/nodes/definitions'
15
+ require 'opal/nodes/yield'
16
+ require 'opal/nodes/rescue'
17
+ require 'opal/nodes/case'
18
+ require 'opal/nodes/super'
19
+ require 'opal/nodes/top'
20
+ require 'opal/nodes/while'
21
+ require 'opal/nodes/for'
22
+ require 'opal/nodes/hash'
23
+ require 'opal/nodes/array'
24
+ require 'opal/nodes/defined'
25
+ require 'opal/nodes/masgn'
26
+ require 'opal/nodes/arglist'