opal 0.10.0.beta3 → 0.10.0.beta4
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.
- 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,
|