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
@@ -0,0 +1,177 @@
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.upcase
16
+
17
+ constants.each {|const|
18
+ encoding = const_get(const)
19
+
20
+ next unless Encoding === encoding
21
+
22
+ if encoding.name == upcase || encoding.names.include?(upcase)
23
+ return encoding
24
+ end
25
+ }
26
+
27
+ raise ArgumentError, "unknown encoding name - #{name}"
28
+ end
29
+
30
+ class << self
31
+ attr_accessor :default_external
32
+ end
33
+
34
+ attr_reader :name, :names
35
+
36
+ def initialize(name, names, ascii, dummy)
37
+ @name = name
38
+ @names = names
39
+ @ascii = ascii
40
+ @dummy = dummy
41
+ end
42
+
43
+ def ascii_compatible?
44
+ @ascii
45
+ end
46
+
47
+ def dummy?
48
+ @dummy
49
+ end
50
+
51
+ def to_s
52
+ @name
53
+ end
54
+
55
+ def inspect
56
+ "#<Encoding:#{@name}#{" (dummy)" if @dummy}>"
57
+ end
58
+
59
+ # methods to implement per encoding
60
+ def each_byte(*)
61
+ raise NotImplementedError
62
+ end
63
+
64
+ def getbyte(*)
65
+ raise NotImplementedError
66
+ end
67
+
68
+ def bytesize(*)
69
+ raise NotImplementedError
70
+ end
71
+
72
+ class EncodingError < StandardError; end
73
+ class CompatibilityError < EncodingError; end
74
+ end
75
+
76
+ Encoding.register "UTF-8", aliases: ["CP65001"], ascii: true do
77
+ def each_byte(string, &block)
78
+ %x{
79
+ for (var i = 0, length = string.length; i < length; i++) {
80
+ var code = string.charCodeAt(i);
81
+
82
+ if (code <= 0x7f) {
83
+ #{yield `code`};
84
+ }
85
+ else {
86
+ var encoded = encodeURIComponent(string.charAt(i)).substr(1).split('%');
87
+
88
+ for (var j = 0, encoded_length = encoded.length; j < encoded_length; j++) {
89
+ #{yield `parseInt(encoded[j], 16)`};
90
+ }
91
+ }
92
+ }
93
+ }
94
+ end
95
+
96
+ def bytesize
97
+ bytes.length
98
+ end
99
+ end
100
+
101
+ Encoding.register "UTF-16LE" do
102
+ def each_byte(string, &block)
103
+ %x{
104
+ for (var i = 0, length = string.length; i < length; i++) {
105
+ var code = string.charCodeAt(i);
106
+
107
+ #{yield `code & 0xff`};
108
+ #{yield `code >> 8`};
109
+ }
110
+ }
111
+ end
112
+
113
+ def bytesize
114
+ bytes.length
115
+ end
116
+ end
117
+
118
+ Encoding.register "ASCII-8BIT", aliases: ["BINARY"], ascii: true do
119
+ def each_byte(string, &block)
120
+ %x{
121
+ for (var i = 0, length = string.length; i < length; i++) {
122
+ #{yield `string.charCodeAt(i) & 0xff`};
123
+ }
124
+ }
125
+ end
126
+
127
+ def bytesize
128
+ bytes.length
129
+ end
130
+ end
131
+
132
+ class String
133
+ `String.prototype.encoding = #{Encoding::UTF_16LE}`
134
+
135
+ def bytes
136
+ each_byte.to_a
137
+ end
138
+
139
+ def bytesize
140
+ @encoding.bytesize(self)
141
+ end
142
+
143
+ def each_byte(&block)
144
+ return enum_for :each_byte unless block_given?
145
+
146
+ @encoding.each_byte(self, &block)
147
+
148
+ self
149
+ end
150
+
151
+ def encode(encoding)
152
+ dup.force_encoding(encoding)
153
+ end
154
+
155
+ def encoding
156
+ @encoding
157
+ end
158
+
159
+ def force_encoding(encoding)
160
+ encoding = Opal.coerce_to!(encoding, String, :to_str)
161
+ encoding = Encoding.find(encoding)
162
+
163
+ return self if encoding == @encoding
164
+ raise ArgumentError, "unknown encoding name - #{encoding}" if encoding.nil?
165
+
166
+ %x{
167
+ var result = new String(self);
168
+ result.encoding = encoding;
169
+
170
+ return result;
171
+ }
172
+ end
173
+
174
+ def getbyte(idx)
175
+ @encoding.getbyte(self, idx)
176
+ end
177
+ end
@@ -1,3 +1,5 @@
1
+ require 'corelib/string'
2
+
1
3
  class String
