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
@@ -6,6 +6,10 @@ class BasicObject
6
6
  `self === other`
7
7
  end
8
8
 
9
+ def eql?(other)
10
+ self == other
11
+ end
12
+
9
13
  def __id__
10
14
  `self.$$id || (self.$$id = Opal.uid())`
11
15
  end
@@ -34,7 +38,10 @@ class BasicObject
34
38
  false
35
39
  end
36
40
 
37
- alias eql? ==
41
+ def !=(other)
42
+ !(self == other)
43
+ end
44
+
38
45
  alias equal? ==
39
46
 
40
47
  def instance_eval(&block)
@@ -45,7 +52,22 @@ class BasicObject
45
52
  result;
46
53
 
47
54
  block.$$s = null;
48
- result = block.call(self, self);
55
+
56
+ // need to pass $$eval so that method definitions know if this is being done on a class/module. Cannot be compiler driven since
57
+ // send(:instance_eval) needs to work
58
+ if (self.$$is_class || self.$$is_module) {
59
+ self.$$eval = true;
60
+ try {
61
+ result = block.call(self, self);
62
+ }
63
+ finally {
64
+ self.$$eval = false;
65
+ }
66
+ }
67
+ else {
68
+ result = block.call(self, self);
69
+ }
70
+
49
71
  block.$$s = old;
50
72
 
51
73
  return result;
@@ -58,15 +80,37 @@ class BasicObject
58
80
  %x{
59
81
  var block_self = block.$$s,
60
82
  result;
61
-
83
+
62
84
  block.$$s = null;
63
- result = block.apply(self, args);
85
+
86
+ if (self.$$is_class || self.$$is_module) {
87
+ self.$$eval = true;
88
+ try {
89
+ result = block.apply(self, args);
90
+ }
91
+ finally {
92
+ self.$$eval = false;
93
+ }
94
+ }
95
+ else {
96
+ result = block.apply(self, args);
97
+ }
98
+
64
99
  block.$$s = block_self;
65
100
 
66
101
  return result;
67
102
  }
68
103
  end
69
104
 
105
+ def singleton_method_added(*)
106
+ end
107
+
108
+ def singleton_method_removed(*)
109
+ end
110
+
111
+ def singleton_method_undefined(*)
112
+ end
113
+
70
114
  def method_missing(symbol, *args, &block)
71
115
  Kernel.raise NoMethodError, `self.$inspect && !self.$inspect.$$stub` ?
72
116
  "undefined method `#{symbol}' for #{inspect}:#{`self.$$class`}" :
@@ -1,14 +1,12 @@
1
- class Boolean
1
+ class Boolean < `Boolean`
2
2
  `def.$$is_boolean = true`
3
+ `def.$$meta = #{self}`
3
4
 
4
5
  def __id__
5
6
  `self.valueOf() ? 2 : 0`
6
7
  end
7
- alias object_id __id__
8
8
 
9
- class << self
10
- undef_method :new
11
- end
9
+ alias object_id __id__
12
10
 
13
11
  def !
14
12
  `self != true`
@@ -31,12 +29,23 @@ class Boolean
31
29
  end
32
30
 
33
31
  alias equal? ==
32
+ alias eql? ==
34
33
 
35
- alias singleton_class class
34
+ def singleton_class
35
+ Boolean
36
+ end
36
37
 
37
38
  def to_s
38
39
  `(self == true) ? 'true' : 'false'`
39
40
  end
41
+
42
+ def dup
43
+ raise TypeError, "can't dup #{self.class}"
44
+ end
45
+
46
+ def clone
47
+ raise TypeError, "can't clone #{self.class}"
48
+ end
40
49
  end
41
50
 
42
51
  TrueClass = Boolean
@@ -3,14 +3,15 @@ require 'corelib/module'
3
3
  class Class
4
4
  def self.new(sup = Object, &block)
