opal 0.8.1 → 0.9.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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"