opal 0.8.1 → 0.9.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 (331) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/.gitmodules +3 -3
  4. data/.jshintrc +17 -20
  5. data/.travis.yml +22 -11
  6. data/CHANGELOG.md +51 -1
  7. data/CODE_OF_CONDUCT.md +15 -0
  8. data/CONTRIBUTING.md +125 -9
  9. data/Gemfile +1 -1
  10. data/Guardfile +2 -2
  11. data/README.md +95 -29
  12. data/Rakefile +1 -1
  13. data/benchmark/benchmarks +103 -0
  14. data/benchmark/bm_array_flatten.rb +9 -0
  15. data/benchmark/bm_array_intersection_numbers.rb +7 -0
  16. data/benchmark/bm_array_intersection_objects.rb +7 -0
  17. data/benchmark/bm_array_intersection_strings.rb +7 -0
  18. data/benchmark/bm_array_join_ary.rb +9 -0
  19. data/benchmark/bm_array_minus_numbers.rb +7 -0
  20. data/benchmark/bm_array_minus_objects.rb +7 -0
  21. data/benchmark/bm_array_minus_strings.rb +7 -0
  22. data/benchmark/bm_array_union_numbers.rb +7 -0
  23. data/benchmark/bm_array_union_objects.rb +7 -0
  24. data/benchmark/bm_array_union_strings.rb +7 -0
  25. data/benchmark/bm_array_uniq_bang_numbers.rb +5 -0
  26. data/benchmark/bm_array_uniq_bang_objects.rb +5 -0
  27. data/benchmark/bm_array_uniq_bang_strings.rb +5 -0
  28. data/benchmark/bm_array_uniq_numbers.rb +5 -0
  29. data/benchmark/bm_array_uniq_objects.rb +5 -0
  30. data/benchmark/bm_array_uniq_strings.rb +5 -0
  31. data/benchmark/bm_dispatch_bind_table.rb +57 -0
  32. data/benchmark/bm_dispatch_code_gen.rb +65 -0
  33. data/benchmark/bm_dispatch_code_gen_if.rb +64 -0
  34. data/benchmark/bm_dispatch_hardcoded.rb +44 -0
  35. data/benchmark/bm_dispatch_send.rb +38 -0
  36. data/benchmark/bm_dispatch_send_table.rb +57 -0
  37. data/benchmark/bm_hash_assoc_object.rb +11 -0
  38. data/benchmark/bm_hash_assoc_string.rb +9 -0
  39. data/benchmark/bm_hash_clone_object.rb +9 -0
  40. data/benchmark/bm_hash_clone_string.rb +9 -0
  41. data/benchmark/bm_hash_delete_object.rb +11 -0
  42. data/benchmark/bm_hash_delete_string.rb +9 -0
  43. data/benchmark/bm_hash_each_key_object.rb +9 -0
  44. data/benchmark/bm_hash_each_key_string.rb +9 -0
  45. data/benchmark/bm_hash_each_object.rb +9 -0
  46. data/benchmark/bm_hash_each_string.rb +9 -0
  47. data/benchmark/bm_hash_each_value_object.rb +9 -0
  48. data/benchmark/bm_hash_each_value_string.rb +9 -0
  49. data/benchmark/bm_hash_element_reference_object.rb +11 -0
  50. data/benchmark/bm_hash_element_reference_string.rb +9 -0
  51. data/benchmark/bm_hash_element_set_object.rb +5 -0
  52. data/benchmark/bm_hash_element_set_string.rb +5 -0
  53. data/benchmark/bm_hash_equal_value_object.rb +14 -0
  54. data/benchmark/bm_hash_equal_value_string.rb +11 -0
  55. data/benchmark/bm_hash_fetch_object.rb +11 -0
  56. data/benchmark/bm_hash_fetch_string.rb +9 -0
  57. data/benchmark/bm_hash_flatten_object.rb +9 -0
  58. data/benchmark/bm_hash_flatten_string.rb +9 -0
  59. data/benchmark/bm_hash_has_key_object.rb +11 -0
  60. data/benchmark/bm_hash_has_key_string.rb +9 -0
  61. data/benchmark/bm_hash_has_value_object.rb +9 -0
  62. data/benchmark/bm_hash_has_value_string.rb +9 -0
  63. data/benchmark/bm_hash_hash_object.rb +9 -0
  64. data/benchmark/bm_hash_hash_string.rb +9 -0
  65. data/benchmark/bm_hash_inspect_object.rb +9 -0
  66. data/benchmark/bm_hash_inspect_string.rb +9 -0
  67. data/benchmark/bm_hash_invert_object.rb +9 -0
  68. data/benchmark/bm_hash_invert_string.rb +9 -0
  69. data/benchmark/bm_hash_keep_if_object.rb +9 -0
  70. data/benchmark/bm_hash_keep_if_string.rb +9 -0
  71. data/benchmark/bm_hash_key_object.rb +9 -0
  72. data/benchmark/bm_hash_key_string.rb +9 -0
  73. data/benchmark/bm_hash_keys_object.rb +9 -0
  74. data/benchmark/bm_hash_keys_string.rb +9 -0
  75. data/benchmark/bm_hash_literal_mixed_large.rb +3 -0
  76. data/benchmark/bm_hash_literal_mixed_small.rb +3 -0
  77. data/benchmark/bm_hash_literal_object_large.rb +4 -0
  78. data/benchmark/bm_hash_literal_object_small.rb +3 -0
  79. data/benchmark/bm_hash_literal_string_large.rb +4 -0
  80. data/benchmark/bm_hash_literal_string_small.rb +3 -0
  81. data/benchmark/bm_hash_merge_object.rb +22 -0
  82. data/benchmark/bm_hash_merge_string.rb +18 -0
  83. data/benchmark/bm_hash_rassoc_object.rb +9 -0
  84. data/benchmark/bm_hash_rassoc_string.rb +9 -0
  85. data/benchmark/bm_hash_rehash_object.rb +9 -0
  86. data/benchmark/bm_hash_rehash_string.rb +9 -0
  87. data/benchmark/bm_hash_reject_bang_object.rb +9 -0
  88. data/benchmark/bm_hash_reject_bang_string.rb +9 -0
  89. data/benchmark/bm_hash_reject_object.rb +9 -0
  90. data/benchmark/bm_hash_reject_string.rb +9 -0
  91. data/benchmark/bm_hash_replace_object.rb +18 -0
  92. data/benchmark/bm_hash_replace_string.rb +14 -0
  93. data/benchmark/bm_hash_select_bang_object.rb +9 -0
  94. data/benchmark/bm_hash_select_bang_string.rb +9 -0
  95. data/benchmark/bm_hash_select_object.rb +9 -0
  96. data/benchmark/bm_hash_select_string.rb +9 -0
  97. data/benchmark/bm_hash_shift_object.rb +10 -0
  98. data/benchmark/bm_hash_shift_string.rb +10 -0
  99. data/benchmark/bm_hash_to_a_object.rb +9 -0
  100. data/benchmark/bm_hash_to_a_string.rb +9 -0
  101. data/benchmark/bm_hash_to_h_object.rb +10 -0
  102. data/benchmark/bm_hash_to_h_string.rb +10 -0
  103. data/benchmark/bm_hash_values_object.rb +9 -0
  104. data/benchmark/bm_hash_values_string.rb +9 -0
  105. data/benchmark/run.rb +48 -0
  106. data/bin/opal-mspec +1 -1
  107. data/bin/opal-repl +4 -4
  108. data/docs/compiled_ruby.md +214 -56
  109. data/docs/configuring_gems.md +2 -2
  110. data/docs/faq.md +2 -2
  111. data/docs/getting_started.md +19 -2
  112. data/docs/jquery.md +5 -5
  113. data/docs/opal_parser.md +53 -0
  114. data/docs/unsupported_features.md +2 -2
  115. data/docs/upgrading.md +22 -0
  116. data/docs/using_sprockets.md +15 -0
  117. data/examples/rack/config.ru +13 -0
  118. data/examples/sinatra/config.ru +4 -5
  119. data/lib/mspec/opal/runner.rb +54 -11
  120. data/lib/opal.rb +1 -1
  121. data/lib/opal/builder.rb +1 -1
  122. data/lib/opal/builder_processors.rb +1 -1
  123. data/lib/opal/cli.rb +17 -13
  124. data/lib/opal/cli_options.rb +1 -1
  125. data/lib/opal/compiler.rb +12 -0
  126. data/lib/opal/config.rb +4 -0
  127. data/lib/opal/nodes/arglist.rb +5 -7
  128. data/lib/opal/nodes/call.rb +6 -1
  129. data/lib/opal/nodes/call_special.rb +74 -0
  130. data/lib/opal/nodes/def.rb +35 -28
  131. data/lib/opal/nodes/definitions.rb +3 -5
  132. data/lib/opal/nodes/for.rb +13 -0
  133. data/lib/opal/nodes/helpers.rb +15 -1
  134. data/lib/opal/nodes/if.rb +5 -5
  135. data/lib/opal/nodes/iter.rb +6 -1
  136. data/lib/opal/nodes/literal.rb +1 -1
  137. data/lib/opal/nodes/logic.rb +2 -2
  138. data/lib/opal/nodes/masgn.rb +1 -2
  139. data/lib/opal/nodes/module.rb +2 -1
  140. data/lib/opal/nodes/rescue.rb +10 -1
  141. data/lib/opal/nodes/scope.rb +8 -2
  142. data/lib/opal/nodes/singleton_class.rb +1 -1
  143. data/lib/opal/nodes/top.rb +11 -0
  144. data/lib/opal/nodes/variables.rb +4 -4
  145. data/lib/opal/parser.rb +21 -3
  146. data/lib/opal/parser/grammar.rb +3115 -2961
  147. data/lib/opal/parser/grammar.y +29 -6
  148. data/lib/opal/parser/lexer.rb +18 -8
  149. data/lib/opal/sprockets.rb +85 -0
  150. data/lib/opal/sprockets/processor.rb +11 -35
  151. data/lib/opal/sprockets/server.rb +3 -15
  152. data/lib/opal/version.rb +2 -2
  153. data/opal.gemspec +4 -4
  154. data/opal/README.md +9 -0
  155. data/opal/corelib/array.rb +433 -181
  156. data/opal/corelib/basic_object.rb +48 -4
  157. data/opal/corelib/boolean.rb +15 -6
  158. data/opal/corelib/class.rb +6 -5
  159. data/opal/corelib/comparable.rb +12 -0
  160. data/opal/corelib/complex.rb +282 -0
  161. data/opal/corelib/constants.rb +9 -0
  162. data/opal/corelib/enumerable.rb +83 -34
  163. data/opal/corelib/enumerator.rb +3 -1
  164. data/opal/corelib/error.rb +49 -10
  165. data/opal/corelib/file.rb +1 -0
  166. data/opal/corelib/hash.rb +353 -577
  167. data/opal/corelib/helpers.rb +20 -0
  168. data/opal/corelib/kernel.rb +114 -59
  169. data/opal/corelib/math.rb +470 -0
  170. data/opal/corelib/method.rb +11 -2
  171. data/opal/corelib/module.rb +96 -96
  172. data/opal/corelib/{nil_class.rb → nil.rb} +20 -1
  173. data/opal/corelib/number.rb +751 -0
  174. data/opal/corelib/numeric.rb +77 -437
  175. data/opal/corelib/proc.rb +81 -1
  176. data/opal/corelib/process.rb +27 -0
  177. data/opal/corelib/rational.rb +358 -0
  178. data/opal/corelib/regexp.rb +156 -27
  179. data/opal/corelib/runtime.js +724 -335
  180. data/opal/corelib/string.rb +93 -104
  181. data/opal/corelib/string/encoding.rb +177 -0
  182. data/opal/corelib/string/inheritance.rb +2 -0
  183. data/opal/corelib/struct.rb +105 -18
  184. data/opal/corelib/time.rb +267 -146
  185. data/opal/corelib/unsupported.rb +216 -0
  186. data/opal/corelib/variables.rb +0 -6
  187. data/opal/opal.rb +8 -22
  188. data/opal/opal/base.rb +9 -0
  189. data/opal/opal/mini.rb +17 -0
  190. data/spec/README.md +1 -1
  191. data/spec/filters/bugs/array.rb +38 -136
  192. data/spec/filters/bugs/{basic_object.rb → basicobject.rb} +14 -15
  193. data/spec/filters/bugs/class.rb +6 -12
  194. data/spec/filters/bugs/complex.rb +3 -0
  195. data/spec/filters/bugs/date.rb +162 -10
  196. data/spec/filters/bugs/enumerable.rb +31 -58
  197. data/spec/filters/bugs/enumerator.rb +42 -0
  198. data/spec/filters/bugs/exception.rb +66 -10
  199. data/spec/filters/bugs/float.rb +17 -0
  200. data/spec/filters/bugs/hash.rb +11 -97
  201. data/spec/filters/bugs/inheritance.rb +5 -0
  202. data/spec/filters/bugs/integer.rb +28 -0
  203. data/spec/filters/bugs/kernel.rb +304 -12
  204. data/spec/filters/bugs/language.rb +133 -399
  205. data/spec/filters/bugs/language_opal.rb +88 -0
  206. data/spec/filters/bugs/module.rb +203 -62
  207. data/spec/filters/bugs/numeric.rb +32 -0
  208. data/spec/filters/bugs/proc.rb +39 -0
  209. data/spec/filters/bugs/range.rb +148 -0
  210. data/spec/filters/bugs/regexp.rb +168 -0
  211. data/spec/filters/bugs/set.rb +46 -3
  212. data/spec/filters/bugs/singleton.rb +1 -2
  213. data/spec/filters/bugs/string.rb +59 -90
  214. data/spec/filters/bugs/strscan.rb +80 -0
  215. data/spec/filters/bugs/struct.rb +10 -20
  216. data/spec/filters/bugs/time.rb +17 -184
  217. data/spec/filters/bugs/unboundmethod.rb +22 -0
  218. data/spec/filters/unsupported/array.rb +163 -0
  219. data/spec/filters/unsupported/basicobject.rb +14 -0
  220. data/spec/filters/unsupported/bignum.rb +46 -0
  221. data/spec/filters/unsupported/class.rb +4 -0
  222. data/spec/filters/unsupported/delegator.rb +5 -0
  223. data/spec/filters/unsupported/enumerable.rb +11 -0
  224. data/spec/filters/unsupported/enumerator.rb +8 -9
  225. data/spec/filters/unsupported/fixnum.rb +14 -0
  226. data/spec/filters/unsupported/float.rb +41 -7
  227. data/spec/filters/unsupported/freeze.rb +45 -0
  228. data/spec/filters/unsupported/hash.rb +50 -0
  229. data/spec/filters/unsupported/integer.rb +3 -0
  230. data/spec/filters/unsupported/kernel.rb +31 -0
  231. data/spec/filters/unsupported/language.rb +17 -0
  232. data/spec/filters/unsupported/matchdata.rb +30 -0
  233. data/spec/filters/unsupported/math.rb +3 -0
  234. data/spec/filters/unsupported/module.rb +5 -3
  235. data/spec/filters/unsupported/pathname.rb +3 -0
  236. data/spec/filters/unsupported/privacy.rb +136 -0
  237. data/spec/filters/unsupported/proc.rb +3 -0
  238. data/spec/filters/unsupported/regexp.rb +59 -0
  239. data/spec/filters/unsupported/set.rb +4 -0
  240. data/spec/filters/unsupported/{marshal.rb → singleton.rb} +4 -2
  241. data/spec/filters/unsupported/{mutable_strings.rb → string.rb} +456 -336
  242. data/spec/filters/unsupported/struct.rb +3 -0
  243. data/spec/filters/unsupported/symbol.rb +5 -0
  244. data/spec/filters/unsupported/taint.rb +16 -0
  245. data/spec/filters/unsupported/thread.rb +5 -0
  246. data/spec/filters/unsupported/time.rb +197 -16
  247. data/spec/lib/cli_spec.rb +14 -4
  248. data/spec/lib/compiler_spec.rb +9 -1
  249. data/spec/lib/parser/call_spec.rb +18 -0
  250. data/spec/lib/parser/not_spec.rb +2 -8
  251. data/spec/lib/sprockets_spec.rb +24 -0
  252. data/spec/opal/core/array/intersection_spec.rb +38 -0
  253. data/spec/opal/core/array/minus_spec.rb +38 -0
  254. data/spec/opal/core/array/union_spec.rb +38 -0
  255. data/spec/opal/core/array/uniq_spec.rb +49 -0
  256. data/spec/opal/core/exception_spec.rb +7 -0
  257. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  258. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  259. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  260. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  261. data/spec/opal/core/hash/internals_spec.rb +332 -0
  262. data/spec/opal/core/helpers_spec.rb +14 -0
  263. data/spec/opal/core/kernel/freeze_spec.rb +1 -1
  264. data/spec/opal/core/kernel/raise_spec.rb +13 -0
  265. data/spec/opal/core/kernel/require_tree_spec.rb +9 -0
  266. data/spec/opal/core/language/class_spec.rb +55 -0
  267. data/spec/opal/core/language/fixtures/send.rb +1 -0
  268. data/spec/opal/core/language/keyword_arguments_spec.rb +11 -0
  269. data/spec/opal/core/language/send_spec.rb +5 -0
  270. data/spec/opal/core/method/to_proc_spec.rb +28 -0
  271. data/spec/opal/core/module/name_spec.rb +0 -17
  272. data/spec/opal/core/runtime/bridged_classes_spec.rb +2 -2
  273. data/spec/opal/core/runtime/eval_spec.rb +1 -1
  274. data/spec/opal/core/runtime/method_missing_spec.rb +6 -0
  275. data/spec/opal/core/runtime_spec.rb +51 -0
  276. data/spec/opal/stdlib/js_spec.rb +66 -0
  277. data/spec/opal/stdlib/native/hash_spec.rb +36 -0
  278. data/spec/rubyspecs +152 -273
  279. data/spec/spec_helper.rb +10 -11
  280. data/stdlib/base64.rb +9 -9
  281. data/stdlib/benchmark.rb +551 -4
  282. data/stdlib/console.rb +94 -0
  283. data/stdlib/date.rb +1 -1
  284. data/stdlib/encoding.rb +1 -170
  285. data/stdlib/js.rb +56 -0
  286. data/stdlib/json.rb +9 -14
  287. data/stdlib/math.rb +1 -370
  288. data/stdlib/native.rb +133 -63
  289. data/stdlib/nodejs/file.rb +5 -0
  290. data/stdlib/nodejs/fileutils.rb +13 -6
  291. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +1 -1
  292. data/stdlib/opal-parser.rb +1 -2
  293. data/stdlib/ostruct.rb +65 -6
  294. data/stdlib/pp.rb +2 -4
  295. data/stdlib/rbconfig.rb +1 -3
  296. data/stdlib/strscan.rb +164 -28
  297. data/tasks/benchmarking.rake +88 -0
  298. data/tasks/testing.rake +181 -55
  299. data/{lib/mspec/opal/special_calls.rb → tasks/testing/mspec_special_calls.rb} +1 -1
  300. data/{lib/mspec/opal/sprockets.js → tasks/testing/phantomjs1-sprockets.js} +17 -6
  301. data/test/opal/test_keyword.rb +590 -0
  302. data/vendored-minitest/minitest.rb +2 -2
  303. data/vendored-minitest/test/unit.rb +5 -0
  304. metadata +229 -62
  305. data/benchmarks/operators.rb +0 -11
  306. data/benchmarks/prova.js.rb +0 -13
  307. data/docs/libraries.md +0 -36
  308. data/lib/mspec/opal/new.html.erb +0 -1
  309. data/lib/mspec/opal/rake_task.rb +0 -248
  310. data/opal/corelib/match_data.rb +0 -128
  311. data/spec/filters/bugs/math.rb +0 -95
  312. data/spec/filters/bugs/nil.rb +0 -7
  313. data/spec/filters/bugs/opal.rb +0 -9
  314. data/spec/filters/bugs/regular_expressions.rb +0 -41
  315. data/spec/filters/bugs/stringscanner.rb +0 -33
  316. data/spec/filters/unsupported/encoding.rb +0 -102
  317. data/spec/filters/unsupported/frozen.rb +0 -92
  318. data/spec/filters/unsupported/hash_compare_by_identity.rb +0 -16
  319. data/spec/filters/unsupported/integer_size.rb +0 -59
  320. data/spec/filters/unsupported/method_added.rb +0 -10
  321. data/spec/filters/unsupported/private_constants.rb +0 -30
  322. data/spec/filters/unsupported/private_methods.rb +0 -55
  323. data/spec/filters/unsupported/random.rb +0 -4
  324. data/spec/filters/unsupported/rational_numbers.rb +0 -4
  325. data/spec/filters/unsupported/regular_expressions.rb +0 -137
  326. data/spec/filters/unsupported/ruby_exe.rb +0 -5
  327. data/spec/filters/unsupported/symbols.rb +0 -17
  328. data/spec/filters/unsupported/tainted.rb +0 -180
  329. data/spec/filters/unsupported/trusted.rb +0 -88
  330. data/stdlib/process.rb +0 -10
  331. data/tasks/documenting.rake +0 -37