2
4
  def self.inherited(klass)
3
5
  replace = Class.new(String::Wrapper)
@@ -14,7 +14,18 @@ class Struct
14
14
  Class.new(self) {
15
15
  args.each { |arg| define_struct_attribute arg }
16
16
 
17
- instance_eval(&block) if block
17
+ class_eval(&block) if block
18
+
19
+ class << self
20
+ def new(*args)
21
+ instance = allocate
22
+ `#{instance}.$$data = {};`
23
+ instance.initialize(*args)
24
+ instance
25
+ end
26
+
27
+ alias [] new
28
+ end
18
29
  }
19
30
  end
20
31
  end
@@ -26,7 +37,15 @@ class Struct
26
37
 
27
38
  members << name
28
39
 
29
- attr_accessor name
40
+ if Opal.valid_method_name?(name)
41
+ define_method name do
42
+ self[name]
43
+ end
44
+
45
+ define_method "#{name}=" do |value|
46
+ self[name] = value
47
+ end
48
+ end
30
49
  end
31
50
 
32
51
  def self.members
@@ -45,19 +64,19 @@ class Struct
45
64
  }
46
65
  end
47
66
 
48
- class << self
49
- alias [] new
50
- end
51
-
52
67
  def initialize(*args)
53
68
  members.each_with_index {|name, index|
54
- instance_variable_set "@#{name}", args[index]
69
+ self[name] = args[index]
55
70
  }
56
71
  end
57
72
 
58
73
  def members
59
74
  self.class.members
60
75
  end
76
+
77
+ def hash
78
+ Hash.new(`self.$$data`).hash
79
+ end
61
80
 
62
81
  def [](name)
63
82
  if Integer === name
@@ -71,7 +90,8 @@ class Struct
71
90
  raise TypeError, "no implicit conversion of #{name.class} into Integer"
72
91
  end
73
92
 
74
- instance_variable_get "@#{name}"
93
+ name = Opal.coerce_to!(name, String, :to_str)
94
+ `self.$$data[name]`
75
95
  end
76
96
 
77
97
  def []=(name, value)
@@ -86,29 +106,96 @@ class Struct
86
106
  raise TypeError, "no implicit conversion of #{name.class} into Integer"
87
107
  end
88
108
 
