opal 0.6.3 → 0.7.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.spectator +2 -0
  4. data/.spectator-mspec +3 -0
  5. data/.travis.yml +8 -11
  6. data/CHANGELOG.md +33 -0
  7. data/CONTRIBUTING.md +8 -43
  8. data/Gemfile +15 -4
  9. data/Guardfile +77 -0
  10. data/README.md +15 -9
  11. data/Rakefile +36 -12
  12. data/benchmarks/operators.rb +11 -0
  13. data/bin/opal +10 -13
  14. data/bin/opal-build +4 -4
  15. data/bin/opal-mspec +10 -0
  16. data/bin/opal-repl +4 -3
  17. data/examples/sinatra/Gemfile +1 -1
  18. data/examples/sinatra/config.ru +3 -3
  19. data/lib/mspec/opal/main.rb.erb +2 -2
  20. data/lib/mspec/opal/rake_task.rb +31 -24
  21. data/lib/mspec/opal/runner.rb +18 -1
  22. data/lib/mspec/opal/sprockets.js +17 -0
  23. data/lib/opal.rb +1 -34
  24. data/lib/opal/builder.rb +92 -58
  25. data/lib/opal/builder_processors.rb +165 -0
  26. data/lib/opal/cli.rb +85 -144
  27. data/lib/opal/cli_options.rb +136 -90
  28. data/lib/opal/cli_runners.rb +10 -0
  29. data/lib/opal/cli_runners/nodejs.rb +56 -0
  30. data/lib/opal/cli_runners/phantom.js +35 -0
  31. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  32. data/lib/opal/cli_runners/server.rb +54 -0
  33. data/lib/opal/compiler.rb +35 -16
  34. data/lib/opal/erb.rb +29 -15
  35. data/lib/opal/hike_path_finder.rb +18 -0
  36. data/lib/opal/nodes.rb +1 -0
  37. data/lib/opal/nodes/call.rb +107 -26
  38. data/lib/opal/nodes/call_special.rb +31 -6
  39. data/lib/opal/nodes/class.rb +2 -2
  40. data/lib/opal/nodes/constants.rb +5 -20
  41. data/lib/opal/nodes/def.rb +4 -4
  42. data/lib/opal/nodes/defined.rb +3 -3
  43. data/lib/opal/nodes/definitions.rb +1 -1
  44. data/lib/opal/nodes/for.rb +35 -0
  45. data/lib/opal/nodes/helpers.rb +2 -2
  46. data/lib/opal/nodes/iter.rb +3 -3
  47. data/lib/opal/nodes/literal.rb +10 -2
  48. data/lib/opal/nodes/masgn.rb +2 -2
  49. data/lib/opal/nodes/module.rb +2 -2
  50. data/lib/opal/nodes/scope.rb +1 -0
  51. data/lib/opal/nodes/singleton_class.rb +2 -2
  52. data/lib/opal/nodes/super.rb +2 -2
  53. data/lib/opal/nodes/top.rb +30 -3
  54. data/lib/opal/parser.rb +15 -1
  55. data/lib/opal/parser/grammar.rb +2571 -2452
  56. data/lib/opal/parser/grammar.y +37 -5
  57. data/lib/opal/parser/keywords.rb +2 -0
  58. data/lib/opal/parser/lexer.rb +21 -11
  59. data/lib/opal/path_reader.rb +28 -0
  60. data/lib/opal/paths.rb +38 -0
  61. data/lib/opal/source_map.rb +32 -15
  62. data/lib/opal/sprockets/environment.rb +9 -2
  63. data/lib/opal/sprockets/erb.rb +1 -2
  64. data/lib/opal/sprockets/path_reader.rb +34 -0
  65. data/lib/opal/sprockets/processor.rb +40 -39
  66. data/lib/opal/sprockets/server.rb +47 -33
  67. data/lib/opal/version.rb +1 -1
  68. data/opal.gemspec +10 -5
  69. data/opal/README.md +6 -0
  70. data/opal/corelib/array.rb +36 -4
  71. data/opal/corelib/array/inheritance.rb +6 -6
  72. data/opal/corelib/basic_object.rb +9 -9
  73. data/opal/corelib/boolean.rb +1 -1
  74. data/opal/corelib/class.rb +12 -12
  75. data/opal/corelib/dir.rb +20 -0
  76. data/opal/corelib/enumerable.rb +42 -42
  77. data/opal/corelib/enumerator.rb +1 -1
  78. data/opal/corelib/error.rb +2 -2
  79. data/opal/corelib/file.rb +56 -0
  80. data/opal/corelib/hash.rb +5 -5
  81. data/opal/corelib/helpers.rb +3 -3
  82. data/opal/corelib/io.rb +13 -10
  83. data/opal/corelib/kernel.rb +44 -68
  84. data/opal/corelib/method.rb +1 -1
  85. data/opal/corelib/module.rb +89 -114
  86. data/opal/corelib/nil_class.rb +1 -1
  87. data/opal/corelib/numeric.rb +27 -23
  88. data/opal/corelib/proc.rb +5 -5
  89. data/opal/corelib/range.rb +8 -4
  90. data/opal/corelib/regexp.rb +5 -5
  91. data/opal/corelib/runtime.js +589 -272
  92. data/opal/corelib/string.rb +52 -37
  93. data/opal/corelib/string/inheritance.rb +5 -5
  94. data/opal/corelib/time.rb +102 -52
  95. data/opal/corelib/variables.rb +3 -3
  96. data/opal/opal.rb +2 -0
  97. data/package.json +9 -0
  98. data/spec/filters/bugs/array.rb +0 -6
  99. data/spec/filters/bugs/language.rb +4 -0
  100. data/spec/filters/bugs/numeric.rb +7 -6
  101. data/spec/filters/bugs/opal.rb +2 -0
  102. data/spec/filters/bugs/regexp.rb +4 -0
  103. data/spec/filters/bugs/string.rb +0 -7
  104. data/spec/filters/bugs/stringscanner.rb +4 -1
  105. data/spec/filters/unsupported/private_methods.rb +2 -0
  106. data/spec/lib/builder_processors_spec.rb +27 -0
  107. data/spec/lib/builder_spec.rb +66 -0
  108. data/spec/{cli → lib}/cli_spec.rb +60 -5
  109. data/spec/{cli → lib}/compiler_spec.rb +66 -5
  110. data/spec/{cli → lib}/dependency_resolver_spec.rb +1 -1
  111. data/spec/lib/fixtures/no_requires.rb +1 -0
  112. data/spec/{cli → lib}/fixtures/opal_file.rb +0 -0
  113. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  114. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  115. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  116. data/spec/lib/fixtures/requires.rb +7 -0
  117. data/spec/{cli → lib}/fixtures/sprockets_file.js.rb +0 -0
  118. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  119. data/spec/lib/hike_path_finder_spec.rb +23 -0
  120. data/spec/{cli → lib}/lexer_spec.rb +1 -1
  121. data/spec/{cli → lib}/parser/alias_spec.rb +1 -1
  122. data/spec/{cli → lib}/parser/and_spec.rb +1 -1
  123. data/spec/{cli → lib}/parser/attrasgn_spec.rb +1 -1
  124. data/spec/{cli → lib}/parser/begin_spec.rb +1 -1
  125. data/spec/{cli → lib}/parser/block_spec.rb +1 -1
  126. data/spec/{cli → lib}/parser/break_spec.rb +1 -1
  127. data/spec/{cli → lib}/parser/call_spec.rb +1 -1
  128. data/spec/{cli → lib}/parser/class_spec.rb +1 -1
  129. data/spec/{cli → lib}/parser/comments_spec.rb +1 -1
  130. data/spec/{cli → lib}/parser/def_spec.rb +1 -1
  131. data/spec/{cli → lib}/parser/if_spec.rb +1 -1
  132. data/spec/{cli → lib}/parser/iter_spec.rb +1 -1
  133. data/spec/{cli → lib}/parser/lambda_spec.rb +1 -1
  134. data/spec/{cli → lib}/parser/literal_spec.rb +1 -1
  135. data/spec/{cli → lib}/parser/masgn_spec.rb +1 -1
  136. data/spec/{cli → lib}/parser/module_spec.rb +1 -1
  137. data/spec/{cli → lib}/parser/not_spec.rb +1 -1
  138. data/spec/{cli → lib}/parser/op_asgn1_spec.rb +1 -1
  139. data/spec/{cli → lib}/parser/op_asgn2_spec.rb +1 -1
  140. data/spec/{cli → lib}/parser/or_spec.rb +1 -1
  141. data/spec/{cli → lib}/parser/return_spec.rb +1 -1
  142. data/spec/{cli → lib}/parser/sclass_spec.rb +1 -1
  143. data/spec/{cli → lib}/parser/string_spec.rb +8 -1
  144. data/spec/{cli → lib}/parser/super_spec.rb +1 -1
  145. data/spec/lib/parser/unary_spec.rb +48 -0
  146. data/spec/{cli → lib}/parser/undef_spec.rb +1 -1
  147. data/spec/{cli → lib}/parser/unless_spec.rb +1 -1
  148. data/spec/{cli → lib}/parser/variables_spec.rb +1 -1
  149. data/spec/{cli → lib}/parser/while_spec.rb +1 -1
  150. data/spec/{cli → lib}/parser/yield_spec.rb +1 -1
  151. data/spec/lib/path_reader_spec.rb +24 -0
  152. data/spec/lib/shared/path_finder_shared.rb +19 -0
  153. data/spec/lib/shared/path_reader_shared.rb +31 -0
  154. data/spec/lib/spec_helper.rb +9 -0
  155. data/spec/lib/sprockets/environment_spec.rb +30 -0
  156. data/spec/{cli → lib}/sprockets/erb_spec.rb +1 -1
  157. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  158. data/spec/{cli → lib}/sprockets/processor_spec.rb +9 -2
  159. data/spec/lib/sprockets/server_spec.rb +20 -0
  160. data/spec/opal/compiler/irb_spec.rb +11 -11
  161. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  162. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  163. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  164. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  165. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  166. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  167. data/spec/opal/core/kernel/respond_to_spec.rb +2 -2
  168. data/spec/opal/core/runtime/method_missing_spec.rb +19 -0
  169. data/spec/opal/core/source_map_spec.rb +2 -2
  170. data/spec/opal/core/string_spec.rb +11 -0
  171. data/spec/opal/stdlib/erb/erb_spec.rb +0 -1
  172. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  173. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  174. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  175. data/spec/rubyspecs +54 -11
  176. data/spec/spec_helper.rb +18 -3
  177. data/spec/support/mspec_rspec_adapter.rb +33 -0
  178. data/spec/{cli/spec_helper.rb → support/parser_helpers.rb} +10 -10
  179. data/stdlib/README.md +3 -0
  180. data/stdlib/benchmark.rb +10 -0
  181. data/stdlib/date.rb +2 -2
  182. data/stdlib/dir.rb +1 -5
  183. data/stdlib/file.rb +1 -7
  184. data/stdlib/json.rb +10 -1
  185. data/stdlib/native.rb +5 -5
  186. data/stdlib/nodejs.rb +5 -0
  187. data/stdlib/nodejs/dir.rb +13 -0
  188. data/stdlib/nodejs/file.rb +98 -0
  189. data/stdlib/nodejs/fileutils.rb +26 -0
  190. data/stdlib/nodejs/io.rb +2 -0
  191. data/stdlib/nodejs/irb.rb +45 -0
  192. data/stdlib/nodejs/process.rb +16 -0
  193. data/stdlib/nodejs/require.rb +32 -0
  194. data/stdlib/nodejs/rubygems.rb +68 -0
  195. data/stdlib/nodejs/runtime.rb +25 -0
  196. data/stdlib/nodejs/yaml.rb +11 -0
  197. data/stdlib/opal-parser.rb +1 -2
  198. data/stdlib/opal-source-maps.rb +2 -0
  199. data/stdlib/phantomjs.rb +8 -0
  200. data/stdlib/process.rb +10 -0
  201. data/stdlib/promise.rb +12 -4
  202. data/stdlib/set.rb +27 -0
  203. data/stdlib/source_map.rb +5 -63
  204. data/stdlib/source_map/map.rb +220 -0
  205. data/stdlib/source_map/mapping.rb +26 -0
  206. data/stdlib/source_map/offset.rb +88 -0
  207. data/stdlib/source_map/version.rb +3 -0
  208. data/stdlib/source_map/vlq.rb +77 -101
  209. data/stdlib/sourcemap.rb +1 -0
  210. data/stdlib/strscan.rb +7 -1
  211. data/stdlib/template.rb +1 -1
  212. data/stdlib/thread.rb +147 -7
  213. metadata +238 -104
  214. data/lib/mspec/opal/mspec_fixes.rb +0 -87
  215. data/spec/cli/sprockets/environment_spec.rb +0 -14
  216. data/spec/filters/bugs/symbol.rb +0 -5
  217. data/spec/opal/core/kernel/warn_spec.rb +0 -83
  218. data/spec/opal/core/language/numbers_spec.rb +0 -60
  219. data/stdlib/opal-source-maps.js.erb +0 -2
  220. data/stdlib/source_map/generator.rb +0 -251
  221. data/stdlib/source_map/parser.rb +0 -102
