opal 0.5.5 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (257) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +40 -9
  3. data/CHANGELOG.md +349 -0
  4. data/Gemfile +7 -8
  5. data/README.md +25 -3
  6. data/Rakefile +4 -2
  7. data/bin/opal +1 -1
  8. data/examples/rack/Gemfile +3 -0
  9. data/examples/rack/app/application.rb +13 -0
  10. data/examples/rack/app/user.rb +21 -0
  11. data/examples/rack/config.ru +7 -0
  12. data/examples/rack/index.html.erb +10 -0
  13. data/examples/sinatra/Gemfile +4 -0
  14. data/examples/sinatra/app/application.rb +7 -0
  15. data/examples/sinatra/config.ru +21 -0
  16. data/lib/mspec/opal/rake_task.rb +29 -8
  17. data/lib/mspec/opal/runner.rb +5 -4
  18. data/lib/opal.rb +1 -0
  19. data/lib/opal/builder.rb +0 -28
  20. data/lib/opal/cli.rb +0 -14
  21. data/lib/opal/compiler.rb +12 -11
  22. data/lib/opal/fragment.rb +8 -1
  23. data/lib/opal/nodes/array.rb +1 -1
  24. data/lib/opal/nodes/base.rb +4 -0
  25. data/lib/opal/nodes/call.rb +6 -2
  26. data/lib/opal/nodes/call_special.rb +1 -1
  27. data/lib/opal/nodes/class.rb +2 -2
  28. data/lib/opal/nodes/constants.rb +3 -1
  29. data/lib/opal/nodes/helpers.rb +23 -14
  30. data/lib/opal/nodes/if.rb +16 -9
  31. data/lib/opal/nodes/literal.rb +37 -5
  32. data/lib/opal/nodes/logic.rb +7 -1
  33. data/lib/opal/nodes/module.rb +2 -2
  34. data/lib/opal/nodes/scope.rb +13 -2
  35. data/lib/opal/nodes/top.rb +9 -0
  36. data/lib/opal/nodes/variables.rb +5 -2
  37. data/lib/opal/parser.rb +306 -71
  38. data/lib/opal/parser/grammar.rb +2667 -2775
  39. data/lib/opal/parser/grammar.y +177 -233
  40. data/lib/opal/parser/lexer.rb +511 -427
  41. data/lib/opal/parser/sexp.rb +15 -3
  42. data/lib/opal/source_map.rb +8 -4
  43. data/lib/opal/sprockets.rb +4 -0
  44. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  45. data/lib/opal/sprockets/environment.rb +21 -0
  46. data/lib/opal/sprockets/erb.rb +30 -0
  47. data/lib/opal/sprockets/processor.rb +127 -0
  48. data/lib/opal/sprockets/server.rb +166 -0
  49. data/lib/opal/util.rb +29 -0
  50. data/lib/opal/version.rb +1 -1
  51. data/opal.gemspec +1 -1
  52. data/opal/corelib/array.rb +106 -187
  53. data/opal/corelib/array/inheritance.rb +113 -0
  54. data/opal/corelib/basic_object.rb +6 -2
  55. data/opal/corelib/boolean.rb +4 -0
  56. data/opal/corelib/class.rb +2 -0
  57. data/opal/corelib/complex.rb +3 -0
  58. data/opal/corelib/enumerable.rb +75 -8
  59. data/opal/corelib/enumerator.rb +2 -0
  60. data/opal/corelib/error.rb +23 -23
  61. data/opal/corelib/hash.rb +5 -5
  62. data/opal/corelib/helpers.rb +51 -16
  63. data/opal/corelib/io.rb +7 -24
  64. data/opal/corelib/kernel.rb +23 -11
  65. data/opal/corelib/module.rb +44 -47
  66. data/opal/corelib/nil_class.rb +4 -0
  67. data/opal/corelib/numeric.rb +101 -15
  68. data/opal/corelib/range.rb +2 -0
  69. data/opal/corelib/rational.rb +3 -0
  70. data/opal/corelib/regexp.rb +36 -17
  71. data/opal/corelib/runtime.js +22 -7
  72. data/opal/corelib/string.rb +213 -110
  73. data/opal/corelib/string/inheritance.rb +78 -0
  74. data/opal/corelib/struct.rb +8 -0
  75. data/opal/corelib/time.rb +54 -42
  76. data/opal/corelib/variables.rb +24 -0
  77. data/opal/opal.rb +5 -27
  78. data/spec/cli/compiler_spec.rb +136 -0
  79. data/spec/cli/dependency_resolver_spec.rb +40 -0
  80. data/spec/cli/lexer_spec.rb +110 -0
  81. data/spec/cli/parser/alias_spec.rb +26 -0
  82. data/spec/cli/parser/and_spec.rb +13 -0
  83. data/spec/cli/parser/attrasgn_spec.rb +28 -0
  84. data/spec/cli/parser/begin_spec.rb +42 -0
  85. data/spec/cli/parser/block_spec.rb +12 -0
  86. data/spec/cli/parser/break_spec.rb +17 -0
  87. data/spec/cli/parser/call_spec.rb +139 -0
  88. data/spec/cli/parser/class_spec.rb +35 -0
  89. data/spec/cli/parser/comments_spec.rb +11 -0
  90. data/spec/cli/parser/def_spec.rb +61 -0
  91. data/spec/cli/parser/if_spec.rb +26 -0
  92. data/spec/cli/parser/iter_spec.rb +59 -0
  93. data/spec/cli/parser/lambda_spec.rb +64 -0
  94. data/spec/cli/parser/literal_spec.rb +113 -0
  95. data/spec/cli/parser/masgn_spec.rb +37 -0
  96. data/spec/cli/parser/module_spec.rb +27 -0
  97. data/spec/cli/parser/not_spec.rb +27 -0
  98. data/spec/cli/parser/op_asgn1_spec.rb +23 -0
  99. data/spec/cli/parser/op_asgn2_spec.rb +23 -0
  100. data/spec/cli/parser/or_spec.rb +13 -0
  101. data/spec/cli/parser/return_spec.rb +17 -0
  102. data/spec/cli/parser/sclass_spec.rb +21 -0
  103. data/spec/cli/parser/string_spec.rb +269 -0
  104. data/spec/cli/parser/super_spec.rb +20 -0
  105. data/spec/cli/parser/undef_spec.rb +15 -0
  106. data/spec/cli/parser/unless_spec.rb +13 -0
  107. data/spec/cli/parser/variables_spec.rb +92 -0
  108. data/spec/cli/parser/while_spec.rb +15 -0
  109. data/spec/cli/parser/yield_spec.rb +20 -0
  110. data/spec/cli/spec_helper.rb +31 -11
  111. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  112. data/spec/opal/core/date_spec.rb +122 -0
  113. data/spec/opal/core/language/predefined_spec.rb +1 -1
  114. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  115. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  116. data/spec/opal/filters/bugs/array.rb +96 -87
  117. data/spec/opal/filters/bugs/basic_object.rb +9 -0
  118. data/spec/opal/filters/bugs/class.rb +16 -0
  119. data/spec/opal/filters/bugs/enumerable.rb +54 -0
  120. data/spec/opal/filters/bugs/language.rb +37 -3
  121. data/spec/opal/filters/bugs/math.rb +93 -0
  122. data/spec/opal/filters/bugs/nil.rb +7 -0
  123. data/spec/opal/filters/bugs/numeric.rb +19 -0
  124. data/spec/opal/filters/bugs/opal.rb +12 -0
  125. data/spec/opal/filters/bugs/regexp.rb +0 -2
  126. data/spec/opal/filters/bugs/string.rb +317 -19
  127. data/spec/opal/filters/bugs/struct.rb +29 -0
  128. data/spec/opal/filters/bugs/time.rb +130 -9
  129. data/spec/opal/filters/unsupported/encoding.rb +52 -4
  130. data/spec/opal/filters/unsupported/enumerator.rb +0 -3
  131. data/spec/opal/filters/unsupported/integer_size.rb +7 -0
  132. data/spec/opal/filters/unsupported/method_added.rb +10 -0
  133. data/spec/opal/filters/unsupported/mutable_strings.rb +299 -1
  134. data/spec/opal/filters/unsupported/private_constants.rb +30 -0
  135. data/spec/opal/filters/unsupported/private_methods.rb +16 -0
  136. data/spec/opal/filters/unsupported/random.rb +4 -0
  137. data/spec/opal/filters/unsupported/tainted.rb +53 -0
  138. data/spec/opal/filters/unsupported/trusted.rb +5 -0
  139. data/spec/opal/rubyspecs +167 -234
  140. data/spec/opal/spec_helper.rb +3 -0
  141. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  142. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  143. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  144. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  145. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  146. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  147. data/stdlib/base64.rb +152 -0
  148. data/stdlib/date.rb +82 -49
  149. data/{opal/corelib → stdlib}/encoding.rb +3 -1
  150. data/stdlib/erb.rb +0 -1
  151. data/stdlib/json.rb +10 -26
  152. data/stdlib/math.rb +370 -0
  153. data/stdlib/native.rb +40 -33
  154. data/stdlib/opal-parser.rb +7 -4
  155. data/stdlib/promise.rb +292 -0
  156. data/stdlib/strscan.rb +1 -1
  157. data/stdlib/template.rb +1 -3
  158. data/stdlib/time.rb +9 -0
  159. metadata +143 -204
  160. data/doc/compiler.md +0 -42
  161. data/doc/compiler_options.md +0 -5
  162. data/doc/examples/node_http_server.rb +0 -49
  163. data/doc/external_libraries.md +0 -9
  164. data/doc/generated_javascript.md +0 -272
  165. data/doc/home.md +0 -17
  166. data/doc/method_missing.md +0 -58
  167. data/doc/static_applications.md +0 -60
  168. data/doc/using_ruby_from_javascript.md +0 -18
  169. data/doc/using_sprockets.md +0 -65
  170. data/spec/opal/core/numeric/abs_spec.rb +0 -12
  171. data/spec/opal/core/numeric/downto_spec.rb +0 -19
  172. data/spec/opal/core/numeric/equal_value_spec.rb +0 -9
  173. data/spec/opal/core/numeric/even_spec.rb +0 -21
  174. data/spec/opal/core/numeric/magnitude_spec.rb +0 -12
  175. data/spec/opal/core/numeric/odd_spec.rb +0 -21
  176. data/spec/opal/core/string/chop_spec.rb +0 -10
  177. data/spec/opal/core/string/chr_spec.rb +0 -13
  178. data/spec/opal/core/string/clone_spec.rb +0 -8
  179. data/spec/opal/core/string/comparison_spec.rb +0 -13
  180. data/spec/opal/core/string/dup_spec.rb +0 -8
  181. data/spec/opal/core/string/element_reference_spec.rb +0 -96
  182. data/spec/opal/core/string/fixtures/classes.rb +0 -49
  183. data/spec/opal/core/string/format_spec.rb +0 -9
  184. data/spec/opal/core/string/freeze_spec.rb +0 -15
  185. data/spec/opal/core/string/gsub_spec.rb +0 -31
  186. data/spec/opal/core/string/lines_spec.rb +0 -9
  187. data/spec/opal/core/string/ljust_spec.rb +0 -32
  188. data/spec/opal/core/string/lstrip_spec.rb +0 -7
  189. data/spec/opal/core/string/match_spec.rb +0 -49
  190. data/spec/opal/core/string/next_spec.rb +0 -10
  191. data/spec/opal/core/string/ord_spec.rb +0 -9
  192. data/spec/opal/core/string/partition_spec.rb +0 -10
  193. data/spec/opal/core/string/rindex_spec.rb +0 -50
  194. data/spec/opal/core/string/rjust_spec.rb +0 -32
  195. data/spec/opal/core/string/rstrip_spec.rb +0 -7
  196. data/spec/opal/core/string/scan_spec.rb +0 -66
  197. data/spec/opal/core/string/slice_spec.rb +0 -74
  198. data/spec/opal/core/string/split_spec.rb +0 -5
  199. data/spec/opal/core/string/strip_spec.rb +0 -6
  200. data/spec/opal/core/string/sub_spec.rb +0 -38
  201. data/spec/opal/core/string/succ_spec.rb +0 -10
  202. data/spec/opal/core/string/sum_spec.rb +0 -5
  203. data/spec/opal/core/string/to_f_spec.rb +0 -14
  204. data/spec/opal/core/string/to_i_spec.rb +0 -25
  205. data/spec/opal/core/string/tr_s_spec.rb +0 -31
  206. data/spec/opal/core/string/tr_spec.rb +0 -31
  207. data/spec/opal/filters/bugs/parser.rb +0 -10
  208. data/spec/opal/filters/unsupported/immutable_strings.rb +0 -24
  209. data/spec/opal/filters/unsupported/string_subclasses.rb +0 -8
  210. data/spec/opal/parser/alias_spec.rb +0 -26
  211. data/spec/opal/parser/and_spec.rb +0 -13
  212. data/spec/opal/parser/array_spec.rb +0 -22
  213. data/spec/opal/parser/attrasgn_spec.rb +0 -28
  214. data/spec/opal/parser/begin_spec.rb +0 -42
  215. data/spec/opal/parser/block_spec.rb +0 -12
  216. data/spec/opal/parser/break_spec.rb +0 -17
  217. data/spec/opal/parser/call_spec.rb +0 -131
  218. data/spec/opal/parser/class_spec.rb +0 -35
  219. data/spec/opal/parser/const_spec.rb +0 -13
  220. data/spec/opal/parser/cvar_spec.rb +0 -11
  221. data/spec/opal/parser/def_spec.rb +0 -61
  222. data/spec/opal/parser/false_spec.rb +0 -17
  223. data/spec/opal/parser/file_spec.rb +0 -7
  224. data/spec/opal/parser/gvar_spec.rb +0 -13
  225. data/spec/opal/parser/hash_spec.rb +0 -17
  226. data/spec/opal/parser/heredoc_spec.rb +0 -30
  227. data/spec/opal/parser/iasgn_spec.rb +0 -9
  228. data/spec/opal/parser/if_spec.rb +0 -26
  229. data/spec/opal/parser/int_spec.rb +0 -13
  230. data/spec/opal/parser/iter_spec.rb +0 -59
  231. data/spec/opal/parser/ivar_spec.rb +0 -9
  232. data/spec/opal/parser/lambda_spec.rb +0 -64
  233. data/spec/opal/parser/lasgn_spec.rb +0 -8
  234. data/spec/opal/parser/line_spec.rb +0 -8
  235. data/spec/opal/parser/lvar_spec.rb +0 -38
  236. data/spec/opal/parser/masgn_spec.rb +0 -37
  237. data/spec/opal/parser/module_spec.rb +0 -27
  238. data/spec/opal/parser/nil_spec.rb +0 -17
  239. data/spec/opal/parser/not_spec.rb +0 -27
  240. data/spec/opal/parser/nth_ref_spec.rb +0 -13
  241. data/spec/opal/parser/op_asgn1_spec.rb +0 -23
  242. data/spec/opal/parser/op_asgn2_spec.rb +0 -23
  243. data/spec/opal/parser/or_spec.rb +0 -13
  244. data/spec/opal/parser/parse_spec.rb +0 -66
  245. data/spec/opal/parser/regexp_spec.rb +0 -16
  246. data/spec/opal/parser/return_spec.rb +0 -17
  247. data/spec/opal/parser/sclass_spec.rb +0 -21
  248. data/spec/opal/parser/self_spec.rb +0 -17
  249. data/spec/opal/parser/str_spec.rb +0 -107
  250. data/spec/opal/parser/string_spec.rb +0 -8
  251. data/spec/opal/parser/super_spec.rb +0 -20
  252. data/spec/opal/parser/true_spec.rb +0 -17
  253. data/spec/opal/parser/undef_spec.rb +0 -15
  254. data/spec/opal/parser/unless_spec.rb +0 -13
  255. data/spec/opal/parser/while_spec.rb +0 -15
  256. data/spec/opal/parser/xstr_spec.rb +0 -116
  257. data/spec/opal/parser/yield_spec.rb +0 -20