5
5
  %x{
6
- if (!sup.$$is_class || sup.$$is_mod) {
6
+ if (!sup.$$is_class) {
7
7
  #{raise TypeError, "superclass must be a Class"};
8
8
  }
9
9
 
10
10
  function AnonClass(){};
11
- var klass = Opal.boot(sup, AnonClass)
12
- klass.$$name = nil;
13
- klass.$$parent = sup;
11
+ var klass = Opal.boot(sup, AnonClass)
12
+ klass.$$name = nil;
13
+ klass.$$parent = sup;
14
+ klass.$$is_class = true;
14
15
 
15
16
  // inherit scope from parent
16
17
  Opal.create_scope(sup.$$scope, klass);
@@ -30,7 +31,7 @@ class Class
30
31
 
31
32
  def allocate
32
33
  %x{
33
- var obj = new self.$$alloc;
34
+ var obj = new self.$$alloc();
34
35
  obj.$$id = Opal.uid();
35
36
  return obj;
36
37
  }
@@ -10,6 +10,18 @@ module Comparable
10
10
  def ==(other)
11
11
  return true if equal?(other)
12
12
 
13
+ %x{
14
+ if (self["$<=>"] == Opal.Kernel["$<=>"]) {
15
+ return false;
16
+ }
17
+
18
+ // check for infinite recursion
19
+ if (self.$$comparable) {
20
+ delete self.$$comparable;
21
+ return false;
22
+ }
23
+ }
24
+
13
25
  return false unless cmp = (self <=> other)
14
26
 
15
27
  return `#{Comparable.normalize(cmp)} == 0`
@@ -1,3 +1,285 @@
1
+ require 'corelib/numeric'
2
+
1
3
  class Complex < Numeric
4
+ def self.rect(real, imag = 0)
5
+ unless Numeric === real && real.real? && Numeric === imag && imag.real?
6
+ raise TypeError, 'not a real'
7
+ end
8
+
9
+ new(real, imag)
10
+ end
11
+
12
+ class << self
13
+ alias rectangular rect
14
+ end
15
+
16
+ def self.polar(r, theta = 0)
17
+ unless Numeric === r && r.real? && Numeric === theta && theta.real?
18
+ raise TypeError, 'not a real'
19
+ end
20
+
21
+ new(r * Math.cos(theta), r * Math.sin(theta))
22
+ end
23
+
24
+ attr_reader :real, :imag
25
+
26
+ def initialize(real, imag = 0)
27
+ @real = real
28
+ @imag = imag
29
+ end
30
+
31
+ def coerce(other)
32
+ if Complex === other
33
+ [other, self]
34
+ elsif Numeric === other && other.real?
35
+ [Complex.new(other, 0), self]
36
+ else
37
+ raise TypeError, "#{other.class} can't be coerced into Complex"
38
+ end
39
+ end
40
+
41
+ def ==(other)
42
+ if Complex === other
43
+ @real == other.real && @imag == other.imag
44
+ elsif Numeric === other && other.real?
45
+ @real == other && @imag == 0
46
+ else
47
+ other == self
48
+ end
49
+ end
50
+
51
+ def -@
52
+ Complex(-@real, -@imag)
53
+ end
54
+
55
+ def +(other)
56
+ if Complex === other
57
+ Complex(@real + other.real, @imag + other.imag)
58
+ elsif Numeric === other && other.real?
59
+ Complex(@real + other, @imag)
60
+ else
61
+ __coerced__ :+, other
62
+ end
63
+ end
64
+
65
+ def -(other)
66
+ if Complex === other
67
+ Complex(@real - other.real, @imag - other.imag)
68
+ elsif Numeric === other && other.real?
69
+ Complex(@real - other, @imag)
70
+ else
71
+ __coerced__ :-, other
72
+ end
73
+ end
74
+
75
+ def *(other)
76
+ if Complex === other
77
+ Complex(@real * other.real - @imag * other.imag,
78
+ @real * other.imag + @imag * other.real)
79
+ elsif Numeric === other && other.real?
80
+ Complex(@real * other, @imag * other)
81
+ else
82
+ __coerced__ :*, other
83
+ end
84
+ end
85
+
86
+ def /(other)
87
+ if Complex === other
88
+ if (Number === @real && @real.nan?) || (Number === @imag && @imag.nan?) ||
89
+ (Number === other.real && other.real.nan?) || (Number === other.imag && other.imag.nan?)
90
+ Complex.new(Float::NAN, Float::NAN)
91
+ else
92
+ self * other.conj / other.abs2
93
+ end
94
+ elsif Numeric === other && other.real?
95
+ Complex(@real.quo(other), @imag.quo(other))
96
+ else
97
+ __coerced__ :/, other
98
+ end
99
+ end
100
+
101
+ def **(other)
102
+ if other == 0
103
+ return Complex.new(1, 0)
104
+ end
105
+
106
+ if Complex === other
107
+ r, theta = polar
108
+ ore = other.real
109
+ oim = other.imag
110
+ nr = Math.exp(ore * Math.log(r) - oim * theta)
111
+ ntheta = theta * ore + oim * Math.log(r)
112
+
113
+ Complex.polar(nr, ntheta)
114
+ elsif Integer === other
115
+ if other > 0
116
+ x = self
117
+ z = x
118
+ n = other - 1
119
+
120
+ while n != 0
121
+ while (div, mod = n.divmod(2); mod == 0)
122
+ x = Complex(x.real * x.real - x.imag * x.imag, 2 * x.real * x.imag)
123
+ n = div
124
+ end
125
+
126
+ z *= x
127
+ n -= 1
128
+ end
129
+
130
+ z
131
+ else
132
+ (Rational.new(1, 1) / self) ** -other
133
+ end
134
+ elsif Float === other || Rational === other
135
+ r, theta = polar
136
+
137
+ Complex.polar(r ** other, theta * other)
138
+ else
139
+ __coerced__ :**, other
140
+ end
141
+ end
142
+
143
+ def abs
144
+ Math.hypot(@real, @imag)
145
+ end
146
+
147
+ def abs2
148
+ @real * @real + @imag * @imag
149
+ end
150
+
151
+ def angle
152
+ Math.atan2(@imag, @real)
153
+ end
154
+
155
+ alias arg angle
156
+
157
+ def conj
158
+ Complex(@real, -@imag)
159
+ end
160
+
161
+ alias conjugate conj
162
+
163
+ def denominator
164
+ @real.denominator.lcm(@imag.denominator)
165
+ end
166
+
167
+ alias divide /
168
+
169
+ def eql?(other)
170
+ Complex === other && @real.class == @imag.class && self == other
171
+ end
172
+
173
+ def fdiv(other)
174
+ unless Numeric === other
175
+ raise TypeError, "#{other.class} can't be coerced into Complex"
176
+ end
177
+
178
+ self / other
179
+ end
180
+
181
+ def hash
182
+ "Complex:#@real:#@imag"
183
+ end
184
+
185
+ alias imaginary imag
186
+
187
+ def inspect
188
+ "(#{to_s})"
189
+ end
190
+
191
+ alias magnitude abs
192
+
193
+ def numerator
194
+ d = denominator
195
+
196
+ Complex(@real.numerator * (d / @real.denominator),
197
+ @imag.numerator * (d / @imag.denominator))
198
+ end
199
+
200
+ alias phase arg
201
+
202
+ def polar
203
+ [abs, arg]
204
+ end
205
+
206
+ alias quo /
207
+
208
+ def rationalize(eps = undefined)
209
+ %x{
210
+ if (arguments.length > 1) {
211
+ #{raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 0..1)"};
212
+ }
213
+ }
214
+
215
+ if @imag != 0
216
+ raise RangeError, "can't' convert #{self} into Rational"
217
+ end
218
+
219
+ real.rationalize(eps)
220
+ end
221
+
222
+ def real?
223
+ false
224
+ end
225
+
226
+ def rect
227
+ [@real, @imag]
228
+ end
229
+
230
+ alias rectangular rect
231
+
232
+ def to_f
233
+ unless @imag == 0
234
+ raise RangeError, "can't convert #{self} into Float"
235
+ end
236
+
237
+ @real.to_f
238
+ end
239
+
240
+ def to_i
241
+ unless @imag == 0
242
+ raise RangeError, "can't convert #{self} into Integer"
243
+ end
244
+
245
+ @real.to_i
246
+ end
247
+
248
+ def to_r
249
+ unless @imag == 0
250
+ raise RangeError, "can't convert #{self} into Rational"
251
+ end
252
+
253
+ @real.to_r
254
+ end
255
+
256
+ def to_s
257
+ result = @real.inspect
258
+
259
+ if (Number === @imag && @imag.nan?) || @imag.positive?
260
+ result += ?+
261
+ else
262
+ result += ?-
263
+ end
264
+
265
+ result += @imag.abs.inspect
266
+
267
+ if Number === @imag && (@imag.nan? || @imag.infinite?)
268
+ result += ?*
269
+ end
270
+
271
+ result + ?i
272
+ end
273
+
274
+ I = new(0, 1)
275
+ end
2
276
 
277
+ module Kernel
278
+ def Complex(real, imag = nil)
279
+ if imag
280
+ Complex.new(real, imag)
281
+ else
282
+ Complex.new(real, 0)
283
+ end
284
+ end
3
285
  end