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
@@ -1,3 +1,5 @@
1
+ require 'corelib/string'
2
+
1
3
  class Encoding
2
4
  def self.register(name, options = {}, &block)
3
5
  names = [name] + (options[:aliases] || [])
@@ -151,7 +153,7 @@ class String
151
153
  return self if encoding == @encoding
152
154
 
153
155
  %x{
154
- var result = new native_string(self);
156
+ var result = new String(self);
155
157
  result.encoding = encoding;
156
158
 
157
159
  return result;
@@ -2,7 +2,6 @@ require 'template'
2
2
 
3
3
  class ERB
4
4
  module Util
5
-
6
5
  `var escapes = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;'};`
7
6
  `var escape_regexp = /[&<>"']/g;`
8
7
 
@@ -103,11 +103,6 @@ class Object
103
103
  def to_json
104
104
  to_s.to_json
105
105
  end
106
-
107
- # FIXME: remove this
108
- def as_json
109
- nil
110
- end
111
106
  end
112
107
 
113
108
  class Array
@@ -122,15 +117,9 @@ class Array
122
117
  return '[' + result.join(', ') + ']';
123
118
  }
124
119
  end
125
-
126
120
  end
127
121
 
128
122
  class Boolean
129
- # FIXME: remove this
130
- def as_json
131
- self
132
- end
133
-
134
123
  def to_json
135
124
  `(self == true) ? 'true' : 'false'`
136
125
  end
@@ -152,33 +141,18 @@ class Hash
152
141
  end
153
142
 
154
143
  class NilClass
155
- # FIXME: remove this
156
- def as_json
157
- self
158
- end
159
-
160
144
  def to_json
161
145
  'null'
162
146
  end
163
147
  end
164
148
 
165
149
  class Numeric
166
- # FIXME: remove this
167
- def as_json
168
- self
169
- end
170
-
171
150
  def to_json
172
151
  `self.toString()`
173
152
  end
174
153
  end
175
154
 
176
155
  class String
177
- # FIXME: remove this
178
- def as_json
179
- self
180
- end
181
-
182
156
  alias to_json inspect
183
157
  end
184
158
 
@@ -187,3 +161,13 @@ class Time
187
161
  strftime("%FT%T%z").to_json
188
162
  end
189
163
  end
