opal 0.3.44 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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