@@ -3,7 +3,7 @@ require 'corelib/comparable'
3
3
  class String
4
4
  include Comparable
5
5
 
6
- `def._isString = true`
6
+ `def.$$is_string = true`
7
7
 
8
8
  def self.try_convert(what)
9
9
  what.to_str
@@ -81,7 +81,7 @@ class String
81
81
 
82
82
  def =~(other)
83
83
  %x{
84
- if (other._isString) {
84
+ if (other.$$is_string) {
85
85
  #{raise TypeError, 'type mismatch: String given'};
86
86
  }
87
87
 
@@ -93,7 +93,7 @@ class String
93
93
  %x{
94
94
  var size = self.length;
95
95
 
96
- if (index._isRange) {
96
+ if (index.$$is_range) {
97
97
  var exclude = index.exclude,
98
98
  length = index.end,
99
99
  index = index.begin;
@@ -313,7 +313,7 @@ class String
313
313
  options = pattern.substr(pattern.lastIndexOf('/') + 1) + 'g',
314
314
  regexp = pattern.substr(1, pattern.lastIndexOf('/') - 1);
315
315
 
316
- self.$sub._p = block;
316
+ self.$sub.$$p = block;
317
317
  return self.$sub(new RegExp(regexp, options), replace);
318
318
  }
319
319
  end
@@ -328,7 +328,7 @@ class String
328
328
 
329
329
  def include?(other)
330
330
  %x{
331
- if (other._isString) {
331
+ if (other.$$is_string) {
332
332
  return self.indexOf(other) !== -1;
333
333
  }
334
334
  }
@@ -616,7 +616,7 @@ class String
616
616
  return [self];
617
617
  }
618
618
 
619
- if (pattern && pattern._isRegexp) {
619
+ if (pattern && pattern.$$is_regexp) {
620
620
  var pattern_str = pattern.toString();
621
621
 
622
622
  /* Opal and JS's repr of an empty RE. */
@@ -762,14 +762,44 @@ class String
762
762
  `self.replace(/^\s*/, '').replace(/\s*$/, '')`
763
763
  end
764
764
 
765
+ %x{
766
+ // convert Ruby back reference to JavaScript back reference
767
+ function convertReplace(replace) {
768
+ return replace.replace(
769
+ /(^|[^\\])\\\\(\d)/g, '$1\\$2'
770
+ ).replace(
771
+ /(^|[^\\])(\\\\)+\\\\(\d)/g, '$1$2\\$3'
772
+ ).replace(
773
+ /(^|[^\\])(?:(\\)\\)+([^\\]|$)/g, '$1$2$3'
774
+ );
775
+ }
776
+ }
777
+
765
778
  def sub(pattern, replace = undefined, &block)
766
779
  %x{
767
- if (typeof(replace) === 'string') {
768
- // convert Ruby back reference to JavaScript back reference
769
- replace = replace.replace(/\\([1-9])/g, '$$$1')
770
- return self.replace(pattern, replace);
780
+ if (typeof(pattern) !== 'string' && !pattern.$$is_regexp) {
781
+ pattern = #{Opal.coerce_to! pattern, String, :to_str};
782
+ }
783
+
784
+ if (replace !== undefined) {
785
+ if (#{replace.is_a?(Hash)}) {
786
+ return self.replace(pattern, function(str) {
787
+ var value = #{replace[str]};
788
+
789
+ return (value == null) ? nil : #{value.to_s};
790
+ });
791
+ }
792
+ else {
793
+ if (typeof(replace) !== 'string') {
794
+ replace = #{Opal.coerce_to! replace, String, :to_str};
795
+ }
796
+
797
+ replace = convertReplace(replace);
798
+ return self.replace(pattern, replace);
799
+ }
800
+
771
801
  }
772
- if (block !== nil) {
802
+ else if (block != null && block !== nil) {
773
803
  return self.replace(pattern, function() {
774
804
  // FIXME: this should be a formal MatchData object with all the goodies
775
805
  var match_data = []
@@ -788,36 +818,16 @@ class String
788
818
  var match_len = match_data.length;
789
819
 
790
820
  // $1, $2, $3 not being parsed correctly in Ruby code
791
- //for (var i = 1; i < match_len; i++) {
792
- // __gvars[String(i)] = match_data[i];
793
- //}
821
+ for (var i = 1; i < match_len; i++) {
822
+ Opal.gvars[String(i)] = match_data[i];
823
+ }
794
824
  #{$& = `match_data[0]`};
795
825
  #{$~ = `match_data`};
796
826
  return block(match_data[0]);
797
827
  });
798
828
  }
799
- else if (replace !== undefined) {
800
- if (#{replace.is_a?(Hash)}) {
801
- return self.replace(pattern, function(str) {
802
- var value = #{replace[str]};
803
-
804
- return (value == null) ? nil : #{value.to_s};
805
- });
806
- }
807
- else {
808
- replace = #{String.try_convert(replace)};
809
-
810
- if (replace == null) {
811
- #{raise TypeError, "can't convert #{replace.class} into String"};
812
- }
813
-
814
- return self.replace(pattern, replace);
815
- }
816
- }
817
829
  else {
818
- // convert Ruby back reference to JavaScript back reference
819
- replace = replace.toString().replace(/\\([1-9])/g, '$$$1')
820
- return self.replace(pattern, replace);
830
+ #{raise ArgumentError, 'wrong number of arguments (1 for 2)'}
821
831
  }
822
832
  }
823
833
  end
@@ -880,8 +890,13 @@ class String
880
890
  end
881
891
 
882
892
  def to_proc
883
- proc do |recv, *args|
884
- recv.send(self, *args)
893
+ # Give name to self in case this proc is passed to instance_eval
894
+ sym = self
895
+
896
+ proc do |*args, &block|
897
+ raise ArgumentError, "no receiver given" if args.empty?
898
+ obj = args.shift
899
+ obj.send(sym, *args, &block)
885
900
  end
886
901
  end
887
902
 
@@ -3,10 +3,10 @@ class String
3
3
  replace = Class.new(String::Wrapper)
4
4
 
5
5
  %x{
6
- klass._proto = replace._proto;
7
- klass._proto._klass = klass;
8
- klass._alloc = replace._alloc;
9
- klass.__parent = #{String::Wrapper};
6
+ klass.$$proto = replace.$$proto;
7
+ klass.$$proto.$$class = klass;
8
+ klass.$$alloc = replace.$$alloc;
9
+ klass.$$parent = #{String::Wrapper};
10
10
 
11
11
  klass.$allocate = replace.$allocate;
12
12
  klass.$new = replace.$new;
@@ -38,7 +38,7 @@ class String::Wrapper
38
38
  def method_missing(*args, &block)
39
39
  result = @literal.__send__(*args, &block)
40
40
 
41
- if `result._isString != null`
41
+ if `result.$$is_string != null`
42
42
  if `result == #@literal`
43
43
  self
44
44
  else
data/opal/corelib/time.rb CHANGED
@@ -124,24 +124,26 @@ class Time
124
124
  other = Opal.coerce_to other, Integer, :to_int
125
125
 
126
126
  %x{
127
- var result = new Date(self.getTime() + (other * 1000));
128
- result.tz_offset = self.tz_offset;
127
+ var result = new Date(self.getTime() + (other * 1000));
128
+ result.tz_offset = #@tz_offset;
129
+
129
130
  return result;
130
131
  }
131
132
  end
132
133
 
133
134
  def -(other)
134
135
  if Time === other
135
- `(self.getTime() - other.getTime()) / 1000`
136
- else
137
- other = Opal.coerce_to other, Integer, :to_int
138
-
139
- %x{
140
- var result = new Date(self.getTime() - (other * 1000));
141
- result.tz_offset = self.tz_offset;
142
- return result;
143
- }
136
+ return `(self.getTime() - other.getTime()) / 1000`
144
137
  end
138
+
139
+ other = Opal.coerce_to other, Integer, :to_int
140
+
141
+ %x{
142
+ var result = new Date(self.getTime() - (other * 1000));
143
+ result.tz_offset = #@tz_offset;
144
+
145
+ return result;
146
+ }
145
147
  end
146
148
 
147
149
  def <=>(other)
@@ -159,7 +161,14 @@ class Time
159
161
  alias ctime asctime
160
162
 
161
163
  def day
162
- `self.getDate()`
164
+ %x{
165
+ if (#@tz_offset === 0) {
166
+ return self.getUTCDate();
167
+ }
168
+ else {
169
+ return self.getDate();
170
+ }
171
+ }
163
172
  end
164
173
 
165
174
  def yday
@@ -179,11 +188,18 @@ class Time
179
188
  end
180
189
 
181
190
  def friday?
182
- `self.getDay() === 5`
191
+ `#{wday} == 5`
183
192
  end
184
193
 
185
194
  def hour
186
- `self.getHours()`
195
+ %x{
196
+ if (#@tz_offset === 0) {
197
+ return self.getUTCHours();
198
+ }
199
+ else {
200
+ return self.getHours();
201
+ }
202
+ }
187
203
  end
188
204
 
189
205
  def inspect
@@ -197,25 +213,46 @@ class Time
197
213
  alias mday day
198
214
 
199
215
  def min
200
- `self.getMinutes()`
216
+ %x{
217
+ if (#@tz_offset === 0) {
218
+ return self.getUTCMinutes();
219
+ }
220
+ else {
221
+ return self.getMinutes();
222
+ }
223
+ }
201
224
  end
202
225
 
203
226
  def mon
204
- `self.getMonth() + 1`
227
+ %x{
228
+ if (#@tz_offset === 0) {
229
+ return self.getUTCMonth() + 1;
230
+ }
231
+ else {
232
+ return self.getMonth() + 1;
233
+ }
234
+ }
205
235
  end
206
236
 
207
237
  def monday?
208
- `self.getDay() === 1`
238
+ `#{wday} == 1`
209
239
  end
210
240
 
211
241
  alias month mon
212
242
 
213
243
  def saturday?
214
- `self.getDay() === 6`
244
+ `#{wday} == 6`
215
245
  end
216
246
 
217
247
  def sec
218
- `self.getSeconds()`
248
+ %x{
249
+ if (#@tz_offset === 0) {
250
+ return self.getUTCSeconds();
251
+ }
252
+ else {
253
+ return self.getSeconds();
254
+ }
255
+ }
219
256
  end
220
257
 
221
258
  def usec
@@ -246,14 +283,15 @@ class Time
246
283
 
247
284
  def getgm
248
285
  %x{
249
- var result = new Date(self.getTime());
250
- result.tz_offset = 0;
286
+ var result = new Date(self.getTime());
287
+ result.tz_offset = 0;
288
+
251
289
  return result;
252
290
  }
253
291
  end
254
292
 
255
293
  def gmt?
256
- `self.tz_offset == 0`
294
+ `#@tz_offset === 0`
257
295
  end
258
296
 
259
297
  def gmt_offset
@@ -283,42 +321,42 @@ class Time
283
321
 
284
322
  switch (conv) {
285
323
  case 'Y':
286
- result += self.getFullYear();
324
+ result += #{year};
287
325
  break;
288
326
 
289
327
  case 'C':
290
328
  zero = !blank;
291
- result += Match.round(self.getFullYear() / 100);
329
+ result += Match.round(#{year} / 100);
292
330
  break;
293
331
 
294
332
  case 'y':
295
333
  zero = !blank;
296
- result += (self.getFullYear() % 100);
334
+ result += (#{year} % 100);
297
335
  break;
298
336
 
299
337
  case 'm':
300
338
  zero = !blank;
301
- result += (self.getMonth() + 1);
339
+ result += #{mon};
302
340
  break;
303
341
 
304
342
  case 'B':
305
- result += long_months[self.getMonth()];
343
+ result += long_months[#{mon} - 1];
306
344
  break;
307
345
 
308
346
  case 'b':
309
347
  case 'h':
310
348
  blank = !zero;
311
- result += short_months[self.getMonth()];
349
+ result += short_months[#{mon} - 1];
312
350
  break;
313
351
 
314
352
  case 'd':
315
353
  zero = !blank
316
- result += self.getDate();
354
+ result += #{day};
317
355
  break;
318
356
 
319
357
  case 'e':
320
358
  blank = !zero
321
- result += self.getDate();
359
+ result += #{day};
322
360
  break;
323
361
 
324
362
  case 'j':
@@ -327,40 +365,40 @@ class Time
327
365
 
328
366
  case 'H':
329
367
  zero = !blank;
330
- result += self.getHours();
368
+ result += #{hour};
331
369
  break;
332
370
 
333
371
  case 'k':
334
372
  blank = !zero;
335
- result += self.getHours();
373
+ result += #{hour};
336
374
  break;
337
375
 
338
376
  case 'I':
339
377
  zero = !blank;
340
- result += (self.getHours() % 12 || 12);
378
+ result += (#{hour} % 12 || 12);
341
379
  break;
342
380
 
343
381
  case 'l':
344
382
  blank = !zero;
345
- result += (self.getHours() % 12 || 12);
383
+ result += (#{hour} % 12 || 12);
346
384
  break;
347
385
 
348
386
  case 'P':
349
- result += (self.getHours() >= 12 ? "pm" : "am");
387
+ result += (#{hour} >= 12 ? "pm" : "am");
350
388
  break;
351
389
 
352
390
  case 'p':
353
- result += (self.getHours() >= 12 ? "PM" : "AM");
391
+ result += (#{hour} >= 12 ? "PM" : "AM");
354
392
  break;
355
393
 
356
394
  case 'M':
357
395
  zero = !blank;
358
- result += self.getMinutes();
396
+ result += #{min};
359
397
  break;
360
398
 
361
399
  case 'S':
362
400
  zero = !blank;
363
- result += self.getSeconds();
401
+ result += #{sec}
364
402
  break;
365
403
 
366
404
  case 'L':
@@ -402,26 +440,26 @@ class Time
402
440
  break;
403
441
 
404
442
  case 'A':
405
- result += days_of_week[self.getDay()];
443
+ result += days_of_week[#{wday}];
406
444
  break;
407
445
 
408
446
  case 'a':
409
- result += short_days[self.getDay()];
447
+ result += short_days[#{wday}];
410
448
  break;
411
449
 
412
450
  case 'u':
413
- result += (self.getDay() + 1);
451
+ result += (#{wday} + 1);
414
452
  break;
415
453
 
416
454
  case 'w':
417
- result += self.getDay();
455
+ result += #{wday};
418
456
  break;
419
457
 
420
458
  // TODO: week year
421
459
  // TODO: week number
422
460
 
423
461
  case 's':
424
- result += parseInt(self.getTime() / 1000)
462
+ result += #{to_i};
425
463
  break;
426
464
 
427
465
  case 'n':
@@ -489,11 +527,11 @@ class Time
489
527
  end
490
528
 
491
529
  def sunday?
492
- `self.getDay() === 0`
530
+ `#{wday} == 0`
493
531
  end
494
532
 
495
533
  def thursday?
496
- `self.getDay() === 4`
534
+ `#{wday} == 4`
497
535
  end
498
536
 
499
537
  def to_a
@@ -511,24 +549,36 @@ class Time
511
549
  alias to_s inspect
512
550
 
513
551
  def tuesday?
514
- `self.getDay() === 2`
552
+ `#{wday} == 2`
515
553
  end
516
554
 
517
555
  alias utc? gmt?
518
556
 
519
- def utc_offset
520
- `self.getTimezoneOffset() * -60`
521
- end
557
+ alias utc_offset gmt_offset
522
558
 
523
559
  def wday
524
- `self.getDay()`
560
+ %x{
561
+ if (#@tz_offset === 0) {
562
+ return self.getUTCDay();
563
+ }
564
+ else {
565
+ return self.getDay();
566
+ }
567
+ }
525
568
  end
526
569
 
527
570
  def wednesday?
528
- `self.getDay() === 3`
571
+ `#{wday} == 3`
529
572
  end
530
573
 
531
574
  def year
532
- `self.getFullYear()`
575
+ %x{
576
+ if (#@tz_offset === 0) {
577
+ return self.getUTCFullYear();
578
+ }
579
+ else {
580
+ return self.getFullYear();
581
+ }
582
+ }
533
583
  end
534
584
  end