opal 0.3.44 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +0 -1
- data/CHANGELOG.md +52 -0
- data/README.md +3 -3
- data/Rakefile +32 -8
- data/bin/opal +69 -16
- data/config.ru +1 -1
- data/examples/native/app/app.rb +28 -9
- data/examples/rack/app/app.rb +1 -1
- data/lib/opal.rb +0 -1
- data/lib/opal/cli.rb +106 -0
- data/lib/opal/lexer.rb +4 -2
- data/lib/opal/parser.rb +603 -360
- data/lib/opal/processor.rb +20 -8
- data/lib/opal/server.rb +47 -0
- data/lib/opal/source_map.rb +63 -0
- data/lib/opal/sprockets_parser.rb +77 -0
- data/lib/opal/sprockets_source_map_header.rb +21 -0
- data/lib/opal/target_scope.rb +14 -7
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +2 -0
- data/opal/opal-browser/script_loader.rb +7 -7
- data/opal/opal-parser.js.erb +2 -2
- data/opal/opal-source-maps.js.erb +2 -0
- data/opal/opal.rb +3 -4
- data/opal/opal/array.rb +31 -28
- data/opal/opal/boolean.rb +4 -0
- data/opal/opal/class.rb +14 -5
- data/opal/opal/enumerable.rb +68 -8
- data/opal/opal/error.rb +1 -1
- data/opal/opal/hash.rb +15 -18
- data/opal/opal/kernel.rb +24 -10
- data/opal/opal/native.rb +31 -0
- data/opal/opal/nil_class.rb +7 -2
- data/opal/opal/numeric.rb +10 -1
- data/opal/opal/proc.rb +4 -0
- data/opal/opal/range.rb +1 -1
- data/opal/opal/regexp.rb +13 -3
- data/opal/opal/runtime.js +134 -51
- data/opal/opal/string.rb +45 -22
- data/opal/opal/time.rb +25 -7
- data/opal/source_map.rb +63 -0
- data/opal/source_map/generator.rb +251 -0
- data/opal/source_map/parser.rb +102 -0
- data/opal/source_map/vlq.rb +122 -0
- data/opal/strscan.rb +30 -12
- data/spec/opal/class/_inherited_spec.rb +1 -1
- data/spec/{rubyspec/core → opal}/class/bridge_class_spec.rb +5 -3
- data/spec/{rubyspec/core → opal}/class/extend_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/class/instance_methods_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/class/last_value_spec.rb +0 -1
- data/spec/{rubyspec/core → opal}/json/parse_spec.rb +0 -0
- data/spec/{rubyspec/core/kernel/block_given.rb → opal/kernel/block_given_spec.rb} +0 -0
- data/spec/{rubyspec/core → opal}/kernel/class_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/extend_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/format_spec.rb +0 -0
- data/spec/opal/kernel/freeze_spec.rb +15 -0
- data/spec/{rubyspec/core → opal}/kernel/match_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/method_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/methods_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/nil_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/p_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/printf_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/proc_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/rand_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/respond_to_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/sprintf_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/kernel/to_json_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/alias_method_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/ancestors_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/append_features_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/constants_spec.rb +0 -0
- data/spec/{rubyspec/core → opal}/module/module_function_spec.rb +0 -1
- data/spec/opal/native_spec.rb +85 -3
- data/spec/opal/numeric/equal_spec.rb +9 -0
- data/spec/opal/parser/irb_spec.rb +43 -0
- data/spec/{rubyspec/core → opal}/proc/proc_tricks_spec.rb +0 -0
- data/spec/opal/runtime/block_send_spec.rb +28 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/call_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/class_hierarchy_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/def_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/defined_spec.rb +0 -0
- data/spec/{rubyspec/core/runtime → opal/runtime2}/super_spec.rb +0 -0
- data/spec/opal/source_map_spec.rb +19 -0
- data/spec/opal/string/freeze_spec.rb +15 -0
- data/spec/{rubyspec/core → opal}/string/to_json_spec.rb +0 -0
- data/spec/ospec/runner.rb +3 -0
- data/spec/parser/str_spec.rb +4 -0
- data/spec/rubyspec/core/enumerable/fixtures/classes.rb +2 -2
- data/spec/rubyspec/core/enumerable/none_spec.rb +68 -0
- data/spec/rubyspec/core/enumerable/sort_by_spec.rb +31 -0
- data/spec/rubyspec/core/hash/size_spec.rb +1 -1
- data/spec/rubyspec/core/hash/to_native_spec.rb +3 -3
- data/spec/rubyspec/core/string/fixtures/classes.rb +49 -0
- data/spec/rubyspec/core/string/index_spec.rb +405 -0
- data/spec/rubyspec/filters/bugs/language/class.rb +0 -2
- data/spec/rubyspec/filters/bugs/language/module.rb +3 -0
- data/spec/rubyspec/language/array_spec.rb +1 -1
- data/spec/rubyspec/language/block_spec.rb +1 -1
- data/spec/rubyspec/language/module_spec.rb +5 -5
- data/spec/rubyspec/language/predefined_spec.rb +1 -2
- data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +29 -0
- data/spec/rubyspec/spec_helper.rb +31 -0
- metadata +130 -76
- data/lib/opal/erb.rb +0 -41
- data/opal/erb.rb +0 -19
- data/spec/opal/erb/erb_spec.rb +0 -31
- data/spec/simple_erb_template.opalerb +0 -1
- data/spec/templates/foo/bar.opalerb +0 -1
- data/spec/templates/prefixed.opalerb +0 -1
data/opal/opal/boolean.rb
CHANGED
data/opal/opal/class.rb
CHANGED
@@ -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
|
66
|
-
module
|
74
|
+
if (!module._included_in) {
|
75
|
+
module._included_in = [];
|
67
76
|
}
|
68
77
|
|
69
|
-
module
|
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
|
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
|
267
|
+
return null;
|
259
268
|
}
|
260
269
|
end
|
261
270
|
|
data/opal/opal/enumerable.rb
CHANGED
@@ -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(
|
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(
|
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
|
data/opal/opal/error.rb
CHANGED
data/opal/opal/hash.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
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.$
|
708
|
-
result[key] = #{`obj`.
|
704
|
+
if (obj.$to_n) {
|
705
|
+
result[key] = #{`obj`.to_n};
|
709
706
|
}
|
710
707
|
else {
|
711
708
|
result[key] = obj;
|
data/opal/opal/kernel.rb
CHANGED
@@ -36,7 +36,7 @@ module Kernel
|
|
36
36
|
#{ raise NameError };
|
37
37
|
}
|
38
38
|
|
39
|
-
func.
|
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
|
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}.
|
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}.
|
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}.
|
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.
|
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}.
|
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}.
|
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.
|
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}.
|
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
|
data/opal/opal/native.rb
ADDED
@@ -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
|
data/opal/opal/nil_class.rb
CHANGED
data/opal/opal/numeric.rb
CHANGED
@@ -76,7 +76,7 @@ class Numeric
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def ==(other)
|
79
|
-
|
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
|