data/stdlib/console.rb ADDED
@@ -0,0 +1,94 @@
1
+ require 'native'
2
+
3
+ # Manipulate the browser console.
4
+ #
5
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/console
6
+ class Console
7
+ include Native
8
+
9
+ # Clear the console.
10
+ def clear
11
+ `#@native.clear()`
12
+ end
13
+
14
+ # Print a stacktrace from the call site.
15
+ def trace
16
+ `#@native.trace()`
17
+ end
18
+
19
+ # Log the passed objects based on an optional initial format.
20
+ def log(*args)
21
+ `#@native.log.apply(#@native, args)`
22
+ end
23
+
24
+ # Log the passed objects based on an optional initial format as informational
25
+ # log.
26
+ def info(*args)
27
+ `#@native.info.apply(#@native, args)`
28
+ end
29
+
30
+ # Log the passed objects based on an optional initial format as warning.
31
+ def warn(*args)
32
+ `#@native.warn.apply(#@native, args)`
33
+ end
34
+
35
+ # Log the passed objects based on an optional initial format as error.
36
+ def error(*args)
37
+ `#@native.error.apply(#@native, args)`
38
+ end
39
+
40
+ # Time the given block with the given label.
41
+ def time(label, &block)
42
+ raise ArgumentError, "no block given" unless block
43
+
44
+ `#@native.time(label)`
45
+
46
+ begin
47
+ if block.arity == 0
48
+ instance_exec(&block)
49
+ else
50
+ block.call(self)
51
+ end
52
+ ensure
53
+ `#@native.timeEnd()`
54
+ end
55
+ end
56
+
57
+ # Group the given block.
58
+ def group(*args, &block)
59
+ raise ArgumentError, "no block given" unless block
60
+
61
+ `#@native.group.apply(#@native, args)`
62
+
63
+ begin
64
+ if block.arity == 0
65
+ instance_exec(&block)
66
+ else
67
+ block.call(self)
68
+ end
69
+ ensure
70
+ `#@native.groupEnd()`
71
+ end
72
+ end
73
+
74
+ # Group the given block but collapse it.
75
+ def group!(*args, &block)
76
+ return unless block_given?
77
+
78
+ `#@native.groupCollapsed.apply(#@native, args)`
79
+
80
+ begin
81
+ if block.arity == 0
82
+ instance_exec(&block)
83
+ else
84
+ block.call(self)
85
+ end
86
+ ensure
87
+ `#@native.groupEnd()`
88
+ end
89
+ end
90
+ end
91
+
92
+ if defined?(`Opal.global.console`)
93
+ $console = Console.new(`Opal.global.console`)
94
+ end
data/stdlib/date.rb CHANGED
@@ -10,7 +10,7 @@ class Date
10
10
 
