opal 0.3.44 → 0.4.0

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 (109) hide show
  1. data/.travis.yml +0 -1
  2. data/CHANGELOG.md +52 -0
  3. data/README.md +3 -3
  4. data/Rakefile +32 -8
  5. data/bin/opal +69 -16
  6. data/config.ru +1 -1
  7. data/examples/native/app/app.rb +28 -9
  8. data/examples/rack/app/app.rb +1 -1
  9. data/lib/opal.rb +0 -1
  10. data/lib/opal/cli.rb +106 -0
  11. data/lib/opal/lexer.rb +4 -2
  12. data/lib/opal/parser.rb +603 -360
  13. data/lib/opal/processor.rb +20 -8
  14. data/lib/opal/server.rb +47 -0
  15. data/lib/opal/source_map.rb +63 -0
  16. data/lib/opal/sprockets_parser.rb +77 -0
  17. data/lib/opal/sprockets_source_map_header.rb +21 -0
  18. data/lib/opal/target_scope.rb +14 -7
  19. data/lib/opal/version.rb +1 -1
  20. data/opal.gemspec +2 -0
  21. data/opal/opal-browser/script_loader.rb +7 -7
  22. data/opal/opal-parser.js.erb +2 -2
  23. data/opal/opal-source-maps.js.erb +2 -0
  24. data/opal/opal.rb +3 -4
  25. data/opal/opal/array.rb +31 -28
  26. data/opal/opal/boolean.rb +4 -0
  27. data/opal/opal/class.rb +14 -5
  28. data/opal/opal/enumerable.rb +68 -8
  29. data/opal/opal/error.rb +1 -1
  30. data/opal/opal/hash.rb +15 -18
  31. data/opal/opal/kernel.rb +24 -10
  32. data/opal/opal/native.rb +31 -0
  33. data/opal/opal/nil_class.rb +7 -2
  34. data/opal/opal/numeric.rb +10 -1
  35. data/opal/opal/proc.rb +4 -0
  36. data/opal/opal/range.rb +1 -1
  37. data/opal/opal/regexp.rb +13 -3
  38. data/opal/opal/runtime.js +134 -51
  39. data/opal/opal/string.rb +45 -22
  40. data/opal/opal/time.rb +25 -7
  41. data/opal/source_map.rb +63 -0
  42. data/opal/source_map/generator.rb +251 -0
  43. data/opal/source_map/parser.rb +102 -0
  44. data/opal/source_map/vlq.rb +122 -0
  45. data/opal/strscan.rb +30 -12
  46. data/spec/opal/class/_inherited_spec.rb +1 -1
  47. data/spec/{rubyspec/core → opal}/class/bridge_class_spec.rb +5 -3
  48. data/spec/{rubyspec/core → opal}/class/extend_spec.rb +0 -0
  49. data/spec/{rubyspec/core → opal}/class/instance_methods_spec.rb +0 -0
  50. data/spec/{rubyspec/core → opal}/class/last_value_spec.rb +0 -1
  51. data/spec/{rubyspec/core → opal}/json/parse_spec.rb +0 -0
  52. data/spec/{rubyspec/core/kernel/block_given.rb → opal/kernel/block_given_spec.rb} +0 -0
  53. data/spec/{rubyspec/core → opal}/kernel/class_spec.rb +0 -0
  54. data/spec/{rubyspec/core → opal}/kernel/extend_spec.rb +0 -0
  55. data/spec/{rubyspec/core → opal}/kernel/format_spec.rb +0 -0
  56. data/spec/opal/kernel/freeze_spec.rb +15 -0
  57. data/spec/{rubyspec/core → opal}/kernel/match_spec.rb +0 -0
  58. data/spec/{rubyspec/core → opal}/kernel/method_spec.rb +0 -0
  59. data/spec/{rubyspec/core → opal}/kernel/methods_spec.rb +0 -0
  60. data/spec/{rubyspec/core → opal}/kernel/nil_spec.rb +0 -0
  61. data/spec/{rubyspec/core → opal}/kernel/p_spec.rb +0 -0
  62. data/spec/{rubyspec/core → opal}/kernel/printf_spec.rb +0 -0
  63. data/spec/{rubyspec/core → opal}/kernel/proc_spec.rb +0 -0
  64. data/spec/{rubyspec/core → opal}/kernel/rand_spec.rb +0 -0
  65. data/spec/{rubyspec/core → opal}/kernel/respond_to_spec.rb +0 -0
  66. data/spec/{rubyspec/core → opal}/kernel/sprintf_spec.rb +0 -0
  67. data/spec/{rubyspec/core → opal}/kernel/to_json_spec.rb +0 -0
  68. data/spec/{rubyspec/core → opal}/module/alias_method_spec.rb +0 -0
  69. data/spec/{rubyspec/core → opal}/module/ancestors_spec.rb +0 -0
  70. data/spec/{rubyspec/core → opal}/module/append_features_spec.rb +0 -0
  71. data/spec/{rubyspec/core → opal}/module/constants_spec.rb +0 -0
  72. data/spec/{rubyspec/core → opal}/module/module_function_spec.rb +0 -1
  73. data/spec/opal/native_spec.rb +85 -3
  74. data/spec/opal/numeric/equal_spec.rb +9 -0
  75. data/spec/opal/parser/irb_spec.rb +43 -0
  76. data/spec/{rubyspec/core → opal}/proc/proc_tricks_spec.rb +0 -0
  77. data/spec/opal/runtime/block_send_spec.rb +28 -0
  78. data/spec/{rubyspec/core/runtime → opal/runtime2}/call_spec.rb +0 -0
  79. data/spec/{rubyspec/core/runtime → opal/runtime2}/class_hierarchy_spec.rb +0 -0
  80. data/spec/{rubyspec/core/runtime → opal/runtime2}/def_spec.rb +0 -0
  81. data/spec/{rubyspec/core/runtime → opal/runtime2}/defined_spec.rb +0 -0
  82. data/spec/{rubyspec/core/runtime → opal/runtime2}/super_spec.rb +0 -0
  83. data/spec/opal/source_map_spec.rb +19 -0
  84. data/spec/opal/string/freeze_spec.rb +15 -0
  85. data/spec/{rubyspec/core → opal}/string/to_json_spec.rb +0 -0
  86. data/spec/ospec/runner.rb +3 -0
  87. data/spec/parser/str_spec.rb +4 -0
  88. data/spec/rubyspec/core/enumerable/fixtures/classes.rb +2 -2
  89. data/spec/rubyspec/core/enumerable/none_spec.rb +68 -0
  90. data/spec/rubyspec/core/enumerable/sort_by_spec.rb +31 -0
  91. data/spec/rubyspec/core/hash/size_spec.rb +1 -1
  92. data/spec/rubyspec/core/hash/to_native_spec.rb +3 -3
  93. data/spec/rubyspec/core/string/fixtures/classes.rb +49 -0
  94. data/spec/rubyspec/core/string/index_spec.rb +405 -0
  95. data/spec/rubyspec/filters/bugs/language/class.rb +0 -2
  96. data/spec/rubyspec/filters/bugs/language/module.rb +3 -0
  97. data/spec/rubyspec/language/array_spec.rb +1 -1
  98. data/spec/rubyspec/language/block_spec.rb +1 -1
  99. data/spec/rubyspec/language/module_spec.rb +5 -5
  100. data/spec/rubyspec/language/predefined_spec.rb +1 -2
  101. data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +29 -0
  102. data/spec/rubyspec/spec_helper.rb +31 -0
  103. metadata +130 -76
  104. data/lib/opal/erb.rb +0 -41
  105. data/opal/erb.rb +0 -19
  106. data/spec/opal/erb/erb_spec.rb +0 -31
  107. data/spec/simple_erb_template.opalerb +0 -1
  108. data/spec/templates/foo/bar.opalerb +0 -1
  109. data/spec/templates/prefixed.opalerb +0 -1