164
+
165
+ class Date
166
+ def to_json
167
+ to_s.to_json
168
+ end
169
+
170
+ def as_json
171
+ to_s
172
+ end
173
+ end
@@ -0,0 +1,370 @@
1
+ module Math
2
+ class DomainError < StandardError
3
+ def self.new(method)
4
+ super "Numerical argument is out of domain - \"#{method}\""
5
+ end
6
+ end
7
+
8
+ E = `Math.E`
9
+ PI = `Math.PI`
10
+
11
+ def acos(x)
12
+ %x{
13
+ if (!#{Numeric === x}) {
14
+ #{raise Opal.type_error(x, Float)};
15
+ }
16
+
17
+ x = #{x.to_f};
18
+
19
+ if (x < -1 || x > 1) {
20
+ #{raise DomainError, :acos};
21
+ }
22
+
23
+ return Math.acos(x);
24
+ }
25
+ end
26
+
27
+ unless defined?(`Math.acosh`)
28
+ %x{
29
+ Math.acosh = function(x) {
30
+ return Math.log(x + Math.sqrt(x * x - 1));
31
+ }
32
+ }
33
+ end
34
+
35
+ def acosh(x)
36
+ %x{
37
+ if (!#{Numeric === x}) {
38
+ #{raise Opal.type_error(x, Float)};
39
+ }
40
+
41
+ return Math.acosh(#{x.to_f});
42
+ }
43
+ end
44
+
45
+ def asin(x)
46
+ %x{
47
+ if (!#{Numeric === x}) {
48
+ #{raise Opal.type_error(x, Float)};
49
+ }
50
+
51
+ x = #{x.to_f};
52
+
53
+ if (x < -1 || x > 1) {
54
+ #{raise DomainError, :asin};
55
+ }
56
+
57
+ return Math.asin(x);
58
+ }
59
+ end
60
+
61
+ unless defined?(`Math.asinh`)
62
+ %x{
63
+ Math.asinh = function(x) {
64
+ return Math.log(x + Math.sqrt(x * x + 1))
65
+ }
66
+ }
67
+ end
68
+
69
+ def asinh(x)
70
+ %x{
71
+ if (!#{Numeric === x}) {
72
+ #{raise Opal.type_error(x, Float)};
73
+ }
74
+
75
+ return Math.asinh(#{x.to_f});
76
+ }
77
+ end
78
+
79
+ def atan(x)
80
+ %x{
81
+ if (!#{Numeric === x}) {
82
+ #{raise Opal.type_error(x, Float)};
83
+ }
84
+
85
+ return Math.atan(#{x.to_f});
86
+ }
87
+ end
88
+
89
+ def atan2(x, y)
90
+ %x{
91
+ if (!#{Numeric === x}) {
92
+ #{raise Opal.type_error(x, Float)};
93
+ }
94
+
95
+ if (!#{Numeric === y}) {
96
+ #{raise Opal.type_error(y, Float)};
97
+ }
98
+
99
+ return Math.atan2(#{x.to_f}, #{y.to_f});
100
+ }
101
+ end
102
+
103
+ unless defined?(`Math.atanh`)
104
+ %x{
105
+ Math.atanh = function(x) {
106
+ return 0.5 * Math.log((1 + x) / (1 - x));
107
+ }
108
+ }
109
+ end
110
+
111
+ def atanh(x)
112
+ %x{
113
+ if (!#{Numeric === x}) {
114
+ #{raise Opal.type_error(x, Float)};
115
+ }
116
+
117
+ x = #{x.to_f};
118
+
119
+ if (x < -1 || x > 1) {
120
+ #{raise DomainError, :atanh};
121
+ }
122
+
123
+ return Math.atanh(x);
124
+ }
125
+ end
126
+
127
+ # TODO: reimplement this when unavailable
128
+ def cbrt(x)
129
+ `Math.cbrt(x)`
130
+ end
131
+
132
+ def cos(x)
133
+ %x{
134
+ if (!#{Numeric === x}) {
135
+ #{raise Opal.type_error(x, Float)};
136
+ }
137
+
138
+ return Math.cos(#{x.to_f});
139
+ }
140
+ end
141
+
142
+ unless defined?(`Math.cosh`)
143
+ %x{
144
+ Math.cosh = function(x) {
145
+ return (Math.exp(x) + Math.exp(-x)) / 2;
146
+ }
147
+ }
148
+ end
149
+
150
+ def cosh(x)
151
+ %x{
152
+ if (!#{Numeric === x}) {
153
+ #{raise Opal.type_error(x, Float)};
154
+ }
155
+
156
+ return Math.cosh(#{x.to_f});
157
+ }
158
+ end
159
+
160
+ def erf(x)
161
+ raise NotImplementedError
162
+ end
163
+
164
+ def erfc(x)
165
+ raise NotImplementedError
166
+ end
167
+
168
+ def exp(x)
169
+ %x{
170
+ if (!#{Numeric === x}) {
171
+ #{raise Opal.type_error(x, Float)};
172
+ }
173
+
174
+ return Math.exp(#{x.to_f});
175
+ }
176
+ end
177
+
178
+ def frexp(x)
179
+ raise NotImplementedError
180
+ end
181
+
182
+ def gamma(x)
183
+ raise NotImplementedError
184
+ end
185
+
186
+ unless defined?(`Math.hypot`)
187
+ %x{
188
+ Math.hypot = function(x, y) {
189
+ return Math.sqrt(x * x + y * y)
190
+ }
191
+ }
192
+ end
193
+
194
+ def hypot(x, y)
195
+ %x{
196
+ if (!#{Numeric === x}) {
197
+ #{raise Opal.type_error(x, Float)};
198
+ }
199
+
200
+ if (!#{Numeric === y}) {
201
+ #{raise Opal.type_error(y, Float)};
202
+ }
203
+
204
+ return Math.hypot(#{x.to_f}, #{y.to_f});
205
+ }
206
+ end
207
+
208
+ def ldexp(flt, int)
209
+ raise NotImplementedError
210
+ end
211
+
212
+ def lgamma(x)
213
+ raise NotImplementedError
214
+ end
215
+
216
+ def log(num, base = E, method = nil)
217
+ %x{
218
+ if (!#{Numeric === num}) {
219
+ #{raise Opal.type_error(num, Float)};
220
+ }
221
+
222
+ if (!#{Numeric === base}) {
223
+ #{raise Opal.type_error(base, Float)};
224
+ }
225
+
226
+ num = #{num.to_f};
227
+ base = #{base.to_f};
228
+
229
+ if (num < 0) {
230
+ #{raise DomainError, method || :log};
231
+ }
232
+
233
+ num = Math.log(num);
234
+
235
+ if (base != Math.E) {
236
+ num /= Math.log(base);
237
+ }
238
+
239
+ return num
240
+ }
241
+ end
242
+
243
+ if defined?(`Math.log10`)
244
+ def log10(num)
245
+ %x{
246
+ if (!#{Numeric === num}) {
247
+ #{raise Opal.type_error(num, Float)};
248
+ }
249
+
250
+ num = #{num.to_f};
251
+
252
+ if (num < 0) {
253
+ #{raise DomainError, :log2};
254
+ }
255
+
256
+ return Math.log10(num);
257
+ }
258
+ end
259
+ else
260
+ def log10(num)
261
+ log(num, 10, :log10)
262
+ end
263
+ end
264
+
265
+ if defined?(`Math.log2`)
266
+ def log2(num)
267
+ %x{
268
+ if (!#{Numeric === num}) {
269
+ #{raise Opal.type_error(num, Float)};
270
+ }
271
+
272
+ num = #{num.to_f};
273
+
274
+ if (num < 0) {
275
+ #{raise DomainError, :log2};
276
+ }
277
+
278
+ return Math.log2(num);
279
+ }
280
+ end
281
+ else
282
+ def log2(num)
283
+ log(num, 2, :log2)
284
+ end
285
+ end
286
+
287
+ def sin(x)
288
+ %x{
289
+ if (!#{Numeric === x}) {
290
+ #{raise Opal.type_error(x, Float)};
291
+ }
292
+
293
+ return Math.sin(#{x.to_f});
294
+ }
295
+ end
296
+
297
+ unless defined?(`Math.sinh`)
298
+ %x{
299
+ Math.sinh = function(x) {
300
+ return (Math.exp(x) - Math.exp(-x)) / 2;
301
+ }
302
+ }
303
+ end
304
+
305
+ def sinh(x)
306
+ %x{
307
+ if (!#{Numeric === x}) {
308
+ #{raise Opal.type_error(x, Float)};
309
+ }
310
+
311
+ return Math.sinh(#{x.to_f});
312
+ }
313
+ end
314
+
315
+ def sqrt(x)
316
+ %x{
317
+ if (!#{Numeric === x}) {
318
+ #{raise Opal.type_error(x, Float)};
319
+ }
320
+
321
+ x = #{x.to_f};
322
+
323
+ if (x < 0) {
324
+ #{raise DomainError, :log2};
325
+ }
326
+
327
+ return Math.sqrt(x);
328
+ }
329
+ end
330
+
331
+ def tan(x)
332
+ %x{
333
+ if (!#{Numeric === x}) {
334
+ #{raise Opal.type_error(x, Float)};
335
+ }
336
+
337
+ return Math.tan(#{x.to_f});
338
+ }
339
+ end
340
+
341
+ unless defined?(`Math.tanh`)
342
+ %x{
343
+ Math.tanh = function(x) {
344
+ if (x == Infinity) {
345
+ return 1;
346
+ }
347
+ else if (x == -Infinity) {
348
+ return -1;
349
+ }
350
+ else {
351
+ return (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x));
352
+ }
353
+ }
354
+ }
355
+ end
356
+
357
+ def tanh(x)
358
+ %x{
359
+ if (!#{Numeric === x}) {
360
+ #{raise Opal.type_error(x, Float)};
361
+ }
362
+
363
+ return Math.tanh(#{x.to_f});
364
+ }
365
+ end
366
+
367
+ class << self
368
+ include Math
369
+ end
370
+ end