opal 0.5.0 → 0.5.2
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/Gemfile +0 -2
- data/README.md +1 -1
- data/Rakefile +11 -8
- data/lib/opal.rb +1 -1
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +1 -1
- data/{corelib → opal/core}/array.rb +47 -40
- data/{corelib → opal/core}/basic_object.rb +4 -0
- data/{corelib → opal/core}/boolean.rb +2 -6
- data/{corelib → opal/core}/class.rb +0 -0
- data/{corelib → opal/core}/comparable.rb +0 -0
- data/{corelib → opal/core}/encoding.rb +0 -0
- data/{corelib → opal/core}/enumerable.rb +160 -38
- data/opal/core/enumerator.rb +416 -0
- data/{corelib → opal/core}/error.rb +0 -0
- data/{corelib → opal/core}/hash.rb +38 -48
- data/{corelib → opal/core}/io.rb +13 -9
- data/{corelib → opal/core}/kernel.rb +75 -49
- data/{corelib → opal/core}/main.rb +0 -0
- data/{corelib → opal/core}/match_data.rb +0 -4
- data/{corelib → opal/core}/method.rb +0 -0
- data/{corelib → opal/core}/module.rb +24 -3
- data/{corelib → opal/core}/nil_class.rb +0 -4
- data/{corelib → opal/core}/numeric.rb +3 -4
- data/{corelib → opal/core}/proc.rb +0 -4
- data/{corelib → opal/core}/range.rb +0 -0
- data/{corelib → opal/core}/regexp.rb +0 -4
- data/{corelib → opal/core}/runtime.js +0 -0
- data/{corelib → opal/core}/string.rb +4 -6
- data/{corelib → opal/core}/struct.rb +3 -21
- data/{corelib → opal/core}/time.rb +0 -4
- data/opal/opal.rb +121 -0
- data/spec/corelib/array/select_spec.rb +14 -0
- data/spec/filters/20.rb +4 -0
- data/spec/filters/bugs/enumerable.rb +1 -48
- data/spec/filters/unsupported/enumerator.rb +13 -0
- data/spec/opal/compiler/irb_spec.rb +1 -0
- data/spec/rubyspecs +1 -0
- data/spec/{corelib → stdlib}/native/alias_native_spec.rb +6 -4
- data/spec/{corelib → stdlib}/native/each_spec.rb +3 -1
- data/spec/{corelib → stdlib}/native/element_reference_spec.rb +3 -1
- data/spec/stdlib/native/ext_spec.rb +19 -0
- data/spec/{corelib → stdlib}/native/initialize_spec.rb +4 -4
- data/spec/{corelib → stdlib}/native/method_missing_spec.rb +13 -1
- data/spec/{corelib → stdlib}/native/new_spec.rb +3 -1
- data/stdlib/enumerator.rb +1 -0
- data/stdlib/json.rb +1 -1
- data/stdlib/native.rb +483 -0
- metadata +52 -47
- data/corelib/enumerator.rb +0 -55
- data/corelib/native.rb +0 -270
- data/corelib/opal.rb +0 -88
- data/spec/corelib/native/ext_spec.rb +0 -5
- data/spec/filters/bugs/enumerator.rb +0 -6
data/{corelib → opal/core}/io.rb
RENAMED
@@ -38,32 +38,36 @@ class IO
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
STDERR
|
42
|
-
STDIN
|
43
|
-
STDOUT
|
41
|
+
STDERR = $stderr = IO.new
|
42
|
+
STDIN = $stdin = IO.new
|
43
|
+
STDOUT = $stdout = IO.new
|
44
44
|
|
45
45
|
def $stdout.puts(*strs)
|
46
46
|
%x{
|
47
47
|
for (var i = 0; i < strs.length; i++) {
|
48
|
-
if(strs[i] instanceof Array) {
|
49
|
-
#{
|
50
|
-
}
|
48
|
+
if (strs[i] instanceof Array) {
|
49
|
+
#{puts(*`strs[i]`)};
|
50
|
+
}
|
51
|
+
else {
|
51
52
|
console.log(#{`strs[i]`.to_s});
|
52
53
|
}
|
53
54
|
}
|
54
55
|
}
|
56
|
+
|
55
57
|
nil
|
56
58
|
end
|
57
59
|
|
58
60
|
def $stderr.puts(*strs)
|
59
61
|
%x{
|
60
62
|
for (var i = 0; i < strs.length; i++) {
|
61
|
-
if(strs[i] instanceof Array) {
|
62
|
-
#{
|
63
|
-
}
|
63
|
+
if (strs[i] instanceof Array) {
|
64
|
+
#{puts(*`strs[i]`)};
|
65
|
+
}
|
66
|
+
else {
|
64
67
|
console.warn(#{`strs[i]`.to_s});
|
65
68
|
}
|
66
69
|
}
|
67
70
|
}
|
71
|
+
|
68
72
|
nil
|
69
73
|
end
|
@@ -36,16 +36,19 @@ module Kernel
|
|
36
36
|
def methods(all = true)
|
37
37
|
%x{
|
38
38
|
var methods = [];
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
|
40
|
+
for (var key in self) {
|
41
|
+
if (key[0] == "$" && typeof(self[key]) === "function") {
|
42
|
+
if (all == false || all === nil) {
|
43
|
+
if (!$opal.hasOwnProperty.call(self, key)) {
|
43
44
|
continue;
|
44
45
|
}
|
45
46
|
}
|
46
|
-
|
47
|
+
|
48
|
+
methods.push(key.substr(1));
|
47
49
|
}
|
48
50
|
}
|
51
|
+
|
49
52
|
return methods;
|
50
53
|
}
|
51
54
|
end
|
@@ -55,9 +58,6 @@ module Kernel
|
|
55
58
|
if (object == null || object === nil) {
|
56
59
|
return [];
|
57
60
|
}
|
58
|
-
else if (#{native?(object)}) {
|
59
|
-
return #{Native::Array.new(object, *args, &block).to_a};
|
60
|
-
}
|
61
61
|
else if (#{object.respond_to? :to_ary}) {
|
62
62
|
return #{object.to_ary};
|
63
63
|
}
|
@@ -80,18 +80,44 @@ module Kernel
|
|
80
80
|
`self._klass`
|
81
81
|
end
|
82
82
|
|
83
|
-
def
|
83
|
+
def copy_instance_variables(other)
|
84
84
|
%x{
|
85
|
-
|
86
|
-
|
85
|
+
for (var name in other) {
|
86
|
+
if (name.charAt(0) !== '$') {
|
87
|
+
if (name !== '_id' && name !== '_klass') {
|
88
|
+
self[name] = other[name];
|
89
|
+
}
|
90
|
+
}
|
87
91
|
}
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
def clone
|
96
|
+
copy = self.class.allocate
|
88
97
|
|
98
|
+
copy.copy_instance_variables(self)
|
99
|
+
copy.initialize_clone(self)
|
100
|
+
|
101
|
+
copy
|
102
|
+
end
|
103
|
+
|
104
|
+
def initialize_clone(other)
|
105
|
+
initialize_copy(other)
|
106
|
+
end
|
107
|
+
private :initialize_clone
|
108
|
+
|
109
|
+
def define_singleton_method(name, &body)
|
110
|
+
unless body
|
111
|
+
raise ArgumentError, "tried to create Proc object without a block"
|
112
|
+
end
|
113
|
+
|
114
|
+
%x{
|
89
115
|
var jsid = '$' + name;
|
90
116
|
body._jsid = name;
|
91
117
|
body._s = null;
|
92
118
|
body._def = body;
|
93
119
|
|
94
|
-
#{
|
120
|
+
#{singleton_class}._proto[jsid] = body;
|
95
121
|
|
96
122
|
return self;
|
97
123
|
}
|
@@ -100,22 +126,19 @@ module Kernel
|
|
100
126
|
def dup
|
101
127
|
copy = self.class.allocate
|
102
128
|
|
103
|
-
|
104
|
-
|
105
|
-
if (name.charAt(0) !== '$') {
|
106
|
-
if (name !== '_id' && name !== '_klass') {
|
107
|
-
copy[name] = self[name];
|
108
|
-
}
|
109
|
-
}
|
110
|
-
}
|
111
|
-
}
|
129
|
+
copy.copy_instance_variables(self)
|
130
|
+
copy.initialize_dup(self)
|
112
131
|
|
113
|
-
copy.initialize_copy self
|
114
132
|
copy
|
115
133
|
end
|
116
134
|
|
117
|
-
def
|
118
|
-
|
135
|
+
def initialize_dup(other)
|
136
|
+
initialize_copy(other)
|
137
|
+
end
|
138
|
+
private :initialize_dup
|
139
|
+
|
140
|
+
def enum_for(method = :each, *args, &block)
|
141
|
+
Enumerator.for(self, method, *args, &block)
|
119
142
|
end
|
120
143
|
|
121
144
|
def equal?(other)
|
@@ -369,9 +392,13 @@ module Kernel
|
|
369
392
|
end
|
370
393
|
|
371
394
|
def loop(&block)
|
372
|
-
|
373
|
-
|
374
|
-
|
395
|
+
%x{
|
396
|
+
while (true) {
|
397
|
+
if (block() === $breaker) {
|
398
|
+
return $breaker.$v;
|
399
|
+
}
|
400
|
+
}
|
401
|
+
}
|
375
402
|
|
376
403
|
self
|
377
404
|
end
|
@@ -380,15 +407,13 @@ module Kernel
|
|
380
407
|
false
|
381
408
|
end
|
382
409
|
|
383
|
-
|
384
|
-
`self._id || (self._id = Opal.uid())`
|
385
|
-
end
|
410
|
+
alias object_id __id__
|
386
411
|
|
387
412
|
def printf(*args)
|
388
413
|
if args.length > 0
|
389
|
-
|
390
|
-
print format(fmt, *args)
|
414
|
+
print format(*args)
|
391
415
|
end
|
416
|
+
|
392
417
|
nil
|
393
418
|
end
|
394
419
|
|
@@ -397,13 +422,12 @@ module Kernel
|
|
397
422
|
end
|
398
423
|
|
399
424
|
def proc(&block)
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
}
|
425
|
+
unless block
|
426
|
+
raise ArgumentError, "tried to create Proc object without a block"
|
427
|
+
end
|
428
|
+
|
429
|
+
`block.is_lambda = false`
|
430
|
+
block
|
407
431
|
end
|
408
432
|
|
409
433
|
def puts(*strs)
|
@@ -428,7 +452,7 @@ module Kernel
|
|
428
452
|
if (exception == null && #$!) {
|
429
453
|
exception = #$!;
|
430
454
|
}
|
431
|
-
else if (
|
455
|
+
else if (exception._isString) {
|
432
456
|
exception = #{RuntimeError.new exception};
|
433
457
|
}
|
434
458
|
else if (!#{exception.is_a? Exception}) {
|
@@ -443,15 +467,17 @@ module Kernel
|
|
443
467
|
|
444
468
|
def rand(max = undefined)
|
445
469
|
%x{
|
446
|
-
if(
|
470
|
+
if (max === undefined) {
|
447
471
|
return Math.random();
|
448
|
-
}
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
472
|
+
}
|
473
|
+
else if (max._isRange) {
|
474
|
+
var arr = #{max.to_a};
|
475
|
+
|
476
|
+
return arr[#{rand(`arr.length`)}];
|
477
|
+
}
|
478
|
+
else {
|
479
|
+
return Math.floor(Math.random() *
|
480
|
+
Math.abs(#{Opal.coerce_to max, Integer, :to_int}));
|
455
481
|
}
|
456
482
|
}
|
457
483
|
end
|
@@ -533,7 +559,7 @@ module Kernel
|
|
533
559
|
end
|
534
560
|
|
535
561
|
def to_s
|
536
|
-
`"#<" + self.
|
562
|
+
`"#<" + #{self.class.name} + ":" + self._id + ">"`
|
537
563
|
end
|
538
564
|
|
539
565
|
def freeze
|
File without changes
|
File without changes
|
@@ -366,8 +366,24 @@ class Module
|
|
366
366
|
end
|
367
367
|
|
368
368
|
alias class_eval module_eval
|
369
|
-
|
370
|
-
|
369
|
+
|
370
|
+
def module_exec(&block)
|
371
|
+
%x{
|
372
|
+
if (block === nil) {
|
373
|
+
throw new Error("no block given");
|
374
|
+
}
|
375
|
+
|
376
|
+
var block_self = block._s, result;
|
377
|
+
|
378
|
+
block._s = null;
|
379
|
+
result = block.apply(self, $slice.call(arguments));
|
380
|
+
block._s = block_self;
|
381
|
+
|
382
|
+
return result;
|
383
|
+
}
|
384
|
+
end
|
385
|
+
|
386
|
+
alias class_exec module_exec
|
371
387
|
|
372
388
|
def method_defined?(method)
|
373
389
|
%x{
|
@@ -428,12 +444,17 @@ class Module
|
|
428
444
|
alias private public
|
429
445
|
alias protected public
|
430
446
|
|
447
|
+
def private_method_defined?(obj)
|
448
|
+
false
|
449
|
+
end
|
450
|
+
|
451
|
+
alias protected_method_defined? private_method_defined?
|
452
|
+
|
431
453
|
alias public_instance_methods instance_methods
|
432
454
|
|
433
455
|
alias public_method_defined? method_defined?
|
434
456
|
|
435
457
|
def remove_class_variable(*)
|
436
|
-
|
437
458
|
end
|
438
459
|
|
439
460
|
def remove_const(name)
|
@@ -384,10 +384,6 @@ class Numeric
|
|
384
384
|
[q, r]
|
385
385
|
end
|
386
386
|
|
387
|
-
def to_n
|
388
|
-
`self.valueOf()`
|
389
|
-
end
|
390
|
-
|
391
387
|
def upto(finish, &block)
|
392
388
|
return enum_for :upto, finish unless block
|
393
389
|
|
@@ -440,4 +436,7 @@ class Float < Numeric
|
|
440
436
|
def self.===(other)
|
441
437
|
`!!(other._isNumber && (other % 1) != 0)`
|
442
438
|
end
|
439
|
+
|
440
|
+
INFINITY = `Infinity`
|
441
|
+
NAN = `NaN`
|
443
442
|
end
|
File without changes
|
File without changes
|
@@ -267,7 +267,7 @@ class String
|
|
267
267
|
def end_with?(*suffixes)
|
268
268
|
%x{
|
269
269
|
for (var i = 0, length = suffixes.length; i < length; i++) {
|
270
|
-
var suffix = suffixes[i];
|
270
|
+
var suffix = #{Opal.coerce_to `suffixes[i]`, String, :to_str};
|
271
271
|
|
272
272
|
if (self.length >= suffix.length && self.substr(0 - suffix.length) === suffix) {
|
273
273
|
return true;
|
@@ -563,7 +563,9 @@ class String
|
|
563
563
|
def start_with?(*prefixes)
|
564
564
|
%x{
|
565
565
|
for (var i = 0, length = prefixes.length; i < length; i++) {
|
566
|
-
|
566
|
+
var prefix = #{Opal.coerce_to `prefixes[i]`, String, :to_str};
|
567
|
+
|
568
|
+
if (self.indexOf(prefix) === 0) {
|
567
569
|
return true;
|
568
570
|
}
|
569
571
|
}
|
@@ -713,10 +715,6 @@ class String
|
|
713
715
|
|
714
716
|
alias to_sym intern
|
715
717
|
|
716
|
-
def to_n
|
717
|
-
`#{self}.valueOf()`
|
718
|
-
end
|
719
|
-
|
720
718
|
def tr(from, to)
|
721
719
|
%x{
|
722
720
|
if (from.length == 0 || from === to) {
|
@@ -52,17 +52,9 @@ class Struct
|
|
52
52
|
include Enumerable
|
53
53
|
|
54
54
|
def initialize(*args)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
members.each {|name|
|
59
|
-
instance_variable_set "@#{name}", Native(`#{object}[#{name}]`)
|
60
|
-
}
|
61
|
-
else
|
62
|
-
members.each_with_index {|name, index|
|
63
|
-
instance_variable_set "@#{name}", args[index]
|
64
|
-
}
|
65
|
-
end
|
55
|
+
members.each_with_index {|name, index|
|
56
|
+
instance_variable_set "@#{name}", args[index]
|
57
|
+
}
|
66
58
|
end
|
67
59
|
|
68
60
|
def members
|
@@ -123,16 +115,6 @@ class Struct
|
|
123
115
|
|
124
116
|
alias values to_a
|
125
117
|
|
126
|
-
def to_n
|
127
|
-
result = `{}`
|
128
|
-
|
129
|
-
each_pair {|name, value|
|
130
|
-
`#{result}[#{name}] = #{value.to_n}`
|
131
|
-
}
|
132
|
-
|
133
|
-
result
|
134
|
-
end
|
135
|
-
|
136
118
|
def inspect
|
137
119
|
result = "#<struct "
|
138
120
|
|