@@ -30,6 +30,10 @@ class Boolean
30
30
  def to_s
31
31
  `(#{self} == true) ? 'true' : 'false'`
32
32
  end
33
+
34
+ def to_n
35
+ self
36
+ end
33
37
  end
34
38
 
35
39
  TrueClass = Boolean
@@ -19,6 +19,11 @@ class Class
19
19
  }
20
20
  end
21
21
 
22
+ def self.bridge_class(name, constructor)
23
+ `__opal.bridge(name, constructor)`
24
+ end
25
+
26
+
22
27
  def allocate
23
28
  %x{
24
29
  var obj = new #{self};
@@ -32,6 +37,10 @@ class Class
32
37
  self
33
38
  end
34
39
 
40
+ def alias_native(mid, jsid)
41
+ `#{self}.prototype['$' + mid] = #{self}.prototype[jsid]`
42
+ end
43
+
35
44
  def ancestors
36
45
  %x{
37
46
  var parent = #{self},
@@ -62,11 +71,11 @@ class Class
62
71
 
63
72
  klass.$included_modules.push(module);
64
73
 
65
- if (!module.$included_in) {
66
- module.$included_in = [];
74
+ if (!module._included_in) {
75
+ module._included_in = [];
67
76
  }
68
77
 
69
- module.$included_in.push(klass);
78
+ module._included_in.push(klass);
70
79
 
71
80
  var donator = module.prototype,
72
81
  prototype = klass.prototype,
@@ -81,7 +90,7 @@ class Class
81
90
  prototype._smethods.push.apply(prototype._smethods, methods);
82
91
  }
83
92
 
84
- if (klass.$included_in) {
93
+ if (klass._included_in) {
85
94
  __opal.donate(klass, methods.slice(), true);
86
95
  }
87
96
  }
@@ -255,7 +264,7 @@ class Class
255
264
  #{self}.prototype[jsid] = block;
256
265
  __opal.donate(#{self}, [jsid]);
257
266
 
258
- return nil;
267
+ return null;
259
268
  }
260
269
  end
261
270
 
@@ -10,11 +10,11 @@ module Enumerable
10
10
  for(var i = 0; i < arguments.length; i ++) {
11
11
  args[i] = arguments[i];
12
12
  }
13
-
13
+
14
14
  if ((value = block.apply(#{self}, args)) === __breaker) {
15
15
  return __breaker.$v;
16
16
  }
17
-
17
+
18
18
  if (value === false || value === nil) {
19
19
  result = false;
20
20
  __breaker.$v = nil;
@@ -25,7 +25,7 @@ module Enumerable
25
25
  }
26
26
  else {
27
27
  proc = function(obj) {
28
- if ((obj === false || obj === nil) && arguments.length < 2) {
28
+ if ((obj === false || obj === nil) && arguments.length < 2) {
29
29
  result = false;
30
30
  __breaker.$v = nil;
31
31
 
@@ -41,7 +41,7 @@ module Enumerable
41
41
  }
42
42
  end
43
43
 
44
- def any?(&block)
44
+ def any?(&block)
45
45
  %x{
46
46
  var result = false, proc;
47
47
 
@@ -52,7 +52,7 @@ module Enumerable
52
52
  for(var i = 0; i < arguments.length; i ++) {
53
53
  args[i] = arguments[i];
54
54
  }
55
-
55
+
56
56
  if ((value = block.apply(#{self}, args)) === __breaker) {
57
57
  return __breaker.$v;
58
58
  }
@@ -70,7 +70,7 @@ module Enumerable
70
70
  if ((obj !== false && obj !== nil) || arguments.length >= 2) {
71
71
  result = true;
72
72
  __breaker.$v = nil;
73
-
73
+
74
74
  return __breaker;
75
75
  }
76
76
  }
@@ -90,7 +90,7 @@ module Enumerable
90
90
  var proc = function() {
91
91
  var obj = __slice.call(arguments), value;
92
92
 
93
- if ((value = block.apply(null, obj)) === __breaker) {
93
+ if ((value = block.apply(nil, obj)) === __breaker) {
94
94
  return __breaker.$v;
95
95
  }
96
96
 
@@ -111,7 +111,7 @@ module Enumerable
111
111
  var proc = function() {
112
112
  var obj = __slice.call(arguments), value;
113
113
 
114
- if ((value = block.apply(null, [result].concat(obj))) === __breaker) {
114
+ if ((value = block.apply(nil, [result].concat(obj))) === __breaker) {
115
115
  result = __breaker.$v;
116
116
  __breaker.$v = nil;
117
117
 
@@ -532,6 +532,66 @@ module Enumerable
532
532
  }
533
533
  end
534
534
 
535
+ def none?(&block)
536
+ %x{
537
+ var result = true, proc;
538
+
539
+ if (block !== nil) {
540
+ proc = function(obj) {
541
+ var value;
542
+ var args = [];
543
+ for(var i = 0; i < arguments.length; i ++) {
544
+ args[i] = arguments[i];
545
+ }
546
+
547
+ if ((value = block.apply(#{self}, args)) === __breaker) {
548
+ return __breaker.$v;
549
+ }
550
+
551
+ if (value !== false && value !== nil) {
552
+ result = false;
553
+ __breaker.$v = nil;
554
+
555
+ return __breaker;
556
+ }
557
+ }
558
+ }
559
+ else {
560
+ proc = function(obj) {
561
+ if (arguments.length == 1 && (obj !== false && obj !== nil)) {
562
+ result = false;
563
+ __breaker.$v = nil;
564
+
565
+ return __breaker;
566
+ }
567
+ else {
568
+ for (var i = 0, length = arguments.length; i < length; i++) {
569
+ if (arguments[i] !== false && arguments[i] !== nil) {
570
+ result = false;
571
+ __breaker.$v = nil;
572
+
573
+ return __breaker;
574
+ }
575
+ }
576
+ }
577
+ };
578
+ }
579
+
580
+ #{self}.$each._p = proc;
581
+ #{self}.$each();
582
+
583
+ return result;
584
+ }
585
+ end
586
+
587
+ def sort_by &block
588
+ map { |*f|
589
+ # FIXME: this should probably belongs to somewhere more
590
+ f = `#{f}.length === 1 ? #{f}[0] : #{f}`
591
+ `[#{block.call(f)}, #{f}]`
592
+ }.sort.map { |f| `#{f}[1]` }
593
+ end
594
+
535
595
  alias select find_all
536
596
 
537
597
  alias take first
@@ -4,7 +4,7 @@ class Exception
4
4
  def self.new(message = '')
5
5
  %x{
6
6
  var err = new Error(message);
7
- err._klass = #{self};
7
+ err.constructor = #{self};
8
8
  err.name = #{self}._name;
9
9
  return err;
10
10
  }
@@ -48,28 +48,25 @@ class Hash
48
48
  `__hash()`
49
49
  end
50
50
 
51
- def self.from_native(obj)
52
- %x{
53
- var hash = __hash(), map = hash.map, keys = hash.keys;
54
-
55
- for (var key in obj) {
56
- keys.push(key);
57
- map[key] = obj[key];
58
- }
59
-
60
- return hash;
61
- }
62
- end
63
-
64
51
  def self.new(defaults = undefined, &block)
65
52
  %x{
66
53
  var hash = __hash();
67
54
 
68
55
  if (defaults != null) {
69
- hash.none = defaults;
56
+ if (defaults.constructor == Object) {
57
+ var map = hash.map, keys = hash.keys;
58
+
59
+ for (var key in defaults) {
60
+ keys.push(key);
61
+ map[key] = defaults[key];
62
+ }
63
+ }
64
+ else {
65
+ hash.none = defaults;
66
+ }
70
67
  }
71
68
  else if (block !== nil) {
72
- hash.proc = block;
69
+ hash.proc = block;
73
70
  }
74
71
 
75
72
  return hash;
@@ -697,15 +694,15 @@ class Hash
697
694
  }
698
695
  end
699
696
 
700
- def to_native
697
+ def to_n
701
698
  %x{
702
699
  var result = {}, keys = #{self}.keys, map = #{self}.map, bucket, value;
703
700
 
704
701
  for (var i = 0, length = keys.length; i < length; i++) {
705
702
  var key = keys[i], obj = map[key];
706
703
 
707
- if (obj.$to_native) {
708
- result[key] = #{`obj`.to_native};
704
+ if (obj.$to_n) {
705
+ result[key] = #{`obj`.to_n};
709
706
  }
710
707
  else {
711
708
  result[key] = obj;
@@ -36,7 +36,7 @@ module Kernel
36
36
  #{ raise NameError };
37
37
  }
38
38
 
39
- func._klass = #{Method};
39
+ func.constructor = #{Method};
40
40
  return func;
41
41
  }
42
42
  end
@@ -60,7 +60,10 @@ module Kernel
60
60
 
61
61
  def Array(object)
62
62
  %x{
63
- if (object.$to_ary) {
63
+ if (object === nil) {
64
+ return [];
65
+ }
66
+ else if (object.$to_ary) {
64
67
  return #{object.to_ary};
65
68
  }
66
69
  else if (object.$to_a) {
@@ -72,7 +75,7 @@ module Kernel
72
75
  end
73
76
 
74
77
  def class
75
- `#{self}._klass`
78
+ `#{self}.constructor`
76
79
  end
77
80
 
78
81
  def define_singleton_method(name, &body)
@@ -252,7 +255,7 @@ module Kernel
252
255
  end
253
256
 
254
257
  def instance_of?(klass)
255
- `#{self}._klass === klass`
258
+ `#{self}.constructor === klass`
256
259
  end
257
260
 
258
261
  def instance_variable_defined?(name)
@@ -287,7 +290,7 @@ module Kernel
287
290
 
288
291
  def is_a?(klass)
289
292
  %x{
290
- var search = #{self}._klass;
293
+ var search = #{self}.constructor;
291
294
 
292
295
  while (search) {
293
296
  if (search === klass) {
@@ -392,7 +395,7 @@ module Kernel
392
395
  }
393
396
 
394
397
  var meta = new __opal.Class;
395
- meta._klass = __opal.Class;
398
+ meta.constructor = __opal.Class;
396
399
  #{self}._singleton = meta;
397
400
  meta.prototype = #{self};
398
401
  meta._isSingleton = true;
@@ -401,7 +404,7 @@ module Kernel
401
404
  }
402
405
 
403
406
  if (typeof(#{self}) === 'function') {
404
- return #{self}._klass;
407
+ return #{self}.constructor;
405
408
  }
406
409
 
407
410
  if (#{self}._singleton) {
@@ -409,7 +412,7 @@ module Kernel
409
412
  }
410
413
 
411
414
  else {
412
- var orig_class = #{self}._klass,
415
+ var orig_class = #{self}.constructor,
413
416
  class_id = "#<Class:#<" + orig_class._name + ":" + orig_class._id + ">>";
414
417
 
415
418
  var Singleton = function () {};
@@ -418,7 +421,7 @@ module Kernel
418
421
 
419
422
  meta.prototype = #{self};
420
423
  #{self}._singleton = meta;
421
- meta._klass = orig_class._klass;
424
+ meta.constructor = orig_class.constructor;
422
425
 
423
426
  return meta;
424
427
  }
@@ -445,6 +448,17 @@ module Kernel
445
448
  end
446
449
 
447
450
  def to_s
448
- `return "#<" + #{self}._klass._name + ":" + #{self}._id + ">";`
451
+ `return "#<" + #{self}.constructor._name + ":" + #{self}._id + ">";`
452
+ end
453
+
454
+ alias to_str to_s
455
+
456
+ def freeze
457
+ @___frozen___ = true
458
+ self
459
+ end
460
+
461
+ def frozen?
462
+ @___frozen___ || false
449
463
  end
450
464
  end
@@ -0,0 +1,31 @@
1
+ class Native
2
+ def self.try_convert(value)
3
+ %x{
4
+ if (value == null) {
5
+ return null;
6
+ }
7
+
8
+ if (value.$to_n) {
9
+ return value.$to_n()
10
+ }
11
+ else if (!value.$object_id) {
12
+ return value;
13
+ }
14
+ else {
15
+ return null;
16
+ }
17
+ }
18
+ end
19
+
20
+ def initialize(native)
21
+ if (native = Native.try_convert(native)).nil?
22
+ raise ArgumentError, "the passed value isn't a native"
23
+ end
24
+
25
+ @native = native
26
+ end
27
+
28
+ def to_n
29
+ @native
30
+ end
31
+ end
@@ -53,11 +53,16 @@ class NilClass
53
53
  'null'
54
54
  end
55
55
 
56
- def to_native
57
- `null`
56
+ def to_n
57
+ `nil`
58
58
  end
59
59
 
60
60
  def to_s
61
61
  ''
62
62
  end
63
+
64
+ def object_id
65
+ `#{NilClass}._id || (#{NilClass}._id = Opal.uid())`
66
+ end
67
+ alias hash object_id
63
68
  end
@@ -76,7 +76,7 @@ class Numeric
76
76
  end
77
77
 
78
78
  def ==(other)
79
- `#{self} == other`
79
+ `!!(other._isNumber) && #{self} == Number(other)`
80
80
  end
81
81
 
82
82
  def <=>(other)
@@ -189,6 +189,10 @@ class Numeric
189
189
  `#{self}.toString()`
190
190
  end
191
191
 
192
+ def to_n
193
+ self
194
+ end
195
+
192
196
  def upto(finish, &block)
193
197
  return enum_for :upto, finish unless block_given?
194
198
 
@@ -206,6 +210,11 @@ class Numeric
206
210
  def zero?
207
211
  `#{self} == 0`
208
212
  end
213
+
214
+ def size
215
+ # Just a stub, JS is 32bit for bitwise ops though
216
+ 4
217
+ end
209
218
  end
210
219
 
211
220
  Fixnum = Numeric