11
11
  def parse(string)
12
12
  match = `/^(\d*)-(\d*)-(\d*)/.exec(string)`
13
- wrap `new Date(parseInt(match[1]), parseInt(match[2]) - 1, parseInt(match[3]))`
13
+ wrap `new Date(parseInt(match[1], 10), parseInt(match[2], 10) - 1, parseInt(match[3], 10))`
14
14
  end
15
15
 
16
16
  def today
data/stdlib/encoding.rb CHANGED
@@ -1,170 +1 @@
1
- require 'corelib/string'
2
-
3
- class Encoding
4
- def self.register(name, options = {}, &block)
5
- names = [name] + (options[:aliases] || [])
6
- encoding = Class.new(self, &block).
7
- new(name, names, options[:ascii] || false, options[:dummy] || false)
8
-
9
- names.each {|name|
10
- const_set name.sub('-', '_'), encoding
11
- }
12
- end
13
-
14
- def self.find(name)
15
- upcase_name = name.upcase
16
- return upcase_name if self === upcase_name
17
-
18
- constants.each {|const|
19
- encoding = const_get(const)
20
-
21
- if encoding.name == upcase_name || encoding.names.include?(upcase_name)
22
- return encoding
23
- end
24
- }
25
-
26
- raise ArgumentError, "unknown encoding name - #{name}"
27
- end
28
-
29
- class << self
30
- attr_accessor :default_external
31
- end
32
-
33
- attr_reader :name, :names
34
-
35
- def initialize(name, names, ascii, dummy)
36
- @name = name
37
- @names = names
38
- @ascii = ascii
39
- @dummy = dummy
40
- end
41
-
42
- def ascii_compatible?
43
- @ascii
44
- end
45
-
46
- def dummy?
47
- @dummy
48
- end
49
-
50
- def to_s
51
- @name
52
- end
53
-
54
- def inspect
55
- "#<Encoding:#{@name}#{" (dummy)" if @dummy}>"
56
- end
57
-
58
- # methods to implement per encoding
59
- def each_byte(*)
60
- raise NotImplementedError
61
- end
62
-
63
- def getbyte(*)
64
- raise NotImplementedError
65
- end
66
-
67
- def bytesize(*)
68
- raise NotImplementedError
69
- end
70
-
71
- class EncodingError < StandardError; end
72
- class CompatibilityError < EncodingError; end
73
- end
74
-
75
- Encoding.register "UTF-8", aliases: ["CP65001"], ascii: true do
76
- def each_byte(string, &block)
77
- %x{
78
- for (var i = 0, length = string.length; i < length; i++) {
79
- var code = string.charCodeAt(i);
80
-
81
- if (code <= 0x7f) {
82
- #{yield `code`};
83
- }
84
- else {
85
- var encoded = encodeURIComponent(string.charAt(i)).substr(1).split('%');
86
-
87
- for (var j = 0, encoded_length = encoded.length; j < encoded_length; j++) {
88
- #{yield `parseInt(encoded[j], 16)`};
89
- }
90
- }
91
- }
92
- }
93
- end
94
-
95
- def bytesize
96
- bytes.length
97
- end
98
- end
99
-
100
- Encoding.register "UTF-16LE" do
101
- def each_byte(string, &block)
102
- %x{
103
- for (var i = 0, length = string.length; i < length; i++) {
104
- var code = string.charCodeAt(i);
105
-
106
- #{yield `code & 0xff`};
107
- #{yield `code >> 8`};
108
- }
109
- }
110
- end
111
-
112
- def bytesize
113
- bytes.length
114
- end
115
- end
116
-
117
- Encoding.register "ASCII-8BIT", aliases: ["BINARY"], ascii: true do
118
- def each_byte(string, &block)
119
- %x{
120
- for (var i = 0, length = string.length; i < length; i++) {
121
- #{yield `string.charCodeAt(i) & 0xff`};
122
- }
123
- }
124
- end
125
-
126
- def bytesize
127
- bytes.length
128
- end
129
- end
130
-
131
- class String
132
- `def.encoding = #{Encoding::UTF_16LE}`
133
-
134
- def bytes
135
- each_byte.to_a
136
- end
137
-
138
- def bytesize
139
- @encoding.bytesize(self)
140
- end
141
-
142
- def each_byte(&block)
143
- return enum_for :each_byte unless block_given?
144
-
145
- @encoding.each_byte(self, &block)
146
-
147
- self
148
- end
149
-
150
- def encoding
151
- @encoding
152
- end
153
-
154
- def force_encoding(encoding)
155
- encoding = Encoding.find(encoding)
156
-
157
- return self if encoding == @encoding
158
-
159
- %x{
160
- var result = new String(self);
161
- result.encoding = encoding;
162
-
163
- return result;
164
- }
165
- end
166
-
167
- def getbyte(idx)
168
- @encoding.getbyte(self, idx)
169
- end
170
- end
1
+ warn "DEPRECATION: encoding is now part of the core library, requiring it is deprecated"
data/stdlib/js.rb ADDED
@@ -0,0 +1,56 @@
1
+ # The JS module provides syntax sugar for calling native javascript
2
+ # operators (e.g. typeof, instanceof, new, delete) and global functions
3
+ # (e.g. parseFloat, parseInt).
4
+ module JS
5
+ # Use delete to remove a property from an object.
6
+ def delete(object, property)
7
+ `delete #{object}[#{property}]`
8
+ end
9
+
10
+ # The global object
11
+ def global
12
+ `Opal.global`
13
+ end
14
+
15
+ # Use in to check for a property in an object.
16
+ def in(property, object)
17
+ `#{property} in #{object}`
18
+ end
19
+
20
+ # Use instanceof to return whether value is an instance of the function.
21
+ def instanceof(value, func)
22
+ `#{value} instanceof #{func}`
23
+ end
24
+
25
+ # Use new to create a new instance of the prototype of the function.
26
+ def new(func, *args, &block)
27
+ args << block if block
28
+ f = `function(){return func.apply(this, args)}`
29
+ f.JS[:prototype] = func.JS[:prototype]
30
+ `new f()`
31
+ end
32
+
33
+ # Use typeof to return the underlying javascript type of value.
34
+ # Note that for undefined values, this will not work exactly like
35
+ # the javascript typeof operator, as the argument is evaluated before
36
+ # the function call.
37
+ def typeof(value)
38
+ `typeof #{value}`
39
+ end
40
+
41
+ # Use void to return undefined.
42
+ def void(expr)
43
+ # Could use `undefined` here, but this is closer to the intent of the method
44
+ `void #{expr}`
45
+ end
46
+
47
+ # Call the global javascript function with the given arguments.
48
+ def call(func, *args, &block)
49
+ g = global
50
+ args << block if block
51
+ g.JS[func].JS.apply(g, args)
52
+ end
53
+ alias method_missing call
54
+
55
+ extend self
56
+ end
data/stdlib/json.rb CHANGED
@@ -40,7 +40,7 @@ module JSON
40
40
 