89
- instance_variable_set "@#{name}", value
109
+ name = Opal.coerce_to!(name, String, :to_str)
110
+ `self.$$data[name] = value`
111
+ end
112
+
113
+ def ==(other)
114
+ return false unless other.instance_of?(self.class)
115
+
116
+ %x{
117
+ var recursed1 = {}, recursed2 = {};
118
+
119
+ function _eqeq(struct, other) {
120
+ var key, a, b;
121
+
122
+ recursed1[#{`struct`.__id__}] = true;
123
+ recursed2[#{`other`.__id__}] = true;
124
+
125
+ for (key in struct.$$data) {
126
+ a = struct.$$data[key];
127
+ b = other.$$data[key];
128
+
129
+ if (#{Struct === `a`}) {
130
+ if (!recursed1.hasOwnProperty(#{`a`.__id__}) || !recursed2.hasOwnProperty(#{`b`.__id__})) {
131
+ if (!_eqeq(a, b)) {
132
+ return false;
133
+ }
134
+ }
135
+ } else {
136
+ if (!#{`a` == `b`}) {
137
+ return false;
138
+ }
139
+ }
140
+ }
141
+
142
+ return true;
143
+ }
144
+
145
+ return _eqeq(self, other);
146
+ }
147
+ end
148
+
149
+ def eql?(other)
150
+ return false unless other.instance_of?(self.class)
151
+
152
+ %x{
153
+ var recursed1 = {}, recursed2 = {};
154
+
155
+ function _eqeq(struct, other) {
156
+ var key, a, b;
157
+
158
+ recursed1[#{`struct`.__id__}] = true;
159
+ recursed2[#{`other`.__id__}] = true;
160
+
161
+ for (key in struct.$$data) {
162
+ a = struct.$$data[key];
163
+ b = other.$$data[key];
164
+
165
+ if (#{Struct === `a`}) {
166
+ if (!recursed1.hasOwnProperty(#{`a`.__id__}) || !recursed2.hasOwnProperty(#{`b`.__id__})) {
167
+ if (!_eqeq(a, b)) {
168
+ return false;
169
+ }
170
+ }
171
+ } else {
172
+ if (!#{`a`.eql?(`b`)}) {
173
+ return false;
174
+ }
175
+ }
176
+ }
177
+
178
+ return true;
179
+ }
180
+
181
+ return _eqeq(self, other);
182
+ }
90
183
  end
91
184
 
92
185
  def each
93
- return enum_for :each unless block_given?
186
+ return enum_for(:each){self.size} unless block_given?
94
187
 
95
188
  members.each { |name| yield self[name] }
96
189
  self
97
190
  end
98
191
 
99
192
  def each_pair
100
- return enum_for :each_pair unless block_given?
193
+ return enum_for(:each_pair){self.size} unless block_given?
101
194
 
102
- members.each { |name| yield name, self[name] }
195
+ members.each { |name| yield [name, self[name]] }
103
196
  self
104
197
  end
105
198
 
106
- def eql?(other)
107
- hash == other.hash || other.each_with_index.all? {|object, index|
108
- self[members[index]] == object
109
- }
110
- end
111
-
112
199
  def length
113
200
  members.length
114
201
  end
data/opal/corelib/time.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'corelib/comparable'
2
2
 
3
- class Time
3
+ class Time < `Date`
4
4
  include Comparable
5
5
 
6
6
  %x{
@@ -10,100 +10,213 @@ class Time
10
10
  long_months = #{%w[January February March April May June July August September October November December]};
11
11
  }
12
12
 
13
- def self.at(seconds, frac = 0)
14
- `new Date(seconds * 1000 + frac)`
15
- end
16
-
17
- def self.new(year = undefined, month = undefined, day = undefined, hour = undefined, minute = undefined, second = undefined, utc_offset = undefined)
13
+ def self.at(seconds, frac = undefined)
18
14
  %x{
19
- switch (arguments.length) {
20
- case 1:
21
- return new Date(year, 0);
22
-
23
- case 2:
24
- return new Date(year, month - 1);
25
-
26
- case 3:
27
- return new Date(year, month - 1, day);
15
+ var result;
28
16
 
29
- case 4:
30
- return new Date(year, month - 1, day, hour);
31
-
32
- case 5:
33
- return new Date(year, month - 1, day, hour, minute);
17
+ if (#{Time === seconds}) {
18
+ if (frac !== undefined) {
19
+ #{raise TypeError, "can't convert Time into an exact number"}
20
+ }
21
+ result = new Date(seconds.getTime());
22
+ result.is_utc = seconds.is_utc;
23
+ return result;
24
+ }
34
25
 
35
- case 6:
36
- return new Date(year, month - 1, day, hour, minute, second);
26
+ if (!seconds.$$is_number) {
27
+ seconds = #{Opal.coerce_to!(seconds, Integer, :to_int)};
28
+ }
37
29
 
38
- case 7:
39
- return new Date(year, month - 1, day, hour, minute, second);
30
+ if (frac === undefined) {
31
+ return new Date(seconds * 1000);
32
+ }
40
33
 
41
- default:
42
- return new Date();
34
+ if (!frac.$$is_number) {
35
+ frac = #{Opal.coerce_to!(frac, Integer, :to_int)};
43
36
  }
37
+
38
+ return new Date(seconds * 1000 + (frac / 1000));
44
39
  }
45
40
  end
46
41
 
47
- def self.local(year, month = nil, day = nil, hour = nil, minute = nil, second = nil, millisecond = nil)
48
- if `arguments.length === 10`
49
- %x{
50
- var args = $slice.call(arguments).reverse();
42
+ %x{
43
+ function time_params(year, month, day, hour, min, sec) {
44
+ if (year.$$is_string) {
45
+ year = parseInt(year, 10);
46
+ } else {
47
+ year = #{Opal.coerce_to!(`year`, Integer, :to_int)};
48
+ }
51
49
 
52
- second = args[9];
53
- minute = args[8];
54
- hour = args[7];
55
- day = args[6];
56
- month = args[5];
57
- year = args[4];
50
+ if (month === nil) {
51
+ month = 1;
52
+ } else if (!month.$$is_number) {
53
+ if (#{`month`.respond_to?(:to_str)}) {
54
+ month = #{`month`.to_str};
55
+ switch (month.toLowerCase()) {
56
+ case 'jan': month = 1; break;
57
+ case 'feb': month = 2; break;
58
+ case 'mar': month = 3; break;
59
+ case 'apr': month = 4; break;
60
+ case 'may': month = 5; break;
61
+ case 'jun': month = 6; break;
62
+ case 'jul': month = 7; break;
63
+ case 'aug': month = 8; break;
64
+ case 'sep': month = 9; break;
65
+ case 'oct': month = 10; break;
66
+ case 'nov': month = 11; break;
67
+ case 'dec': month = 12; break;
68
+ default: month = #{`month`.to_i};
69
+ }
70
+ } else {
71
+ month = #{Opal.coerce_to!(`month`, Integer, :to_int)};
72
+ }
58
73
  }
59
- end
60
74
 
61
- year = year.kind_of?(String) ? year.to_i : Opal.coerce_to(year, Integer, :to_int)
75
+ if (month < 1 || month > 12) {
76
+ #{raise ArgumentError, "month out of range: #{`month`}"}
77
+ }
78
+ month = month - 1;
79
+
80
+ if (day === nil) {
81
+ day = 1;
82
+ } else if (day.$$is_string) {
83
+ day = parseInt(day, 10);
84
+ } else {
85
+ day = #{Opal.coerce_to!(`day`, Integer, :to_int)};
86
+ }
62
87
 
63
- month = month.kind_of?(String) ? month.to_i : Opal.coerce_to(month || 1, Integer, :to_int)
88
+ if (day < 1 || day > 31) {
89
+ #{raise ArgumentError, "day out of range: #{`day`}"}
90
+ }
64
91
 
65
- unless month.between?(1, 12)
66
- raise ArgumentError, "month out of range: #{month}"
67
- end
92
+ if (hour === nil) {
93
+ hour = 0;
94
+ } else if (hour.$$is_string) {
95
+ hour = parseInt(hour, 10);
96
+ } else {
97
+ hour = #{Opal.coerce_to!(`hour`, Integer, :to_int)};
98
+ }
99
+
100
+ if (hour < 0 || hour > 24) {
101
+ #{raise ArgumentError, "hour out of range: #{`hour`}"}
102
+ }
68
103
 
69
- day = day.kind_of?(String) ? day.to_i : Opal.coerce_to(day || 1, Integer, :to_int)
104
+ if (min === nil) {
105
+ min = 0;
106
+ } else if (min.$$is_string) {
107
+ min = parseInt(min, 10);
108
+ } else {
109
+ min = #{Opal.coerce_to!(`min`, Integer, :to_int)};
110
+ }
70
111
 
71
- unless day.between?(1, 31)
72
- raise ArgumentError, "day out of range: #{day}"
73
- end
112
+ if (min < 0 || min > 59) {
113
+ #{raise ArgumentError, "min out of range: #{`min`}"}
114
+ }
74
115
 
75
- hour = hour.kind_of?(String) ? hour.to_i : Opal.coerce_to(hour || 0, Integer, :to_int)
116
+ if (sec === nil) {
117
+ sec = 0;
118
+ } else if (!sec.$$is_number) {
119
+ if (sec.$$is_string) {
120
+ sec = parseInt(sec, 10);
121
+ } else {
122
+ sec = #{Opal.coerce_to!(`sec`, Integer, :to_int)};
123
+ }
124
+ }
76
125
 
77
- unless hour.between?(0, 24)
78
- raise ArgumentError, "hour out of range: #{hour}"
79
- end
126
+ if (sec < 0 || sec > 60) {
127
+ #{raise ArgumentError, "sec out of range: #{`sec`}"}
128
+ }
80
129
 
81
- minute = minute.kind_of?(String) ? minute.to_i : Opal.coerce_to(minute || 0, Integer, :to_int)
130
+ return [year, month, day, hour, min, sec];
131
+ }
132
+ }
82
133
 
83
- unless minute.between?(0, 59)
84
- raise ArgumentError, "minute out of range: #{minute}"
85
- end
134
+ def self.new(year = undefined, month = nil, day = nil, hour = nil, min = nil, sec = nil, utc_offset = nil)
135
+ %x{
136
+ var args, result;
86
137
 
87
- second = second.kind_of?(String) ? second.to_i : Opal.coerce_to(second || 0, Integer, :to_int)
138
+ if (year === undefined) {
139
+ return new Date();
140
+ }
88
141
 
89
- unless second.between?(0, 59)
90
- raise ArgumentError, "second out of range: #{second}"
91
- end
142
+ if (utc_offset !== nil) {
143
+ #{raise ArgumentError, 'Opal does not support explicitly specifying UTC offset for Time'}
144
+ }
92
145
 
93
- new(*[year, month, day, hour, minute, second].compact)
146
+ args = time_params(year, month, day, hour, min, sec);
147
+ year = args[0];
148
+ month = args[1];
149
+ day = args[2];
150
+ hour = args[3];
151
+ min = args[4];
152
+ sec = args[5];
153
+
154
+ result = new Date(year, month, day, hour, min, 0, sec * 1000);
155
+ if (year < 100) {
156
+ result.setFullYear(year);
157
+ }
158
+ return result;
159
+ }
94
160
  end
95
161
 
96
- def self.gm(year, month = undefined, day = undefined, hour = undefined, minute = undefined, second = undefined, utc_offset = undefined)
97
- raise TypeError, 'missing year (got nil)' if year.nil?
162
+ def self.local(year, month = nil, day = nil, hour = nil, min = nil, sec = nil, millisecond = nil)
163
+ %x{
164
+ var args, result;
165
+
166
+ if (arguments.length === 10) {
167
+ args = $slice.call(arguments);
168
+ year = args[5];
169
+ month = args[4];
170
+ day = args[3];
171
+ hour = args[2];
172
+ min = args[1];
173
+ sec = args[0];
174
+ }
98
175
 
176
+ args = time_params(year, month, day, hour, min, sec);
177
+ year = args[0];
178
+ month = args[1];
179
+ day = args[2];
180
+ hour = args[3];
181
+ min = args[4];
182
+ sec = args[5];
183
+
184
+ result = new Date(year, month, day, hour, min, 0, sec * 1000);
185
+ if (year < 100) {
186
+ result.setFullYear(year);
187
+ }
188
+ return result;
189
+ }
190
+ end
191
+
192
+ def self.gm(year, month = nil, day = nil, hour = nil, min = nil, sec = nil, millisecond = nil)
99
193
  %x{
100
- if (month > 12 || day > 31 || hour > 24 || minute > 59 || second > 59) {
101
- #{raise ArgumentError};
194
+ var args, result;
195
+
196
+ if (arguments.length === 10) {
197
+ args = $slice.call(arguments);
198
+ year = args[5];
199
+ month = args[4];
200
+ day = args[3];
201
+ hour = args[2];
202
+ min = args[1];
203
+ sec = args[0];
102
204
  }
103
205
 
104
- var date = new Date(Date.UTC(year, (month || 1) - 1, (day || 1), (hour || 0), (minute || 0), (second || 0)));
105
- date.tz_offset = 0
106
- return date;
206
+ args = time_params(year, month, day, hour, min, sec);
207
+ year = args[0];
208
+ month = args[1];
209
+ day = args[2];
210
+ hour = args[3];
211
+ min = args[4];
212
+ sec = args[5];
213
+
214
+ result = new Date(Date.UTC(year, month, day, hour, min, 0, sec * 1000));
215
+ if (year < 100) {
216
+ result.setUTCFullYear(year);
217
+ }
218
+ result.is_utc = true;
219
+ return result;
107
220
  }
108
221
  end
109
222
 
@@ -113,7 +226,7 @@ class Time
113
226
  end
114
227
 
115
228
  def self.now
116
- `new Date()`
229
+ new
117
230
  end
118
231
 
119
232
  def +(other)
@@ -121,12 +234,12 @@ class Time
121
234
  raise TypeError, "time + time?"
122
235
  end
123
236
 
124
- other = Opal.coerce_to other, Integer, :to_int
125
-
126
237
  %x{
127
- var result = new Date(self.getTime() + (other * 1000));
128
- result.tz_offset = #@tz_offset;
129
-
238
+ if (!other.$$is_number) {
239
+ other = #{Opal.coerce_to!(other, Integer, :to_int)};
240
+ }
241
+ var result = new Date(self.getTime() + (other * 1000));
242
+ result.is_utc = self.is_utc;
130
243
  return result;
131
244
  }
132
245
  end
@@ -136,18 +249,31 @@ class Time
136
249
  return `(self.getTime() - other.getTime()) / 1000`
137
250
  end
138
251
 
139
- other = Opal.coerce_to other, Integer, :to_int
140
-
141
252
  %x{
142
- var result = new Date(self.getTime() - (other * 1000));
143
- result.tz_offset = #@tz_offset;
144
-
253
+ if (!other.$$is_number) {
254
+ other = #{Opal.coerce_to!(other, Integer, :to_int)};
255
+ }
256
+ var result = new Date(self.getTime() - (other * 1000));
257
+ result.is_utc = self.is_utc;
145
258
  return result;
146
259
  }
147
260
  end
148
261
 
149
262
  def <=>(other)
150
- to_f <=> other.to_f
263
+ if Time === other
264
+ to_f <=> other.to_f
265
+ else
266
+ r = other <=> self
267
+ if r.nil?
268
+ nil
269
+ elsif r > 0
270
+ -1
271
+ elsif r < 0
272
+ 1
273
+ else
274
+ 0
275
+ end
276
+ end
151
277
  end
152
278
 
153
279
  def ==(other)
@@ -161,26 +287,37 @@ class Time
161
287
  alias ctime asctime
162
288
 
163
289
  def day
164
- %x{
165
- if (#@tz_offset === 0) {
166
- return self.getUTCDate();
167
- }
168
- else {
169
- return self.getDate();
170
- }
171
- }
290
+ `self.is_utc ? self.getUTCDate() : self.getDate()`
172
291
  end
173
292
 
174
293
  def yday
294
+ # http://javascript.about.com/library/bldayyear.htm
295
+ # also see moment.js implementation: http://git.io/vCKNE
296
+
297
+ start_of_year = Time.new(year).to_i
298
+ start_of_day = Time.new(year, month, day).to_i
299
+ one_day = 86400
300
+
301
+ ((start_of_day - start_of_year) / one_day).round + 1
302
+ end
303
+
304
+ def isdst
175
305
  %x{
176
- // http://javascript.about.com/library/bldayyear.htm
177
- var onejan = new Date(self.getFullYear(), 0, 1);
178
- return Math.ceil((self - onejan) / 86400000);
306
+ var jan = new Date(self.getFullYear(), 0, 1),
307
+ jul = new Date(self.getFullYear(), 6, 1);
308
+ return self.getTimezoneOffset() < Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
179
309
  }
180
310
  end
181
311
 
182
- def isdst
183
- raise NotImplementedError
312
+ alias dst? isdst
313
+
314
+ def dup
315
+ copy = `new Date(self.getTime())`
316
+
317
+ copy.copy_instance_variables(self)
318
+ copy.initialize_dup(self)
319
+
320
+ copy
184
321
  end
185
322
 
186
323
  def eql?(other)
@@ -191,15 +328,12 @@ class Time
191
328
  `#{wday} == 5`
192
329
  end
193
330
 
331
+ def hash
332
+ `'Time:' + self.getTime()`
333
+ end
334
+
194
335
  def hour
195
- %x{
196
- if (#@tz_offset === 0) {
197
- return self.getUTCHours();
198
- }
199
- else {
200
- return self.getHours();
201
- }
202
- }
336
+ `self.is_utc ? self.getUTCHours() : self.getHours()`
203
337
  end
204
338
 
205
339
  def inspect
@@ -213,25 +347,11 @@ class Time
213
347
  alias mday day
214
348
 
215
349
  def min
216
- %x{
217
- if (#@tz_offset === 0) {
218
- return self.getUTCMinutes();
219
- }
220
- else {
221
- return self.getMinutes();
222
- }
223
- }
350
+ `self.is_utc ? self.getUTCMinutes() : self.getMinutes()`
224
351
  end
225
352
 
226
353
  def mon
227
- %x{
228
- if (#@tz_offset === 0) {
229
- return self.getUTCMonth() + 1;
230
- }
231
- else {
232
- return self.getMonth() + 1;
233
- }
234
- }
354
+ `(self.is_utc ? self.getUTCMonth() : self.getMonth()) + 1`
235
355
  end
236
356
 
237
357
  def monday?
@@ -245,19 +365,19 @@ class Time
245
365
  end
246
366
 
247
367
  def sec
368
+ `self.is_utc ? self.getUTCSeconds() : self.getSeconds()`
369
+ end
370
+
371
+ def succ
248
372
  %x{
249
- if (#@tz_offset === 0) {
250
- return self.getUTCSeconds();
251
- }
252
- else {
253
- return self.getSeconds();
254
- }
373
+ var result = new Date(self.getTime() + 1000);
374
+ result.is_utc = self.is_utc;
375
+ return result;
255
376
  }
256
377
  end
257
378
 
258
379
  def usec
259
- warn 'Microseconds are not supported'
260
- 0
380
+ `self.getMilliseconds() * 1000`
261
381
  end
262
382
 
263
383
  def zone
@@ -283,15 +403,25 @@ class Time
283
403
 
284
404
  def getgm
285
405
  %x{
286
- var result = new Date(self.getTime());
287
- result.tz_offset = 0;
288
-
406
+ var result = new Date(self.getTime());
407
+ result.is_utc = true;
289
408
  return result;
290
409
  }
291
410
  end
292
411
 
412
+ alias getutc getgm
413
+
414
+ def gmtime
415
+ %x{
416
+ self.is_utc = true;
417
+ return self;
418
+ }
419
+ end
420
+
421
+ alias utc gmtime
422
+
293
423
  def gmt?
294
- `#@tz_offset === 0`
424
+ `self.is_utc === true`
295
425
  end
296
426
 
297
427
  def gmt_offset
@@ -302,7 +432,6 @@ class Time
302
432
  %x{
303
433
  return format.replace(/%([\-_#^0]*:{0,2})(\d+)?([EO]*)(.)/g, function(full, flags, width, _, conv) {
304
434
  var result = "",
305
- width = parseInt(width),
306
435
  zero = flags.indexOf('0') !== -1,
307
436
  pad = flags.indexOf('-') === -1,
308
437
  blank = flags.indexOf('_') !== -1,
@@ -310,6 +439,8 @@ class Time
310
439
  invert = flags.indexOf('#') !== -1,
311
440
  colons = (flags.match(':') || []).length;
312
441
 
442
+ width = parseInt(width, 10);
443
+
313
444
  if (zero && blank) {
314
445
  if (flags.indexOf('0') < flags.indexOf('_')) {
315
446
  zero = false;
@@ -552,7 +683,7 @@ class Time
552
683
  end
553
684
 
554
685
  def to_i
555
- `parseInt(self.getTime() / 1000)`
686
+ `parseInt(self.getTime() / 1000, 10)`
556
687
  end
557
688
 
558
689
  alias to_s inspect
@@ -561,19 +692,17 @@ class Time
561
692
  `#{wday} == 2`
562
693
  end
563
694
 
695
+ alias tv_sec sec
696
+
697
+ alias tv_usec usec
698
+
564
699
  alias utc? gmt?
565
700
 
701
+ alias gmtoff gmt_offset
566
702
  alias utc_offset gmt_offset
567
703
 
568
704
  def wday
569
- %x{
570
- if (#@tz_offset === 0) {
571
- return self.getUTCDay();
572
- }
573
- else {
574
- return self.getDay();
575
- }
576
- }
705
+ `self.is_utc ? self.getUTCDay() : self.getDay()`
577
706
  end
578
707
 
579
708
  def wednesday?
@@ -581,17 +710,9 @@ class Time
581
710
  end
582
711
 
583
712
  def year
584
- %x{
585
- if (#@tz_offset === 0) {
586
- return self.getUTCFullYear();
587
- }
588
- else {
589
- return self.getFullYear();
590
- }
591
- }
713
+ `self.is_utc ? self.getUTCFullYear() : self.getFullYear()`
592
714
  end
593
715
 
594
- private :cweek_cyear
595
716
  def cweek_cyear
596
717
  jan01 = Time.new(self.year, 1, 1)
597
718
  jan01_wday = jan01.wday