@@ -42,32 +42,15 @@ STDERR = $stderr = IO.new
42
42
  STDIN = $stdin = IO.new
43
43
  STDOUT = $stdout = IO.new
44
44
 
45
- def $stdout.puts(*strs)
46
- %x{
47
- for (var i = 0; i < strs.length; i++) {
48
- if (strs[i] instanceof Array) {
49
- #{puts(*`strs[i]`)};
50
- }
51
- else {
52
- console.log(#{`strs[i]`.to_s});
53
- }
54
- }
55
- }
56
-
45
+ def $stdout.write(string)
46
+ `console.log(#{string.to_s});`
57
47
  nil
58
48
  end
59
49
 
60
- def $stderr.puts(*strs)
61
- %x{
62
- for (var i = 0; i < strs.length; i++) {
63
- if (strs[i] instanceof Array) {
64
- #{puts(*`strs[i]`)};
65
- }
66
- else {
67
- console.warn(#{`strs[i]`.to_s});
68
- }
69
- }
70
- }
71
-
50
+ def $stderr.write(string)
51
+ `console.warn(#{string.to_s});`
72
52
  nil
73
53
  end
54
+
55
+ $stdout.extend(IO::Writable)
56
+ $stderr.extend(IO::Writable)
@@ -104,7 +104,6 @@ module Kernel
104
104
  def initialize_clone(other)
105
105
  initialize_copy(other)
106
106
  end
107
- private :initialize_clone
108
107
 
109
108
  def define_singleton_method(name, &body)
110
109
  unless body
@@ -135,7 +134,6 @@ module Kernel
135
134
  def initialize_dup(other)
136
135
  initialize_copy(other)
137
136
  end
138
- private :initialize_dup
139
137
 
140
138
  def enum_for(method = :each, *args, &block)
141
139
  Enumerator.for(self, method, *args, &block)
@@ -147,18 +145,23 @@ module Kernel
147
145
 
148
146
  def extend(*mods)
149
147
  %x{
150
- for (var i = 0, length = mods.length; i < length; i++) {
151
- #{ self.singleton_class.include `mods[i]` };
152
- }
148
+ var singleton = #{singleton_class};
153
149
 
154
- return self;
150
+ for (var i = mods.length - 1; i >= 0; i--) {
151
+ var mod = mods[i];
152
+
153
+ #{`mod`.append_features `singleton`};
154
+ #{`mod`.extended self};
155
+ }
155
156
  }
157
+
158
+ self
156
159
  end
157
160
 
158
161
  def format(format, *args)
159
162
  %x{
160
163
  var idx = 0;
161
- return format.replace(/%(\\d+\\$)?([-+ 0]*)(\\d*|\\*(\\d+\\$)?)(?:\\.(\\d*|\\*(\\d+\\$)?))?([cspdiubBoxXfgeEG])|(%%)/g, function(str, idx_str, flags, width_str, w_idx_str, prec_str, p_idx_str, spec, escaped) {
164
+ return format.replace(/%(\d+\$)?([-+ 0]*)(\d*|\*(\d+\$)?)(?:\.(\d*|\*(\d+\$)?))?([cspdiubBoxXfgeEG])|(%%)/g, function(str, idx_str, flags, width_str, w_idx_str, prec_str, p_idx_str, spec, escaped) {
162
165
  if (escaped) {
163
166
  return '%';
164
167
  }
@@ -300,7 +303,7 @@ module Kernel
300
303
  end
301
304
 
302
305
  def instance_variable_defined?(name)
303
- `self.hasOwnProperty(name.substr(1))`
306
+ `$opal.hasOwnProperty.call(self, name.substr(1))`
304
307
  end
305
308
 
306
309
  def instance_variable_get(name)
@@ -440,7 +443,9 @@ module Kernel
440
443
  args.length <= 1 ? args[0] : args
441
444
  end
442
445
 
443
- alias print puts
446
+ def print(*strs)
447
+ $stdout.print(*strs)
448
+ end
444
449
 
445
450
  def warn(*strs)
446
451
  $stderr.puts(*strs) unless $VERBOSE.nil? || strs.empty?
@@ -485,10 +490,17 @@ module Kernel
485
490
  alias srand rand
486
491
 
487
492
  def respond_to?(name, include_all = false)
493
+ return true if respond_to_missing?(name)
494
+
488
495
  %x{
489
496
  var body = self['$' + name];
490
- return (!!body) && !body.rb_stub;
497
+
498
+ if (typeof(body) === "function" && !body.rb_stub) {
499
+ return true;
500
+ }
491
501
  }
502
+
503
+ false
492
504
  end
493
505
 
494
506
  alias send __send__
@@ -571,7 +583,7 @@ module Kernel
571
583
  @___frozen___ || false
572
584
  end
573
585
 
574
- def respond_to_missing? method_name
586
+ def respond_to_missing?(method_name)
575
587
  false
576
588
  end
577
589
  end
@@ -137,7 +137,7 @@ class Module
137
137
 
138
138
  def attr_reader(*names)
139
139
  %x{
140
- var proto = #{self}._proto, cls = #{self};
140
+ var proto = self._proto, cls = self;
141
141
  for (var i = 0, length = names.length; i < length; i++) {
142
142
  (function(name) {
143
143
  proto[name] = nil;
@@ -159,7 +159,7 @@ class Module
159
159
 
160
160
  def attr_writer(*names)
161
161
  %x{
162
- var proto = #{self}._proto, cls = #{self};
162
+ var proto = self._proto, cls = self;
163
163
  for (var i = 0, length = names.length; i < length; i++) {
164
164
  (function(name) {
165
165
  proto[name] = nil;
@@ -180,12 +180,8 @@ class Module
180
180
 
181
181
  alias attr attr_accessor
182
182
 
183
- # when self is Module (or Class), implement 1st form:
184
- # - global constants, classes and modules in global scope
185
- # when self is not Module (or Class), implement 2nd form:
186
- # - constants, classes and modules scoped to instance
187
183
  def constants
188
- `#{self}._scope.constants`
184
+ `self._scope.constants`
189
185
  end
190
186
 
191
187
  # check for constant within current scope
@@ -194,9 +190,9 @@ class Module
194
190
  raise NameError, "wrong constant name #{name}" unless name =~ /^[A-Z]\w*$/
195
191
 
196
192
  %x{
197
- scopes = [#{self}._scope];
198
- if (inherit || #{self} === Opal.Object) {
199
- var parent = #{self}._super;
193
+ scopes = [self._scope];
194
+ if (inherit || self === Opal.Object) {
195
+ var parent = self._super;
200
196
  while (parent !== Opal.BasicObject) {
201
197
  scopes.push(parent._scope);
202
198
  parent = parent._super;
@@ -213,15 +209,13 @@ class Module
213
209
  }
214
210
  end
215
211
 
216
- # check for constant within current scope
217
- # if inherit is true or self is Object, will also check ancestors
218
212
  def const_get(name, inherit = true)
219
213
  raise NameError, "wrong constant name #{name}" unless name =~ /^[A-Z]\w*$/
220
214
 
221
215
  %x{
222
- var scopes = [#{self}._scope];
223
- if (inherit || #{self} == Opal.Object) {
224
- var parent = #{self}._super;
216
+ var scopes = [self._scope];
217
+ if (inherit || self == Opal.Object) {
218
+ var parent = self._super;
225
219
  while (parent !== Opal.BasicObject) {
226
220
  scopes.push(parent._scope);
227
221
  parent = parent._super;
@@ -239,7 +233,7 @@ class Module
239
233
  end
240
234
 
241
235
  def const_missing(const)
242
- name = `#{self}._name`
236
+ name = `self._name`
243
237
 
244
238
  raise NameError, "uninitialized constant #{name}::#{const}"
245
239
  end
@@ -274,8 +268,8 @@ class Module
274
268
  block._s = null;
275
269
  block._def = block;
276
270
 
277
- #{self}._proto[jsid] = block;
278
- $opal.donate(#{self}, [jsid]);
271
+ self._proto[jsid] = block;
272
+ $opal.donate(self, [jsid]);
279
273
 
280
274
  return null;
281
275
  }
@@ -284,32 +278,30 @@ class Module
284
278
  def remove_method(name)
285
279
  %x{
286
280
  var jsid = '$' + name;
287
- var current = #{self}._proto[jsid];
288
- delete #{self}._proto[jsid];
281
+ var current = self._proto[jsid];
282
+ delete self._proto[jsid];
289
283
 
290
284
  // Check if we need to reverse $opal.donate
291
- // $opal.retire(#{self}, [jsid]);
292
- return #{self};
285
+ // $opal.retire(self, [jsid]);
286
+ return self;
293
287
  }
294
288
  end
295
289
 
296
290
  def include(*mods)
297
291
  %x{
298
- var i = mods.length - 1, mod;
299
- while (i >= 0) {
300
- mod = mods[i];
301
- i--;
292
+ for (var i = mods.length - 1; i >= 0; i--) {
293
+ var mod = mods[i];
302
294
 
303
- if (mod === #{self}) {
295
+ if (mod === self) {
304
296
  continue;
305
297
  }
306
298
 
307
- #{ `mod`.append_features self };
308
- #{ `mod`.included self };
299
+ #{`mod`.append_features self};
300
+ #{`mod`.included self};
309
301
  }
310
-
311
- return #{self};
312
302
  }
303
+
304
+ self
313
305
  end
314
306
 
315
307
  def instance_method(name)
@@ -326,9 +318,9 @@ class Module
326
318
 
327
319
  def instance_methods(include_super = false)
328
320
  %x{
329
- var methods = [], proto = #{self}._proto;
321
+ var methods = [], proto = self._proto;
330
322
 
331
- for (var prop in #{self}._proto) {
323
+ for (var prop in self._proto) {
332
324
  if (!include_super && !proto.hasOwnProperty(prop)) {
333
325
  continue;
334
326
  }
@@ -349,17 +341,19 @@ class Module
349
341
  def included(mod)
350
342
  end
351
343
 
344
+ def extended(mod)
345
+ end
346
+
352
347
  def module_eval(&block)
353
- %x{
354
- if (block === nil) {
355
- throw new Error("no block given");
356
- }
348
+ raise ArgumentError, 'no block given' unless block
357
349
 
358
- var block_self = block._s, result;
350
+ %x{
351
+ var old = block._s,
352
+ result;
359
353
 
360
354
  block._s = null;
361
- result = block.call(#{self});
362
- block._s = block_self;
355
+ result = block.call(self);
356
+ block._s = old;
363
357
 
364
358
  return result;
365
359
  }
@@ -387,7 +381,7 @@ class Module
387
381
 
388
382
  def method_defined?(method)
389
383
  %x{
390
- var body = #{self}._proto['$' + method];
384
+ var body = self._proto['$' + method];
391
385
  return (!!body) && !body.rb_stub;
392
386
  }
393
387
  end
@@ -395,12 +389,12 @@ class Module
395
389
  def module_function(*methods)
396
390
  %x{
397
391
  for (var i = 0, length = methods.length; i < length; i++) {
398
- var meth = methods[i], func = #{self}._proto['$' + meth];
392
+ var meth = methods[i], func = self._proto['$' + meth];
399
393
 
400
- #{self}.constructor.prototype['$' + meth] = func;
394
+ self.constructor.prototype['$' + meth] = func;
401
395
  }
402
396
 
403
- return #{self};
397
+ return self;
404
398
  }
405
399
  end
406
400
 
@@ -448,6 +442,9 @@ class Module
448
442
  false
449
443
  end
450
444
 
445
+ def private_constant(*)
446
+ end
447
+
451
448
  alias protected_method_defined? private_method_defined?
452
449
 
453
450
  alias public_instance_methods instance_methods
@@ -459,8 +456,8 @@ class Module
459
456
 
460
457
  def remove_const(name)
461
458
  %x{
462
- var old = #{self}._scope[name];
463
- delete #{self}._scope[name];
459
+ var old = self._scope[name];
460
+ delete self._scope[name];
464
461
  return old;
465
462
  }
466
463
  end
@@ -470,7 +467,7 @@ class Module
470
467
  end
471
468
 
472
469
  def undef_method(symbol)
473
- `$opal.add_stub_for(#{self}._proto, "$" + symbol)`
470
+ `$opal.add_stub_for(self._proto, "$" + symbol)`
474
471
  self
475
472
  end
476
473
  end
@@ -1,4 +1,8 @@
1
1
  class NilClass
2
+ def !
3
+ true
4
+ end
5
+
2
6
  def &(other)
3
7
  false
4
8
  end
@@ -1,12 +1,10 @@
1
+ require 'corelib/comparable'
2
+
1
3
  class Numeric
2
4
  include Comparable
3
5
 
4
6
  `def._isNumber = true`
5
7
 
6
- class << self
7
- undef_method :new
8
- end
9
-
10
8
  def coerce(other, type = :operation)
11
9
  %x{
12
10
  if (other._isNumber) {
@@ -197,6 +195,14 @@ class Numeric
197
195
  `self >> #{count.to_int}`
198
196
  end
199
197
 
198
+ def [](bit)
199
+ bit = Opal.coerce_to! bit, Integer, :to_int
200
+ min = -(2**30)
201
+ max = (2**30) - 1
202
+
203
+ `(#{bit} < #{min} || #{bit} > #{max}) ? 0 : (self >> #{bit}) % 2`
204
+ end
205
+
200
206
  def +@
201
207
  `+self`
202
208
  end
@@ -277,6 +283,30 @@ class Numeric
277
283
  `Math.floor(self)`
278
284
  end
279
285
 
286
+ def gcd(other)
287
+ unless Integer === other
288
+ raise TypeError, 'not an integer'
289
+ end
290
+
291
+ %x{
292
+ var min = Math.abs(self),
293
+ max = Math.abs(other);
294
+
295
+ while (min > 0) {
296
+ var tmp = min;
297
+
298
+ min = max % min;
299
+ max = tmp;
300
+ }
301
+
302
+ return max;
303
+ }
304
+ end
305
+
306
+ def gcdlcm(other)
307
+ [gcd, lcm]
308
+ end
309
+
280
310
  def hash
281
311
  `self.toString()`
282
312
  end
@@ -286,12 +316,38 @@ class Numeric
286
316
  end
287
317
 
288
318
  def is_a?(klass)
319
+ return true if klass == Fixnum && Integer === self
320
+ return true if klass == Integer && Integer === self
289
321
  return true if klass == Float && Float === self
322
+
323
+ super
324
+ end
325
+
326
+ alias kind_of? is_a?
327
+
328
+ def instance_of?(klass)
329
+ return true if klass == Fixnum && Integer === self
290
330
  return true if klass == Integer && Integer === self
331
+ return true if klass == Float && Float === self
291
332
 
292
333
  super
293
334
  end
294
335
 
336
+ def lcm(other)
337
+ unless Integer === other
338
+ raise TypeError, 'not an integer'
339
+ end
340
+
341
+ %x{
342
+ if (self == 0 || other == 0) {
343
+ return 0;
344
+ }
345
+ else {
346
+ return Math.abs(self * other / #{gcd(other)});
347
+ }
348
+ }
349
+ end
350
+
295
351
  alias magnitude abs
296
352
 
297
353
  alias modulo %
@@ -316,6 +372,10 @@ class Numeric
316
372
  `self - 1`
317
373
  end
318
374
 
375
+ def round
376
+ `Math.round(self)`
377
+ end
378
+
319
379
  def step(limit, step = 1, &block)
320
380
  return enum_for :step, limit, step unless block
321
381
 
@@ -358,11 +418,11 @@ class Numeric
358
418
  end
359
419
 
360
420
  def to_f
361
- `parseFloat(#{self})`
421
+ self
362
422
  end
363
423
 
364
424
  def to_i
365
- `parseInt(#{self})`
425
+ `parseInt(self)`
366
426
  end
367
427
 
368
428
  alias to_int to_i
@@ -402,8 +462,8 @@ class Numeric
402
462
  `self == 0`
403
463
  end
404
464
 
465
+ # Since bitwise operations are 32 bit, declare it to be so.
405
466
  def size
406
- # Just a stub, JS is 32bit for bitwise ops though
407
467
  4
408
468
  end
409
469
 
@@ -412,15 +472,29 @@ class Numeric
412
472
  end
413
473
 
414
474
  def finite?
415
- `self == Infinity || self == -Infinity`
475
+ `self != Infinity && self != -Infinity`
416
476
  end
417
477
 
418
478
  def infinite?
419
- if `self == Infinity`
420
- `+1`
421
- elsif `self == -Infinity`
422
- `-1`
423
- end
479
+ %x{
480
+ if (self == Infinity) {
481
+ return +1;
482
+ }
483
+ else if (self == -Infinity) {
484
+ return -1;
485
+ }
486
+ else {
487
+ return nil;
488
+ }
489
+ }
490
+ end
491
+
492
+ def positive?
493
+ `1 / self > 0`
494
+ end
495
+
496
+ def negative?
497
+ `1 / self < 0`
424
498
  end
425
499
  end
426
500
 
@@ -428,15 +502,27 @@ Fixnum = Numeric
428
502
 
429
503
  class Integer < Numeric
430
504
  def self.===(other)
431
- `!!(other._isNumber && (other % 1) == 0)`
505
+ %x{
506
+ if (!other._isNumber) {
507
+ return false;
508
+ }
509
+
510
+ return (other % 1) === 0;
511
+ }
432
512
  end
433
513
  end
434
514
 
435
515
  class Float < Numeric
436
516
  def self.===(other)
437
- `!!(other._isNumber && (other % 1) != 0)`
517
+ `!!other._isNumber`
438
518
  end
439
519
 
440
520
  INFINITY = `Infinity`
441
521
  NAN = `NaN`
522
+
523
+ if defined?(`Number.EPSILON`)
524
+ EPSILON = `Number.EPSILON`
525
+ else
526
+ EPSILON = `2.2204460492503130808472633361816E-16`
527
+ end
442
528
  end