41
41
  var klass;
42
42
  if ((klass = #{`hash`[JSON.create_id]}) != nil) {
43
- klass = Opal.cget(klass);
43
+ klass = Opal.get(klass);
44
44
  return #{`klass`.json_create(`hash`)};
45
45
  }
46
46
  else {
@@ -136,27 +136,22 @@ end
136
136
  class Hash
137
137
  def to_json
138
138
  %x{
139
- var inspect = [],
140
- keys = self.keys,
141
- _map = self.map,
142
- smap = self.smap,
143
- map, khash;
139
+ var result = [];
144
140
 
145
- for (var i = 0, length = keys.length; i < length; i++) {
146
- var key = keys[i];
141
+ for (var i = 0, keys = self.keys, length = keys.length, key, value; i < length; i++) {
142
+ key = keys[i];
147
143
 
148
144
  if (key.$$is_string) {
149
- map = smap;
150
- khash = key;
145
+ value = self.smap[key];
151
146
  } else {
152
- map = _map;
153
- khash = key.$hash();
147
+ value = key.value;
148
+ key = key.key;
154
149
  }
155
150
 
156
- inspect.push(#{`key`.to_s.to_json} + ':' + #{`map[khash]`.to_json});
151
+ result.push(#{`key`.to_s.to_json} + ':' + #{`value`.to_json});
157
152
  }
158
153
 
159
- return '{' + inspect.join(', ') + '}';
154
+ return '{' + result.join(', ') + '}';
160
155
  }
161
156
  end
162
157
  end
data/stdlib/math.rb CHANGED
@@ -1,370 +1 @@
1
- module Math
2
- class DomainError < StandardError
3
- def self.new(method)
4
- super "Numerical argument is out of domain - \"#{method}\""
5
- end
6
- end
7
-
8
- E = `Math.E`
9
- PI = `Math.PI`
10
-
11
- def acos(x)
12
- %x{
13
- if (!#{Numeric === x}) {
14
- #{raise Opal.type_error(x, Float)};
15
- }
16
-
17
- x = #{x.to_f};
18
-
19
- if (x < -1 || x > 1) {
20
- #{raise DomainError, :acos};
21
- }
22
-
23
- return Math.acos(x);
24
- }
25
- end
26
-
27
- unless defined?(`Math.acosh`)
28
- %x{
29
- Math.acosh = function(x) {
30
- return Math.log(x + Math.sqrt(x * x - 1));
31
- }
32
- }
33
- end
34
-
35
- def acosh(x)
36
- %x{
37
- if (!#{Numeric === x}) {
38
- #{raise Opal.type_error(x, Float)};
39
- }
40
-
41
- return Math.acosh(#{x.to_f});
42
- }
43
- end
44
-
45
- def asin(x)
46
- %x{
47
- if (!#{Numeric === x}) {
48
- #{raise Opal.type_error(x, Float)};
49
- }
50
-
51
- x = #{x.to_f};
52
-
53
- if (x < -1 || x > 1) {
54
- #{raise DomainError, :asin};
55
- }
56
-
57
- return Math.asin(x);
58
- }
59
- end
60
-
61
- unless defined?(`Math.asinh`)
62
- %x{
63
- Math.asinh = function(x) {
64
- return Math.log(x + Math.sqrt(x * x + 1))
65
- }
66
- }
67
- end
68
-
69
- def asinh(x)
70
- %x{
71
- if (!#{Numeric === x}) {
72
- #{raise Opal.type_error(x, Float)};
73
- }
74
-
75
- return Math.asinh(#{x.to_f});
76
- }
77
- end
78
-
79
- def atan(x)
80
- %x{
81
- if (!#{Numeric === x}) {
82
- #{raise Opal.type_error(x, Float)};
83
- }
84
-
85
- return Math.atan(#{x.to_f});
86
- }
87
- end
88
-
89
- def atan2(x, y)
90
- %x{
91
- if (!#{Numeric === x}) {
92
- #{raise Opal.type_error(x, Float)};
93
- }
94
-
95
- if (!#{Numeric === y}) {
96
- #{raise Opal.type_error(y, Float)};
97
- }
98
-
99
- return Math.atan2(#{x.to_f}, #{y.to_f});
100
- }
101
- end
102
-
103
- unless defined?(`Math.atanh`)
104
- %x{
105
- Math.atanh = function(x) {
106
- return 0.5 * Math.log((1 + x) / (1 - x));
107
- }
108
- }
109
- end
110
-
111
- def atanh(x)
112
- %x{
113
- if (!#{Numeric === x}) {
114
- #{raise Opal.type_error(x, Float)};
115
- }
116
-
117
- x = #{x.to_f};
118
-
119
- if (x < -1 || x > 1) {
120
- #{raise DomainError, :atanh};
121
- }
122
-
123
- return Math.atanh(x);
124
- }
125
- end
126
-
127
- # TODO: reimplement this when unavailable
128
- def cbrt(x)
129
- `Math.cbrt(x)`
130
- end
131
-
132
- def cos(x)
133
- %x{
134
- if (!#{Numeric === x}) {
135
- #{raise Opal.type_error(x, Float)};
136
- }
137
-
138
- return Math.cos(#{x.to_f});
139
- }
140
- end
141
-
142
- unless defined?(`Math.cosh`)
143
- %x{
144
- Math.cosh = function(x) {
145
- return (Math.exp(x) + Math.exp(-x)) / 2;
146
- }
147
- }
148
- end
149
-
150
- def cosh(x)
151
- %x{
152
- if (!#{Numeric === x}) {
153
- #{raise Opal.type_error(x, Float)};
154
- }
155
-
156
- return Math.cosh(#{x.to_f});
157
- }
158
- end
159
-
160
- def erf(x)
161
- raise NotImplementedError
162
- end
163
-
164
- def erfc(x)
165
- raise NotImplementedError
166
- end
167
-
168
- def exp(x)
169
- %x{
170
- if (!#{Numeric === x}) {
171
- #{raise Opal.type_error(x, Float)};
172
- }
173
-
174
- return Math.exp(#{x.to_f});
175
- }
176
- end
177
-
178
- def frexp(x)
179
- raise NotImplementedError
180
- end
181
-
182
- def gamma(x)
183
- raise NotImplementedError
184
- end
185
-
186
- unless defined?(`Math.hypot`)
187
- %x{
188
- Math.hypot = function(x, y) {
189
- return Math.sqrt(x * x + y * y)
190
- }
191
- }
192
- end
193
-
194
- def hypot(x, y)
195
- %x{
196
- if (!#{Numeric === x}) {
197
- #{raise Opal.type_error(x, Float)};
198
- }
199
-
200
- if (!#{Numeric === y}) {
201
- #{raise Opal.type_error(y, Float)};
202
- }
203
-
204
- return Math.hypot(#{x.to_f}, #{y.to_f});
205
- }
206
- end
207
-
208
- def ldexp(flt, int)
209
- raise NotImplementedError
210
- end
211
-
212
- def lgamma(x)
213
- raise NotImplementedError
214
- end
215
-
216
- def log(num, base = E, method = nil)
217
- %x{
218
- if (!#{Numeric === num}) {
219
- #{raise Opal.type_error(num, Float)};
220
- }
221
-
222
- if (!#{Numeric === base}) {
223
- #{raise Opal.type_error(base, Float)};
224
- }
225
-
226
- num = #{num.to_f};
227
- base = #{base.to_f};
228
-
229
- if (num < 0) {
230
- #{raise DomainError, method || :log};
231
- }
232
-
233
- num = Math.log(num);
234
-
235
- if (base != Math.E) {
236
- num /= Math.log(base);
237
- }
238
-
239
- return num
240
- }
241
- end
242
-
243
- if defined?(`Math.log10`)
244
- def log10(num)
245
- %x{
246
- if (!#{Numeric === num}) {
247
- #{raise Opal.type_error(num, Float)};
248
- }
249
-
250
- num = #{num.to_f};
251
-
252
- if (num < 0) {
253
- #{raise DomainError, :log2};
254
- }
255
-
256
- return Math.log10(num);
257
- }
258
- end
259
- else
260
- def log10(num)
261
- log(num, 10, :log10)
262
- end
263
- end
264
-
265
- if defined?(`Math.log2`)
266
- def log2(num)
267
- %x{
268
- if (!#{Numeric === num}) {
269
- #{raise Opal.type_error(num, Float)};
270
- }
271
-
272
- num = #{num.to_f};
273
-
274
- if (num < 0) {
275
- #{raise DomainError, :log2};
276
- }
277
-
278
- return Math.log2(num);
279
- }
280
- end
281
- else
282
- def log2(num)
283
- log(num, 2, :log2)
284
- end
285
- end
286
-
287
- def sin(x)
288
- %x{
289
- if (!#{Numeric === x}) {
290
- #{raise Opal.type_error(x, Float)};
291
- }
292
-
293
- return Math.sin(#{x.to_f});
294
- }
295
- end
296
-
297
- unless defined?(`Math.sinh`)
298
- %x{
299
- Math.sinh = function(x) {
300
- return (Math.exp(x) - Math.exp(-x)) / 2;
301
- }
302
- }
303
- end
304
-
305
- def sinh(x)
306
- %x{
307
- if (!#{Numeric === x}) {
308
- #{raise Opal.type_error(x, Float)};
309
- }
310
-
311
- return Math.sinh(#{x.to_f});
312
- }
313
- end
314
-
315
- def sqrt(x)
316
- %x{
317
- if (!#{Numeric === x}) {
318
- #{raise Opal.type_error(x, Float)};
319
- }
320
-
321
- x = #{x.to_f};
322
-
323
- if (x < 0) {
324
- #{raise DomainError, :log2};
325
- }
326
-
327
- return Math.sqrt(x);
328
- }
329
- end
330
-
331
- def tan(x)
332
- %x{
333
- if (!#{Numeric === x}) {
334
- #{raise Opal.type_error(x, Float)};
335
- }
336
-
337
- return Math.tan(#{x.to_f});
338
- }
339
- end
340
-
341
- unless defined?(`Math.tanh`)
342
- %x{
343
- Math.tanh = function(x) {
344
- if (x == Infinity) {
345
- return 1;
346
- }
347
- else if (x == -Infinity) {
348
- return -1;
349
- }
350
- else {
351
- return (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x));
352
- }
353
- }
354
- }
355
- end
356
-
357
- def tanh(x)
358
- %x{
359
- if (!#{Numeric === x}) {
360
- #{raise Opal.type_error(x, Float)};
361
- }
362
-
363
- return Math.tanh(#{x.to_f});
364
- }
365
- end
366
-
367
- class << self
368
- include Math
369
- end
370
- end
1
+ warn "DEPRECATION: math is now part of the core library, requiring it is deprecated"