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
@@ -0,0 +1,113 @@
1
+ class Array
2
+ def self.inherited(klass)
3
+ replace = Class.new(Array::Wrapper)
4
+
5
+ %x{
6
+ klass._proto = replace._proto;
7
+ klass._proto._klass = klass;
8
+ klass._alloc = replace._alloc;
9
+ klass.__parent = #{Array::Wrapper};
10
+
11
+ klass.$allocate = replace.$allocate;
12
+ klass.$new = replace.$new;
13
+ klass["$[]"] = replace["$[]"];
14
+ }
15
+ end
16
+ end
17
+
18
+ class Array::Wrapper
19
+ def self.allocate(array = [])
20
+ obj = super()
21
+ `obj.literal = array`
22
+ obj
23
+ end
24
+
25
+ def self.new(*args, &block)
26
+ obj = allocate
27
+ obj.initialize(*args, &block)
28
+ obj
29
+ end
30
+
31
+ def self.[](*objects)
32
+ allocate(objects)
33
+ end
34
+
35
+ def initialize(*args, &block)
36
+ @literal = Array.new(*args, &block)
37
+ end
38
+
39
+ def method_missing(*args, &block)
40
+ result = @literal.__send__(*args, &block)
41
+
42
+ if `result === #@literal`
43
+ self
44
+ else
45
+ result
46
+ end
47
+ end
48
+
49
+ def initialize_copy(other)
50
+ @literal = `other.literal`.clone
51
+ end
52
+
53
+ def respond_to?(name, *)
54
+ super || @literal.respond_to?(name)
55
+ end
56
+
57
+ def ==(other)
58
+ @literal == other
59
+ end
60
+
61
+ def eql?(other)
62
+ @literal.eql?(other)
63
+ end
64
+
65
+ def to_a
66
+ @literal
67
+ end
68
+
69
+ def to_ary
70
+ self
71
+ end
72
+
73
+ def inspect
74
+ @literal.inspect
75
+ end
76
+
77
+ # wrapped results
78
+ def *(other)
79
+ %x{
80
+ var result = #{@literal * other};
81
+
82
+ if (result._isArray) {
83
+ return #{self.class.allocate(`result`)}
84
+ }
85
+ else {
86
+ return result;
87
+ }
88
+ }
89
+ end
90
+
91
+ def [](index, length = undefined)
92
+ %x{
93
+ var result = #{@literal.slice(index, length)};
94
+
95
+ if (result._isArray && (index._isRange || length !== undefined)) {
96
+ return #{self.class.allocate(`result`)}
97
+ }
98
+ else {
99
+ return result;
100
+ }
101
+ }
102
+ end
103
+
104
+ alias slice []
105
+
106
+ def uniq
107
+ self.class.allocate(@literal.uniq)
108
+ end
109
+
110
+ def flatten(level = undefined)
111
+ self.class.allocate(@literal.flatten(level))
112
+ end
113
+ end
@@ -30,6 +30,10 @@ class BasicObject
30
30
  }
31
31
  end
32
32
 
33
+ def !
34
+ false
35
+ end
36
+
33
37
  alias eql? ==
34
38
  alias equal? ==
35
39
 
@@ -37,12 +41,12 @@ class BasicObject
37
41
  Kernel.raise ArgumentError, "no block given" unless block
38
42
 
39
43
  %x{
40
- var block_self = block._s,
44
+ var old = block._s,
41
45
  result;
42
46
 
43
47
  block._s = null;
44
48
  result = block.call(self, self);
45
- block._s = block_self;
49
+ block._s = old;
46
50
 
47
51
  return result;
48
52
  }
@@ -5,6 +5,10 @@ class Boolean
5
5
  undef_method :new
6
6
  end
7
7
 
8
+ def !
9
+ `self != true`
10
+ end
11
+
8
12
  def &(other)
9
13
  `(self == true) ? (other !== false && other !== nil) : false`
10
14
  end
@@ -1,3 +1,5 @@
1
+ require 'corelib/module'
2
+
1
3
  class Class
2
4
  def self.new(sup = Object, &block)
