opal 0.10.0.beta3 → 0.10.0.beta4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.md +9 -1
- data/HACKING.md +2 -2
- data/docs/compiled_ruby.md +6 -6
- data/lib/opal/cli_runners/nodejs.rb +3 -1
- data/lib/opal/nodes/args/mlhsarg.rb +1 -3
- data/lib/opal/nodes/def.rb +18 -54
- data/lib/opal/nodes/helpers.rb +3 -3
- data/lib/opal/nodes/iter.rb +32 -3
- data/lib/opal/nodes/logic.rb +5 -5
- data/lib/opal/nodes/node_with_args.rb +31 -0
- data/lib/opal/parser/lexer.rb +9 -7
- data/lib/opal/sprockets/processor.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +16 -0
- data/opal/corelib/basic_object.rb +1 -1
- data/opal/corelib/class.rb +15 -0
- data/opal/corelib/constants.rb +1 -1
- data/opal/corelib/enumerable.rb +32 -62
- data/opal/corelib/file.rb +2 -0
- data/opal/corelib/helpers.rb +41 -1
- data/opal/corelib/module.rb +26 -10
- data/opal/corelib/runtime.js +47 -12
- data/spec/filters/bugs/date.rb +0 -9
- data/spec/filters/bugs/hash.rb +0 -2
- data/spec/filters/bugs/kernel.rb +0 -5
- data/spec/filters/bugs/language.rb +4 -19
- data/spec/filters/bugs/module.rb +0 -30
- data/spec/filters/bugs/pathname.rb +5 -0
- data/spec/filters/bugs/proc.rb +0 -6
- data/spec/filters/unsupported/thread.rb +1 -0
- data/spec/lib/compiler_spec.rb +29 -29
- data/spec/opal/core/runtime/truthy_spec.rb +26 -0
- data/spec/ruby_specs +0 -3
- data/stdlib/date.rb +21 -0
- data/stdlib/native.rb +1 -1
- data/stdlib/nodejs/file.rb +36 -11
- data/stdlib/nodejs/io.rb +55 -0
- data/stdlib/pathname.rb +43 -0
- data/stdlib/promise.rb +1 -1
- data/tasks/testing.rake +55 -31
- data/test/nodejs/test_file.rb +30 -0
- metadata +6 -2
@@ -120,14 +120,14 @@ module Opal
|
|
120
120
|
|
121
121
|
# @deprecated
|
122
122
|
def self.stubbed_files
|
123
|
-
warn "Deprecated: use `::Opal::Config.stubbed_files
|
123
|
+
warn "Deprecated: `::Opal::Processor.stubbed_files' is deprecated, use `::Opal::Config.stubbed_files' instead"
|
124
124
|
puts caller(5)
|
125
125
|
::Opal::Config.stubbed_files
|
126
126
|
end
|
127
127
|
|
128
128
|
# @deprecated
|
129
129
|
def self.stub_file(name)
|
130
|
-
warn "Deprecated: use `::Opal::Config.stubbed_files << #{name.inspect}.to_s
|
130
|
+
warn "Deprecated: `::Opal::Processor.stub_file' is deprecated, use `::Opal::Config.stubbed_files << #{name.inspect}.to_s' instead"
|
131
131
|
puts caller(5)
|
132
132
|
::Opal::Config.stubbed_files << name.to_s
|
133
133
|
end
|
data/lib/opal/version.rb
CHANGED
data/opal/corelib/array.rb
CHANGED
@@ -795,6 +795,19 @@ class Array < `Array`
|
|
795
795
|
}
|
796
796
|
end
|
797
797
|
|
798
|
+
def dup
|
799
|
+
%x{
|
800
|
+
if (
|
801
|
+
self.$$class === Opal.Array &&
|
802
|
+
self.$allocate.$$pristine &&
|
803
|
+
self.$copy_instance_variables.$$pristine &&
|
804
|
+
self.$initialize_dup.$$pristine
|
805
|
+
) return self.slice(0);
|
806
|
+
}
|
807
|
+
|
808
|
+
super
|
809
|
+
end
|
810
|
+
|
798
811
|
def each(&block)
|
799
812
|
return enum_for(:each){self.size} unless block_given?
|
800
813
|
|
@@ -2231,4 +2244,7 @@ class Array < `Array`
|
|
2231
2244
|
def instance_variables
|
2232
2245
|
super.reject { |ivar| `/^@\d+$/.test(#{ivar})` || ivar == '@length' }
|
2233
2246
|
end
|
2247
|
+
|
2248
|
+
Opal.pristine self, :allocate, :copy_instance_variables, :initialize_dup
|
2234
2249
|
end
|
2250
|
+
|
@@ -54,7 +54,7 @@ class BasicObject
|
|
54
54
|
default_eval_options = { file: (file || '(eval)'), eval: true }
|
55
55
|
compiling_options = __OPAL_COMPILER_CONFIG__.merge(default_eval_options)
|
56
56
|
compiled = Opal.compile string, compiling_options
|
57
|
-
block = Kernel.
|
57
|
+
block = Kernel.proc do
|
58
58
|
%x{
|
59
59
|
return (function(self) {
|
60
60
|
return eval(compiled);
|
data/opal/corelib/class.rb
CHANGED
@@ -47,4 +47,19 @@ class Class
|
|
47
47
|
def superclass
|
48
48
|
`self.$$super || nil`
|
49
49
|
end
|
50
|
+
|
51
|
+
def to_s
|
52
|
+
%x{
|
53
|
+
var singleton_of = self.$$singleton_of;
|
54
|
+
|
55
|
+
if (singleton_of && (singleton_of.$$is_class || singleton_of.$$is_module)) {
|
56
|
+
return #{"#<Class:#{`singleton_of`.name}>"};
|
57
|
+
}
|
58
|
+
else if (singleton_of) {
|
59
|
+
// a singleton class created from an object
|
60
|
+
return #{"#<Class:#<#{`singleton_of.$$class`.name}:0x#{`singleton_of.$$id`.to_s(16)}>>"};
|
61
|
+
}
|
62
|
+
return #{super()};
|
63
|
+
}
|
64
|
+
end
|
50
65
|
end
|
data/opal/corelib/constants.rb
CHANGED
data/opal/corelib/enumerable.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
module Enumerable
|
2
2
|
def all?(&block)
|
3
|
-
result = true
|
4
|
-
|
5
3
|
if block_given?
|
6
4
|
|
7
5
|
each do |*value|
|
8
6
|
unless yield(*value)
|
9
|
-
|
10
|
-
break
|
7
|
+
return false
|
11
8
|
end
|
12
9
|
end
|
13
10
|
|
@@ -15,25 +12,21 @@ module Enumerable
|
|
15
12
|
|
16
13
|
each do |*value|
|
17
14
|
unless Opal.destructure(value)
|
18
|
-
|
19
|
-
break
|
15
|
+
return false
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
23
19
|
end
|
24
20
|
|
25
|
-
|
21
|
+
true
|
26
22
|
end
|
27
23
|
|
28
24
|
def any?(&block)
|
29
|
-
result = false
|
30
|
-
|
31
25
|
if block_given?
|
32
26
|
|
33
27
|
each do |*value|
|
34
28
|
if yield(*value)
|
35
|
-
|
36
|
-
break
|
29
|
+
return true
|
37
30
|
end
|
38
31
|
end
|
39
32
|
|
@@ -41,14 +34,13 @@ module Enumerable
|
|
41
34
|
|
42
35
|
each do |*value|
|
43
36
|
if Opal.destructure(value)
|
44
|
-
|
45
|
-
break
|
37
|
+
return true
|
46
38
|
end
|
47
39
|
end
|
48
40
|
|
49
41
|
end
|
50
42
|
|
51
|
-
|
43
|
+
false
|
52
44
|
end
|
53
45
|
|
54
46
|
def chunk(state = undefined, &original_block)
|
@@ -204,28 +196,25 @@ module Enumerable
|
|
204
196
|
|
205
197
|
def detect(ifnone = undefined, &block)
|
206
198
|
return enum_for :detect, ifnone unless block_given?
|
207
|
-
result = `undefined`
|
208
199
|
|
209
200
|
each do |*args|
|
210
201
|
value = Opal.destructure(args)
|
211
202
|
if yield(value)
|
212
|
-
|
213
|
-
break
|
203
|
+
return value
|
214
204
|
end
|
215
205
|
end
|
216
206
|
|
217
207
|
%x{
|
218
|
-
if (
|
208
|
+
if (ifnone !== undefined) {
|
219
209
|
if (typeof(ifnone) === 'function') {
|
220
|
-
|
221
|
-
}
|
222
|
-
|
223
|
-
result = ifnone;
|
210
|
+
return ifnone();
|
211
|
+
} else {
|
212
|
+
return ifnone;
|
224
213
|
}
|
225
214
|
}
|
226
|
-
|
227
|
-
return result === undefined ? nil : result;
|
228
215
|
}
|
216
|
+
|
217
|
+
nil
|
229
218
|
end
|
230
219
|
|
231
220
|
def drop(number)
|
@@ -470,14 +459,12 @@ module Enumerable
|
|
470
459
|
def find_index(object = undefined, &block)
|
471
460
|
return enum_for :find_index if `object === undefined && block === nil`
|
472
461
|
|
473
|
-
result = nil
|
474
462
|
index = 0
|
475
463
|
|
476
464
|
if `object != null`
|
477
465
|
each do |*value|
|
478
466
|
if Opal.destructure(value) == object
|
479
|
-
|
480
|
-
break
|
467
|
+
return index
|
481
468
|
end
|
482
469
|
|
483
470
|
`index += 1`
|
@@ -485,23 +472,20 @@ module Enumerable
|
|
485
472
|
else
|
486
473
|
each do |*value|
|
487
474
|
if yield(*value)
|
488
|
-
|
489
|
-
break
|
475
|
+
return index
|
490
476
|
end
|
491
477
|
|
492
478
|
`index += 1`
|
493
479
|
end
|
494
480
|
end
|
495
481
|
|
496
|
-
|
482
|
+
nil
|
497
483
|
end
|
498
484
|
|
499
485
|
def first(number = undefined)
|
500
486
|
if `number === undefined`
|
501
|
-
result = nil
|
502
487
|
each do |value|
|
503
|
-
|
504
|
-
break
|
488
|
+
return value
|
505
489
|
end
|
506
490
|
else
|
507
491
|
result = []
|
@@ -521,12 +505,12 @@ module Enumerable
|
|
521
505
|
`result.push(#{Opal.destructure(args)})`
|
522
506
|
|
523
507
|
if `number <= ++current`
|
524
|
-
|
508
|
+
return result
|
525
509
|
end
|
526
510
|
end
|
527
|
-
end
|
528
511
|
|
529
|
-
|
512
|
+
result
|
513
|
+
end
|
530
514
|
end
|
531
515
|
|
532
516
|
alias flat_map collect_concat
|
@@ -590,15 +574,13 @@ module Enumerable
|
|
590
574
|
end
|
591
575
|
|
592
576
|
def include?(obj)
|
593
|
-
result = false
|
594
577
|
each do |*args|
|
595
578
|
if Opal.destructure(args) == obj
|
596
|
-
|
597
|
-
break
|
579
|
+
return true
|
598
580
|
end
|
599
581
|
end
|
600
582
|
|
601
|
-
|
583
|
+
false
|
602
584
|
end
|
603
585
|
|
604
586
|
def inject(object = undefined, sym = undefined, &block)
|
@@ -848,14 +830,11 @@ module Enumerable
|
|
848
830
|
end
|
849
831
|
|
850
832
|
def none?(&block)
|
851
|
-
result = true
|
852
|
-
|
853
833
|
if block_given?
|
854
834
|
|
855
835
|
each do |*value|
|
856
836
|
if yield(*value)
|
857
|
-
|
858
|
-
break
|
837
|
+
return false
|
859
838
|
end
|
860
839
|
end
|
861
840
|
|
@@ -863,29 +842,25 @@ module Enumerable
|
|
863
842
|
|
864
843
|
each do |*value|
|
865
844
|
if Opal.destructure(value)
|
866
|
-
|
867
|
-
break
|
845
|
+
return false
|
868
846
|
end
|
869
847
|
end
|
870
848
|
|
871
849
|
end
|
872
850
|
|
873
|
-
|
851
|
+
true
|
874
852
|
end
|
875
853
|
|
876
854
|
def one?(&block)
|
877
|
-
|
855
|
+
count = 0
|
878
856
|
|
879
857
|
if block_given?
|
880
858
|
|
881
859
|
each do |*value|
|
882
860
|
if yield(*value)
|
883
|
-
|
884
|
-
result = false
|
885
|
-
break
|
886
|
-
end
|
861
|
+
count += 1
|
887
862
|
|
888
|
-
|
863
|
+
return false if count > 1
|
889
864
|
end
|
890
865
|
end
|
891
866
|
|
@@ -893,18 +868,15 @@ module Enumerable
|
|
893
868
|
|
894
869
|
each do |*value|
|
895
870
|
if Opal.destructure(value)
|
896
|
-
|
897
|
-
result = false
|
898
|
-
break
|
899
|
-
end
|
871
|
+
count += 1
|
900
872
|
|
901
|
-
|
873
|
+
return false if count > 1
|
902
874
|
end
|
903
875
|
end
|
904
876
|
|
905
877
|
end
|
906
878
|
|
907
|
-
|
879
|
+
count == 1
|
908
880
|
end
|
909
881
|
|
910
882
|
def partition(&block)
|
@@ -1066,13 +1038,11 @@ module Enumerable
|
|
1066
1038
|
value = Opal.destructure(args)
|
1067
1039
|
|
1068
1040
|
unless yield(value)
|
1069
|
-
|
1041
|
+
return result
|
1070
1042
|
end
|
1071
1043
|
|
1072
1044
|
`result.push(value)`
|
1073
1045
|
end
|
1074
|
-
|
1075
|
-
result
|
1076
1046
|
end
|
1077
1047
|
|
1078
1048
|
alias to_a entries
|
data/opal/corelib/file.rb
CHANGED
data/opal/corelib/helpers.rb
CHANGED
@@ -72,7 +72,10 @@ module Opal
|
|
72
72
|
return args;
|
73
73
|
}
|
74
74
|
else {
|
75
|
-
|
75
|
+
var args_ary = new Array(args.length);
|
76
|
+
for(var i = 0, l = args_ary.length; i < l; i++) { args_ary[i] = args[i]; }
|
77
|
+
|
78
|
+
return args_ary;
|
76
79
|
}
|
77
80
|
}
|
78
81
|
end
|
@@ -123,4 +126,41 @@ module Opal
|
|
123
126
|
|
124
127
|
const_name
|
125
128
|
end
|
129
|
+
|
130
|
+
# @private
|
131
|
+
# Mark some methods as pristine in order to apply optimizations when they
|
132
|
+
# are still in their original form. This could probably be moved to
|
133
|
+
# the `Opal.def()` JS API, but for now it will stay manual.
|
134
|
+
#
|
135
|
+
# @example
|
136
|
+
#
|
137
|
+
# Opal.pristine Array, :allocate, :copy_instance_variables, :initialize_dup
|
138
|
+
#
|
139
|
+
# class Array
|
140
|
+
# def dup
|
141
|
+
# %x{
|
142
|
+
# if (
|
143
|
+
# self.$allocate.$$pristine &&
|
144
|
+
# self.$copy_instance_variables.$$pristine &&
|
145
|
+
# self.$initialize_dup.$$pristine
|
146
|
+
# ) return self.slice(0);
|
147
|
+
# }
|
148
|
+
#
|
149
|
+
# super
|
150
|
+
# end
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
# @param owner_class [Class] the class owning the methods
|
154
|
+
# @param method_names [Array<Symbol>] the list of methods names to mark
|
155
|
+
# @return [nil]
|
156
|
+
def self.pristine owner_class, *method_names
|
157
|
+
%x{
|
158
|
+
var method_name;
|
159
|
+
for (var i = method_names.length - 1; i >= 0; i--) {
|
160
|
+
method_name = method_names[i];
|
161
|
+
owner_class.$$proto['$'+method_name].$$pristine = true
|
162
|
+
}
|
163
|
+
}
|
164
|
+
nil
|
165
|
+
end
|
126
166
|
end
|
data/opal/corelib/module.rb
CHANGED
@@ -389,32 +389,32 @@ class Module
|
|
389
389
|
|
390
390
|
self
|
391
391
|
end
|
392
|
-
|
392
|
+
|
393
393
|
def included_modules
|
394
394
|
%x{
|
395
395
|
var results;
|
396
|
-
|
396
|
+
|
397
397
|
var module_chain = function(klass) {
|
398
398
|
var included = [];
|
399
|
-
|
399
|
+
|
400
400
|
for (var i = 0; i != klass.$$inc.length; i++) {
|
401
401
|
var mod_or_class = klass.$$inc[i];
|
402
402
|
included.push(mod_or_class);
|
403
403
|
included = included.concat(module_chain(mod_or_class));
|
404
404
|
}
|
405
|
-
|
405
|
+
|
406
406
|
return included;
|
407
407
|
};
|
408
|
-
|
408
|
+
|
409
409
|
results = module_chain(self);
|
410
|
-
|
410
|
+
|
411
411
|
// need superclass's modules
|
412
412
|
if (self.$$is_class) {
|
413
413
|
for (var cls = self; cls; cls = cls.$$super) {
|
414
414
|
results = results.concat(module_chain(cls));
|
415
415
|
}
|
416
416
|
}
|
417
|
-
|
417
|
+
|
418
418
|
return results;
|
419
419
|
}
|
420
420
|
end
|
@@ -486,7 +486,7 @@ class Module
|
|
486
486
|
|
487
487
|
def included(mod)
|
488
488
|
end
|
489
|
-
|
489
|
+
|
490
490
|
def extended(mod)
|
491
491
|
end
|
492
492
|
|
@@ -499,8 +499,24 @@ class Module
|
|
499
499
|
def method_undefined(*)
|
500
500
|
end
|
501
501
|
|
502
|
-
def module_eval(&block)
|
503
|
-
|
502
|
+
def module_eval(*args, &block)
|
503
|
+
if block.nil? && `!!Opal.compile`
|
504
|
+
Kernel.raise ArgumentError, "wrong number of arguments (0 for 1..3)" unless (1..3).cover? args.size
|
505
|
+
|
506
|
+
string, file, _lineno = *args
|
507
|
+
default_eval_options = { file: (file || '(eval)'), eval: true }
|
508
|
+
compiling_options = __OPAL_COMPILER_CONFIG__.merge(default_eval_options)
|
509
|
+
compiled = Opal.compile string, compiling_options
|
510
|
+
block = Kernel.proc do
|
511
|
+
%x{
|
512
|
+
return (function(self) {
|
513
|
+
return eval(compiled);
|
514
|
+
})(self)
|
515
|
+
}
|
516
|
+
end
|
517
|
+
elsif args.size > 0
|
518
|
+
Kernel.raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
|
519
|
+
end
|
504
520
|
|
505
521
|
%x{
|
506
522
|
var old = block.$$s,
|