3
5
  %x{
@@ -0,0 +1,3 @@
1
+ class Complex < Numeric
2
+
3
+ end
@@ -95,7 +95,8 @@ module Enumerable
95
95
  end
96
96
 
97
97
  def collect_concat(&block)
98
- raise NotImplementedError
98
+ return enum_for :collect_concat unless block_given?
99
+ map { |item| yield item }.flatten(1)
99
100
  end
100
101
 
101
102
  def count(object = undefined, &block)
@@ -317,7 +318,7 @@ module Enumerable
317
318
  slice.push(param);
318
319
 
319
320
  if (slice.length === n) {
320
- if (block(slice) === $breaker) {
321
+ if ($opal.$yield1(block, slice) === $breaker) {
321
322
  result = $breaker.$v;
322
323
  return $breaker;
323
324
  }
@@ -334,7 +335,7 @@ module Enumerable
334
335
 
335
336
  // our "last" group, if smaller than n then won't have been yielded
336
337
  if (slice.length > 0) {
337
- if (block(slice) === $breaker) {
338
+ if ($opal.$yield1(block, slice) === $breaker) {
338
339
  return $breaker.$v;
339
340
  }
340
341
  }
@@ -939,13 +940,80 @@ module Enumerable
939
940
  end
940
941
 
941
942
  def partition(&block)
942
- raise NotImplementedError
943
+ return enum_for :partition unless block_given?
944
+
945
+ %x{
946
+ var truthy = [], falsy = [];
947
+
948
+ self.$each._p = function() {
949
+ var param = #{Opal.destructure(`arguments`)},
950
+ value = $opal.$yield1(block, param);
951
+
952
+ if (value === $breaker) {
953
+ result = $breaker.$v;
954
+ return $breaker;
955
+ }
956
+
957
+ if (#{Opal.truthy?(`value`)}) {
958
+ truthy.push(param);
959
+ }
960
+ else {
961
+ falsy.push(param);
962
+ }
963
+ };
964
+
965
+ self.$each();
966
+
967
+ return [truthy, falsy];
968
+ }
943
969
  end
944
970
 
945
971
  alias reduce inject
946
972
 
973
+ def reject(&block)
974
+ return enum_for :reject unless block_given?
975
+
976
+ %x{
977
+ var result = [];
978
+
979
+ self.$each._p = function() {
980
+ var param = #{Opal.destructure(`arguments`)},
981
+ value = $opal.$yield1(block, param);
982
+
983
+ if (value === $breaker) {
984
+ result = $breaker.$v;
985
+ return $breaker;
986
+ }
987
+
988
+ if (#{Opal.falsy?(`value`)}) {
989
+ result.push(param);
990
+ }
991
+ };
992
+
993
+ self.$each();
994
+
995
+ return result;
996
+ }
997
+ end
998
+
947
999
  def reverse_each(&block)
948
- raise NotImplementedError
1000
+ return enum_for :reverse_each unless block_given?
1001
+
1002
+ %x{
1003
+ var result = [];
1004
+
1005
+ self.$each._p = function() {
1006
+ result.push(arguments);
1007
+ };
1008
+
1009
+ self.$each();
1010
+
1011
+ for (var i = result.length - 1; i >= 0; i--) {
1012
+ $opal.$yieldX(block, result[i]);
1013
+ }
1014
+
1015
+ return result;
1016
+ }
949
1017
  end
950
1018
 
951
1019
  alias select find_all
@@ -1058,8 +1126,7 @@ module Enumerable
1058
1126
 
1059
1127
  alias to_a entries
1060
1128
 
1061
- def zip(*lists, &block)
1062
- raise NotImplementedError
1129
+ def zip(*others, &block)
1130
+ to_a.zip(*others)
1063
1131
  end
1064
1132
  end
1065
-
@@ -1,3 +1,5 @@
1
+ require 'corelib/enumerable'
2
+
1
3
  class Enumerator
2
4
  include Enumerable
3
5
 
@@ -15,7 +15,7 @@ class Exception
15
15
  var backtrace = self.stack;
16
16
 
17
17
  if (typeof(backtrace) === 'string') {
18
- return backtrace.split("\\n").slice(0, 15);
18
+ return backtrace.split("\n").slice(0, 15);
19
19
  }
20
20
  else if (backtrace) {
21
21
  return backtrace.slice(0, 15);
@@ -33,29 +33,29 @@ class Exception
33
33
  end
34
34
 
35
35
  # keep the indentation, it makes the exception hierarchy clear
36
- class StandardError < Exception; end
37
- class SystemCallError < StandardError; end
38
- class NameError < StandardError; end
39
- class NoMethodError < NameError; end
40
- class RuntimeError < StandardError; end
41
- class LocalJumpError < StandardError; end
42
- class TypeError < StandardError; end
43
- class ArgumentError < StandardError; end
44
- class IndexError < StandardError; end
45
- class StopIteration < IndexError; end
46
- class KeyError < IndexError; end
47
- class RangeError < StandardError; end
48
- class FloatDomainError < RangeError; end
49
- class IOError < StandardError; end
50
-
51
- class ScriptError < Exception; end
52
- class SyntaxError < ScriptError; end
53
- class NotImplementedError < ScriptError; end
54
-
55
- class SystemExit < Exception; end
56
-
36
+ class ScriptError < Exception; end
37
+ class SyntaxError < ScriptError; end
38
+ class LoadError < ScriptError; end
39
+ class NotImplementedError < ScriptError; end
40
+
41
+ class SystemExit < Exception; end
42
+
43
+ class StandardError < Exception; end
44
+ class NameError < StandardError; end
45
+ class NoMethodError < NameError; end
46
+ class RuntimeError < StandardError; end
47
+ class LocalJumpError < StandardError; end
48
+ class TypeError < StandardError; end
49
+ class ArgumentError < StandardError; end
50
+ class IndexError < StandardError; end
51
+ class StopIteration < IndexError; end
52
+ class KeyError < IndexError; end
53
+ class RangeError < StandardError; end
54
+ class FloatDomainError < RangeError; end
55
+ class IOError < StandardError; end
56
+ class SystemCallError < StandardError; end
57
57
  module Errno
58
- class EINVAL < SystemCallError
58
+ class EINVAL < SystemCallError
59
59
  def self.new
60
60
  super('Invalid argument')
61
61
  end
@@ -1,8 +1,8 @@
1
+ require 'corelib/enumerable'
2
+
1
3
  class Hash
2
4
  include Enumerable
3
5
 
4
- `var $hasOwn = {}.hasOwnProperty`
5
-
6
6
  def self.[](*objs)
7
7
  `$opal.hash.apply(null, objs)`
8
8
  end
@@ -64,7 +64,7 @@ class Hash
64
64
  %x{
65
65
  var map = self.map;
66
66
 
67
- if ($hasOwn.call(map, key)) {
67
+ if ($opal.hasOwnProperty.call(map, key)) {
68
68
  return map[key];
69
69
  }
70
70
 
@@ -82,7 +82,7 @@ class Hash
82
82
  %x{
83
83
  var map = self.map;
84
84
 
85
- if (!$hasOwn.call(map, key)) {
85
+ if (!$opal.hasOwnProperty.call(map, key)) {
86
86
  self.keys.push(key);
87
87
  }
88
88
 
@@ -314,7 +314,7 @@ class Hash
314
314
  end
315
315
 
316
316
  def has_key?(key)
317
- `$hasOwn.call(self.map, key)`
317
+ `$opal.hasOwnProperty.call(self.map, key)`
318
318
  end
319
319
 
320
320
  def has_value?(value)
@@ -1,9 +1,17 @@
1
1
  module Opal
2
+ def self.type_error(object, type, method = nil, coerced = nil)
3
+ if method && coerced
4
+ TypeError.new "can't convert #{object.class} into #{type} (#{object.class}##{method} gives #{coerced.class}"
5
+ else
6
+ TypeError.new "no implicit conversion of #{object.class} into #{type}"
7
+ end
8
+ end
9
+
2
10
  def self.coerce_to(object, type, method)
3
11
  return object if type === object
4
12
 
5
13
  unless object.respond_to? method
6
- raise TypeError, "no implicit conversion of #{object.class} into #{type}"
14
+ raise type_error(object, type)
7
15
  end
8
16
 
9
17
  object.__send__ method
@@ -13,7 +21,21 @@ module Opal
13
21
  coerced = coerce_to(object, type, method)
14
22
 
15
23
  unless type === coerced
16
- raise TypeError, "can't convert #{object.class} into #{type} (#{object.class}##{method} gives #{coerced.class}"
24
+ raise type_error(object, type, method, coerced)
25
+ end
26
+
27
+ coerced
28
+ end
29
+
30
+ def self.coerce_to?(object, type, method)
31
+ return unless object.respond_to? method
32
+
33
+ coerced = coerce_to(object, type, method)
34
+
35
+ return if coerced.nil?
36
+
37
+ unless type === coerced
38
+ raise type_error(object, type, method, coerced)
17
39
  end
18
40
 
19
41
  coerced
@@ -37,20 +59,6 @@ module Opal
37
59
  compare
38
60
  end
39
61
 
40
- def self.fits_fixnum!(value)
41
- # since we have Fixnum#size as 32 bit, this is based on the int limits
42
- if `value > 2147483648`
43
- raise RangeError, "bignum too big to convert into `long'"
44
- end
45
- end
46
-
47
- def self.fits_array!(value)
48
- # this is the computed ARY_MAX_SIZE for 32 bit
49
- if `value >= 536870910`
50
- raise ArgumentError, "argument too big"
51
- end
52
- end
53
-
54
62
  def self.destructure(args)
55
63
  %x{
56
64
  if (args.length == 1) {
@@ -64,4 +72,31 @@ module Opal
64
72
  }
65
73
  }
66
74
  end
75
+
76
+ def self.respond_to?(obj, method)
77
+ %x{
78
+ if (obj == null || !obj._klass) {
79
+ return false;
80
+ }
81
+ }
82
+
83
+ obj.respond_to? method
84
+ end
85
+
86
+ def self.inspect(obj)
87
+ %x{
88
+ if (obj === undefined) {
89
+ return "undefined";
90
+ }
91
+ else if (obj === null) {
92
+ return "null";
93
+ }
94
+ else if (!obj._klass) {
95
+ return obj.toString();
96
+ }
97
+ else {
98
+ return #{obj.inspect};
99
+ }
100
+ }
101
+ end
67
102
  end